X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=014f1082e4b0216f7a74b55c261ff89e95156e6b;hb=28989cfb6aed1278147476aebb7121f12c45bc7f;hp=038c014bde66ced7dae93ea0263ea586281a003f;hpb=b2429767aa02b1e02def623875fdd6a942c4a44f;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 038c014b..014f1082 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -61,6 +61,8 @@ from sqlalchemy import create_engine, Table, MetaData, Column, Integer, desc, \ from sqlalchemy.orm import sessionmaker, mapper, relation, object_session, \ backref, MapperExtension, EXT_CONTINUE, object_mapper, clear_mappers from sqlalchemy import types as sqltypes +from sqlalchemy.orm.collections import attribute_mapped_collection +from sqlalchemy.ext.associationproxy import association_proxy # Don't remove this, we re-export the exceptions to scripts which import us from sqlalchemy.exc import * @@ -499,6 +501,8 @@ class DBBinary(ORMObject): return ['package', 'version', 'maintainer', 'source', 'poolfile', \ 'binarytype'] + metadata = association_proxy('key', 'value') + def get_component_name(self): return self.poolfile.location.component.component_name @@ -2153,6 +2157,18 @@ __all__.append('get_sections') ################################################################################ +class SrcContents(ORMObject): + def __init__(self, file = None, source = None): + self.file = file + self.source = source + + def properties(self): + return ['file', 'source'] + +__all__.append('SrcContents') + +################################################################################ + class DBSource(ORMObject): def __init__(self, source = None, version = None, maintainer = None, \ changedby = None, poolfile = None, install_date = None): @@ -2172,6 +2188,27 @@ class DBSource(ORMObject): return ['source', 'version', 'install_date', 'maintainer', \ 'changedby', 'poolfile', 'install_date'] + metadata = association_proxy('key', 'value') + + def scan_contents(self): + ''' + Returns a set of names for non directories. The path names are + normalized after converting them from either utf-8 or iso8859-1 + encoding. + ''' + fullpath = self.poolfile.fullpath + from daklib.contents import UnpackedSource + unpacked = UnpackedSource(fullpath) + fileset = set() + for name in unpacked.get_all_filenames(): + # enforce proper utf-8 encoding + try: + name.decode('utf-8') + except UnicodeDecodeError: + name = name.decode('iso8859-1').encode('utf-8') + fileset.add(name) + return fileset + __all__.append('DBSource') @session_wrapper @@ -2817,10 +2854,10 @@ __all__.append('MetadataKey') ################################################################################ class BinaryMetadata(ORMObject): - def __init__(self, binary = None, key = None, value = None): - self.binary = binary + def __init__(self, key = None, value = None, binary = None): self.key = key self.value = value + self.binary = binary def properties(self): return ['binary', 'key', 'value'] @@ -2833,10 +2870,10 @@ __all__.append('BinaryMetadata') ################################################################################ class SourceMetadata(ORMObject): - def __init__(self, source = None, key = None, value = None): - self.source = source + def __init__(self, key = None, value = None, source = None): self.key = key self.value = value + self.source = source def properties(self): return ['source', 'key', 'value'] @@ -2904,6 +2941,7 @@ class DBConn(object): 'source_acl', 'source_metadata', 'src_associations', + 'src_contents', 'src_format', 'src_uploaders', 'suite', @@ -2985,7 +3023,9 @@ class DBConn(object): suites = relation(Suite, secondary=self.tbl_bin_associations, backref=backref('binaries', lazy='dynamic')), extra_sources = relation(DBSource, secondary=self.tbl_extra_src_references, - backref=backref('extra_binary_references', lazy='dynamic'))), + backref=backref('extra_binary_references', lazy='dynamic')), + key = relation(BinaryMetadata, cascade='all', + collection_class=attribute_mapped_collection('key'))), extension = validator) mapper(BinaryACL, self.tbl_binary_acl, @@ -3155,7 +3195,9 @@ class DBConn(object): primaryjoin=(self.tbl_source.c.id==self.tbl_dsc_files.c.source)), suites = relation(Suite, secondary=self.tbl_src_associations, backref=backref('sources', lazy='dynamic')), - srcuploaders = relation(SrcUploader)), + srcuploaders = relation(SrcUploader), + key = relation(SourceMetadata, cascade='all', + collection_class=attribute_mapped_collection('key'))), extension = validator) mapper(SourceACL, self.tbl_source_acl, @@ -3203,6 +3245,12 @@ class DBConn(object): backref=backref('contents', lazy='dynamic', cascade='all')), file = self.tbl_bin_contents.c.file)) + mapper(SrcContents, self.tbl_src_contents, + properties = dict( + source = relation(DBSource, + backref=backref('contents', lazy='dynamic', cascade='all')), + file = self.tbl_src_contents.c.file)) + mapper(MetadataKey, self.tbl_metadata_keys, properties = dict( key_id = self.tbl_metadata_keys.c.key_id,