1- import { validateBeforeTransaction , createTransaction , optionsGenerator } from './Utils' ;
1+ import { useCallback } from 'react' ;
2+ import { validateBeforeTransaction } from './Utils' ;
23import { ObjectStoreMeta , ObjectStoreSchema } from './indexed-hooks' ;
4+ import { createReadwriteTransaction } from './createReadwriteTransaction' ;
5+ import { createReadonlyTransaction } from './createReadonlyTransaction' ;
36
47export type Key = string | number | Date | ArrayBufferView | ArrayBuffer | IDBArrayKey | IDBKeyRange ;
58export interface IndexDetails {
@@ -49,100 +52,46 @@ export function CreateObjectStore(dbName: string, version: number, storeSchemas:
4952}
5053
5154export function DBOperations ( dbName : string , version : number , currentStore : string ) {
52- return {
53- add < T > ( value : T , key ?: any ) {
54- return new Promise < number > ( ( resolve , reject ) => {
55- openDatabase ( dbName , version ) . then ( ( db : IDBDatabase ) => {
56- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readwrite , currentStore , reject , resolve ) ) ,
57- objectStore = transaction . objectStore ( currentStore ) ;
58- let request = objectStore . add ( value , key ) ;
59- request . onsuccess = ( evt : any ) => {
60- key = evt . target . result ;
61- resolve ( key ) ;
62- } ;
63- } ) ;
64- } ) ;
65- } ,
66- getByID < T > ( id : string | number ) {
67- return new Promise < T > ( ( resolve , reject ) => {
68- openDatabase ( dbName , version ) . then ( ( db : IDBDatabase ) => {
69- validateBeforeTransaction ( db , currentStore , reject ) ;
70- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readonly , currentStore , reject , resolve ) ) ,
71- objectStore = transaction . objectStore ( currentStore ) ,
72- request : IDBRequest ;
73- request = objectStore . get ( + id ) ;
74- request . onsuccess = function ( event : Event ) {
75- resolve ( ( event . target as any ) . result as T ) ;
76- } ;
77- } ) ;
78- } ) ;
79- } ,
80- getAll < T > ( ) {
81- return new Promise < T [ ] > ( ( resolve , reject ) => {
82- openDatabase ( dbName , version ) . then ( db => {
83- validateBeforeTransaction ( db , currentStore , reject ) ;
84- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readonly , currentStore , reject , resolve ) ) ,
85- objectStore = transaction . objectStore ( currentStore ) ,
86- result : Array < any > = [ ] ;
55+ // Readonly operations
56+ const getAll = useCallback (
57+ < T > ( ) => new Promise < T [ ] > ( ( resolve , reject ) => {
58+ openDatabase ( dbName , version ) . then ( db => {
59+ validateBeforeTransaction ( db , currentStore , reject ) ;
60+ const { store } = createReadonlyTransaction ( db , currentStore , resolve , reject ) ;
61+ const request = store . getAll ( ) ;
8762
88- const request : IDBRequest = objectStore . getAll ( ) ;
63+ request . onerror = error => reject ( error ) ;
8964
90- request . onerror = function ( e ) {
91- reject ( e ) ;
92- } ;
93-
94- request . onsuccess = function ( { target : { result } } : any ) {
95- resolve ( result as T [ ] ) ;
96- } ;
97- } ) ;
65+ request . onsuccess = function ( { target : { result } } : any ) {
66+ resolve ( result as T [ ] ) ;
67+ } ;
9868 } ) ;
99- } ,
100- update < T > ( value : T , key ?: any ) {
101- return new Promise < any > ( ( resolve , reject ) => {
102- openDatabase ( dbName , version ) . then ( db => {
103- validateBeforeTransaction ( db , currentStore , reject ) ;
104- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readwrite , currentStore , reject , resolve ) ) ,
105- objectStore = transaction . objectStore ( currentStore ) ;
106- transaction . oncomplete = event => {
107- resolve ( event ) ;
108- } ;
109- objectStore . put ( value , key ) ;
110- } ) ;
111- } ) ;
112- } ,
113- deleteRecord ( key : Key ) {
114- return new Promise < any > ( ( resolve , reject ) => {
115- openDatabase ( dbName , version ) . then ( db => {
116- validateBeforeTransaction ( db , currentStore , reject ) ;
117- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readwrite , currentStore , reject , resolve ) ) ,
118- objectStore = transaction . objectStore ( currentStore ) ;
119- let request = objectStore . delete ( key ) ;
120- request . onsuccess = event => {
121- resolve ( event ) ;
122- } ;
123- } ) ;
124- } ) ;
125- } ,
126- clear ( ) {
127- return new Promise < any > ( ( resolve , reject ) => {
128- openDatabase ( dbName , version ) . then ( db => {
129- validateBeforeTransaction ( db , currentStore , reject ) ;
130- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readwrite , currentStore , reject , resolve ) ) ,
131- objectStore = transaction . objectStore ( currentStore ) ;
132- objectStore . clear ( ) ;
133- transaction . oncomplete = event => {
134- resolve ( ) ;
135- } ;
136- } ) ;
69+ } ) ,
70+ [ dbName , version , currentStore ]
71+ ) ;
72+
73+ const getByID = useCallback (
74+ < T > ( id : string | number ) => new Promise < T > ( ( resolve , reject ) => {
75+ openDatabase ( dbName , version ) . then ( ( db : IDBDatabase ) => {
76+ validateBeforeTransaction ( db , currentStore , reject ) ;
77+ const { store } = createReadonlyTransaction ( db , currentStore , resolve , reject ) ;
78+ const request = store . get ( + id ) ;
79+
80+ request . onsuccess = function ( event : Event ) {
81+ resolve ( ( event . target as any ) . result as T ) ;
82+ } ;
13783 } ) ;
138- } ,
139- openCursor ( cursorCallback : ( event : Event ) => void , keyRange ?: IDBKeyRange ) {
84+ } ) ,
85+ [ dbName , version , currentStore ] ,
86+ ) ;
87+
88+ const openCursor = useCallback (
89+ ( cursorCallback : ( event : Event ) => void , keyRange ?: IDBKeyRange ) => {
14090 return new Promise < void > ( ( resolve , reject ) => {
14191 openDatabase ( dbName , version ) . then ( db => {
14292 validateBeforeTransaction ( db , currentStore , reject ) ;
143- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readonly , currentStore , reject , resolve ) ) ,
144- objectStore = transaction . objectStore ( currentStore ) ,
145- request = objectStore . openCursor ( keyRange ) ;
93+ const { store } = createReadonlyTransaction ( db , currentStore , resolve , reject ) ;
94+ const request = store . openCursor ( keyRange ) ;
14695
14796 request . onsuccess = ( event : Event ) => {
14897 cursorCallback ( event ) ;
@@ -151,20 +100,96 @@ export function DBOperations(dbName: string, version: number, currentStore: stri
151100 } ) ;
152101 } ) ;
153102 } ,
154- getByIndex ( indexName : string , key : any ) {
155- return new Promise < any > ( ( resolve , reject ) => {
156- openDatabase ( dbName , version ) . then ( db => {
157- validateBeforeTransaction ( db , currentStore , reject ) ;
158- let transaction = createTransaction ( db , optionsGenerator ( DBMode . readonly , currentStore , reject , resolve ) ) ,
159- objectStore = transaction . objectStore ( currentStore ) ,
160- index = objectStore . index ( indexName ) ,
161- request = index . get ( key ) ;
162- request . onsuccess = ( event : Event ) => {
163- resolve ( ( < IDBOpenDBRequest > event . target ) . result ) ;
164- } ;
165- } ) ;
103+ [ dbName , version , currentStore ] ,
104+ ) ;
105+
106+ const getByIndex = useCallback (
107+ ( indexName : string , key : any ) => new Promise < any > ( ( resolve , reject ) => {
108+ openDatabase ( dbName , version ) . then ( db => {
109+ validateBeforeTransaction ( db , currentStore , reject ) ;
110+ const { store } = createReadonlyTransaction ( db , currentStore , resolve , reject ) ;
111+ const index = store . index ( indexName ) ;
112+ const request = index . get ( key ) ;
113+
114+ request . onsuccess = ( event : Event ) => {
115+ resolve ( ( < IDBOpenDBRequest > event . target ) . result ) ;
116+ } ;
166117 } ) ;
167- }
118+ } ) ,
119+ [ dbName , version , currentStore ] ,
120+ ) ;
121+
122+ // Readwrite operations
123+ const add = useCallback (
124+ < T > ( value : T , key ?: any ) => new Promise < number > ( ( resolve , reject ) => {
125+ openDatabase ( dbName , version ) . then ( ( db : IDBDatabase ) => {
126+ const { store } = createReadwriteTransaction ( db , currentStore , resolve , reject ) ;
127+ const request = store . add ( value , key ) ;
128+
129+ request . onsuccess = ( evt : any ) => {
130+ key = evt . target . result ;
131+ resolve ( key ) ;
132+ } ;
133+
134+ request . onerror = error => reject ( error ) ;
135+ } ) ;
136+ } ) ,
137+ [ dbName , version , currentStore ] ,
138+ ) ;
139+
140+ const update = useCallback (
141+ < T > ( value : T , key ?: any ) => new Promise < any > ( ( resolve , reject ) => {
142+ openDatabase ( dbName , version ) . then ( db => {
143+ validateBeforeTransaction ( db , currentStore , reject ) ;
144+ const {
145+ transaction,
146+ store,
147+ } = createReadwriteTransaction ( db , currentStore , resolve , reject ) ;
148+
149+ transaction . oncomplete = event => resolve ( event ) ;
150+
151+ store . put ( value , key ) ;
152+ } ) ;
153+ } ) ,
154+ [ dbName , version , currentStore ] ,
155+ ) ;
156+
157+ const deleteRecord = useCallback (
158+ ( key : Key ) => new Promise < any > ( ( resolve , reject ) => {
159+ openDatabase ( dbName , version ) . then ( db => {
160+ validateBeforeTransaction ( db , currentStore , reject ) ;
161+ const { store } = createReadwriteTransaction ( db , currentStore , resolve , reject ) ;
162+ const request = store . delete ( key ) ;
163+
164+ request . onsuccess = event => resolve ( event ) ;
165+ } ) ;
166+ } ) ,
167+ [ dbName , version , currentStore ] ,
168+ ) ;
169+
170+ const clear = useCallback (
171+ ( ) => new Promise < any > ( ( resolve , reject ) => {
172+ openDatabase ( dbName , version ) . then ( db => {
173+ validateBeforeTransaction ( db , currentStore , reject ) ;
174+ const { store, transaction } = createReadwriteTransaction ( db , currentStore , resolve , reject ) ;
175+
176+ transaction . oncomplete = ( ) => resolve ( ) ;
177+
178+ store . clear ( ) ;
179+ } ) ;
180+ } ) ,
181+ [ dbName , version , currentStore ] ,
182+ ) ;
183+
184+ return {
185+ add,
186+ getByID,
187+ getAll,
188+ update,
189+ deleteRecord,
190+ clear,
191+ openCursor,
192+ getByIndex,
168193 } ;
169194}
170195
0 commit comments