Hi Mr. Steve, The *indexes* i am using are lists... The code for creation of the PartionedPK is given below... ******************************************************************************* class PartitionedPK(object): def __init__(self, name, save_to, fields): self.name = name self.idx_name = save_to self.part_name = save_to + PARTITION_SUFFIX self.fields = fields self.digester = sha.new
def setup(self, schema): self.partitions = [[] for i in range(256)] self.flush_pos = [[] for i in range(256)] self.flush_count = 0 self.index = {} self.offsets = field_offsets(self.fields, schema) if not self.offsets: raise ValueError('One or more index field names are invalid') self.idx_file = open(self.idx_name, 'wb+') self.part_file = open(self.part_name, 'wb+') def save(self): pickle.dump(self.flush_count, self.part_file, -1) pickle.dump(self.flush_pos, self.part_file, -1) self.idx_file.close() self.part_file.close() def flush(self): self.flush_count += 1 for i in range(256): self.flush_pos[i].append(self.idx_file.tell()) pickle.dump(self.partitions[i], self.idx_file, -1) self.partitions[i] = [] def valid(self, record, data): key = self.digester(''.join( [data[i] for i in self.offsets] )).digest() self.partitions[ ord(key[0]) ].append( (key, record) ) # defer checking till later return True def finalize(self): self.flush() errors = [] for bin in range(256): #show('Checking %s, bin %d/256 ... ' % (self.name, bin)) seen = {} has = seen.has_key for flush in range(self.flush_count): self.idx_file.seek( self.flush_pos[bin][flush] ) records = pickle.load(self.idx_file) for key, value in records: if has(key): errors.append(value) else: seen[key] = value return errors ******************************************************************************* the PK definition is as follows: vol_pk = PartitionedPK( name = 'VOL_PK', save_to = '../Index/vol.idx', fields = ['ID','Type','Curr_Code','Tenor']) The code for the Foreign Key declaration (referencing to the indexes) is as given below... ******************************************************************************* class HashedFK(object): def __init__(self, name, load_from, fields): self.name = name self.filename = load_from self.fields = fields self.digester = sha.new def setup(self, schema): self.index = {} self.offsets = field_offsets(self.fields, schema) if not self.offsets: raise ValueError('One or more index field names are invalid') file = open(self.filename, 'rb+') self.index = pickle.load(file) file.close() def valid(self, record, fields): key = self.digester(''.join( [fields[i] for i in self.offsets] )).digest() return self.index.has_key(key) def flush(self): pass def finalize(self): return None ******************************************************************************* the FK definition is as follows: vol_fk = HashedFK( name = ' VOL_FK, load_from = '../Index/vol.idx', fields= ['ID','Type','Curr_Code','Tenor']) The code is working fine when the foreign key is referenced to the complete primary key But if the FK were to be on only 'ID' the FK defn would have been like => vol_fk = HashedFK( name = ' VOL_FK, load_from = '../Index/vol.idx', fields = ['ID'] ) This is were the problem lies... it shows AttributeError: 'list' object has no attribute 'has_key' I have also tried defining another PK with a single field as follows => Tvol_pk = PartitionedPK( name = 'TVOL_PK', save_to = '../Index/tvol.idx', fields = ['ID'] ) The index ''tvol.idx'' is being created at the given location(path specified) but referencing to this index(i.e., tvol.idx) with the vol_fk given above also gives the same error. -- http://mail.python.org/mailman/listinfo/python-list