def _load_tiddler(self, tiddler, stiddler): try: if tiddler.revision: stiddler.rev = tiddler.revision revision = stiddler.revision() else: revision = stiddler.current_revision tiddler.modifier = revision.modifier tiddler.modified = revision.modified tiddler.revision = revision.number tiddler.type = revision.type if tiddler.type and tiddler.type != 'None' and not tiddler.type.startswith( 'text/'): tiddler.text = b64decode(revision.text.lstrip().rstrip()) else: tiddler.text = revision.text tiddler.tags = self._load_tags(revision.tags) for sfield in revision.fields: tiddler.fields[sfield.name] = sfield.value tiddler.created = stiddler.created() tiddler.creator = stiddler.creator() return tiddler except IndexError, exc: raise NoTiddlerError('No revision %s for tiddler %s, %s' % (stiddler.rev, stiddler.title, exc))
def list_tiddler_revisions(self, tiddler): try: stiddler = (self.session.query(sTiddler).filter( sTiddler.title == tiddler.title).filter( sTiddler.bag_name == tiddler.bag).one()) except NoResultFound, exc: raise NoTiddlerError('tiddler %s not found, %s' % (tiddler.title, exc))
def tiddler_get(self, tiddler): try: stiddler = (self.session.query(sTiddler). filter(sTiddler.title==tiddler.title). filter(sTiddler.bag_name==tiddler.bag).one()) tiddler = self._load_tiddler(tiddler, stiddler) return tiddler except NoResultFound, exc: raise NoTiddlerError('Tiddler %s not found: %s' % (tiddler.title, exc))
def tiddler_delete(self, tiddler): try: stiddler = (self.session.query(sTiddler).filter( sTiddler.title == tiddler.title).filter( sTiddler.bag_name == tiddler.bag).one()) self.session.delete(stiddler) self.session.commit() self.tiddler_written(tiddler) except NoResultFound, exc: raise NoTiddlerError('no tiddler %s to delete, %s' % (tiddler.title, exc))
def list_tiddler_revisions(self, tiddler): revisions = [row[0] for row in select([revision_table.c.number], whereclause=and_( revision_table.c.tiddler_title==tiddler.title, revision_table.c.bag_name==tiddler.bag), order_by=desc(revision_table.c.number), bind=self.session.get_bind(None)).execute()] if not revisions: raise NoTiddlerError('tiddler %s not found' % (tiddler.title,)) else: return revisions
def tiddler_put(self, tiddler): """ Write a tiddler into the store. We only write if the bag already exists. Bag creation is a separate action from writing to a bag. """ tiddler_base_filename = self._tiddler_base_filename(tiddler) if not os.path.exists(tiddler_base_filename): try: os.mkdir(tiddler_base_filename) except OSError, exc: raise NoTiddlerError('unable to put tiddler: %s' % exc)
def list_tiddler_revisions(self, tiddler): """ List all the revisions of one tiddler, returning a list of ints. """ tiddler_base_filename = self._tiddler_base_filename(tiddler) try: revisions = sorted( int(x) for x in self._numeric_files_in_dir(tiddler_base_filename)) except OSError, exc: raise NoTiddlerError('unable to list revisions in tiddler: %s' % exc)
def tiddler_delete(self, tiddler): """ Irrevocably remove a tiddler and its directory. """ try: tiddler_base_filename = self._tiddler_base_filename(tiddler) if not os.path.exists(tiddler_base_filename): raise NoTiddlerError('%s not present' % tiddler_base_filename) shutil.rmtree(tiddler_base_filename) except NoTiddlerError: raise except Exception, exc: raise IOError('unable to delete %s: %s' % (tiddler.title, exc))
def tiddler_delete(self, tiddler): """ Irrevocably remove :py:class:`tiddler <tiddlyweb.model.tiddler.Tiddler>` from the filesystem. """ try: tiddler_base_filename = self._tiddler_base_filename(tiddler) if not os.path.exists(tiddler_base_filename): raise NoTiddlerError('%s not present' % tiddler_base_filename) shutil.rmtree(tiddler_base_filename) except NoTiddlerError: raise except Exception as exc: raise IOError('unable to delete %s: %s' % (tiddler.title, exc))
def list_tiddler_revisions(self, tiddler): """ List all the revisions of one :py:class:`tiddler <tiddlyweb.model.tiddler.Tiddler>`, returning a list of ints. """ tiddler_base_filename = self._tiddler_base_filename(tiddler) try: revisions = sorted( int(x) for x in self._numeric_files_in_dir(tiddler_base_filename)) except OSError as exc: raise NoTiddlerError('unable to list revisions in tiddler: %s' % exc) revisions.reverse() return revisions
def _tiddler_base_filename(self, tiddler): """ Return the string that is the pathname to a tiddler's directory. """ # should we get a Bag or a name here? bag_name = tiddler.bag store_dir = self._tiddlers_dir(bag_name) if not os.path.exists(store_dir): raise NoBagError('%s does not exist' % store_dir) try: return os.path.join(store_dir, _encode_filename(tiddler.title)) except StoreEncodingError as exc: raise NoTiddlerError(exc)
def tiddler_get(self, tiddler): full_access = self._determine_user_access() open_fields = self.environ['tiddlyweb.config'].get( 'mappingsql.open_fields', []) tasters = self.environ['tiddlyweb.config'].get('mappingsql.tasters', False) self._validate_bag_name(tiddler.bag) try: if tasters and not full_access: stiddler = self.session.query(sTiddler).filter( getattr(sTiddler, self.id_column) == tiddler.title).filter( sTiddler.taster == 'Y').one() else: stiddler = self.session.query(sTiddler).filter( getattr(sTiddler, self.id_column) == tiddler.title).one() except NoResultFound, exc: raise NoTiddlerError('tiddler %s not found, %s' % (tiddler.title, exc))
def _tiddler_revision_filename(self, tiddler, index=0): """ Calculate the revision filename for the tiddler revision we want. """ revision = 0 if tiddler.revision: revision = tiddler.revision else: revisions = self.list_tiddler_revisions(tiddler) if revisions: revision = revisions[index] try: revision = int(revision) except ValueError: raise NoTiddlerError('%s is not a valid revision id' % revision) return revision
def tiddler_get(self, tiddler): """ Fill :py:class:`tiddler <tiddlyweb.model.tiddler.Tiddler>` with data from the store. """ try: # read in the desired tiddler tiddler = self._read_tiddler_revision(tiddler) # now make another tiddler to get created time first_rev = Tiddler(tiddler.title) first_rev.bag = tiddler.bag first_rev = self._read_tiddler_revision(first_rev, index=-1) # set created on new tiddler from modified on first_rev # (might be the same) tiddler.created = first_rev.modified tiddler.creator = first_rev.modifier return tiddler except IOError as exc: raise NoTiddlerError('no tiddler for %s: %s' % (tiddler.title, exc))
def tiddler_get(self, tiddler): """ Get a tiddler as string from a bag and deserialize it into object. """ try: # read in the desired tiddler tiddler = self._read_tiddler_revision(tiddler) # now make another tiddler to get created time # base_tiddler is the head of the revision stack base_tiddler = Tiddler(tiddler.title) base_tiddler.bag = tiddler.bag base_tiddler = self._read_tiddler_revision(base_tiddler, index=-1) # set created on new tiddler from modified on base_tiddler # (might be the same) tiddler.created = base_tiddler.modified tiddler.creator = base_tiddler.modifier return tiddler except IOError, exc: raise NoTiddlerError('no tiddler for %s: %s' % (tiddler.title, exc))
def tiddler_put(self, tiddler): """ Write a :py:class:`tiddler <tiddlyweb.model.tiddler.Tiddler>` into the store. We only write if the tiddler's :py:class:`bag <tiddlyweb.model.bag.Bag>` already exists. Bag creation is a separate action. """ tiddler_base_filename = self._tiddler_base_filename(tiddler) if not os.path.exists(tiddler_base_filename): try: os.mkdir(tiddler_base_filename) except OSError as exc: raise NoTiddlerError('unable to put tiddler: %s' % exc) locked = 0 lock_attempts = 0 while not locked: try: lock_attempts = lock_attempts + 1 write_lock(tiddler_base_filename) locked = 1 except LockError as exc: if lock_attempts > 4: raise StoreLockError(exc) time.sleep(.1) # Protect against incoming tiddlers that have revision # set. Since we are putting a new one, we want the system # to calculate. tiddler.revision = None revision = self._tiddler_revision_filename(tiddler) + 1 tiddler_filename = self._tiddler_full_filename(tiddler, revision) representation = self.serializer.serialization.tiddler_as(tiddler, omit_empty=True, omit_members=['creator']) write_utf8_file(tiddler_filename, representation) write_unlock(tiddler_base_filename) tiddler.revision = revision