int get_info(void* _pvCtx, int _iRhs, int* _piParent, int *_piAddr, int _iItemPos) { SciErr sciErr; int iRet = 0; int iType = 0; sciErr = getVarType(_pvCtx, _piAddr, &iType); switch (iType) { case sci_matrix : iRet = get_double_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_poly : iRet = get_poly_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_boolean : iRet = get_boolean_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_sparse : iRet = get_sparse_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_boolean_sparse : iRet = get_bsparse_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_ints : iRet = get_integer_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_strings : iRet = get_string_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_list : insert_indent(); sciprint("List "); iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_tlist : insert_indent(); sciprint("TList "); iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_mlist : insert_indent(); sciprint("MList "); iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; case sci_pointer : iRet = get_pointer_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos); break; default : insert_indent(); sciprint("Unknown type\n"); return 1; } return iRet; }
int Database::list_destroy(string& key) { list_key_encode(key, skey) string val; int r = get(skey, &val); if (r != ErrorCode::OK) return r; uint32_t size; uint64_t first, last; bool valid; get_list_info(size, first, last, val, valid); if (!valid) return ErrorCode::DB_ERROR; list_item_key_encode(key, first, sfirst); leveldb::ReadOptions options; options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); it->Seek(sfirst); uint32_t i = 0; leveldb::WriteBatch batch; while (i < size && it->Valid()) { batch.Delete(it->key()); it->Next(); i++; } batch.Delete(skey); leveldb::Status s = db->Write(leveldb::WriteOptions(), &batch); if (s.ok()) return ErrorCode::OK; return ErrorCode::DB_ERROR; }
int Database::list_index(string& key, uint32_t index, string& val) { list_key_encode(key, skey) string lval; int r = get(skey, &lval); if (r != ErrorCode::OK) return r; uint32_t size; uint64_t first, last; bool valid; get_list_info(size, first, last, lval, valid); if (!valid) return ErrorCode::DB_ERROR; list_item_key_encode(key, first, sfirst); leveldb::ReadOptions options; //options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); it->Seek(sfirst); uint32_t i = 0; while (i < size && it->Valid()) { if (i == index) { val = it->value().ToString(); return ErrorCode::OK; } it->Next(); i++; } return ErrorCode::IS_NOT_FOUND; }
int Database::list_size(string& key, uint32_t& size) { list_key_encode(key, skey) string lval; int r = get(skey, &lval); if (r != ErrorCode::OK) return r; uint64_t first, last; bool valid; get_list_info(size, first, last, lval, valid); if (!valid) return ErrorCode::DB_ERROR; return ErrorCode::OK; }
int Database::list_range(string& key, uint32_t index, uint32_t& count, char* data, uint32_t& data_size) { list_key_encode(key, skey) string lval; int r = get(skey, &lval); if (r != ErrorCode::OK) return r; uint32_t size; uint64_t first, last; bool valid; get_list_info(size, first, last, lval, valid); if (!valid) return ErrorCode::DB_ERROR; list_item_key_encode(key, first, sfirst); leveldb::ReadOptions options; //options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); it->Seek(sfirst); uint32_t i = 0; while (i < size && it->Valid()) { if (i == index) { uint32_t c = 0; _enc_declare2_(result, data); while (c < count && it->Valid()) { if (it->value().size() + _enc_size_(result) > data_size) break; _enc_put_string_(result, it->value().ToString()); it->Next(); c++; } count = c; data_size = _enc_size_(result); return ErrorCode::OK; } it->Next(); i++; } return ErrorCode::IS_NOT_FOUND; }
int Database::list_remove(string& key, uint32_t index) { list_key_encode(key, skey) string lval; int r = get(skey, &lval); if (r != ErrorCode::OK) return r; uint32_t size; uint64_t first, last; bool valid; get_list_info(size, first, last, lval, valid); if (!valid) return ErrorCode::DB_ERROR; list_item_key_encode(key, first, sfirst); leveldb::ReadOptions options; options.fill_cache = false; leveldb::Iterator* it = db->NewIterator(options); it->Seek(sfirst); uint32_t i = 0; while (i < size && it->Valid()) { if (i == index) { leveldb::WriteBatch batch; size--; set_list_info(size, first, last, val); batch.Put(skey, val); batch.Delete(it->key()); leveldb::Status status = db->Write(leveldb::WriteOptions(), &batch); if (status.ok()) return ErrorCode::OK; else return ErrorCode::DB_ERROR; } it->Next(); i++; } return ErrorCode::IS_NOT_FOUND; }
int Database::list_pushback(string& key, string& val) { list_key_encode(key, skey) string lval; int r = get(skey, &lval); if (r != ErrorCode::OK) return r; uint32_t size; uint64_t first, last; bool valid; get_list_info(size, first, last, lval, valid); if (!valid) return ErrorCode::DB_ERROR; size++; last++; set_list_info(size, first, last, lval2); list_item_key_encode(key, last, slast); leveldb::WriteBatch batch; batch.Put(slast, val); batch.Put(skey, lval2); leveldb::Status s = db->Write(leveldb::WriteOptions(), &batch); if (s.ok()) return ErrorCode::OK; return ErrorCode::DB_ERROR; }