All pastes #884619 Raw Edit

dbobjects.py

public python v1 · immutable
#884619 ·published 2008-01-30 14:14 UTC
rendered paste body
import loggingimport sysimport gcimport oslogging.basicConfig()log = logging.getLogger("dbobjects")log.setLevel(logging.INFO)if (sys.version_info[0] == 2 and sys.version_info[1] < 4) or sys.version_info[0] < 2:    log.exception("Unable to load library.  This library requires Python 2.4 or newer")    raise Exception("Incorrect python version - use python 2.4 or higher")from sqlobject import *from sqlobject.sqlbuilder import *# CREATE TABLE imports ( id INTEGER PRIM ARY KEY NOT NULL, time INTEGER# );# CREATE TABLE meta ( id INTEGER PRIMARY KEY NOT NULL, name TEXT UNIQUE#                                 NOT NULL, data TEXT );# CREATE TABLE photo_tags ( photo_id INTEGER, tag_id INTE GER );# CREATE TABLE photo_versions ( photo_id INTEGER, version _id INTEGER,# name STRING );# CREATE TABLE photos ( id INTEGER PRIMARY KEY NOT NULL, time INTEGER# NOT NULL, directory_path STRING NOT NULL, name STRING NOT NULL,# description TEXT NOT NU LL, default_version_id INTEGER NOT NULL );# CREATE TABLE tags ( id INTEGER PR IMARY KEY NOT NULL, name TEXT# UNIQUE, cate gory_id INTEGER, is_category BOOLEAN, sort_priority# INTEGER, icon TEXT );class PhotoVersion:    def __init__(self, id, name, photo):        self.id = id        self.name = name        self.photo = photo        self.isDefault = id == photo.defaultVersionId        def getFilename(self):        return self.photo.directoryPath + os.sep + os.path.splitext(self.photo.name)[0] + " (" + self.name + ")"  + os.path.splitext(self.photo.name)[1]    class Photo(SQLObject):    class sqlmeta:        table = "photos"    time = IntCol()    directoryPath = UnicodeCol(notNone=True)    name = UnicodeCol(notNone=True)    description = StringCol(notNone=True)    defaultVersionId = IntCol(notNone=True)    tags = RelatedJoin('Tag', intermediateTable='photo_tags',                              joinColumn='photo_id', otherColumn='tag_id')    versions = None    def getFilename(self, forceOriginal=False, version=None, cache=None):        if version:            try: return self.getVersions(cache)[int(version)].getFilename()            except: pass        if self.defaultVersionId > 1 and not forceOriginal:            return self.getVersions(cache)[self.defaultVersionId].getFilename()        else:            return self.directoryPath + os.sep + self.name        # we can't have a photo_versions object because the column has no id    def getVersions(self, cache=None):        """        Performs an SQL query to get all of the versions of this file.  After this        has been called once, it will store the data for future instances.                @param cache:  an SQLCache object if desired. This allows saving some of the        results in RAM for future use.        """        if self.versions: return self.versions        self.versions = {}        query = """SELECT version_id, name FROM photo_versions WHERE photo_id=%d""" % (self.id)        if not cache:            res = self._connection.queryAll(query)        else:            res = cache.execute(query)        for r in res:            self.versions[r[0]] = PhotoVersion(r[0], r[1], self)        return self.versions            class TagRepr:    """Representation of a tag that is not dependent on SQLObject.        This class is used when we do things with tags that don't require the    SQLObject interface but still need an object oriented interface    """    def __init__(self, id=None, name=None, categoryId=None, numPhotos=None):        self.id = id        self.name = name        self.categoryId = categoryId        self.numPhotos=numPhotos        class Tag(SQLObject):    class sqlmeta:        table = "tags"    name = UnicodeCol(notNone=True, alternateID=True)    categoryId = IntCol()    isCategory = BoolCol()    sortPriority = IntCol()    icon = StringCol()    children = MultipleJoin('Tag', joinColumn='category_id')    def toTagRepr(self):        return TagRep(it=self.id, name=self.name, categoryId=self.categoryId)    def expire_all():    """Simple function to expire the cache from everything.  Call    it periodically to keep stuff happy    taken from: http://mikewatkins.net/categories/technical/2004-07-14-1.html    """    c = Study._connection    for k in c.cache.caches.keys():        c.cache.caches[k].expireAll()    gc.collect()def setConnection(conn):    for x in [y for y in globals().values() if hasattr(y,'setConnection')              and y.__class__.__name__ == 'DeclarativeMeta'              and not y.__module__.startswith('sqlobject')]:        x.setConnection(conn)        print "setting connection on ", xdef connect(uri, debug=False, cache=None, process=True):    global connection    global sqlhub        connection = connectionForURI(uri)    if process:        sqlhub.processConnection = connection    if debug:        connection.debug = True    if cache != None:        connection.cache = cache    return connection