@@ -9,7 +9,7 @@ const IDB_COMPLETE = 'complete';
9
9
const IDB_ERROR = 'error' ;
10
10
const IDB_UPGRADE_NEEDED = 'upgradeneeded' ;
11
11
12
- const IDB_TXN_READ = 'read ' ;
12
+ const IDB_TXN_READ = 'readonly ' ;
13
13
const IDB_TXN_READWRITE = 'readwrite' ;
14
14
15
15
export const DB_INSERT = 'DB_INSERT' ;
@@ -120,6 +120,80 @@ export class Database {
120
120
. do ( payload => notify ? this . changes . next ( { type : DB_INSERT , payload } ) : ( { } ) ) ;
121
121
}
122
122
123
+ get ( storeName :string , key :any ) {
124
+ return this . open ( this . _schema . name )
125
+ . mergeMap ( db => {
126
+ return new Observable ( txnObserver => {
127
+ const txn = db . transaction ( [ storeName ] , IDB_TXN_READ ) ;
128
+ const objectStore = txn . objectStore ( storeName ) ;
129
+
130
+ const getRequest = objectStore . get ( key ) ;
131
+
132
+ const onTxnError = ( err ) => txnObserver . error ( err ) ;
133
+ const onTxnComplete = ( ) => txnObserver . complete ( ) ;
134
+ const onRecordFound = ( ev ) => txnObserver . next ( getRequest . result ) ;
135
+
136
+ txn . addEventListener ( IDB_COMPLETE , onTxnComplete ) ;
137
+ txn . addEventListener ( IDB_ERROR , onTxnError ) ;
138
+
139
+ getRequest . addEventListener ( IDB_SUCCESS , onRecordFound ) ;
140
+ getRequest . addEventListener ( IDB_ERROR , onTxnError ) ;
141
+
142
+ return ( ) => {
143
+ getRequest . removeEventListener ( IDB_SUCCESS , onRecordFound ) ;
144
+ getRequest . removeEventListener ( IDB_ERROR , onTxnError ) ;
145
+ txn . removeEventListener ( IDB_COMPLETE , onTxnComplete ) ;
146
+ txn . removeEventListener ( IDB_ERROR , onTxnError ) ;
147
+ }
148
+
149
+ } ) ;
150
+ } ) ;
151
+ }
152
+
153
+ query ( storeName :string , predicate ?:( rec :any ) => boolean ) {
154
+ return this . open ( this . _schema . name )
155
+ . mergeMap ( db => {
156
+ return new Observable ( txnObserver => {
157
+ const txn = db . transaction ( [ storeName ] , IDB_TXN_READ ) ;
158
+ const objectStore = txn . objectStore ( storeName ) ;
159
+
160
+ const getRequest = objectStore . openCursor ( ) ;
161
+
162
+ const onTxnError = ( err ) => txnObserver . error ( err ) ;
163
+ const onRecordFound = ( ev ) => {
164
+ let cursor = ev . target . result ;
165
+ if ( cursor ) {
166
+ if ( predicate ) {
167
+ const match = predicate ( cursor . value ) ;
168
+ if ( match ) {
169
+ txnObserver . next ( cursor . value ) ;
170
+ }
171
+ }
172
+ else {
173
+ txnObserver . next ( cursor . value ) ;
174
+ }
175
+ cursor . continue ( ) ;
176
+ }
177
+ else {
178
+ txnObserver . complete ( ) ;
179
+ }
180
+ }
181
+
182
+ txn . addEventListener ( IDB_ERROR , onTxnError ) ;
183
+
184
+ getRequest . addEventListener ( IDB_SUCCESS , onRecordFound ) ;
185
+ getRequest . addEventListener ( IDB_ERROR , onTxnError ) ;
186
+
187
+ return ( ) => {
188
+ getRequest . removeEventListener ( IDB_SUCCESS , onRecordFound ) ;
189
+ getRequest . removeEventListener ( IDB_ERROR , onTxnError ) ;
190
+ txn . removeEventListener ( IDB_ERROR , onTxnError ) ;
191
+ }
192
+
193
+ } ) ;
194
+ } ) ;
195
+ }
196
+
123
197
executeWrite ( storeName :string , actionType :string , records :any [ ] ) {
124
198
const changes = this . changes ;
125
199
return this . open ( this . _schema . name )
0 commit comments