| # Copyright 2004 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ |
| |
| |
| import types |
| import os |
| import stat |
| |
| import portage_db_template |
| |
| # since this format is massively deprecated, |
| # we're hardcoding the previously weird line count |
| magic_line_count = 22 |
| |
| class database(portage_db_template.database): |
| def module_init(self): |
| self.lastkey = None # Cache |
| self.lastval = None # Cache |
| |
| self.fullpath = self.path + "/" + self.category + "/" |
| |
| if not os.path.exists(self.fullpath): |
| prevmask=os.umask(0) |
| os.makedirs(self.fullpath, 02775) |
| os.umask(prevmask) |
| try: |
| os.chown(self.fullpath, self.uid, self.gid) |
| os.chmod(self.fullpath, 02775) |
| except SystemExit, e: |
| raise |
| except: |
| pass |
| |
| def has_key(self,key): |
| if os.path.exists(self.fullpath+key): |
| return 1 |
| return 0 |
| |
| def keys(self): |
| # XXX: NEED TOOLS SEPERATED |
| # return portage.listdir(self.fullpath,filesonly=1) |
| mykeys = [] |
| for x in os.listdir(self.fullpath): |
| if os.path.isfile(self.fullpath+x) and not x.startswith(".update."): |
| mykeys += [x] |
| return mykeys |
| |
| def get_values(self,key, data=None): |
| """ do not use data unless you know what it does.""" |
| |
| if not key: |
| raise KeyError, "key is not set to a valid value" |
| |
| mydict = {} |
| if data == None: |
| try: |
| # give buffering a hint of the pretty much maximal cache size we deal with |
| myf = open(self.fullpath+key, "r", 8192) |
| except OSError: |
| # either the file didn't exist, or it was removed under our feet. |
| raise KeyError("failed reading key") |
| |
| # nuke the newlines right off the batt. |
| data = myf.read().splitlines() |
| mydict["_mtime_"] = os.fstat(myf.fileno()).st_mtime |
| myf.close() |
| else: |
| mydict["_mtime_"] = data.pop(-1) |
| |
| # rely on exceptions to note differing line counts. |
| try: |
| for x in range(magic_line_count): |
| mydict[self.dbkeys[x]] = data[x] |
| |
| except IndexError: |
| raise ValueError, "Key count mistmatch" |
| |
| return mydict |
| |
| def set_values(self,key, val, raw=False): |
| if not key: |
| raise KeyError, "No key provided. key:%s val:%s" % (key,val) |
| if not val: |
| raise ValueError, "No value provided. key:%s val:%s" % (key,val) |
| |
| # XXX threaded cache updates won't play nice with this. |
| # need a synchronization primitive, or locking (of the fileno, not a seperate file) |
| # to correctly handle threading. |
| |
| update_fp = self.fullpath + ".update." + str(os.getpid()) + "." + key |
| myf = open(update_fp,"w") |
| if not raw: |
| myf.writelines( [ str(val[x]) +"\n" for x in self.dbkeys] ) |
| if len(self.dbkeys) != magic_line_count: |
| myf.writelines(["\n"] * len(self.dbkeys) - magic_line_count) |
| mtime = val["_mtime_"] |
| else: |
| mtime = val.pop(-1) |
| myf.writelines(val) |
| myf.close() |
| |
| os.chown(update_fp, self.uid, self.gid) |
| os.chmod(update_fp, 0664) |
| os.utime(update_fp, (-1,long(mtime))) |
| os.rename(update_fp, self.fullpath+key) |
| |
| def del_key(self,key): |
| try: |
| os.unlink(self.fullpath+key) |
| except OSError, oe: |
| # just attempt it without checking, due to the fact that |
| # a cache update could be in progress. |
| self.lastkey = None |
| self.lastval = None |
| return 0 |
| return 1 |
| |
| def sync(self): |
| return |
| |
| def close(self): |
| return |
| |