~m4v/scratbot-plugins/spaces

« back to all changes in this revision

Viewing changes to objects.py

  • Committer: Elián Hanisch
  • Date: 2010-01-16 17:17:38 UTC
  • mfrom: (142.4.47 Factos-history)
  • Revision ID: lambdae2@gmail.com-20100116171738-bonpipqpkzl1ly3z
merge with history refactoring branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
503
503
    def __len__(self):
504
504
        return len(self.host)
505
505
 
506
 
# TODO the whole history index stuff needs to be refactored
507
 
# make it simpler if possible, following this code is already too brain cracking for me
508
506
class FactosSqliteDB(databases.ChannelSqliteDB):
509
507
    """Class for manipulating the sqlite database in Supybot, with methods specific to the Factos
510
508
    plugin."""
511
509
 
512
 
    def __init__(self, filename, tableFact, tableHist, tableUser):
 
510
    def __init__(self, filename, tableFact, tableHist, tableHistRedo, tableUser):
513
511
        self.__parent = super(FactosSqliteDB, self)
514
512
        self.__parent.__init__(filename)
515
513
 
516
514
        self.tableFact = tableFact
517
515
        self.tableHist = tableHist
 
516
        self.tableHistRedo = tableHistRedo
518
517
        self.tableUser = tableUser
519
518
        tableVersion = databases.Table(tblVersionStruct, 'version')
520
519
        # check database and update it if needed
617
616
        """Gets the next id for users."""
618
617
        return self.newId('user_id', select='user_id', order='user_id DESC', **kwargs)
619
618
 
620
 
    def newHistId(self, name, **kwargs):
 
619
    def newHistId(self, name, prefix, **kwargs):
621
620
        """Gets the next id for a history record of a particular fact."""
622
 
        key = 'hist_' + name # otherwise a fact called 'user_id' can screw everything.
623
 
        id = self.newId(key, select='history_id', where='name', equal=name, default=1, order='history_id DESC',
 
621
        key = prefix + name # otherwise a fact called 'user_id' can screw everything.
 
622
        id = self.newId(key, select='history_id', where='name', equal=name, order='history_id DESC',
624
623
                **kwargs)
625
 
        if not id > 0:
626
 
            id = 1
 
624
        if id or id == 0:
627
625
            self.indexes[key] = id
628
626
        return id
629
627
 
630
 
    def getHist(self, where=None, **kwargs):
 
628
    def getHist(self, where=None, table=None, **kwargs):
631
629
        """Fetchs rows from the history table."""
632
630
        if not where:
633
631
            where = 'name'
634
 
        return self.__parent.get(table=self.tableHist, where=where, order='history_id', **kwargs)
 
632
        return self.__parent.get(table=table or self.tableHist, where=where, order='history_id DESC', **kwargs)
635
633
 
636
 
    def addHist(self, values, channel=None):
 
634
    def addHist(self, values, table=None, prefix='undo', channel=None):
637
635
        """Adds new history record."""
638
 
        self.setup(self.tableHist, channel=channel, create=True)
639
 
        values['history_id'] = self.newHistId(values['name'])
 
636
        self.setup(table or self.tableHist, channel=channel, create=True)
 
637
        id = self.newHistId(values['name'], prefix)
 
638
        assert id >= 0
 
639
        values['history_id'] = id
640
640
        self._insert(values)
641
641
 
642
 
    def updateHist(self, hist, current_id, new_id):
 
642
    def updateHist(self, hist, history_id, undo=True, channel=None):
643
643
        """Updates history when performing an undo or redo operation, undo history has positive indexes,
644
644
        while redo are negative."""
645
 
        if self.setup(self.tableHist):
646
 
            hist['history_id'] = new_id
647
 
            name = hist['name']
648
 
            self.update(hist, where='name=\'%s\' and history_id=\'%s\'' %(name, current_id))
 
645
        name = hist['name']
 
646
        if undo:
 
647
            table = self.tableHist
 
648
            key = 'undo' + name
 
649
        else:
 
650
            table = self.tableHistRedo
 
651
            key = 'redo' + name
 
652
        if self.setup(table, channel=channel):
649
653
            try:
650
 
                key = 'hist_' + name
651
654
                id = self.indexes[key]
652
655
            except KeyError:
653
656
                id = self.getOne(select='history_id', where='name', equal=name,
654
657
                        order='history_id DESC')
655
658
                id = int(id[0])
656
 
            if current_id > 0:
657
 
                # we did an undo, reduce index by one
658
 
                self.indexes[key] = id - 1
659
 
            elif current_id < 0:
660
 
                # we did a redo, increase index by one
661
 
                self.indexes[key] = id + 1
 
659
            self.indexes[key] = id - 1
 
660
            self.delete('name=\'%s\' and history_id=\'%s\'' %(name, history_id))
 
661
            if undo:
 
662
                table = self.tableHistRedo
 
663
                action = 'redo'
 
664
            else:
 
665
                table = self.tableHist
 
666
                action = 'undo'
 
667
            self.addHist(hist, table=table, prefix=action, channel=channel)
662
668
 
663
669
    def getUserById(self, user_id):
664
670
        """Returns a user that matches user_id in the cache or database."""