]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
improve mappings
[dak.git] / daklib / dbconn.py
index 9801fdfdf25017121d9804e11d16a1d3d7d2adc1..23fff4f4ffaf3061c4750b8d9eba815490b326e5 100755 (executable)
@@ -37,8 +37,10 @@ import os
 import psycopg2
 import traceback
 
+from sqlalchemy import create_engine, Table, MetaData, select
+from sqlalchemy.orm import sessionmaker, mapper, relation
+
 from singleton import Singleton
-from config import Config
 
 ################################################################################
 
@@ -47,7 +49,7 @@ class Cache(object):
         if hashfunc:
             self.hashfunc = hashfunc
         else:
-            self.hashfunc = lambda x: x['value']
+            self.hashfunc = lambda x: str(x)
 
         self.data = {}
 
@@ -59,6 +61,207 @@ class Cache(object):
 
 ################################################################################
 
+class Architecture(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Architecture %s>' % self.arch_string
+
+class Archive(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Archive %s>' % self.name
+
+class BinAssociation(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<BinAssociation %s (%s, %s)>' % (self.ba_id, self.binary, self.suite)
+
+class Binary(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Binary %s (%s, %s)>' % (self.package, self.version, self.architecture)
+
+def binary_from_id(id):
+    return DBConn().session().query(Binary).filter_by(binary_id=id).one()
+
+class Component(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Component %s>' % self.component_name
+
+class DBConfig(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<DBConfig %s>' % self.name
+
+class ContentFilename(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<ContentFilename %s>' % self.filename
+
+class ContentFilepath(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<ContentFilepath %s>' % self.filepath
+
+class ContentAssociations(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<ContentAssociation %s>' % self.ca_id
+
+class DSCFile(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<DSCFile %s>' % self.dscfile_id
+
+class PoolFile(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<PoolFile %s>' % self.filename
+
+class Fingerprint(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Fingerprint %s>' % self.fingerprint
+
+class Keyring(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Keyring %s>' % self.keyring_name
+
+class Location(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Location %s (%s)>' % (self.path, self.location_id)
+
+class Maintainer(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '''<Maintainer '%s' (%s)>''' % (self.name, self.maintainer_id)
+
+class Override(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Override %s (%s)>' % (self.package, self.suite_id)
+
+class OverrideType(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<OverrideType %s>' % self.overridetype
+
+class PendingContentAssociation(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<PendingContentAssociation %s>' % self.pca_id
+
+class Priority(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Priority %s (%s)>' % (self.priority, self.priority_id)
+
+class Queue(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Queue %s>' % self.queue_name
+
+class QueueBuild(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<QueueBuild %s (%s)>' % (self.filename, self.queue_id)
+
+class Section(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Section %s>' % self.section
+
+class Source(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Source %s (%s)>' % (self.source, self.version)
+
+class SrcAssociation(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<SrcAssociation %s (%s, %s)>' % (self.sa_id, self.source, self.suite)
+
+class SrcUploader(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<SrcUploader %s>' % self.uploader_id
+
+class Suite(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Suite %s>' % self.suite_name
+
+class SuiteArchitecture(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<SuiteArchitecture (%s, %s)>' % (self.suite_id, self.arch_id)
+
+class Uid(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __repr__(self):
+        return '<Uid %s (%s)>' % (self.uid, self.name)
+
+################################################################################
+
 class DBConn(Singleton):
     """
     database module init.
@@ -70,25 +273,241 @@ class DBConn(Singleton):
         self.__createconn()
         self.__init_caches()
 
+    def __setuptables(self):
+        self.tbl_architecture = Table('architecture', self.db_meta, autoload=True)
+        self.tbl_archive = Table('archive', self.db_meta, autoload=True)
+        self.tbl_bin_associations = Table('bin_associations', self.db_meta, autoload=True)
+        self.tbl_binaries = Table('binaries', self.db_meta, autoload=True)
+        self.tbl_component = Table('component', self.db_meta, autoload=True)
+        self.tbl_config = Table('config', self.db_meta, autoload=True)
+        self.tbl_content_associations = Table('content_associations', self.db_meta, autoload=True)
+        self.tbl_content_file_names = Table('content_file_names', self.db_meta, autoload=True)
+        self.tbl_content_file_paths = Table('content_file_paths', self.db_meta, autoload=True)
+        self.tbl_dsc_files = Table('dsc_files', self.db_meta, autoload=True)
+        self.tbl_files = Table('files', self.db_meta, autoload=True)
+        self.tbl_fingerprint = Table('fingerprint', self.db_meta, autoload=True)
+        self.tbl_keyrings = Table('keyrings', self.db_meta, autoload=True)
+        self.tbl_location = Table('location', self.db_meta, autoload=True)
+        self.tbl_maintainer = Table('maintainer', self.db_meta, autoload=True)
+        self.tbl_override = Table('override', self.db_meta, autoload=True)
+        self.tbl_override_type = Table('override_type', self.db_meta, autoload=True)
+        self.tbl_pending_content_associations = Table('pending_content_associations', self.db_meta, autoload=True)
+        self.tbl_priority = Table('priority', self.db_meta, autoload=True)
+        self.tbl_queue = Table('queue', self.db_meta, autoload=True)
+        self.tbl_queue_build = Table('queue_build', self.db_meta, autoload=True)
+        self.tbl_section = Table('section', self.db_meta, autoload=True)
+        self.tbl_source = Table('source', self.db_meta, autoload=True)
+        self.tbl_src_associations = Table('src_associations', self.db_meta, autoload=True)
+        self.tbl_src_uploaders = Table('src_uploaders', self.db_meta, autoload=True)
+        self.tbl_suite = Table('suite', self.db_meta, autoload=True)
+        self.tbl_suite_architectures = Table('suite_architectures', self.db_meta, autoload=True)
+        self.tbl_uid = Table('uid', self.db_meta, autoload=True)
+
+    def __setupmappers(self):
+        mapper(Architecture, self.tbl_architecture,
+               properties = dict(arch_id = self.tbl_architecture.c.id))
+
+        mapper(Archive, self.tbl_archive,
+               properties = dict(archive_id = self.tbl_archive.c.id,
+                                 archive_name = self.tbl_archive.c.name))
+
+        mapper(BinAssociation, self.tbl_bin_associations,
+               properties = dict(ba_id = self.tbl_bin_associations.c.id,
+                                 suite_id = self.tbl_bin_associations.c.suite,
+                                 suite = relation(Suite),
+                                 binary_id = self.tbl_bin_associations.c.bin,
+                                 binary = relation(Binary)))
+
+        mapper(Binary, self.tbl_binaries,
+               properties = dict(binary_id = self.tbl_binaries.c.id,
+                                 package = self.tbl_binaries.c.package,
+                                 version = self.tbl_binaries.c.version,
+                                 maintainer_id = self.tbl_binaries.c.maintainer,
+                                 maintainer = relation(Maintainer),
+                                 source_id = self.tbl_binaries.c.source,
+                                 source = relation(Source),
+                                 arch_id = self.tbl_binaries.c.architecture,
+                                 architecture = relation(Architecture),
+                                 poolfile_id = self.tbl_binaries.c.file,
+                                 poolfile = relation(PoolFile),
+                                 binarytype = self.tbl_binaries.c.type,
+                                 fingerprint_id = self.tbl_binaries.c.sig_fpr,
+                                 fingerprint = relation(Fingerprint),
+                                 install_date = self.tbl_binaries.c.install_date,
+                                 binassociations = relation(BinAssociation,
+                                                            primaryjoin=(self.tbl_binaries.c.id==self.tbl_bin_associations.c.bin))))
+
+        mapper(Component, self.tbl_component,
+               properties = dict(component_id = self.tbl_component.c.id,
+                                 component_name = self.tbl_component.c.name))
+
+        mapper(DBConfig, self.tbl_config,
+               properties = dict(config_id = self.tbl_config.c.id))
+
+        mapper(ContentAssociations, self.tbl_content_associations,
+               properties = dict(ca_id = self.tbl_content_associations.c.id,
+                                 filename_id = self.tbl_content_associations.c.filename,
+                                 filename    = relation(ContentFilename),
+                                 filepath_id = self.tbl_content_associations.c.filepath,
+                                 filepath    = relation(ContentFilepath),
+                                 binary_id   = self.tbl_content_associations.c.binary_pkg,
+                                 binary      = relation(Binary)))
+
+
+        mapper(ContentFilename, self.tbl_content_file_names,
+               properties = dict(cafilename_id = self.tbl_content_file_names.c.id,
+                                 filename = self.tbl_content_file_names.c.file))
+
+        mapper(ContentFilepath, self.tbl_content_file_paths,
+               properties = dict(cafilepath_id = self.tbl_content_file_paths.c.id,
+                                 filepath = self.tbl_content_file_paths.c.path))
+
+        mapper(DSCFile, self.tbl_dsc_files,
+               properties = dict(dscfile_id = self.tbl_dsc_files.c.id,
+                                 source_id = self.tbl_dsc_files.c.source,
+                                 source = relation(Source),
+                                 poolfile_id = self.tbl_dsc_files.c.file,
+                                 poolfile = relation(PoolFile)))
+
+        mapper(PoolFile, self.tbl_files,
+               properties = dict(file_id = self.tbl_files.c.id,
+                                 filesize = self.tbl_files.c.size,
+                                 location_id = self.tbl_files.c.location,
+                                 location = relation(Location)))
+
+        mapper(Fingerprint, self.tbl_fingerprint,
+               properties = dict(fingerprint_id = self.tbl_fingerprint.c.id,
+                                 uid_id = self.tbl_fingerprint.c.uid,
+                                 uid = relation(Uid),
+                                 keyring_id = self.tbl_fingerprint.c.keyring,
+                                 keyring = relation(Keyring)))
+
+        mapper(Keyring, self.tbl_keyrings,
+               properties = dict(keyring_name = self.tbl_keyrings.c.name,
+                                 keyring_id = self.tbl_keyrings.c.id))
+
+        mapper(Location, self.tbl_location,
+               properties = dict(location_id = self.tbl_location.c.id,
+                                 component_id = self.tbl_location.c.component,
+                                 component = relation(Component),
+                                 archive_id = self.tbl_location.c.archive,
+                                 archive = relation(Archive),
+                                 archive_type = self.tbl_location.c.type))
+
+        mapper(Maintainer, self.tbl_maintainer,
+               properties = dict(maintainer_id = self.tbl_maintainer.c.id))
+
+        mapper(Override, self.tbl_override,
+               properties = dict(suite_id = self.tbl_override.c.suite,
+                                 suite = relation(Suite),
+                                 component_id = self.tbl_override.c.component,
+                                 component = relation(Component),
+                                 priority_id = self.tbl_override.c.priority,
+                                 priority = relation(Priority),
+                                 section_id = self.tbl_override.c.section,
+                                 section = relation(Section),
+                                 overridetype_id = self.tbl_override.c.type,
+                                 overridetype = relation(OverrideType)))
+
+        mapper(OverrideType, self.tbl_override_type,
+               properties = dict(overridetype = self.tbl_override_type.c.type,
+                                 overridetype_id = self.tbl_override_type.c.id))
+
+        mapper(PendingContentAssociation, self.tbl_pending_content_associations,
+               properties = dict(pca_id = self.tbl_pending_content_associations.c.id,
+                                 filepath_id = self.tbl_pending_content_associations.c.filepath,
+                                 filepath = relation(ContentFilepath),
+                                 filename_id = self.tbl_pending_content_associations.c.filename,
+                                 filename = relation(ContentFilename)))
+
+        mapper(Priority, self.tbl_priority,
+               properties = dict(priority_id = self.tbl_priority.c.id))
+
+        mapper(Queue, self.tbl_queue,
+               properties = dict(queue_id = self.tbl_queue.c.id))
+
+        mapper(QueueBuild, self.tbl_queue_build,
+               properties = dict(suite_id = self.tbl_queue_build.c.suite,
+                                 queue_id = self.tbl_queue_build.c.queue,
+                                 queue = relation(Queue)))
+
+        mapper(Section, self.tbl_section,
+               properties = dict(section_id = self.tbl_section.c.id))
+
+        mapper(Source, self.tbl_source,
+               properties = dict(source_id = self.tbl_source.c.id,
+                                 version = self.tbl_source.c.version,
+                                 maintainer_id = self.tbl_source.c.maintainer,
+                                 maintainer = relation(Maintainer,
+                                                       primaryjoin=(self.tbl_source.c.maintainer==self.tbl_maintainer.c.id)),
+                                 poolfile_id = self.tbl_source.c.file,
+                                 poolfile = relation(PoolFile),
+                                 fingerprint_id = self.tbl_source.c.sig_fpr,
+                                 fingerprint = relation(Fingerprint),
+                                 changedby_id = self.tbl_source.c.changedby,
+                                 changedby = relation(Maintainer,
+                                                      primaryjoin=(self.tbl_source.c.changedby==self.tbl_maintainer.c.id)),
+                                 srcfiles = relation(DSCFile,
+                                                     primaryjoin=(self.tbl_source.c.id==self.tbl_dsc_files.c.source)),
+                                 srcassociations = relation(SrcAssociation,
+                                                            primaryjoin=(self.tbl_source.c.id==self.tbl_src_associations.c.source))))
+
+        mapper(SrcAssociation, self.tbl_src_associations,
+               properties = dict(sa_id = self.tbl_src_associations.c.id,
+                                 suite_id = self.tbl_src_associations.c.suite,
+                                 suite = relation(Suite),
+                                 source_id = self.tbl_src_associations.c.source,
+                                 source = relation(Source)))
+
+        mapper(SrcUploader, self.tbl_src_uploaders,
+               properties = dict(uploader_id = self.tbl_src_uploaders.c.id,
+                                 source_id = self.tbl_src_uploaders.c.source,
+                                 source = relation(Source,
+                                                   primaryjoin=(self.tbl_src_uploaders.c.source==self.tbl_source.c.id)),
+                                 maintainer_id = self.tbl_src_uploaders.c.maintainer,
+                                 maintainer = relation(Maintainer,
+                                                       primaryjoin=(self.tbl_src_uploaders.c.maintainer==self.tbl_maintainer.c.id))))
+
+        mapper(Suite, self.tbl_suite,
+               properties = dict(suite_id = self.tbl_suite.c.id))
+
+        mapper(SuiteArchitecture, self.tbl_suite_architectures,
+               properties = dict(suite_id = self.tbl_suite_architectures.c.suite,
+                                 suite = relation(Suite),
+                                 arch_id = self.tbl_suite_architectures.c.architecture,
+                                 architecture = relation(Architecture)))
+
+        mapper(Uid, self.tbl_uid,
+               properties = dict(uid_id = self.tbl_uid.c.id))
+
     ## Connection functions
     def __createconn(self):
+        from config import Config
         cnf = Config()
-        connstr = "dbname=%s" % cnf["DB::Name"]
         if cnf["DB::Host"]:
-           connstr += " host=%s" % cnf["DB::Host"]
-        if cnf["DB::Port"] and cnf["DB::Port"] != "-1":
-           connstr += " port=%s" % cnf["DB::Port"]
+            # TCP/IP
+            connstr = "postgres://%s" % cnf["DB::Host"]
+            if cnf["DB::Port"] and cnf["DB::Port"] != "-1":
+                connstr += ":%s" % cnf["DB::Port"]
+            connstr += "/%s" % cnf["DB::Name"]
+        else:
+            # Unix Socket
+            connstr = "postgres:///%s" % cnf["DB::Name"]
+            if cnf["DB::Port"] and cnf["DB::Port"] != "-1":
+                connstr += "?port=%s" % cnf["DB::Port"]
 
-        self.db_con = psycopg2.connect(connstr)
+        self.db_pg   = create_engine(connstr)
+        self.db_meta = MetaData()
+        self.db_meta.bind = self.db_pg
+        self.db_smaker = sessionmaker(bind=self.db_pg,
+                                      autoflush=True,
+                                      transactional=True)
 
-    def reconnect(self):
-        try:
-            self.db_con.close()
-        except psycopg2.InterfaceError:
-            pass
+        self.__setuptables()
+        self.__setupmappers()
 
-        self.db_con = None
-        self.__createconn()
+    def session(self):
+        return self.db_smaker()
 
     ## Cache functions
     def __init_caches(self):
@@ -117,45 +536,37 @@ class DBConn(Singleton):
 
     def prepare(self,name,statement):
         if not self.prepared_statements.has_key(name):
-            c = self.cursor()
-            c.execute(statement)
+            pgc.execute(statement)
             self.prepared_statements[name] = statement
 
     def clear_caches(self):
         self.__init_caches()
 
-    ## Functions to pass through to the database connector
-    def cursor(self):
-        return self.db_con.cursor()
-
-    def commit(self):
-        return self.db_con.commit()
-
     ## Get functions
-    def __get_single_id(self, query, values, cachename=None):
+    def __get_id(self, retfield, selectobj, cachekey, cachename=None):
         # This is a bit of a hack but it's an internal function only
         if cachename is not None:
-            res = self.caches[cachename].GetValue(values)
+            res = self.caches[cachename].GetValue(cachekey)
             if res:
                 return res
 
-        c = self.db_con.cursor()
-        c.execute(query, values)
+        c = selectobj.execute()
 
         if c.rowcount != 1:
             return None
 
-        res = c.fetchone()[0]
+        res = c.fetchone()
+
+        if retfield not in res.keys():
+            return None
+
+        res = res[retfield]
 
         if cachename is not None:
-            self.caches[cachename].SetValue(values, res)
+            self.caches[cachename].SetValue(cachekey, res)
 
         return res
 
-    def __get_id(self, retfield, table, qfield, value):
-        query = "SELECT %s FROM %s WHERE %s = %%(value)s" % (retfield, table, qfield)
-        return self.__get_single_id(query, {'value': value}, cachename=table)
-
     def get_suite_id(self, suite):
         """
         Returns database id for given C{suite}.
@@ -168,7 +579,10 @@ class DBConn(Singleton):
         @return: the database id for the given suite
 
         """
-        return int(self.__get_id('id', 'suite', 'suite_name', suite))
+        return int(self.__get_id('id',
+                                 self.tbl_suite.select(self.tbl_suite.columns.suite_name == suite),
+                                 suite,
+                                 'suite'))
 
     def get_section_id(self, section):
         """
@@ -182,7 +596,10 @@ class DBConn(Singleton):
         @return: the database id for the given section
 
         """
-        return self.__get_id('id', 'section', 'section', section)
+        return self.__get_id('id',
+                             self.tbl_section.select(self.tbl_section.columns.section == section),
+                             section,
+                             'section')
 
     def get_priority_id(self, priority):
         """
@@ -196,21 +613,27 @@ class DBConn(Singleton):
         @return: the database id for the given priority
 
         """
-        return self.__get_id('id', 'priority', 'priority', priority)
+        return self.__get_id('id',
+                             self.tbl_priority.select(self.tbl_priority.columns.priority == priority),
+                             priority,
+                             'priority')
 
     def get_override_type_id(self, override_type):
         """
         Returns database id for given override C{type}.
         Results are kept in a cache during runtime to minimize database queries.
 
-        @type type: string
-        @param type: The name of the override type
+        @type override_type: string
+        @param override_type: The name of the override type
 
         @rtype: int
         @return: the database id for the given override type
 
         """
-        return self.__get_id('id', 'override_type', 'type', override_type)
+        return self.__get_id('id',
+                             self.tbl_override_type.select(self.tbl_override_type.columns.type == override_type),
+                             override_type,
+                             'override_type')
 
     def get_architecture_id(self, architecture):
         """
@@ -224,7 +647,10 @@ class DBConn(Singleton):
         @return: the database id for the given architecture
 
         """
-        return self.__get_id('id', 'architecture', 'arch_string', architecture)
+        return self.__get_id('id',
+                             self.tbl_architecture.select(self.tbl_architecture.columns.arch_string == architecture),
+                             architecture,
+                             'architecture')
 
     def get_archive_id(self, archive):
         """
@@ -238,7 +664,11 @@ class DBConn(Singleton):
         @return: the database id for the given archive
 
         """
-        return self.__get_id('id', 'archive', 'lower(name)', archive)
+        archive = archive.lower()
+        return self.__get_id('id',
+                             self.tbl_archive.select(self.tbl_archive.columns.name == archive),
+                             archive,
+                             'archive')
 
     def get_component_id(self, component):
         """
@@ -252,7 +682,11 @@ class DBConn(Singleton):
         @return: the database id for the given component
 
         """
-        return self.__get_id('id', 'component', 'lower(name)', component)
+        component = component.lower()
+        return self.__get_id('id',
+                             self.tbl_component.select(self.tbl_component.columns.name == component),
+                             component.lower(),
+                             'component')
 
     def get_location_id(self, location, component, archive):
         """
@@ -265,36 +699,29 @@ class DBConn(Singleton):
         @type location: string
         @param location: the path of the location
 
-        @type component: int
-        @param component: the id of the component
+        @type component: string
+        @param component: the name of the component
 
-        @type archive: int
-        @param archive: the id of the archive
+        @type archive: string
+        @param archive: the name of the archive
 
         @rtype: int
         @return: the database id for the location
 
         """
 
-        archive_id = self.get_archive_id(archive)
+        archive = archive.lower()
+        component = component.lower()
 
-        if not archive_id:
-            return None
+        values = {'archive': archive, 'location': location, 'component': component}
 
-        res = None
+        s = self.tbl_location.join(self.tbl_archive).join(self.tbl_component)
 
-        if component:
-            component_id = self.get_component_id(component)
-            if component_id:
-                res = self.__get_single_id("SELECT id FROM location WHERE path=%(location)s AND component=%(component)s AND archive=%(archive)s",
-                        {'location': location,
-                         'archive': int(archive_id),
-                         'component': component_id}, cachename='location')
-        else:
-            res = self.__get_single_id("SELECT id FROM location WHERE path=%(location)s AND archive=%(archive)d",
-                    {'location': location, 'archive': archive_id, 'component': ''}, cachename='location')
+        s = s.select(self.tbl_location.columns.path == location)
+        s = s.where(self.tbl_archive.columns.name == archive)
+        s = s.where(self.tbl_component.columns.name == component)
 
-        return res
+        return self.__get_id('location.id', s, values, 'location')
 
     def get_source_id(self, source, version):
         """
@@ -313,8 +740,24 @@ class DBConn(Singleton):
         @return: the database id for the source
 
         """
-        return self.__get_single_id("SELECT id FROM source s WHERE s.source=%(source)s AND s.version=%(version)s",
-                                 {'source': source, 'version': version}, cachename='source')
+        s = self.tbl_source.select()
+        s = s.where(self.tbl_source.columns.source  == source)
+        s = s.where(self.tbl_source.columns.version == version)
+
+        return self.__get_id('id', s, {'source': source, 'version': version}, 'source')
+
+    def get_suite(self, suite):
+        if isinstance(suite, str):
+            suite_id = self.get_suite_id(suite.lower())
+        elif type(suite) == int:
+            suite_id = suite
+
+        s = self.tbl_suite.select(self.tbl_suite.columns.id == suite_id)
+        c = s.execute()
+        if c.rowcount < 1:
+            return None
+        else:
+            return c.fetchone()
 
     def get_suite_version(self, source, suite):
         """
@@ -335,12 +778,13 @@ class DBConn(Singleton):
         @return: the version for I{source} in I{suite}
 
         """
-        return self.__get_single_id("""
-        SELECT s.version FROM source s, suite su, src_associations sa
-        WHERE sa.source=s.id
-          AND sa.suite=su.id
-          AND su.suite_name=%(suite)s
-          AND s.source=%(source)""", {'suite': suite, 'source': source}, cachename='suite_version')
+        s = select([self.tbl_source.columns.source, self.tbl_source.columns.version])
+#        s = self.tbl_source.join(self.tbl_src_associations).join(self.tbl_suite)
+
+        s = s.select(self.tbl_suite.columns.suite_name == suite, use_labels=True)
+        s = s.select(self.tbl_source.columns.source == source)
+
+        return self.__get_id('source.version', s, {'suite': suite, 'source': source}, 'suite_version')
 
 
     def get_files_id (self, filename, size, md5sum, location_id):
@@ -398,11 +842,11 @@ class DBConn(Singleton):
             else:
                 row = cursor.fetchone()
 
-                if row[1] != size or row[2] != md5sum:
+                if row[1] != int(size) or row[2] != md5sum:
                     res =  -2
 
                 else:
-                    self.caches[cachename].SetValue(values, row[0])
+                    self.caches['files'].SetValue(values, row[0])
                     res = row[0]
 
         return res
@@ -500,10 +944,10 @@ class DBConn(Singleton):
 
         @type bin_id: int
         @param bin_id: the id of the binary
-        @type fullpath: string
-        @param fullpath: the path of the file being associated with the binary
+        @type fullpaths: list
+        @param fullpaths: the list of paths of the file being associated with the binary
 
-        @return True upon success
+        @return: True upon success
         """
 
         c = self.db_con.cursor()
@@ -514,6 +958,8 @@ class DBConn(Singleton):
             for fullpath in fullpaths:
                 (path, file) = os.path.split(fullpath)
 
+                if path.startswith( "./" ):
+                    path = path[2:]
                 # Get the necessary IDs ...
                 file_id = self.get_or_set_contents_file_id(file)
                 path_id = self.get_or_set_contents_path_id(path)
@@ -539,7 +985,7 @@ class DBConn(Singleton):
         @type fullpaths: list
         @param fullpaths: the list of paths of the file being associated with the binary
 
-        @return True upon success
+        @return: True upon success
         """
 
         c = self.db_con.cursor()
@@ -576,3 +1022,4 @@ class DBConn(Singleton):
             traceback.print_exc()
             c.execute("ROLLBACK")
             return False
+