Skip to content

Commit aaa7ec1

Browse files
committed
git subrepo pull uno
subrepo: subdir: "uno" merged: "8c0644a" upstream: origin: "https://github.com/prrvchr/uno.git" branch: "main" commit: "8c0644a" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
1 parent ad3b722 commit aaa7ec1

File tree

5 files changed

+101
-91
lines changed

5 files changed

+101
-91
lines changed

uno/.gitrepo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[subrepo]
77
remote = https://github.com/prrvchr/uno.git
88
branch = main
9-
commit = a14c230930b565156941b03390abc2b513a8a1e9
10-
parent = 34c9531b1e952a8d28eb9b853bbd84b88d74b3af
9+
commit = 8c0644af51492f4c8444d3ceeac471c3a8716d7c
10+
parent = ad3b72217e16131c12e8c96da91ee264855124bc
1111
method = merge
1212
cmdver = 0.4.3

uno/lib/uno/embedded/documenthandler.py

Lines changed: 38 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ def __init__(self, ctx, lock, logger, url, index):
6767
self._suffix = '.lck'
6868
self._lock = lock
6969
self._logger = logger
70-
self._listening = False
7170
self._created = False
7271
self._path, self._folder = self._getDataBaseInfo(url)
7372
self._url = url
@@ -80,11 +79,13 @@ def URL(self):
8079
# XCloseListener
8180
def queryClosing(self, event, owner):
8281
url = self._url
82+
print("DocumentHandler.queryClosing() Url: %s" % url)
8383
self._logger.logprb(INFO, 'DocumentHandler', 'queryClosing()', 201, url)
8484
with self._lock:
8585
document = event.Source
86-
if self._closeDataBase(document):
87-
self.removeFolder()
86+
target = document.getDocumentSubStorage(self._directory, READWRITE)
87+
if self._closeDataBase(document, target, 'queryClosing()', 241):
88+
self._removeFolder()
8889
self._url = None
8990
self._logger.logprb(INFO, 'DocumentHandler', 'queryClosing()', 202, url)
9091

@@ -95,15 +96,16 @@ def notifyClosing(self, event):
9596
def notifyStorageChange(self, document, storage):
9697
# The document has been save as with a new name
9798
url = document.getLocation()
99+
print("DocumentHandler.notifyStorageChange() Url: %s" % url)
98100
self._logger.logprb(INFO, 'DocumentHandler', 'notifyStorageChange()', 211, url)
99101
with self._lock:
100102
newpath, newfolder = self._getDataBaseInfo(url)
101-
if self._switchDataBase(document, storage, newfolder):
102-
self.removeFolder()
103+
target = storage.openStorageElement(self._directory, READWRITE)
104+
if self._closeDataBase(document, target, 'notifyStorageChange()', 251):
105+
self._removeFolder()
103106
self._path = newpath
104107
self._folder = newfolder
105108
self._url = url
106-
#document.removeCloseListener(self)
107109
self._logger.logprb(INFO, 'DocumentHandler', 'notifyStorageChange()', 212, url)
108110

109111
# XEventListener
@@ -117,25 +119,10 @@ def disposing(self, event):
117119
self._logger.logprb(INFO, 'DocumentHandler', 'disposing()', 222, url)
118120

119121
# DocumentHandler setter methods
120-
def setListener(self, document):
121-
# FIXME: With OpenOffice there is no Document in the info
122-
# FIXME: parameter provided during the connection
123-
if document is None:
124-
document = self._getDocument()
125-
if document is not None:
126-
# FIXME: We want to add the StorageChangeListener only once
127-
if not self._listening:
128-
document.addStorageChangeListener(self)
129-
self._listening = True
130-
# FIXME: If storage has been changed the closeListener has been removed
131-
document.addCloseListener(self)
132-
133122
def removeFolder(self):
134123
# XXX: The database folder will be deleted only if it was created
135124
if self._created:
136-
sf = getSimpleFile(self._ctx)
137-
if sf.isFolder(self._path):
138-
sf.kill(self._path)
125+
self._removeFolder()
139126

140127
# DocumentHandler getter methods
141128
def getConnectionUrl(self, storage):
@@ -151,6 +138,17 @@ def getConnectionUrl(self, storage):
151138
self._logger.logprb(INFO, 'DocumentHandler', 'getConnectionUrl()', 231, count)
152139
return self._getConnectionUrl(exist)
153140

141+
def getDocument(self):
142+
document = None
143+
interface = 'com.sun.star.frame.XStorable'
144+
components = getDesktop(self._ctx).getComponents().createEnumeration()
145+
while components.hasMoreElements():
146+
component = components.nextElement()
147+
if hasInterface(component, interface) and component.hasLocation() and component.getLocation() == self._url:
148+
document = component
149+
break
150+
return document
151+
154152
# DocumentHandler private getter methods
155153
def _getDataBaseInfo(self, location):
156154
transformer = getUrlTransformer(self._ctx)
@@ -177,65 +175,37 @@ def _getDocumentName(self, title):
177175
name, sep, extension = title.rpartition('.')
178176
return name if sep else extension
179177

180-
def _getDocument(self):
181-
document = None
182-
interface = 'com.sun.star.frame.XStorable'
183-
components = getDesktop(self._ctx).getComponents().createEnumeration()
184-
while components.hasMoreElements():
185-
component = components.nextElement()
186-
if hasInterface(component, interface) and component.hasLocation() and component.getLocation() == self._url:
187-
document = component
188-
break
189-
return document
190-
191178
def _getConnectionUrl(self, exist):
192179
path = self._path[self._index:]
193180
url = '%s%s/%s%s' % (g_protocol, path, g_catalog, g_options)
194181
return url + g_exist if exist else url + g_create
195182

196-
def _getStorageName(self, name, oldname, newname):
197-
return name.replace(oldname, newname)
198-
199-
def _closeDataBase(self, document):
183+
def _closeDataBase(self, document, target, method, resource):
200184
try:
201-
target = document.getDocumentSubStorage(self._directory, READWRITE)
202185
service = 'com.sun.star.embed.FileSystemStorageFactory'
203186
args = (self._path, SEEKABLEREAD)
204187
source = createService(self._ctx, service).createInstanceWithArguments(args)
205188
count = self._copyStorage(source, target)
206-
self._logger.logprb(INFO, 'DocumentHandler', '_closeDataBase()', 241, count)
189+
self._logger.logprb(INFO, 'DocumentHandler', method, resource, count)
207190
document.store()
208191
return True
209192
except Exception as e:
210-
self._logger.logprb(SEVERE, 'DocumentHandler', '_closeDataBase()', 242, self._url, traceback.format_exc())
211-
return False
212-
213-
def _switchDataBase(self, document, storage, newname):
214-
try:
215-
target = storage.openStorageElement(self._directory, READWRITE)
216-
service = 'com.sun.star.embed.FileSystemStorageFactory'
217-
args = (self._path, SEEKABLEREAD)
218-
source = createService(self._ctx, service).createInstanceWithArguments(args)
219-
count = self._copyStorage(source, target)
220-
self._logger.logprb(INFO, 'DocumentHandler', '_switchDataBase()', 251, count)
221-
document.store()
222-
return True
223-
except Exception as e:
224-
self._logger.logprb(SEVERE, 'DocumentHandler', '_switchDataBase()', 252, self._url, traceback.format_exc())
193+
self._logger.logprb(SEVERE, 'DocumentHandler', method, resource + 1, self._url, traceback.format_exc())
225194
return False
226195

227196
# DocumentHandler private setter methods
228197
def _copyStorage(self, source, target):
229198
count = 0
230-
for name in source.getElementNames():
231-
if source.isStreamElement(name):
232-
if target.hasByName(name):
233-
target.removeElement(name)
234-
source.copyElementTo(name, target, name)
235-
count += 1
236-
else:
237-
count += self._copyStorage(source.openStorageElement(name, SEEKABLEREAD),
238-
target.openStorageElement(name, READWRITE))
199+
if source.hasElements():
200+
for name in source.getElementNames():
201+
if source.isStreamElement(name):
202+
if target.hasByName(name):
203+
target.removeElement(name)
204+
source.copyElementTo(name, target, name)
205+
count += 1
206+
else:
207+
count += self._copyStorage(source.openStorageElement(name, SEEKABLEREAD),
208+
target.openStorageElement(name, READWRITE))
239209
target.commit()
240210
target.dispose()
241211
source.dispose()
@@ -260,3 +230,8 @@ def _extractStorage(self, sf, source, url):
260230
def _getPath(self, path, name):
261231
return '%s/%s' % (path, name)
262232

233+
def _removeFolder(self):
234+
sf = getSimpleFile(self._ctx)
235+
if sf.isFolder(self._path):
236+
sf.kill(self._path)
237+

uno/lib/uno/embedded/driver.py

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
from .configuration import g_protocol
6161
from .configuration import g_url
6262
from .configuration import g_user
63+
from .configuration import g_lover
6364

6465
import traceback
6566

@@ -84,24 +85,25 @@ def __init__(self, ctx, lock, service, name, index):
8485

8586
# XDriver
8687
def connect(self, url, infos):
87-
# XXX: We need to test first if jdbcDriverOOo is installed...
88+
# XXX: We need to test first if configuration is OK...
8889
driver = self._getDriver()
8990
newinfos, document, storage, location = self._getConnectionInfo(infos)
9091
if storage is None or location is None:
9192
self._logException(112, url, ' ')
92-
raise self._getException(1001, None, 111, url, '\n')
93-
# XXX: Calling handler unpacks the database files
93+
raise self._getException(1001, None, 111, 112, url, '\n')
9494
handler = self._getDocumentHandler(location)
95+
# XXX: Getting path from handler unpacks the database files
9596
path = handler.getConnectionUrl(storage)
9697
self._logger.logprb(INFO, 'Driver', 'connect()', 113, location)
9798
try:
9899
connection = driver.connect(path, newinfos)
99100
except Exception as e:
100101
self._logger.logprb(SEVERE, 'Driver', 'connect()', 115, str(e), traceback.format_exc())
102+
# XXX: Database files will only be deleted if they have been unpacked
101103
handler.removeFolder()
102104
raise e
103105
# XXX: Connection has been done we can add close and change listener to document
104-
handler.setListener(document)
106+
self._setDocumentHandler(document, handler)
105107
version = connection.getMetaData().getDriverVersion()
106108
self._logger.logprb(INFO, 'Driver', 'connect()', 114, g_dbname, version, g_user)
107109
return connection
@@ -113,8 +115,10 @@ def acceptsURL(self, url):
113115

114116
def getPropertyInfo(self, url, infos):
115117
try:
118+
# XXX: We need to test first if configuration is OK...
119+
driver = self._getDriver()
116120
self._logger.logprb(INFO, 'Driver', 'getPropertyInfo()', 141, url)
117-
drvinfo = self._getDriver().getPropertyInfo(g_protocol, infos)
121+
drvinfo = driver.getPropertyInfo(g_protocol, infos)
118122
for info in drvinfo:
119123
self._logger.logprb(INFO, 'Driver', 'getPropertyInfo()', 142, info.Name, info.Value)
120124
return drvinfo
@@ -143,17 +147,28 @@ def _getDriver(self):
143147
# FIXME: If jdbcDriverOOo is not installed,
144148
# FIXME: we need to throw SQLException
145149
if self._driver is None:
146-
version = getExtensionVersion(self._ctx, g_jdbcid)
147-
if version is None:
148-
self._logException(122, g_jdbcext, ' ', g_extension)
149-
raise self._getException(1001, None, 121, g_jdbcext, '\n', g_extension)
150-
elif not checkVersion(version, g_jdbcver):
151-
self._logException(124, version, g_jdbcext, ' ', g_jdbcver)
152-
raise self._getException(1001, None, 123, version, g_jdbcext, '\n', g_jdbcver)
153-
else:
154-
self._driver = createService(self._ctx, self._service)
150+
self._checkConfiguration()
151+
self._driver = createService(self._ctx, self._service)
155152
return self._driver
156153

154+
def _checkConfiguration(self):
155+
self._checkLibreOffice()
156+
version = getExtensionVersion(self._ctx, g_jdbcid)
157+
if version is None:
158+
self._logException(122, g_jdbcext, ' ', g_extension)
159+
raise self._getException(1001, None, 121, 123, g_jdbcext, '\n', g_extension)
160+
if not checkVersion(version, g_jdbcver):
161+
self._logException(125, version, g_jdbcext, ' ', g_jdbcver)
162+
raise self._getException(1001, None, 122, 125, version, g_jdbcext, '\n', g_jdbcver)
163+
164+
def _checkLibreOffice(self):
165+
configuration = getConfiguration(self._ctx, '/org.openoffice.Setup/Product')
166+
name = configuration.getByName('ooName')
167+
version = configuration.getByName('ooSetupVersion')
168+
if not checkVersion(version, g_lover):
169+
self._logException(124, name, version, ' ', name, g_lover)
170+
raise self._getException(1001, None, 122, 124, name, version, '\n', name, g_lover)
171+
157172
def _getConnectionInfo(self, infos):
158173
document = storage = url = None
159174
service = getConfiguration(self._ctx, g_identifier).getByName('ConnectionService')
@@ -169,13 +184,14 @@ def _getConnectionInfo(self, infos):
169184
document = info.Value
170185
else:
171186
newinfos[info.Name] = info.Value
172-
print("Driver._getConnectionInfo() Name: %s - Value: %s" % (info.Name, info.Value))
173187
return getPropertyValueSet(newinfos), document, storage, url
174188

175189
def _getHandler(self, location):
176190
document = None
177-
for handler in self._handlers:
191+
# XXX: If we want to be able to remove dead handler we need to do copy
192+
for handler in self._handlers[:]:
178193
url = handler.URL
194+
# XXX: The URL is None for a closed connection and can be cleared.
179195
if url is None:
180196
self._handlers.remove(handler)
181197
elif url == location:
@@ -187,18 +203,35 @@ def _getDocumentHandler(self, location):
187203
handler = self._getHandler(location)
188204
if handler is None:
189205
handler = DocumentHandler(self._ctx, self._lock, self._logger, location, self._index)
190-
self._handlers.append(handler)
191206
return handler
192207

208+
def _setDocumentHandler(self, document, handler):
209+
with self._lock:
210+
# FIXME: We only add handler if connection is successful
211+
if handler not in self._handlers:
212+
if self._setListener(document, handler):
213+
self._handlers.append(handler)
214+
215+
def _setListener(self, document, handler):
216+
# FIXME: With OpenOffice there is no Document in the info
217+
# FIXME: parameter provided during the connection
218+
if document is None:
219+
document = handler.getDocument()
220+
if document is not None:
221+
document.addStorageChangeListener(handler)
222+
document.addCloseListener(handler)
223+
return True
224+
return False
225+
193226
def _logException(self, resource, *args):
194227
self._logger.logprb(SEVERE, 'Driver', 'connect()', resource, *args)
195228

196-
def _getException(self, code, exception, resource, *args):
229+
def _getException(self, code, exception, state, resource, *args):
197230
error = SQLException()
198231
error.ErrorCode = code
199232
error.NextException = exception
200-
error.SQLState = self._logger.resolveString(resource)
201-
error.Message = self._logger.resolveString(resource +1, *args)
233+
error.SQLState = self._logger.resolveString(state)
234+
error.Message = self._logger.resolveString(resource, *args)
202235
error.Context = self
203236
return error
204237

uno/resource/embedded/Driver_en_US.properties

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
120=Driver._getDriver()
1212
121=Installation error
13-
122=The extension {} was not found.{}You must install this extension to use {}.
14-
123=Configuration error
15-
124=Version {} of extension {} is obsolete.{}You need to update this extension to version: {}.
13+
122=Configuration error
14+
123=The extension {} was not found.{}You must install this extension to use {}.
15+
124={} version {} is obsolete.{}You need to update {} to version: {} minimum.
16+
125=Version {} of extension {} is obsolete.{}You need to update this extension to version: {}.
1617

1718
130=Driver.acceptsURL()
1819
131=Driver can open a connection with the URL: {} - {}

uno/resource/embedded/Driver_fr_FR.properties

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
120=Driver._getDriver()
1212
121=Erreur d'installation
13-
122=L'extension {} est introuvable.{}Vous devez installer cette extension pour utiliser {}.
14-
123=Erreur de configuration
15-
124=La version {} de l'extension {} est obsolète.{}Vous devez mettre à jour cette extension vers la version: {}.
13+
122=Erreur de configuration
14+
123=L'extension {} est introuvable.{}Vous devez installer cette extension pour utiliser {}.
15+
124={} version {} est obsolète.{}Vous devez mettre à jour {} vers la version: {} minimum.
16+
125=La version {} de l'extension {} est obsolète.{}Vous devez mettre à jour cette extension vers la version: {}.
1617
1718
130=Driver.acceptsURL()
1819
131=Le pilote peut ouvrir une connexion avec l'URL: {} - {}

0 commit comments

Comments
 (0)