X-Git-Url: http://dolda2000.com/gitweb/?p=didex.git;a=blobdiff_plain;f=didex%2Findex.py;h=0608318d3ca52db7c0dc30419202fad36c9d5fc8;hp=c2c55b6cfd3eec2921b588c0786052367bde69b9;hb=HEAD;hpb=f9b1d04098f80bf065480c94975996b87c820da7 diff --git a/didex/index.py b/didex/index.py index c2c55b6..0608318 100644 --- a/didex/index.py +++ b/didex/index.py @@ -2,7 +2,7 @@ import struct, contextlib, math from . import db, lib from .db import bd, txnfun, dloopfun -__all__ = ["maybe", "t_int", "t_uint", "t_dbid", "t_float", "t_str", "t_casestr", "ordered"] +__all__ = ["maybe", "t_bool", "t_int", "t_uint", "t_dbid", "t_float", "t_str", "t_casestr", "ordered"] deadlock = bd.DBLockDeadlockError notfound = bd.DBNotFoundError @@ -140,6 +140,7 @@ def floatcmp(a, b): else: return 0 +t_bool = simpletype((lambda ob: b"\x01" if ob else b"\x00"), (lambda dat: False if dat == b"x\00" else True)) t_int = simpletype.struct(">q") t_uint = simpletype.struct(">Q") t_dbid = t_uint @@ -158,9 +159,9 @@ class index(object): missing = object() class ordered(index, lib.closable): - def __init__(self, db, name, datatype, create=True): + def __init__(self, db, name, datatype, create=True, *, tx=None): super().__init__(db, name, datatype) - fl = bd.DB_THREAD | bd.DB_AUTO_COMMIT + fl = bd.DB_THREAD if create: fl |= bd.DB_CREATE def initdb(db): def compare(a, b): @@ -168,7 +169,7 @@ class ordered(index, lib.closable): return self.typ.compare(self.typ.decode(a), self.typ.decode(b)) db.set_flags(bd.DB_DUPSORT) db.set_bt_compare(compare) - self.bk = db._opendb("i-" + name, bd.DB_BTREE, fl, initdb) + self.bk = db._opendb("i-" + name, bd.DB_BTREE, fl, initdb, tx=tx) self.bk.set_get_returns_none(False) def close(self): @@ -309,7 +310,7 @@ class ordered(index, lib.closable): if not done: cur.close() - @txnfun(lambda self: self.db.env.env) + @txnfun(lambda self: self.db.env) def put(self, key, id, *, tx): obid = struct.pack(">Q", id) if not self.db.ob.has_key(obid, txn=tx.tx): @@ -320,7 +321,7 @@ class ordered(index, lib.closable): return False return True - @txnfun(lambda self: self.db.env.env) + @txnfun(lambda self: self.db.env) def remove(self, key, id, *, tx): obid = struct.pack(">Q", id) if not self.db.ob.has_key(obid, txn=tx.tx):