X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=89072918a2f2c25f4a7a5c81bf39fa7c26ca36ad;hb=28034de51f4a896773545e90041476aba700efbf;hp=21c9cc626a82956b8e75fb207073cf0abb692e09;hpb=a4a019fa541fec6ad205f5e36e5f2a2cdf797235;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 21c9cc62..89072918 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -113,6 +113,14 @@ class DBConn(Singleton): 'suite_version': Cache(lambda x: '%s_%s' % (x['source'], x['suite'])), } + self.prepared_statements = {} + + def prepare(self,name,statement): + if not self.prepared_statements.has_key(name): + c = self.cursor() + c.execute(statement) + self.prepared_statements[name] = statement + def clear_caches(self): self.__init_caches() @@ -202,7 +210,7 @@ class DBConn(Singleton): @return: the database id for the given override type """ - return self.__get_id('id', 'override_type', 'override_type', override_type) + return self.__get_id('id', 'override_type', 'type', override_type) def get_architecture_id(self, architecture): """ @@ -413,18 +421,22 @@ class DBConn(Singleton): @rtype: int @return: the database id for the given component """ - values={'value': filename} - query = "SELECT id FROM content_file_names WHERE file = %(value)s" - id = self.__get_single_id(query, values, cachename='content_file_names') - if not id: - c = self.db_con.cursor() - c.execute( "INSERT INTO content_file_names VALUES (DEFAULT, %(value)s) RETURNING id", - values ) - - id = c.fetchone()[0] - self.caches['content_file_names'].SetValue(values, id) - - return id + try: + values={'value': filename} + query = "SELECT id FROM content_file_names WHERE file = %(value)s" + id = self.__get_single_id(query, values, cachename='content_file_names') + if not id: + c = self.db_con.cursor() + c.execute( "INSERT INTO content_file_names VALUES (DEFAULT, %(value)s) RETURNING id", + values ) + + id = c.fetchone()[0] + self.caches['content_file_names'].SetValue(values, id) + + return id + except: + traceback.print_exc() + raise def get_or_set_contents_path_id(self, path): """ @@ -439,18 +451,22 @@ class DBConn(Singleton): @rtype: int @return: the database id for the given component """ - values={'value': path} - query = "SELECT id FROM content_file_paths WHERE path = %(value)s" - id = self.__get_single_id(query, values, cachename='content_path_names') - if not id: - c = self.db_con.cursor() - c.execute( "INSERT INTO content_file_paths VALUES (DEFAULT, %(value)s) RETURNING id", - values ) - - id = c.fetchone()[0] - self.caches['content_path_names'].SetValue(values, id) - - return id + try: + values={'value': path} + query = "SELECT id FROM content_file_paths WHERE path = %(value)s" + id = self.__get_single_id(query, values, cachename='content_path_names') + if not id: + c = self.db_con.cursor() + c.execute( "INSERT INTO content_file_paths VALUES (DEFAULT, %(value)s) RETURNING id", + values ) + + id = c.fetchone()[0] + self.caches['content_path_names'].SetValue(values, id) + + return id + except: + traceback.print_exc() + raise def get_suite_architectures(self, suite): """ @@ -478,7 +494,7 @@ class DBConn(Singleton): return map(lambda x: x[0], c.fetchall()) - def insert_content_paths(self, package, fullpaths): + def insert_content_paths(self, bin_id, fullpaths): """ Make sure given path is associated with given binary id @@ -492,6 +508,42 @@ class DBConn(Singleton): c = self.db_con.cursor() + c.execute("BEGIN WORK") + try: + + for fullpath in fullpaths: + (path, file) = os.path.split(fullpath) + + # Get the necessary IDs ... + file_id = self.get_or_set_contents_file_id(file) + path_id = self.get_or_set_contents_path_id(path) + + c.execute("""INSERT INTO content_associations + (binary_pkg, filepath, filename) + VALUES ( '%d', '%d', '%d')""" % (bin_id, path_id, file_id) ) + + c.execute("COMMIT") + return True + except: + traceback.print_exc() + c.execute("ROLLBACK") + return False + + def insert_pending_content_paths(self, package, fullpaths): + """ + Make sure given paths are temporarily associated with given + package + + @type package: dict + @param package: the package to associate with should have been read in from the binary control file + @type fullpaths: list + @param fullpaths: the list of paths of the file being associated with the binary + + @return True upon success + """ + + c = self.db_con.cursor() + c.execute("BEGIN WORK") try: @@ -503,6 +555,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)