Skip to content

Commit bfe18ff

Browse files
committed
fix minor issues with database
1 parent 34ac1c3 commit bfe18ff

File tree

6 files changed

+96
-95
lines changed

6 files changed

+96
-95
lines changed

eslint.config.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import rules from '../../packages/eslint/index.js';
2+
export default rules;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"main": ".webpack/main",
99
"scripts": {
1010
"dev": "concurrently \"pnpm run dev:expo\" \"pnpm run dev:electron\"",
11-
"dev:expo": "ELECTRON=true EXPO_NO_METRO_LAZY=true BROWSER=none pnpm --filter @wcpos/main dev --web --port 8088",
11+
"dev:expo": "ELECTRON=true EXPO_NO_METRO_LAZY=true BROWSER=none pnpm --filter @wcpos/main dev --web --port 8088 --clear",
1212
"dev:electron": "NODE_ENV=\"development\" electron-forge start --enable-logging",
1313
"rebuild:all": "electron-rebuild -v 34.1.1 -f",
1414
"package": "DEBUG=electron-osx-sign* electron-forge package",

src/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { app, BrowserWindow } from 'electron';
22

3-
// import { installExtensions } from './main/extensions';
3+
import { installExtensions } from './main/extensions';
44
import logger from './main/log';
55
import { registerMenu } from './main/menu';
66
import { initProtocolHandling } from './main/protocol';
@@ -13,10 +13,10 @@ import './main/print-external-url';
1313
import './main/basePath';
1414

1515
// enabled logging when in development
16-
if (process.env.NODE_ENV === 'development') {
17-
app.commandLine.appendSwitch('enable-logging');
18-
app.commandLine.appendSwitch('v', '1');
19-
}
16+
// if (process.env.NODE_ENV === 'development') {
17+
// app.commandLine.appendSwitch('enable-logging');
18+
// app.commandLine.appendSwitch('v', '1');
19+
// }
2020

2121
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
2222
if (require('electron-squirrel-startup')) {
@@ -29,7 +29,7 @@ if (require('electron-squirrel-startup')) {
2929
app
3030
.whenReady()
3131
.then(loadTranslations)
32-
// .then(installExtensions)
32+
.then(installExtensions)
3333
.then(() => {
3434
logger.info('Starting app');
3535
createWindow();

src/main/database.ts

Lines changed: 78 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import fs from 'fs';
22
import path from 'path';
3+
34
import Database from 'better-sqlite3';
45
import { app, ipcMain } from 'electron';
6+
57
import logger from './log';
68

79
const isDevelopment = process.env.NODE_ENV === 'development';
@@ -11,51 +13,53 @@ const registry = new Map();
1113
* Open or retrieve an existing SQLite database.
1214
*/
1315
const openDatabase = (name: string) => {
14-
// Check registry first
15-
if (registry.has(name)) {
16-
return { name };
17-
}
16+
// Check registry first
17+
if (registry.has(name)) {
18+
return { name };
19+
}
1820

19-
try {
20-
const dbFolder = isDevelopment
21-
? path.resolve('databases')
22-
: path.resolve(app.getPath('userData'), 'wcpos_dbs');
21+
try {
22+
const dbFolder = isDevelopment
23+
? path.resolve('databases')
24+
: path.resolve(app.getPath('userData'), 'wcpos_dbs');
2325

24-
// Create folder if it doesn't exist
25-
if (!fs.existsSync(dbFolder)) {
26-
try {
27-
fs.mkdirSync(dbFolder, { recursive: true });
28-
logger.info(`Created database folder: ${dbFolder}`);
29-
} catch (err) {
30-
logger.error(`Failed to create database folder: ${dbFolder}`, err);
31-
}
32-
}
26+
// Create folder if it doesn't exist
27+
if (!fs.existsSync(dbFolder)) {
28+
try {
29+
fs.mkdirSync(dbFolder, { recursive: true });
30+
logger.info(`Created database folder: ${dbFolder}`);
31+
} catch (err) {
32+
logger.error(`Failed to create database folder: ${dbFolder}`, err);
33+
}
34+
}
3335

34-
logger.info('Opening SQLite database', name);
35-
const db = new Database(path.resolve(dbFolder, `${name}.sqlite3`), { verbose: logger.debug });
36-
logger.info('Opened SQLite database', db);
36+
logger.info('Opening SQLite database', name);
37+
const db = new Database(path.resolve(dbFolder, `${name}.sqlite3`), {
38+
verbose: isDevelopment ? logger.silly : undefined,
39+
});
40+
logger.info('Opened SQLite database', db);
3741

38-
registry.set(name, db);
39-
return { name };
40-
} catch (error) {
41-
logger.error('Failed to open database', error);
42-
throw error;
43-
}
42+
registry.set(name, db);
43+
return { name };
44+
} catch (error) {
45+
logger.error('Failed to open database', error);
46+
throw error;
47+
}
4448
};
4549

4650
export const closeAll = () => {
47-
registry.forEach((db, name) => {
48-
db.close();
49-
registry.delete(name);
50-
logger.info(`Closed and removed ${name} from registry.`);
51-
});
51+
registry.forEach((db, name) => {
52+
db.close();
53+
registry.delete(name);
54+
logger.info(`Closed and removed ${name} from registry.`);
55+
});
5256
};
5357

5458
/**
5559
* Convert boolean values in parameters to numbers (SQLite doesn't support booleans).
5660
*/
5761
function convertBooleansToNumbers(params: (string | number | boolean)[]): (string | number)[] {
58-
return params.map(param => (typeof param === 'boolean' ? (param ? 1 : 0) : param));
62+
return params.map((param) => (typeof param === 'boolean' ? (param ? 1 : 0) : param));
5963
}
6064

6165
/**
@@ -67,51 +71,51 @@ function convertBooleansToNumbers(params: (string | number | boolean)[]): (strin
6771
* - All others: use .run()
6872
*/
6973
function executeSql(db, sql, params) {
70-
if (/^\s*SELECT/i.test(sql)) {
71-
return db.prepare(sql).all(params);
72-
}
73-
// PRAGMA assignments like "PRAGMA synchronous = normal" do not return data.
74-
if (/^\s*PRAGMA\s+\w+\s*=\s*/i.test(sql)) {
75-
return db.prepare(sql).run(params);
76-
}
77-
if (/^\s*PRAGMA/i.test(sql)) {
78-
return db.prepare(sql).all(params);
79-
}
80-
return db.prepare(sql).run(params);
74+
if (/^\s*SELECT/i.test(sql)) {
75+
return db.prepare(sql).all(params);
76+
}
77+
// PRAGMA assignments like "PRAGMA synchronous = normal" do not return data.
78+
if (/^\s*PRAGMA\s+\w+\s*=\s*/i.test(sql)) {
79+
return db.prepare(sql).run(params);
80+
}
81+
if (/^\s*PRAGMA/i.test(sql)) {
82+
return db.prepare(sql).all(params);
83+
}
84+
return db.prepare(sql).run(params);
8185
}
8286

8387
/**
8488
* Handle SQLite IPC requests.
8589
*/
8690
ipcMain.handle('sqlite', (event, obj) => {
87-
logger.silly('SQL request', JSON.stringify(obj, null, 2));
88-
try {
89-
let db;
90-
switch (obj.type) {
91-
case 'open':
92-
return openDatabase(obj.name);
93-
case 'close':
94-
db = registry.get(obj.name);
95-
if (!db) throw new Error(`Database connection "${obj.name}" not found`);
96-
db.close();
97-
registry.delete(obj.name);
98-
logger.info(`Closed and removed ${obj.name} from registry.`);
99-
return;
100-
case 'quit':
101-
closeAll();
102-
return;
103-
case 'all':
104-
case 'run': {
105-
db = registry.get(obj.name);
106-
if (!db) throw new Error(`Database connection "${obj.name}" not found`);
107-
const convertedParams = convertBooleansToNumbers(obj.sql.params);
108-
return executeSql(db, obj.sql.query, convertedParams);
109-
}
110-
default:
111-
throw new Error('Unknown type');
112-
}
113-
} catch (err) {
114-
logger.error('SQLite error', err, obj);
115-
throw err;
116-
}
117-
});
91+
logger.silly('SQL request', JSON.stringify(obj, null, 2));
92+
try {
93+
let db;
94+
switch (obj.type) {
95+
case 'open':
96+
return openDatabase(obj.name);
97+
case 'close':
98+
db = registry.get(obj.name);
99+
if (!db) throw new Error(`Database connection "${obj.name}" not found`);
100+
db.close();
101+
registry.delete(obj.name);
102+
logger.info(`Closed and removed ${obj.name} from registry.`);
103+
return;
104+
case 'quit':
105+
closeAll();
106+
return;
107+
case 'all':
108+
case 'run': {
109+
db = registry.get(obj.name);
110+
if (!db) throw new Error(`Database connection "${obj.name}" not found`);
111+
const convertedParams = convertBooleansToNumbers(obj.sql.params);
112+
return executeSql(db, obj.sql.query, convertedParams);
113+
}
114+
default:
115+
throw new Error('Unknown type');
116+
}
117+
} catch (err) {
118+
logger.error('SQLite error', err, obj);
119+
throw err;
120+
}
121+
});

src/main/extensions.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
1+
import { installExtension, REACT_DEVELOPER_TOOLS } from 'electron-devtools-installer';
12
const isDebug = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true';
23

3-
if (isDebug) {
4-
require('electron-debug')();
5-
}
4+
// if (isDebug) {
5+
// require('electron-debug')();
6+
// }
67

78
export const installExtensions = async () => {
89
if (!isDebug) {
910
return;
1011
}
11-
const installer = require('electron-devtools-installer');
12-
const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
13-
const extensions = ['REACT_DEVELOPER_TOOLS'];
12+
// const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
1413

15-
return installer
16-
.default(
17-
extensions.map((name) => installer[name]),
18-
forceDownload
19-
)
20-
.catch(console.log);
14+
return installExtension([REACT_DEVELOPER_TOOLS])
15+
.then(([react]) => console.log(`Added Extensions: ${react.name}`))
16+
.catch((err) => console.log('An error occurred: ', err));
2117
};

src/main/window.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { BrowserWindow, shell } from 'electron';
44
import serve from 'electron-serve';
55

66
import log from './log';
7-
8-
const isDevelopment = process.env.NODE_ENV === 'development';
7+
import { isDevelopment } from './util';
98

109
// Set up electron-serve
1110
let loadURL: (window: BrowserWindow) => void;

0 commit comments

Comments
 (0)