1 from portage.cache import fs_template
2 from portage.cache import cache_errors
4 from portage import _encodings
5 from portage import _unicode_encode
11 if sys.hexversion >= 0x3000000:
14 # store the current key order *here*.
15 class database(fs_template.FsBased):
19 # do not screw with this ordering. _eclasses_ needs to be last
20 auxdbkey_order=('DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI',
21 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION',
22 'KEYWORDS', 'IUSE', 'CDEPEND',
23 'PDEPEND', 'PROVIDE', 'EAPI', 'PROPERTIES', 'DEFINED_PHASES')
25 def __init__(self, label, auxdbkeys, **config):
26 super(database,self).__init__(label, auxdbkeys, **config)
27 self._base = os.path.join(self._base,
28 self.label.lstrip(os.path.sep).rstrip(os.path.sep))
30 if len(self._known_keys) > len(self.auxdbkey_order) + 2:
31 raise Exception("less ordered keys then auxdbkeys")
32 if not os.path.exists(self._base):
36 def _getitem(self, cpv):
39 myf = codecs.open(_unicode_encode(os.path.join(self._base, cpv),
40 encoding=_encodings['fs'], errors='strict'),
41 mode='r', encoding=_encodings['repo.content'],
43 for k,v in zip(self.auxdbkey_order, myf):
45 except (OSError, IOError) as e:
46 if errno.ENOENT == e.errno:
48 raise cache_errors.CacheCorruption(cpv, e)
51 d["_mtime_"] = long(os.fstat(myf.fileno()).st_mtime)
54 raise cache_errors.CacheCorruption(cpv, e)
59 def _setitem(self, cpv, values):
61 fp=os.path.join(self._base,cpv[:s],".update.%i.%s" % (os.getpid(), cpv[s+1:]))
63 myf = codecs.open(_unicode_encode(fp,
64 encoding=_encodings['fs'], errors='strict'),
65 mode='w', encoding=_encodings['repo.content'],
66 errors='backslashreplace')
67 except (OSError, IOError) as e:
68 if errno.ENOENT == e.errno:
70 self._ensure_dirs(cpv)
71 myf = codecs.open(_unicode_encode(fp,
72 encoding=_encodings['fs'], errors='strict'),
73 mode='w', encoding=_encodings['repo.content'],
74 errors='backslashreplace')
75 except (OSError, IOError) as e:
76 raise cache_errors.CacheCorruption(cpv, e)
78 raise cache_errors.CacheCorruption(cpv, e)
81 for x in self.auxdbkey_order:
82 myf.write(values.get(x,"")+"\n")
85 self._ensure_access(fp, mtime=values["_mtime_"])
86 #update written. now we move it.
87 new_fp = os.path.join(self._base,cpv)
90 except (OSError, IOError) as e:
92 raise cache_errors.CacheCorruption(cpv, e)
95 def _delitem(self, cpv):
97 os.remove(os.path.join(self._base,cpv))
99 if errno.ENOENT == e.errno:
102 raise cache_errors.CacheCorruption(cpv, e)
105 def __contains__(self, cpv):
106 return os.path.exists(os.path.join(self._base, cpv))
110 """generator for walking the dir struct"""
112 len_base = len(self._base)
114 for l in os.listdir(dirs[0]):
115 if l.endswith(".cpickle"):
117 p = os.path.join(dirs[0],l)
119 if stat.S_ISDIR(st.st_mode):
126 def commit(self): pass