#!/usr/bin/python2 # # Copyright 2004 Michael Kefeder (h.t.d@gmx.de) # # Module to work with CNID databases of netatalk 2 # import bsddb3, for python <2.3 needed. don't know how to not require it for 2.3 # that's why it is here ;) from bsddb3 import db import os, struct, sys class cnid_db: def __init__(self): self.numdevino = 0 def open(self, DB_PATH): DB_PATH = os.path.abspath (DB_PATH) if not os.path.isfile (DB_PATH + '/cnid2.db'): DB_PATH = os.path.join (DB_PATH, '.AppleDB') if not os.path.isfile (DB_PATH + '/cnid2.db'): e = "cannot find database file '%s'" % (DB_PATH + '/cnid2.db') raise NameError, e # preparation to support transactions #self.dbenv = db.DBEnv() #self.dbenv.open (DB_PATH, db.DB_INIT_TXN) #self.transaction = self.dbenv.txn_begin() self.cnid2_db = db.DB() # db.DB(self.dbenv) self.cnid2_db.set_get_returns_none(0) self.cnid2_db.open(DB_PATH + '/cnid2.db', 'cnid2.db', db.DB_BTREE) self.cnid_db = self.cnid2_db.cursor() self.didname2_db = db.DB() self.didname2_db.set_get_returns_none(0) self.didname2_db.open(DB_PATH + '/cnid2.db', 'didname.db', db.DB_BTREE) self.didname_db = self.didname2_db.cursor() self.devino2_db = db.DB() self.devino2_db.set_get_returns_none(0) self.devino2_db.open(DB_PATH + '/cnid2.db', 'devino.db', db.DB_BTREE, db.DB_RDONLY) # get number of entries in table devino self.numdevino = len(self.devino2_db) self.devino_db = self.devino2_db.cursor() def close(self): #self.transaction.commit() self.cnid2_db.close() self.didname2_db.close() self.devino2_db.close() #self.dbenv.close() def updateFilenameFromCNID (self, cnid, newname): """ updates filename in database based on CNID """ try: # update cnid_db old_data = self.cnid_db.set(struct.pack (">L", cnid), db.DB_SET) new_data = old_data[1][:28] + newname + '\0' self.cnid_db.put (struct.pack (">L", cnid), new_data, db.DB_CURRENT) # update didname_db old_did_data = self.didname_db.set(old_data[1][24:], db.DB_SET) new_did_key = old_did_data[0][:4] + newname + '\0' self.didname2_db.delete (old_did_data[0]) self.didname2_db.put (new_did_key, old_did_data[1]) except db.DBError, dbe: sys.stderr.write ("DBError: %i: %s\n" % (dbe[0], dbe[1])) sys.stderr.write ("CNID: %i Filename: '%s'" % (cnid, newname)) def renameFromDEVINO (self, device, inode, newname): try: dev_inode = struct.pack (">QQ", device, inode) devino_data = self.devino_db.set(dev_inode, db.DB_SET) except db.DBError: #raise NameErrorm, "DEVICE and INODE combination not found." return -1 self.updateFilenameFromCNID (struct.unpack(">L", devino_data[1])[0], newname) return 0 def DEVINOexists (self, device, inode): try: dev_inode = struct.pack (">QQ", device, inode) devino_data = self.devino_db.set(dev_inode, db.DB_SET) cnid = struct.unpack(">L", devino_data[1])[0] cnid_data = self.cnid_db.set(struct.pack (">L", cnid), db.DB_SET) didname_data = self.didname_db.set(cnid_data[1][24:], db.DB_SET) return 0 except db.DBError: return -1