diff --git a/ydn-db/ydn-db-tests.ts b/ydn-db/ydn-db-tests.ts new file mode 100644 index 000000000..95279b831 --- /dev/null +++ b/ydn-db/ydn-db-tests.ts @@ -0,0 +1,82 @@ +/// + +var schema = { + stores: [{ + name: 'todo', + keyPath: "timeStamp" + }] +}; + + +/** + * Create and initialize the database. Depending on platform, this will + * create IndexedDB or WebSql or even localStorage storage mechanism. + * @type {ydn.db.Storage} + */ +var db = new ydn.db.Storage('todo_2', schema); + +var deleteTodo = function(id: any) { + db.remove('todo', id).fail(function(e) { + console.error(e); + }); + + getAllTodoItems(); +}; + +var getAllTodoItems = function() { + var todos = document.getElementById("todoItems"); + todos.innerHTML = ""; + + var df = db.values('todo'); + + df.done(function(items) { + var n = items.length; + for (var i = 0; i < n; i++) { + renderTodo(items[i]); + } + }); + + df.fail(function(e) { + console.error(e); + }) +}; + +var renderTodo = function(row: any) { + var todos = document.getElementById("todoItems"); + var li = document.createElement("li"); + var a = document.createElement("a"); + var t = document.createTextNode(row.text); + + a.addEventListener("click", function() { + deleteTodo(row.timeStamp); + }, false); + + a.textContent = " [Delete]"; + li.appendChild(t); + li.appendChild(a); + todos.appendChild(li) +}; + +var addTodo = function() { + var todo = document.getElementById("todo"); + + var data = { + "text": todo.value, + "timeStamp": new Date().getTime() + }; + db.put('todo', data).fail(function(e) { + console.error(e); + }); + + todo.value = ""; + + getAllTodoItems(); +}; + +function init() { + getAllTodoItems(); +} + +db.onReady(function() { + init(); +}); diff --git a/ydn-db/ydn-db.d.ts b/ydn-db/ydn-db.d.ts new file mode 100644 index 000000000..564c8ad4c --- /dev/null +++ b/ydn-db/ydn-db.d.ts @@ -0,0 +1,306 @@ +// Type definitions for YDN-DB version 1 +// Project: http://dev.yathit.com/ydn-db/index.html +// Definitions by: Kyaw Tun , Gabriel Monteagudo +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +interface FullTextSource { + storeName: string; + keyPath: string; + weight?: number; +} + +interface FullTextCatalog { + name: string; + lang: string; + sources: FullTextSource[]; +} + +interface IndexSchemaJson { + name?: string; + keyPath: string|string[]; + type?: string; + unique?: boolean; + multiEntry?: boolean; +} + +interface StoreSchemaJson { + autoIncrement?: boolean; + dispatchEvents?: boolean; + name?: string; + indexes?: IndexSchemaJson[]; + keyPath?: string; + type?: string; +} + +interface DatabaseSchemaJson { + version?: number; + stores: StoreSchemaJson[]; + fullTextCatalogs?: FullTextCatalog; +} + +interface StorageOptions { + mechanisms?: string[]; + size?: number; + autoSchema?: boolean; + isSerial?: boolean; + requestType?: string; +} + +declare module ydn.db { + export class Request { + abort(): any; + always(callback: (data: any) => void): any; + done(callback: (data: any) => void): any; + fail(callback: (data: any) => void): any; + then(success_callback: (data: any) => any, error_callback: (data: Error) => any): any; + canAbort(): boolean; + } + + export function cmp(first: any, second: any): number; + + export function deleteDatabase(db_name: string, type?: string): void; + + export class Key { + constructor(json: Object); + constructor(key_string: string); + constructor(store_name: string, id: any, parent_key?: Key); + } + + export class Iterator { + join(peer_store_name: string, peer_field_name?: string, value?: any): any; + getKey(): any; + getPrimaryKey(): any; + reset(): Iterator; + restrict(peer_field_name: string, value: any): any; + resume(key: any, index_key: any): Iterator; + reverse(key: any, index_key: any): Iterator; + } + + enum EventType { + created, + deleted, + error, + fail, + ready, + updated + } + + enum Policy { + all, + atomic, + multi, + repeat, + single + } + + enum TransactionMode { + readonly, + readwrite + } + + enum Op { + ">", "<", "=", ">=", "<=", "^" + } + + export class IndexKeyIterator extends Iterator { + constructor(store_name: string, index_name: string, key_range?: any, reverse?: boolean); + + static where(store_name: string, index_name: string, op: Op, value: any, op2: Op, value2: any): any; + + } + + export class KeyIterator extends Iterator { + constructor(store_name: string, key_range?: any, reverse?: boolean); + + static where(store_name: string, op: Op, value: any, op2: Op, value2: any): any; + + } + + export class ValueIterator extends Iterator { + constructor(store_name: string, key_range?: any, reverse?: boolean); + + static where(store_name: string, op: Op, value: any, op2: Op, value2: any): any; + + } + + export class IndexValueIterator extends Iterator { + constructor(store_name: string, index_name: string, key_range?: any, reverse?: boolean); + + static where(store_name: string, index_name: string, op: Op, value: any, op2: Op, value2: any): any; + + } + + export class Streamer { + constructor(storage: ydn.db.Storage, store_name: string, opt_field_name?: string); + + push(key: any, value?: any): any; + + collect(callback: (values: any[]) => void): any; + + setSink(callback: (key: any, value: any, toWait: () => boolean) => void): any; + } + + export class ICursor { + getKey(i?: number): any; + getPrimaryKey(i?: number): any; + getValue(i?: number): any; + clear(i?: number): Request; + update(value: Object, i?: number): Request; + } + + export class Query { + count(): Request; + open(callback: (ICursor: any) => void, Iterator: any, TransactionMode: any): Request; + patch(Object: any): Request; + patch(field_name: string, value: any): Request; + patch(field_names: string[], value: any[]): Request; + order(field_name: string): Query; + order(field_name: string, descending: boolean): Query; + order(field_names: string[]): Query; + order(field_names: string[], descending: boolean): Query; + reverse(): Query; + list(): Request; + list(limit: number): Request; + where(field_name: string, op: Op, value: any): any; + where(field_name: string, op: Op, value: any, op2: Op, value2: any): any; + } + + export class DbOperator { + + add(store_name: string, value: any, key: any): Request; + add(store_name: string, value: any): Request; + + clear(store_name: string, key_or_key_range: any): Request; + clear(store_name: string): Request; + clear(store_names: string[]): Request; + + count(store_name: string, key_range?: any): Request; + count(store_name: string, index_name: string, key_range: any): Request; + count(store_names: string[]): Request; + + executeSql(sql: string, params?: any[]): Request; + + from(store_name: string): Query; + from(store_name: string, op: Op, value: any): Query; + from(store_name: string, op: Op, value: any, op2: Op, value2: any): Query; + + get(store_name: string, key: any): Request; + + keys(iter: Iterator, limit?: number): Request; + keys(store_name: string, key_range?: Object, limit?: number, offset?: number, reverse?: boolean): Request; + keys(store_name: string, index_name: string, key_range?: Object, limit?: number, offset?: number, reverse?: boolean): Request; + keys(store_name: string, limit?: boolean, offset?: number): Request; + + open(next_callback: (cursor: ICursor) => any, iterator: Iterator, mode: TransactionMode): Request; + + put(store_name: string, value: any, key: any): Request; + put(store_name: string, value: any[], key: any[]): Request; + put(store_name: string, value: any): Request; + put(store_name: string, value: any[]): Request; + + remove(store_name: string, id_or_key_range: any): Request; + remove(store_name: string, index_name: string, id_or_key_range: any): Request; + clear(store_name: string, key_or_key_range: any): Request; + + scan(solver: (keys: any[], values: any[]) => any, iterators: Iterator[]): Request; + + values(iter: Iterator, limit?: number): Request; + values(store_name: string, key_range?: Object, limit?: number, offset?: number, reverse?: boolean): Request; + values(store_name: string, index_name: string, key_range?: Object, limit?: number, offset?: number, reverse?: boolean): Request; + values(store_name: string, ids?: Array): Request; + values(keys?: Array): Request; + } + + export class Storage extends DbOperator { + + constructor(db_name?: string, schema?: DatabaseSchemaJson, options?: StorageOptions); + + addEventListener(type: EventType, handler: (event: any) => void, capture?: boolean): any; + addEventListener(type: EventType[], handler: (event: any) => void, capture?: boolean): any; + + branch(thread: Policy, isSerial: boolean, scope: string[], mode: TransactionMode, maxRequest: number): DbOperator; + + close(): any; + + get(store_name: string, key: any): Request; + + getName(callback: any): string; + + getSchema(callback: any): DatabaseSchemaJson; + + getType(): string; + + onReady(Error?: any): any; + + removeEventListener(type: EventType, handler: (event: any) => void, capture?: boolean): any; + removeEventListener(type: EventType[], handler: (event: any) => void, capture?: boolean): any; + + run(callback: (iStorage: ydn.db.Storage) => void, store_names: string[], mode: TransactionMode): Request; + + search(catalog_name: string): Request; + + setName(name: string): any; + + transaction(callback: (tx: any) => void, store_names: string[], mode: TransactionMode, completed_handler: (type: string, e?: Error) => void): any; + + } +} + +declare module ydb.db.algo { + + export class Solver { + + } + + export class NestedLoop extends Solver { + constructor(out: { push: (value: any) => void }, limit?: number); + } + + export class SortedMerge extends Solver { + constructor(out: { push: (value: any) => void }, limit?: number); + } + + export class ZigzagMerge extends Solver { + constructor(out: { push: (value: any) => void }, limit?: number); + } + +} + +declare module ydn.db.events { + + export class Event { + + name: string; + + type: ydn.db.EventType; + } + + export class RecordEvent extends Event { + + getStoreName(): string; + + getKey(): any; + + getValue(): any; + } + + + export class StorageEvent extends Event { + + getError(): Error; + + getVersion(): number; + + getOldVersion(): number; + } + + + export class StoreEvent extends Event { + + getStoreName(): string; + + getKeys(): any[]; + + getValues(): any[]; + } +}