Example #1
0
    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))
Example #2
0
 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))
Example #3
0
 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))
Example #4
0
 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))
Example #5
0
 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
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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))
Example #9
0
 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))
Example #10
0
 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
Example #11
0
    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)
Example #12
0
 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))
Example #13
0
    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
Example #14
0
 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))
Example #15
0
 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))
Example #16
0
    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