Skip to content

Commit 40d1e9f

Browse files
committed
check table exists
1 parent eb7f364 commit 40d1e9f

File tree

6 files changed

+104
-2
lines changed

6 files changed

+104
-2
lines changed

src/lib/sqlite/initStorages.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { TableStructure } from '../../routes/api/data/types';
2+
import { sendMsgToWorker } from './messageBus';
3+
import { WorkerMessageTypes, type WorkerMessage, type TableExistsResponseData } from './types';
4+
5+
const storages = ['customers_v1'];
6+
7+
async function getStructure(storage: string): Promise<TableStructure> {
8+
const res = await fetch(`/api/data/${storage}/structure`);
9+
const data = (await res.json()) as TableStructure;
10+
return data;
11+
}
12+
13+
export default async function initStorages() {
14+
for (const storageId of storages) {
15+
const res = (await sendMsgToWorker({
16+
storageId,
17+
type: WorkerMessageTypes.TABLE_EXISTS,
18+
expectedType: WorkerMessageTypes.TABLE_EXISTS_RESPONSE,
19+
data: undefined
20+
})) as WorkerMessage<TableExistsResponseData>;
21+
22+
if (res.data.tableExists) {
23+
console.log(`Table ${storageId} exists. Has data: ${res.data.hasData}`);
24+
} else {
25+
const structure = await getStructure(storageId);
26+
console.log(`Table ${storageId} does not exist. Creating...`, structure);
27+
}
28+
}
29+
}

src/lib/sqlite/loadWorker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import initStorages from './initStorages';
12
import { initMsgBus, sendMsgToWorker } from './messageBus';
23
import { WorkerMessageTypes } from './types';
34

@@ -15,4 +16,6 @@ export default async function initWorker() {
1516
});
1617

1718
console.log('Init worker response:', res);
19+
20+
initStorages();
1821
}

src/lib/sqlite/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
export enum WorkerMessageTypes {
22
INIT_DB,
3-
INIT_DB_RESPONSE
3+
INIT_DB_RESPONSE,
4+
TABLE_EXISTS,
5+
TABLE_EXISTS_RESPONSE
46
}
57

68
export type WorkerMessageBase = {
@@ -10,3 +12,9 @@ export type WorkerMessageBase = {
1012
};
1113

1214
export type WorkerMessage<T> = { data: T } & WorkerMessageBase;
15+
16+
export type TableExistsResponseData = {
17+
tableExists: boolean;
18+
hasData: boolean;
19+
errorMsg?: string;
20+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { TableExistsResponseData, WorkerMessage } from '../types';
2+
import { tableExists, tableHasData } from './util/tableInfo';
3+
4+
export function handleTableExists(data: WorkerMessage<unknown>): TableExistsResponseData {
5+
try {
6+
const { storageId } = data;
7+
8+
const resData = <TableExistsResponseData>{};
9+
resData.tableExists = tableExists(storageId);
10+
11+
if (resData.tableExists) {
12+
resData.hasData = tableHasData(storageId);
13+
} else {
14+
resData.hasData = false;
15+
}
16+
17+
return resData;
18+
} catch (err) {
19+
const msg = `Error checking if table exists: ${err}`;
20+
console.error(msg);
21+
22+
return {
23+
tableExists: false,
24+
hasData: false,
25+
errorMsg: msg
26+
};
27+
}
28+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { db } from '../initDb';
2+
3+
export function tableExists(table: string) {
4+
const sql = `SELECT count(*) as "cnt" FROM sqlite_master WHERE type='table' AND name= $table`;
5+
6+
const res = db.selectObject(sql, {
7+
$table: table
8+
}) as { cnt: number };
9+
10+
return res.cnt > 0;
11+
}
12+
13+
export function tableHasData(table: string) {
14+
const sql = `SELECT count(*) as "cnt" FROM ${table}`;
15+
16+
const res = db.selectObject(sql, {
17+
$table: table
18+
}) as { cnt: number };
19+
20+
return res.cnt > 0;
21+
}

src/lib/sqlite/worker/worker.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable no-case-declarations */
2-
import { WorkerMessageTypes, type WorkerMessage } from '../types';
2+
import { WorkerMessageTypes, type WorkerMessage, type TableExistsResponseData } from '../types';
33
import { initDb } from './initDb';
4+
import { handleTableExists } from './storageHandlers';
45

56
console.log('worker loaded');
67

@@ -29,6 +30,18 @@ function sendMsgToMain(obj: WorkerMessage<unknown>) {
2930

3031
break;
3132

33+
case WorkerMessageTypes.TABLE_EXISTS:
34+
const tableExistData = handleTableExists(data);
35+
36+
const tableExistsResult: WorkerMessage<TableExistsResponseData> = {
37+
type: WorkerMessageTypes.TABLE_EXISTS_RESPONSE,
38+
messageId: data.messageId,
39+
storageId: data.storageId,
40+
data: tableExistData
41+
};
42+
sendMsgToMain(tableExistsResult);
43+
break;
44+
3245
default:
3346
throw new Error(`Unknown message type: ${data.type}`);
3447
}

0 commit comments

Comments
 (0)