Skip to content

Commit e4ea5ba

Browse files
committed
Move SQL engine to separate file
1 parent abd09a1 commit e4ea5ba

2 files changed

Lines changed: 130 additions & 57 deletions

File tree

frontend/src/App.vue

Lines changed: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,38 @@
11
<script setup>
2-
import { ref, onMounted } from 'vue'
3-
import { useRoute, useRouter } from 'vue-router'
4-
import initSqlJs from 'sql.js';
5-
import FileUploaderView from './components/FileUploaderView.vue'
2+
import {ref} from 'vue'
3+
import {useRoute, useRouter} from 'vue-router'
4+
import FileUploaderView from '@/components/FileUploaderView.vue'
65
import CoinListView from "@/components/CoinListView.vue";
76
import AboutView from "@/components/AboutView.vue";
7+
import {useSQLite} from "@/composables/useSQLite.js";
8+
9+
const {isLoading,
10+
error,
11+
status,
12+
openDatabase,
13+
executeQuery} = useSQLite()
814
915
const selectedFile = ref(null)
1016
const coinsList = ref([])
1117
let isOpened = false;
1218
const title = ref('OpenNumismat')
1319
14-
const db = ref(null);
15-
const status = ref('');
16-
17-
let SQL = null;
18-
1920
const drawer = ref(false)
2021
2122
const router = useRouter()
2223
const route = useRoute()
2324
24-
onMounted(async () => {
25-
try {
26-
SQL = await initSqlJs({
27-
locateFile: file => `https://sql.js.org/dist/${file}`
28-
});
29-
status.value = 'SQL.js loaded successfully';
30-
} catch (err) {
31-
console.error('Failed to load SQL.js:', err);
32-
status.value = 'Failed to load SQL.js';
33-
}
34-
});
35-
3625
const handleFileUpload = async (file) => {
37-
if (!file) return;
38-
39-
status.value = 'Loading database...';
40-
router.replace('/')
41-
isOpened = true;
42-
selectedFile.value = file;
26+
if (!file)
27+
return;
4328
44-
const reader = new FileReader();
29+
await openDatabase(file)
4530
46-
reader.onload = async (e) => {
47-
try {
48-
const arrayBuffer = e.target.result;
49-
const uint8Array = new Uint8Array(arrayBuffer);
50-
51-
// Load database
52-
db.value = new SQL.Database(uint8Array);
53-
54-
status.value = `Database loaded successfully: ${file.name} (${(file.size / 1024 / 1024).toFixed(2)} MB)`;
55-
56-
const coins = db.value.exec(`
57-
SELECT coins.id, images.image, title, status, subjectshort, value, unit, year, mintmark, series, country
58-
FROM coins LEFT OUTER JOIN images on images.id = coins.image
59-
`);
60-
coinsList.value = coins.length > 0
61-
? coins[0].values
62-
: [];
63-
64-
selectedFile.value = file;
65-
} catch (err) {
66-
console.error('Error loading database:', err);
67-
status.value = 'Error loading database';
68-
}
69-
};
70-
71-
reader.onerror = () => {
72-
status.value = `Error reading file`;
73-
};
31+
selectedFile.value = file;
32+
isOpened = true;
33+
await router.replace('/')
7434
75-
reader.readAsArrayBuffer(file);
35+
coinsList.value = await executeQuery("")
7636
}
7737
</script>
7838

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import {onMounted, ref} from 'vue'
2+
import initSqlJs from "sql.js";
3+
4+
let isInitialized = false
5+
let SQL = null
6+
let db = null
7+
8+
export function useSQLite() {
9+
const isLoading = ref(false)
10+
const error = ref(null)
11+
const status = ref('');
12+
13+
onMounted(async () => {
14+
await initialize()
15+
});
16+
17+
const initialize = async () => {
18+
if (isInitialized)
19+
return
20+
21+
isLoading.value = true
22+
error.value = null
23+
24+
try {
25+
SQL = await initSqlJs({
26+
locateFile: file => `https://sql.js.org/dist/${file}`
27+
});
28+
status.value = 'SQL.js loaded successfully';
29+
isInitialized = true
30+
}
31+
catch (err) {
32+
console.error('Failed to load SQL.js:', err);
33+
status.value = 'Failed to load SQL.js';
34+
}
35+
finally {
36+
isLoading.value = false
37+
}
38+
}
39+
40+
const openDatabase = async (file) => {
41+
return new Promise((resolve, reject) => {
42+
if (!isInitialized)
43+
initialize()
44+
45+
isLoading.value = true
46+
error.value = null
47+
48+
status.value = 'Loading database...';
49+
50+
const reader = new FileReader();
51+
52+
reader.onload = async (e) => {
53+
try {
54+
const arrayBuffer = e.target.result;
55+
const uint8Array = new Uint8Array(arrayBuffer);
56+
57+
// Load database
58+
db = new SQL.Database(uint8Array);
59+
60+
status.value = `Database loaded successfully: ${file.name} (${(file.size / 1024 / 1024).toFixed(2)} MB)`;
61+
resolve()
62+
}
63+
catch (err) {
64+
console.error('Error loading database:', err);
65+
status.value = 'Error loading database';
66+
reject()
67+
}
68+
finally {
69+
isLoading.value = false
70+
}
71+
}
72+
73+
reader.onerror = () => {
74+
status.value = `Error reading file`;
75+
isLoading.value = false
76+
reject()
77+
}
78+
79+
reader.readAsArrayBuffer(file);
80+
});
81+
}
82+
83+
const executeQuery = async (sql, params = []) => {
84+
if (!db)
85+
return
86+
87+
isLoading.value = true
88+
error.value = null
89+
status.value = 'Executing query...';
90+
91+
const result = db.exec(`
92+
SELECT coins.id, images.image, title, status, subjectshort, value, unit, year, mintmark, series, country
93+
FROM coins LEFT OUTER JOIN images on images.id = coins.image
94+
`);
95+
console.log(result[0].values)
96+
const results = result.length > 0
97+
? result[0].values
98+
: [];
99+
100+
isLoading.value = false
101+
status.value = 'Done';
102+
103+
return results
104+
}
105+
106+
return {
107+
isLoading,
108+
error,
109+
status,
110+
openDatabase,
111+
executeQuery,
112+
}
113+
}

0 commit comments

Comments
 (0)