def _updateDrive(self, user): separator = ',' start = parseDateTime() call = self.DataBase.getDriveCall(user.Id, separator, 1, start) roots = [user.RootId] rows, items, parents, page, row = self._getDriveContent(call, user, roots, separator, start) rows += self._filterParents(call, user.Provider, items, parents, roots, separator, start) rejected = self._getRejectedItems(user.Provider, parents, items) if row > 0: call.executeBatch() call.close() end = parseDateTime() self.DataBase.updateUserTimeStamp(user.Id, end) return rejected, rows, page, row, end
def _getNewContent(self, itemid, contenttype): timestamp = parseDateTime() isfolder = self.User.Provider.isFolder(contenttype) isdocument = self.User.Provider.isDocument(contenttype) isroot = itemid == self.User.RootId data = KeyMap() data.insertValue('Id', itemid) data.insertValue('ObjectId', itemid) data.insertValue('Title', '') data.insertValue('TitleOnServer', '') data.insertValue('DateCreated', timestamp) data.insertValue('DateModified', timestamp) data.insertValue('ContentType', contenttype) mediatype = '' if isdocument else contenttype data.insertValue('MediaType', mediatype) data.insertValue('Size', 0) data.insertValue('Trashed', False) data.insertValue('IsRoot', isroot) data.insertValue('IsFolder', isfolder) data.insertValue('IsDocument', isdocument) data.insertValue('CanAddChild', isfolder) data.insertValue('CanRename', True) data.insertValue('IsReadOnly', False) data.insertValue('IsVersionable', isdocument) data.insertValue('Loaded', True) data.insertValue('BaseURI', self.getContentIdentifier()) return data
def _synchronize(self): if self.Provider.isOffLine(): msg = getMessage(self.ctx, 111) logMessage(self.ctx, INFO, msg, 'Replicator', '_synchronize()') elif not self.canceled: timestamp = parseDateTime() self._syncData(timestamp)
def _getNewContent(self): try: print("Identifier._getNewContent() 1") timestamp = parseDateTime() isfolder = self.User.Provider.isFolder(self._contenttype) isdocument = self.User.Provider.isDocument(self._contenttype) data = KeyMap() data.insertValue('Id', self.Id) data.insertValue('ObjectId', self.Id) data.insertValue('Title', '') data.insertValue('TitleOnServer', '') data.insertValue('DateCreated', timestamp) data.insertValue('DateModified', timestamp) data.insertValue('ContentType', self._contenttype) mediatype = self._contenttype if isfolder else '' data.insertValue('MediaType', mediatype) data.insertValue('Size', 0) data.insertValue('Trashed', False) data.insertValue('IsRoot', self.isRoot()) data.insertValue('IsFolder', isfolder) data.insertValue('IsDocument', isdocument) data.insertValue('CanAddChild', isfolder) data.insertValue('CanRename', True) data.insertValue('IsReadOnly', False) data.insertValue('IsVersionable', isdocument) data.insertValue('Loaded', True) data.insertValue('BaseURI', self.getContentIdentifier()) print("Identifier._getNewContent() 2 %s - %s" % (self.Id, self.getContentIdentifier())) return data except Exception as e: print("Identifier._getNewContent() ERROR: %s - %s" % (e, traceback.print_exc()))
def insertItem(self, user, item): timestamp = parseDateTime() rootid = user.getValue('RootId') c1 = self._getDataSourceCall('deleteParent') c2 = self._getDataSourceCall('insertParent') if not self._prepareItemCall('update', c1, c2, user, item, timestamp): self._prepareItemCall('insert', c1, c2, user, item, timestamp) c1.close() c2.close() id = self.Provider.getItemId(item) identifier = KeyMap() identifier.insertValue('Id', id) return self.selectItem(user, identifier)
def insertAndSelectItem(self, user, data): item = None separator = ',' timestamp = parseDateTime() call = self._getCall('insertAndSelectItem') call.setString(1, user.Id) call.setString(2, separator) call.setLong(3, 0) call.setTimestamp(4, timestamp) id = user.Provider.getItemId(data) parents = user.Provider.getItemParent(data, user.RootId) self._mergeItem(call, user.Provider, data, id, parents, separator, timestamp) result = call.executeQuery() if result.next(): item = getKeyMapFromResult(result) call.close() return item
def _pushData(self, user, start): try: results = [] end = parseDateTime() chunk = user.Provider.Chunk url = user.Provider.SourceURL uploader = user.Request.getUploader(chunk, url, self.DataBase.callBack) for item in self.DataBase.getInsertedItems(user.Id, start, end): results.append(self._synchronizeCreatedItems(user, uploader, item)) for item in self.DataBase.getUpdatedItems(user.Id, start, end): results.append(self._synchronizeUpdatedItems(user, uploader, item)) if all(results): pass self.DataBase.updateUserTimeStamp(user.Id, end) print("Replicator._pushData() Created / Updated Items OK") return results except Exception as e: print("Replicator.synchronize() ERROR: %s - %s" % (e, traceback.print_exc()))
def updateContent(self, userid, itemid, property, value): updated = False timestamp = parseDateTime() if property == 'Title': update = self._getCall('updateTitle') update.setTimestamp(1, timestamp) update.setString(2, value) update.setString(3, itemid) updated = update.execute() == 0 update.close() elif property == 'Size': update = self._getCall('updateSize') # The Size of the file is not sufficient to detect a 'Save' of the file, # It can be modified and have the same Size... # For this we temporarily update the Size to 0 update.setTimestamp(1, timestamp) update.setLong(2, 0) update.setString(3, itemid) update.execute() update.setLong(2, value) update.setString(3, itemid) updated = update.execute() == 0 update.close() elif property == 'Trashed': update = self._getCall('updateTrashed') update.setTimestamp(1, timestamp) update.setBoolean(2, value) update.setString(3, itemid) updated = update.execute() == 0 update.close() if updated: # We need to update Capabilities table to be able to retrieve # changes by user with system versioning # TODO: I cannot use a procedure performing the two UPDATE # TODO: without the system versioning malfunctioning... # TODO: As a workaround I use two successive UPDATE queries update = self._getCall('updateCapabilities') update.setTimestamp(1, timestamp) update.setString(2, userid) update.setString(3, itemid) update.execute() update.close() # Start Replicator for pushing changes… self.sync.set()
def updateFolderContent(self, user, content): rows = [] separator = ',' timestamp = parseDateTime() call = self._getCall('mergeItem') call.setString(1, user.Id) call.setString(2, separator) call.setLong(3, 0) call.setTimestamp(4, timestamp) enumerator = user.Provider.getFolderContent(user.Request, content) while enumerator.hasMoreElements(): item = enumerator.nextElement() id = user.Provider.getItemId(item) parents = user.Provider.getItemParent(item, user.RootId) rows.append(self._mergeItem(call, user.Provider, item, id, parents, separator, timestamp)) call.addBatch() if enumerator.RowCount > 0: call.executeBatch() call.close() print("DataBase._updateFolderContent() %s - %s" % (all(rows), len(rows))) return all(rows)
def insertUser(self, user, root): userid = self.Provider.getUserId(user) username = self.Provider.getUserName(user) displayname = self.Provider.getUserDisplayName(user) rootid = self.Provider.getRootId(root) timestamp = parseDateTime() insert = self._getDataSourceCall('insertUser') insert.setString(1, username) insert.setString(2, displayname) insert.setString(3, rootid) insert.setTimestamp(4, timestamp) insert.setString(5, userid) insert.execute() insert.close() if not self._executeRootCall('update', userid, root, timestamp): self._executeRootCall('insert', userid, root, timestamp) data = KeyMap() data.insertValue('UserId', userid) data.insertValue('UserName', username) data.insertValue('RootId', rootid) data.insertValue('RootName', self.Provider.getRootTitle(root)) return data
def insertUser(self, provider, user, root): userid = provider.getUserId(user) username = provider.getUserName(user) displayname = provider.getUserDisplayName(user) rootid = provider.getRootId(root) rootname = provider.getRootTitle(root) timestamp = parseDateTime() insert = self._getCall('insertUser') insert.setString(1, username) insert.setString(2, displayname) insert.setString(3, rootid) insert.setTimestamp(4, timestamp) insert.setString(5, userid) insert.execute() insert.close() self._mergeRoot(provider, userid, rootid, rootname, root, timestamp) data = KeyMap() data.insertValue('UserId', userid) data.insertValue('UserName', username) data.insertValue('RootId', rootid) data.insertValue('RootName', rootname) data.insertValue('Token', '') return data
def _updateFolderContent(self, request, user, content): updated = [] c1 = self._getDataSourceCall('updateItem') c2 = self._getDataSourceCall('updateCapability') c3 = self._getDataSourceCall('insertItem') c4 = self._getDataSourceCall('insertCapability') c5 = self._getDataSourceCall('deleteParent') c6 = self._getDataSourceCall('insertParent') userid = user.getValue('UserId') rootid = user.getValue('RootId') timestamp = parseDateTime() enumerator = self.Provider.getFolderContent(request, content) while enumerator.hasMoreElements(): item = enumerator.nextElement() print("datasource._updateFolderContent() %s" % (item, )) updated.append(self._mergeItem(c1, c2, c3, c4, c5, c6, userid, rootid, item, timestamp)) c1.close() c2.close() c3.close() c4.close() c5.close() c6.close() return all(updated)
def getContent(self): try: if self.IsNew: timestamp = parseDateTime() isfolder = self.DataSource.Provider.isFolder(self._ContentType) isdocument = self.DataSource.Provider.isDocument( self._ContentType) data = KeyMap() data.insertValue('Id', self.Id) data.insertValue('ObjectId', self.Id) data.insertValue('Title', '') data.insertValue('TitleOnServer', '') data.insertValue('DateCreated', timestamp) data.insertValue('DateModified', timestamp) data.insertValue('ContentType', self._ContentType) mediatype = self._ContentType if isfolder else '' data.insertValue('MediaType', mediatype) data.insertValue('Size', 0) data.insertValue('Trashed', False) data.insertValue('IsRoot', self.IsRoot) data.insertValue('IsFolder', isfolder) data.insertValue('IsDocument', isdocument) data.insertValue('CanAddChild', True) data.insertValue('CanRename', True) data.insertValue('IsReadOnly', False) data.insertValue('IsVersionable', isdocument) data.insertValue('Loaded', True) else: data = self.User.getItem(self.DataSource, self.MetaData) data.insertValue('BaseURI', self.MetaData.getValue('BaseURI')) content = Content(self.ctx, self, data) #content.initialize() return content except Exception as e: print("Identifier.getContent() ERROR: %s - %s" % (e, traceback.print_exc()))
def updateContent(self, userid, itemid, property, value): try: updated = False if property == 'Title': update = self._getCall('updateTitle') update.setString(1, value) update.setString(2, itemid) updated = update.execute() == 0 update.close() elif property == 'Size': update = self._getCall('updateSize') update.setLong(1, value) update.setString(2, itemid) updated = update.execute() == 0 update.close() elif property == 'Trashed': update = self._getCall('updateTrashed') update.setBoolean(1, value) update.setString(2, itemid) updated = update.execute() == 0 update.close() if updated: # TODO: I cannot use a procedure performing the two UPDATE # TODO: without the system versioning malfunctioning... # TODO: As a workaround I use two successive UPDATE queries timestamp = parseDateTime() update = self._getCall('updateCapabilities') update.setTimestamp(1, timestamp) update.setString(2, userid) update.setString(3, itemid) update.execute() update.close() self.sync.set() print("DataBase.updateContent() OK") except Exception as e: print("DataBase.updateContent().Error: %s - %s" % (e, traceback.print_exc()))
def insertNewContent(self, content): print("Identifier.insertNewContent() 1") timestamp = parseDateTime() return self.User.DataBase.insertNewContent(self.User.Id, self.Id, self.ParentId, content, timestamp)
def insertNewContent(self, content): timestamp = parseDateTime() return self.User.DataBase.insertNewContent(self.User.Id, self.Id, self.ParentId, content, timestamp)
def parseDateTime(self, timestamp, format='%Y-%m-%dT%H:%M:%S.%fZ'): return parseDateTime(timestamp, format)