from pypy.interpreter.baseobjspace import ObjSpace, W_Root from pypy.rpython.lltypesystem import rffi, lltype from pypy.rpython.lltypesystem.rffi import llexternal, CCHARP, ExternalCompilationInfo, CStructPtr, INT from pypy.rpython.lltypesystem.lltype import Signed, Ptr, Char, GcStruct from pypy.rpython.lltypesystem.rstr import STR from pypy.rpython.lltypesystem import lltype from pypy.rpython.rtyper import RPythonTyper from pypy.interpreter.baseobjspace import Wrappable from pypy.interpreter.typedef import TypeDef from pypy.interpreter.gateway import interp2app, ObjSpace, W_Root import py, sys datum = GcStruct('datum',('dptr',CCHARP), ('dsize', lltype.Signed)) err_func = lltype.Ptr(lltype.FuncType([], lltype.Void)) eci = ExternalCompilationInfo(includes=['gdbm.h'], libraries=['gdbm']) gdbm_file = CStructPtr( 'GDBM_FILE', ('dummy', INT)) open_gdbm = rffi.llexternal('gdbm_open', [CCHARP, INT, INT, INT, err_func], gdbm_file, compilation_info=eci) store_gdbm = rffi.llexternal('gdbm_store', [gdbm_file, CCHARP, CCHARP, INT], INT, compilation_info=eci) fetch_gdbm = rffi.llexternal('gdbm_fetch', [gdbm_file, CCHARP], lltype.Ptr(datum), compilation_info=eci) close_gdbm = rffi.llexternal('gdbm_close', [gdbm_file], INT, compilation_info = eci) class GDBM(Wrappable): def __init__(self, space): self.space = space def gdbm_open(self, name, blocksize, read_write, mode): self.struct_gdbm = open_gdbm(name, blocksize, read_write, mode, 0) if not struct_gdbm: return self.space.w_None return self.space.wrap(self.struct_gdbm) def gdbm_store(self, key, content, flag): res_gdbm = gdbm_store(self.struct_gdbm, key, content, flag) return self.space.wrap(res_gdbm) def gdbm_fetch(self, key): return self.space.wrap(fetch_gdbm(self.struct_gdbm, key)) def gdbm_close(self): close_gdbm(self.struct_gdbm) def GDBM_new(space, w_subtype, args): w_gdbm = space.allocate_instance(GDBM, w_subtype) gdbm = space.interp_w(GDBM, w_gdbm) GDBM.__init__(gdbm, space) return w_gdbm GDBM.typedef = TypeDef( 'GDBM', __new__ = interp2app(GDBM_new, unwrap_spec=[ObjSpace, W_Root, 'bufferstr']), open = interp2app(GDBM.gdbm_open, unwrap_spec=['self', str, int, int, int]), store = interp2app(GDBM.gdbm_store, unwrap_spec=['self', str, str, int]), fetch = interp2app(GDBM.gdbm_fetch, unwrap_spec=['self', str]), close = interp2app(GDBM.gdbm_open, unwrap_spec=['self']) )