Skip to content

Commit d93fd24

Browse files
committed
create table
1 parent 40d1e9f commit d93fd24

File tree

8 files changed

+121
-16
lines changed

8 files changed

+121
-16
lines changed

src/lib/sqlite/initStorages.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import type { TableStructure } from '../../routes/api/data/types';
22
import { sendMsgToWorker } from './messageBus';
3-
import { WorkerMessageTypes, type WorkerMessage, type TableExistsResponseData } from './types';
3+
import {
4+
WorkerMessageTypes,
5+
type WorkerMessage,
6+
type TableExistsResponseData,
7+
type CreateTableRequestData
8+
} from './types';
49

510
const storages = ['customers_v1'];
611

@@ -10,6 +15,17 @@ async function getStructure(storage: string): Promise<TableStructure> {
1015
return data;
1116
}
1217

18+
async function createStorage(storage: string, structure: TableStructure) {
19+
const res = (await sendMsgToWorker({
20+
storageId: storage,
21+
type: WorkerMessageTypes.CREATE_TABLE,
22+
expectedType: WorkerMessageTypes.CREATE_TABLE_RESPONSE,
23+
data: { structure } as CreateTableRequestData
24+
})) as WorkerMessage<TableExistsResponseData>;
25+
26+
if (res.data.errorMsg) throw new Error(res.data.errorMsg);
27+
}
28+
1329
export default async function initStorages() {
1430
for (const storageId of storages) {
1531
const res = (await sendMsgToWorker({
@@ -19,11 +35,14 @@ export default async function initStorages() {
1935
data: undefined
2036
})) as WorkerMessage<TableExistsResponseData>;
2137

38+
if (res.data.errorMsg) throw new Error(res.data.errorMsg);
39+
2240
if (res.data.tableExists) {
2341
console.log(`Table ${storageId} exists. Has data: ${res.data.hasData}`);
2442
} else {
2543
const structure = await getStructure(storageId);
2644
console.log(`Table ${storageId} does not exist. Creating...`, structure);
45+
await createStorage(storageId, structure);
2746
}
2847
}
2948
}

src/lib/sqlite/messageBus.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { WorkerMessage, WorkerMessageBase, WorkerMessageTypes } from './types';
1+
import type { WorkerMessage, WorkerMessageTypes } from './types';
22

33
export type WorkerMsgCb = (data: WorkerMessage<unknown>) => unknown;
44
const cbMap = new Map<string, WorkerMsgCb>();
@@ -68,9 +68,9 @@ export function sendMsgToWorker({
6868
cb
6969
});
7070

71-
const msgData: WorkerMessageBase = { messageId, storageId, type };
71+
const msgData = <WorkerMessage<unknown>>{ messageId, storageId, type };
7272
if (typeof data == 'object') {
73-
Object.assign(msgData, data);
73+
msgData.data = data;
7474
}
7575

7676
worker.postMessage(msgData);

src/lib/sqlite/types.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import type { TableStructure } from '../../routes/api/data/types';
2+
13
export enum WorkerMessageTypes {
2-
INIT_DB,
3-
INIT_DB_RESPONSE,
4-
TABLE_EXISTS,
5-
TABLE_EXISTS_RESPONSE
4+
INIT_DB = 'INIT_DB',
5+
INIT_DB_RESPONSE = 'INIT_DB_RESPONSE',
6+
TABLE_EXISTS = 'TABLE_EXISTS',
7+
TABLE_EXISTS_RESPONSE = 'TABLE_EXISTS_RESPONSE',
8+
CREATE_TABLE = 'CREATE_TABLE',
9+
CREATE_TABLE_RESPONSE = 'CREATE_TABLE_RESPONSE'
610
}
711

812
export type WorkerMessageBase = {
@@ -18,3 +22,11 @@ export type TableExistsResponseData = {
1822
hasData: boolean;
1923
errorMsg?: string;
2024
};
25+
26+
export type CreateTableRequestData = {
27+
structure: TableStructure;
28+
};
29+
30+
export type CreateTableResponseData = {
31+
errorMsg?: string;
32+
};

src/lib/sqlite/worker/storageHandlers.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import type { TableExistsResponseData, WorkerMessage } from '../types';
1+
import type {
2+
CreateTableRequestData,
3+
CreateTableResponseData,
4+
TableExistsResponseData,
5+
WorkerMessage
6+
} from '../types';
7+
import { db } from './initDb';
8+
import genTabSrc from './util/genTabSrc';
29
import { tableExists, tableHasData } from './util/tableInfo';
310

411
export function handleTableExists(data: WorkerMessage<unknown>): TableExistsResponseData {
@@ -26,3 +33,23 @@ export function handleTableExists(data: WorkerMessage<unknown>): TableExistsResp
2633
};
2734
}
2835
}
36+
37+
export function handleCreateTable(
38+
msg: WorkerMessage<CreateTableRequestData>
39+
): CreateTableResponseData {
40+
try {
41+
const src = genTabSrc(msg.storageId, msg.data.structure);
42+
console.log('Creating table:', src);
43+
44+
db.exec(src);
45+
46+
return {};
47+
} catch (err) {
48+
const msg = `Error creating table: ${err}`;
49+
console.error(msg);
50+
51+
return {
52+
errorMsg: msg
53+
};
54+
}
55+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { ColType, TableStructure } from '../../../../routes/api/data/types';
2+
3+
function getDataType(coltype: ColType): string {
4+
switch (coltype) {
5+
case 'string':
6+
return 'text';
7+
case 'number':
8+
return 'real';
9+
default:
10+
throw new Error(`Unknown column type: ${coltype}`);
11+
}
12+
}
13+
14+
export default function genTabSrc(storageId: string, structure: TableStructure) {
15+
let statement = `Create Table ${storageId} (`;
16+
17+
const atomics: string[] = [];
18+
19+
for (const col of structure.columns) {
20+
atomics.push(`${col.name} ${getDataType(col.type)}`);
21+
}
22+
23+
atomics.push(`PRIMARY KEY (${structure.pkColumn})`);
24+
25+
statement += ` ${atomics.join(', ')} ) strict;`;
26+
27+
return statement;
28+
}

src/lib/sqlite/worker/util/tableInfo.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ export function tableExists(table: string) {
1313
export function tableHasData(table: string) {
1414
const sql = `SELECT count(*) as "cnt" FROM ${table}`;
1515

16-
const res = db.selectObject(sql, {
17-
$table: table
18-
}) as { cnt: number };
16+
const res = db.selectObject(sql) as { cnt: number };
1917

2018
return res.cnt > 0;
2119
}

src/lib/sqlite/worker/worker.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
/* eslint-disable no-case-declarations */
2-
import { WorkerMessageTypes, type WorkerMessage, type TableExistsResponseData } from '../types';
2+
import {
3+
WorkerMessageTypes,
4+
type WorkerMessage,
5+
type TableExistsResponseData,
6+
type CreateTableResponseData,
7+
type CreateTableRequestData
8+
} from '../types';
39
import { initDb } from './initDb';
4-
import { handleTableExists } from './storageHandlers';
10+
import { handleCreateTable, handleTableExists } from './storageHandlers';
511

612
console.log('worker loaded');
713

@@ -11,7 +17,7 @@ function sendMsgToMain(obj: WorkerMessage<unknown>) {
1117

1218
(async function () {
1319
addEventListener('message', async function ({ data }: { data: WorkerMessage<unknown> }) {
14-
console.log('worker received message:', data.type);
20+
console.log('worker received message:', data);
1521

1622
switch (data.type) {
1723
case WorkerMessageTypes.INIT_DB:
@@ -42,6 +48,19 @@ function sendMsgToMain(obj: WorkerMessage<unknown>) {
4248
sendMsgToMain(tableExistsResult);
4349
break;
4450

51+
case WorkerMessageTypes.CREATE_TABLE:
52+
const createTableData = await handleCreateTable(
53+
data as WorkerMessage<CreateTableRequestData>
54+
);
55+
56+
const createTableResult: WorkerMessage<CreateTableResponseData> = {
57+
type: WorkerMessageTypes.CREATE_TABLE_RESPONSE,
58+
messageId: data.messageId,
59+
storageId: data.storageId,
60+
data: createTableData
61+
};
62+
sendMsgToMain(createTableResult);
63+
break;
4564
default:
4665
throw new Error(`Unknown message type: ${data.type}`);
4766
}

src/routes/api/data/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
export type ColType = 'string' | 'number';
2+
13
export type ColumnInfo = {
24
name: string;
3-
type: 'string' | 'number';
5+
type: ColType;
46
};
57

68
export type TableStructure = {

0 commit comments

Comments
 (0)