/************************************************************************************************** * EJDB2 * * MIT License * * Copyright (c) 2012-2021 Softmotions Ltd * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *************************************************************************************************/ declare namespace ejdb2_react_native { export type Placeholder = string | number; export type JQLExecuteCallback = (doc: JBDOC, jql?: JQL) => any; interface JQLUseQueryCallback { (jql: JQL): Promise; } /** * EJDB2 Error helpers. */ export class JBE { /** * Returns `true` if given error [err] is `IWKV_ERROR_NOTFOUND` * @param err */ static isNotFound(err: any): boolean; /** * Returns `true` if given errror [err] is `JQL_ERROR_QUERY_PARSE` * @param {Error} err * @return {boolean} */ static isInvalidQuery(err: any): boolean; } /** * Database open options. */ interface OpenOptions { /** * Open databas in read-only mode. */ readonly?: boolean; /** * Truncate database file on open. */ truncate?: boolean; /** * Enable WAL. Default: true. */ wal_enabled?: boolean; /** * Check CRC32 sum for every WAL checkpoint. * Default: false. */ wal_check_crc_on_checkpoint?: boolean; /** * Size of checkpoint buffer in bytes. * Default: 1Gb. Android: 64Mb */ wal_checkpoint_buffer_sz?: number; /** * WAL buffer size in bytes. * Default: 8Mb. Android: 2Mb. */ wal_wal_buffer_sz?: number; /** * Checkpoint timeout in seconds. * Default: 300. Android: 60. */ wal_checkpoint_timeout_sec?: number; /** * Savepoint timeout in secods. * Default: 10. */ wal_savepoint_timeout_sec?: number; /** * Initial size of buffer in bytes used to process/store document on queries. * Preferable average size of document. * Default: 65536. Minimal: 16384. */ document_buffer_sz?: number; /** * Max sorting buffer size in bytes. * If exceeded, an overflow temp file for data will be created. * Default: 16777216. Minimal: 1048576 */ sort_buffer_sz?: number; } /** * Query execution options. */ interface QueryOptions { /** * Overrides `limit` encoded in query */ limit?: number | string; /** * Overrides `skip` encoded in query */ skip?: number | string; } /** * Collection index descriptor. */ interface IndexDescriptor { /** * rfc6901 JSON pointer to indexed field. */ ptr: string; /** * Index mode as bit mask: * * - 0x01 EJDB_IDX_UNIQUE Index is unique * - 0x04 EJDB_IDX_STR Index for JSON string field value type * - 0x08 EJDB_IDX_I64 Index for 8 bytes width signed integer field values * - 0x10 EJDB_IDX_F64 Index for 8 bytes width signed floating point field values. */ mode: number; /** * Index flags. See iwkv.h#iwdb_flags_t */ idbf: number; /** * Internal index database identifier. */ dbid: number; /** * Number of indexed records. */ rnum: number; } /** * Collection descriptor. */ interface CollectionDescriptor { /** * Name of collection. */ name: string; /** * Internal database identifier. */ dbid: number; /** * Number of documents stored in collection. */ rnum: number; /** * List of collection indexes. */ indexes: Array; } interface EJDB2Info { /** * Database engine version string. * Eg. "2.0.29" */ version: string; /** * Database file path. */ file: string; /** * Database file size in bytes. */ size: number; /** * List of database collections. */ collections: Array; } /** * EJDB2 document. */ interface JBDOC { /* * Document identifier */ id: number; /** * Document JSON object */ json: any; /** * String represen */ toString(): string; } /** * Database wrapper. */ export class EJDB2 { /** * Open database identified by relative `filename` in context of * React Native database directory used for sqlite db. * * @param filename `filename` in context of RN sqlite database directory * @param opts Database mode options */ static open(name: string, opts?: OpenOptions): EJDB2; /** * Closes database instance. */ close(): Promise; /** * Get json body with database metadata object. */ info(): Promise; /** * Create instance of [query] specified for [collection]. * If [collection] is not specified a [query] spec must contain collection name, * eg: `@mycollection/[foo=bar]` * * @note WARNING In order to avoid memory leaks, dispose created query object by {@link JQL#close} * or use {@link JQL#use} * * @param query Query text * @param collection Optional collection used in query * @returns {JQL} */ createQuery(query: string, collection?: string): JQL; /** * Saves [json] document under specified [id] or create a document * with new generated `id`. Returns promise holding actual document `id`. */ put(collection: String, json: object | string, id?: number): Promise; /** * Apply rfc6902/rfc7386 JSON [patch] to the document identified by [id]. */ patch(collection: string, json: object | string, id: number): Promise; /** * Apply JSON merge patch (rfc7396) to the document identified by `id` or * insert new document under specified `id`. */ patchOrPut(collection: string, json: object | string, id: number): Promise; /** * Get json body of document identified by [id] and stored in [collection]. * * If document with given `id` is not found then `Error` will be thrown. * Not found error can be detected by {@link JBE.isNotFound} */ get(collection: string, id: number): Promise; /** * Get json body of document identified by [id] and stored in [collection]. * * If document with given `id` is not found then `null` will be resoved. */ getOrNull(collection: string, id: number): Promise; /** * Removes document idenfied by [id] from [collection]. * * If document with given `id` is not found then `Error` will be thrown. * Not found error can be detected by {@link JBE.isNotFound} */ del(collection: string, id: number): Promise; /** * Renames collection */ renameCollection(oldCollectionName: string, newCollectionName: string): Promise; /** * Ensures json document database index specified by [path] json pointer to string data type. */ ensureStringIndex(collection: string, path: string, unique?: boolean): Promise; /** * Removes specified database index. */ removeStringIndex(collection: string, path: string, unique?: boolean): Promise; /** * Ensures json document database index specified by [path] json pointer to integer data type. */ ensureIntIndex(collection: string, path: string, unique?: boolean): Promise; /** * Removes specified database index. */ removeIntIndex(collection: string, path: string, unique?: boolean): Promise; /** * Ensures json document database index specified by [path] json pointer to floating point data type. */ ensureFloatIndex(collection: string, path: string, unique?: boolean): Promise; /** * Removes specified database index. */ removeFloatIndex(collection: string, path: string, unique?: boolean): Promise; /** * Removes database [collection]. */ removeCollection(collection: string): Promise; /** * Creates an online database backup image and copies it into the specified [fileName]. * During online backup phase read/write database operations are allowed and not * blocked for significant amount of time. Returns promise with backup * finish time as number of milliseconds since epoch. */ onlineBackup(fileName: string): Promise; } /** * EJDB Query. */ interface JQL { /** * Database instance associated with this query. */ readonly db: EJDB2; /** * Query text. */ readonly query: string; /** * Retrieve query execution plan. */ readonly explainLog: string | null; /** * Number of documents to skip. */ readonly skip: number; /** * Maximum number of documents to fetch. */ readonly limit: number; /** * Collection name used in query */ readonly collection: string; /** * Set number of documents to skip. * Specified value overrides `skip` option encoded in query. * @param {number} skip */ withSkip(skip: number): JQL; /** * Set maximum number of documents to fetch. * Specified value overrides `limit` option encoded in query. * @param {number} limit Limit */ withLimit(limit: number): JQL; /** * Set collection to use with query. * Value overrides collection encoded in query. */ withCollection(coll: string): JQL; /** * Turn on explain query mode */ withExplain(): JQL; /** * Set string [val] at the specified [placeholder]. */ setString(placeholder: Placeholder, val: string): JQL; /** * Set [json] at the specified [placeholder]. */ setJSON(placeholder: Placeholder, val: string | object): JQL; /** * Set [regexp] string at the specified [placeholder]. * @note `RegExp` options are ignored. */ setRegexp(placeholder: Placeholder, val: string | RegExp): JQL; /** * Set number [val] at the specified [placeholder]. */ setNumber(placeholder: Placeholder, val: number): JQL; /** * Set boolean [val] at the specified [placeholder]. */ setBoolean(placeholder: Placeholder, val: boolean): JQL; /** * Set `null` at the specified [placeholder]. */ setNull(placeholder: Placeholder): JQL; /** * Execute this query. */ execute(dispose: boolean, callback: JQLExecuteCallback): Promise; /** * Execute this query then dispose it. */ useExecute(callback: JQLExecuteCallback): Promise; /** * Uses query in `callback` then closes it. * @param callback Function accepts `JQL` query object. * @return `usefn` promise value. */ use(callback: JQLUseQueryCallback): Promise; /** * List matched document. * @note Use it with care to avoid wasting of memory. * See {@link JQL#use} for result-set callback API. * @param opts */ list(opts: QueryOptions): Promise; /** * Collects up to [n] documents from result set into array. * @param n Default: 1 */ firstN(n?: number): Promise; /** * Returns a first record in result set. * If no reconds found `null` resolved promise will be returned. */ first(): Promise; /** * Returns a scalar integer value as result of query execution. * Eg.: A count query: `/... | count` */ scalarInt(): Promise; /** * Reset query parameters. */ reset(): Promise; /** * Disposes JQL instance and releases all underlying resources. */ close(): void; } } export = ejdb2_react_native;