import * as env from "./env"; import { printString } from "./debug"; import { Encoder, Packer } from "./serializer"; import { check } from "./system"; export function say_hello(): void { printString("hello,world from dbi64"); } export interface PrimaryValue extends Packer { getPrimaryValue(): u64; } export class PrimaryIterator { db: DBI64; i: i32; validPrimary: bool _primary: u64; constructor( db: DBI64, i: i32, primary: u64, validPrimary: bool ) { this.db = db; this.i = i; this._primary = primary; this.validPrimary = validPrimary } get primary(): u64 { check(this.isOk(), "get primary: invalid iterator"); if (this.validPrimary) { return this._primary; } let value = this.getValue(); this._primary = value!.getPrimaryValue(); this.validPrimary = true; return this._primary; } getValue(): T | null { if (!this.isOk()) { return null; } return this.db.getEx(this.i) } isOk(): bool { return this.i >= 0; } isEnd(): bool { return this.i <= -2; } } export class DBI64 { constructor( public code: u64, public scope: u64, public table: u64) { } store(id: u64, value: T, payer: u64): PrimaryIterator { let data = Encoder.pack(value); let data_ptr = data.dataStart; let i = env.db_store_i64(this.scope, this.table, payer, id, data_ptr, data.length ); return new PrimaryIterator(this, i, id, true); } // export declare function db_update_i64(iterator: i32, payer: u64, data: usize, len: usize): void update(iterator: PrimaryIterator, payer: u64, value: T): void { let data = Encoder.pack(value); let data_ptr = data.dataStart; env.db_update_i64(iterator.i, payer, data_ptr, data.length); } // export declare function db_remove_i64(iterator: i32): void remove(iterator: PrimaryIterator): void { env.db_remove_i64(iterator.i); } // export declare function db_get_i64(iterator: i32, data: usize, len: usize): i32 get(iterator: PrimaryIterator): T | null { if (!iterator.isOk()) { return null; } return this.getEx(iterator.i); } getEx(iterator: i32): T | null { let size = env.db_get_i64(iterator, 0, 0); if (size == 0) { return null; } let arr = new Array(size); let ptr = arr.dataStart; env.db_get_i64(iterator, ptr, size); let ret = instantiate(); ret.unpack(arr); return ret; } // export declare function db_next_i64(iterator: i32, primary_ptr: usize): i32 next(iterator: PrimaryIterator): PrimaryIterator { let primary_ptr = __alloc(sizeof()); let itNext = env.db_next_i64(iterator.i, primary_ptr); return new PrimaryIterator(this, itNext, load(primary_ptr), true); } // export declare function db_previous_i64(iterator: i32, primary_ptr: usize): i32 previous(iterator: PrimaryIterator): PrimaryIterator { let primary_ptr = __alloc(sizeof()); let itNext = env.db_previous_i64(iterator.i, primary_ptr); return new PrimaryIterator(this, itNext, load(primary_ptr), true); } // export declare function db_find_i64(code: u64, scope: u64, table: u64, id: u64): i32 find(id: u64): PrimaryIterator { let i = env.db_find_i64(this.code, this.scope, this.table, id); if (i >= 0) { return new PrimaryIterator(this, i, id, true); } return new PrimaryIterator(this, i, 0, false); } // export declare function db_lowerbound_i64(code: u64, scope: u64, table: u64, id: u64): i32 lowerBound(id: u64): PrimaryIterator { let i = env.db_lowerbound_i64(this.code, this.scope, this.table, id); return new PrimaryIterator(this, i, 0, false); } // export declare function db_upperbound_i64(code: u64, scope: u64, table: u64, id: u64): i32 upperBound(id: u64): PrimaryIterator { let i = env.db_upperbound_i64(this.code, this.scope, this.table, id); return new PrimaryIterator(this, i, 0, false); } // export declare function db_end_i64(code: u64, scope: u64, table: u64): i32 end(): PrimaryIterator { let i = env.db_end_i64(this.code, this.scope, this.table); return new PrimaryIterator(this, i, 0, false); } }