cxBool cxDBOpen(cxAny db,cxString file,cxString table,cxBool rdonly) { CX_ASSERT(file != NULL && table != NULL, "args error"); cxDBEnv env = cxDBGetEnv(db); cxDB this = db; if(rdonly){ this->flags = DB_RDONLY; }else{ this->flags = DB_CREATE; } this->ret = db_create(&this->dbptr, env->env, 0); CX_RETURN(this->ret != 0,false); this->ret = CX_METHOD_FIRE(this->ret, this->OpenBefore,db); CX_RETURN(this->ret != 0,false); cxDBTxn txn = cxStackTop(env->txn); this->ret = this->dbptr->open(this->dbptr,cxDBTxnPtr(txn),cxStringBody(file),cxStringBody(table),this->type,this->flags,0); if(this->ret != 0){ CX_ERROR("open db error %s:%s",cxStringBody(file),cxStringBody(table)); return false; } CX_RETURN(this->ret != 0,false); CX_RETAIN_SWAP(this->file, file); CX_RETAIN_SWAP(this->table, table); return CX_METHOD_FIRE(true, this->OpenAfter,db); }
CX_INLINE cxMemPool cxMemPoolInstance() { cxStack stack = cxMemPoolStack(); if(cxStackLength(stack) == 0){ cxMemPool pool = CX_ALLOC(cxMemPool); cxStackPush(stack, pool); CX_RELEASE(pool); } return cxStackTop(stack); }
cxBool cxDBHas(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; return (this->dbptr->exists(this->dbptr,cxDBTxnPtr(txn),&k,0) == 0); }
cxBool cxDBDel(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); CX_ASSERT(this->flags & DB_RDONLY, "only env ,can't del data"); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; return (this->dbptr->del(this->dbptr,cxDBTxnPtr(txn),&k,0) == 0); }
static cxAutoPool cxAutoPoolInstance() { cxAutoPool pool = NULL; cxStack stack = cxAutoPoolStack(); if(cxStackLength(stack) == 0){ pool = CX_ALLOC(cxAutoPool); cxStackPush(stack, pool); CX_RELEASE(pool); }else{ pool = cxStackTop(stack); } return pool; }
cxBool cxDBSet(cxAny db,cxString key,cxString value) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); CX_ASSERT(this->flags & DB_RDONLY, "only env ,can't set data"); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; DBT v={0}; v.data = (void *)cxStringBody(value); v.size = cxStringLength(value); v.flags = DB_DBT_USERMEM; return this->dbptr->put(this->dbptr,cxDBTxnPtr(txn),&k,&v,0) == 0; }
cxInt cxDBCount(cxAny db) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); cxDBTxn txn = cxStackTop(env->txn); if(this->type == DB_BTREE){ DB_BTREE_STAT *stat = NULL; this->dbptr->stat(this->dbptr,cxDBTxnPtr(txn),&stat,DB_READ_COMMITTED); return stat != NULL ? stat->bt_nkeys : 0; } if(this->type == DB_HASH){ DB_HASH_STAT *stat = NULL; this->dbptr->stat(this->dbptr,cxDBTxnPtr(txn),&stat,DB_READ_COMMITTED); return stat != NULL ? stat->hash_nkeys : 0; } return 0; }
cxString cxDBGet(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; DBT v={0}; v.flags = DB_DBT_MALLOC; if(this->dbptr->get(this->dbptr, cxDBTxnPtr(txn), &k, &v,0) != 0){ return NULL; } if(v.size == 0 || v.data == NULL){ return NULL; } return cxStringAttach(v.data, v.size); }