def dbm_cache_store(srv, dbmfile, filename, mtime, val): dbm_type = dbm_cache_type(dbmfile) # NOTE: acquiring a lock for the dbm file (also applies to dbm_cache_get) # See http://issues.apache.org/jira/browse/MODPYTHON-69 # In mod_python versions < 3.2 "pspcache" was used as the lock key. # ie. _apache._global_lock(srv, key, index) # Assuming there are 32 mutexes (the default in 3.1.x), "pspcache" # will hash to one of 31 mutexes (index 0 is reserved). Therefore # there is a 1 in 31 chance for a hash collision if a session is # used in the same request, which would result in a deadlock. This # has been confirmed by testing. # We can avoid this by using index 0 and setting the key to None. # Lock index 0 is also used by DbmSession for locking it's dbm file, # but since the lock is not held for the duration of the request there # should not be any additional deadlock issues. Likewise, the lock # here is only held for a short time, so it will not interfere # with DbmSession file locking. _apache._global_lock(srv, None, 0) try: dbm = dbm_type.open(dbmfile, 'c') dbm[filename] = "%d %s" % (mtime, code2str(val)) finally: try: dbm.close() except: pass _apache._global_unlock(srv, None, 0)
def _dbm_file(self, write): with self._use_rw_lock(write): dbm = self.dbmmodule.open( self.filename, "w" if write else "r") yield dbm dbm.close()
def lookup(self, db, key): dbm = self.dbm(db) try: key = encode(key.lower()) if dbm.has_key(key): return decode(dbm[key]) finally: dbm.close()
def set(self, db, key, val): dbm = self.dbm(db) try: key = encode(key.lower()) val = encode(val) dbm[key] = val finally: dbm.close()
def lookup(self, db, key): dbm = self.dbm(db) try: key = key.lower().encode(self.charset, 'replace') if dbm.has_key(key): return dbm[key].decode(self.charset, 'replace') finally: dbm.close()
def set(self, dbname, key, val): dbm = self.get_dbm(dbname) try: key = encode(key.lower()) val = encode(val) dbm[key] = val finally: dbm.close()
def set(self, db, key, val): dbm = self.dbm(db) try: key = key.lower().encode(self.charset, 'replace') val = val.encode(self.charset, 'replace') dbm[key] = val finally: dbm.close()
def set(self, dbname, key, val): dbm = self.get_dbm(dbname) try: key = key.lower().encode(self.charset, "replace") val = val.encode(self.charset, "replace") dbm[key] = val finally: dbm.close()
def get(self, dbname, key): dbm = self.get_dbm(dbname) try: key = key.lower().encode(self.charset, "replace") val = dbm.get(key) if isinstance(val, str): val = val.decode(self.charset, "replace") return val finally: dbm.close()
def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(key): del dbm[key] return True return False finally: dbm.close()
def get(self, dbname, key): dbm = self.get_dbm(dbname) try: key = encode(key.lower()) val = dbm.get(key) if isinstance(val, str): val = decode(val) return val finally: dbm.close()
def unset(self, dbname, key): dbm = self.get_dbm(dbname) try: key = key.lower().encode(self.charset, "replace") if dbm.has_key(key): del dbm[key] return True return False finally: dbm.close()
def unset(self, shortcut): dbm = self.learn.dbm(self.dbname) try: key = encode(shortcut.lower()) if dbm.has_key(shortcut): del dbm[shortcut] return True return False finally: dbm.close()
def unset(self, dbname, key): dbm = self.get_dbm(dbname) try: key = encode(key.lower()) if dbm.has_key(key): del dbm[key] return True return False finally: dbm.close()
def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(nick): del dbm[nick] return True return False finally: dbm.close()
def dbm_cache_get(srv, dbmfile, filename, mtime): dbm_type = dbm_cache_type(dbmfile) _apache._global_lock(srv, None, 0) try: dbm = dbm_type.open(dbmfile, 'c') try: entry = dbm[filename] t, val = entry.split(" ", 1) if int(t) == mtime: return str2code(val) except KeyError: return None finally: try: dbm.close() except: pass _apache._global_unlock(srv, None, 0)
def __search_dbm(self, pathname, keys, actions, source): """ Search a DBM-style database. """ import dbm dbm = dbm.open(pathname, 'r') found_match = 0 for key in keys: if key and key.lower() in dbm: found_match = 1 dbm_value = dbm[key.lower()] # If there is an entry for this key, # we consider it an overriding action # specification. if dbm_value: actions.clear() actions.update(self.__buildactions(dbm_value, source)) dbm.close() break return found_match
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: dbm.open(file, flag='r', mode=0o666) # Открывает и возвращает хранилище # flag - режим работы 'r' # открытик существующей базы только для чтение (по умалчанию) 'w' # открытие существующей базы только для запись 'c' # открытие файла для записи и чтения, если файла нет, то # создаст новый 'n' # всегда создаёт новую, пустую базу данных, открытую для # чтения и записи # mode - устанавливает права доступа к файлу dbm.whichdb(filename) # Эта функция пытается угадать, какой из нескольких простых # модулей базы данных доступен - dbm.gnu, dbm.ndbm или dbm.dumb - # следует использовать для открытия данного файла. # Возвращает одно из следующих значений: None, если файл нельзя # открыть, потому что он не читается или не существует; # пустая строка (''), если формат файла не может быть догадан; # или строку, содержащую требуемое имя модуля, например # «dbm.ndbm» или «dbm.gnu». dbm.close() # закрытие базы
def get_db(self, db): dbm = self.dbm(db) try: return dict(dbm) finally: dbm.close()