|
21 | 21 |
|
22 | 22 | import * as commonStorage from './common_storage'; |
23 | 23 | import * as storageModuleContent from './module_content'; |
| 24 | +import * as storageNames from './names'; |
24 | 25 |
|
25 | 26 | // Functions for saving blocks modules to client side storage. |
26 | 27 |
|
@@ -57,7 +58,62 @@ export async function openClientSideStorage(): Promise<commonStorage.Storage> { |
57 | 58 | }; |
58 | 59 | openRequest.onsuccess = () => { |
59 | 60 | const db = openRequest.result; |
60 | | - resolve(ClientSideStorage.create(db)); |
| 61 | + fixOldModules(db).then(() => { |
| 62 | + resolve(ClientSideStorage.create(db)); |
| 63 | + }) |
| 64 | + }; |
| 65 | + }); |
| 66 | +} |
| 67 | + |
| 68 | +// The following function allows Alan and Liz to load older projects. |
| 69 | +// TODO(lizlooney): Remove this function. |
| 70 | +async function fixOldModules(db: IDBDatabase): Promise<void> { |
| 71 | + return new Promise((resolve, reject) => { |
| 72 | + const transaction = db.transaction([MODULES_STORE_NAME], 'readwrite'); |
| 73 | + transaction.oncomplete = () => { |
| 74 | + resolve(); |
| 75 | + }; |
| 76 | + transaction.onabort = () => { |
| 77 | + console.log('IndexedDB transaction aborted.'); |
| 78 | + reject(new Error('IndexedDB transaction aborted.')); |
| 79 | + }; |
| 80 | + const modulesObjectStore = transaction.objectStore(MODULES_STORE_NAME); |
| 81 | + const openCursorRequest = modulesObjectStore.openCursor(); |
| 82 | + openCursorRequest.onerror = () => { |
| 83 | + console.log('IndexedDB openCursor request failed. openCursorRequest.error is...'); |
| 84 | + console.log(openCursorRequest.error); |
| 85 | + reject(new Error('IndexedDB openCursor request failed.')); |
| 86 | + }; |
| 87 | + openCursorRequest.onsuccess = () => { |
| 88 | + const cursor = openCursorRequest.result; |
| 89 | + if (cursor) { |
| 90 | + const value = cursor.value; |
| 91 | + const regexForOldModulePath = new RegExp('^([A-Z][A-Za-z0-9]*)/([A-Z][A-Za-z0-9]*).json$'); |
| 92 | + const result = regexForOldModulePath.exec(value.path); |
| 93 | + if (result) { |
| 94 | + const oldModulePath = value.path; |
| 95 | + const projectName = result[1]; |
| 96 | + const className = result[2]; |
| 97 | + const moduleType = storageModuleContent.parseModuleContentText(value.content).getModuleType(); |
| 98 | + value.path = storageNames.makeModulePath(projectName, className, moduleType); |
| 99 | + const putRequest = modulesObjectStore.put(value); |
| 100 | + putRequest.onerror = () => { |
| 101 | + console.log('IndexedDB put request failed. putRequest.error is...'); |
| 102 | + console.log(putRequest.error); |
| 103 | + throw new Error('IndexedDB put request failed.'); |
| 104 | + }; |
| 105 | + const deleteRequest = modulesObjectStore.delete(oldModulePath); |
| 106 | + deleteRequest.onerror = () => { |
| 107 | + console.log('IndexedDB delete request failed. deleteRequest.error is...'); |
| 108 | + console.log(deleteRequest.error); |
| 109 | + throw new Error('IndexedDB delete request failed.'); |
| 110 | + }; |
| 111 | + } |
| 112 | + cursor.continue(); |
| 113 | + } else { |
| 114 | + // The cursor is done. We have finished reading all the modules. |
| 115 | + resolve(); |
| 116 | + } |
61 | 117 | }; |
62 | 118 | }); |
63 | 119 | } |
@@ -257,8 +313,6 @@ class ClientSideStorage implements commonStorage.Storage { |
257 | 313 | console.log(deleteRequest.error); |
258 | 314 | throw new Error('IndexedDB delete request failed.'); |
259 | 315 | }; |
260 | | - deleteRequest.onsuccess = () => { |
261 | | - }; |
262 | 316 | }); |
263 | 317 | } |
264 | 318 | } |
0 commit comments