|
71 | 71 | return "string";
|
72 | 72 | }
|
73 | 73 |
|
74 |
| - function updateInstructs(data) { |
| 74 | + async function getColumnTypes(table) { |
| 75 | + const { result } = await queryDb(dbUrl, `PRAGMA table_info('${table}')`); |
| 76 | + const types = {}; |
| 77 | + result.forEach((col) => { |
| 78 | + types[col.name] = col.type || ""; |
| 79 | + }); |
| 80 | + return types; |
| 81 | + } |
| 82 | +
|
| 83 | + async function updateInstructs(data, table = activeTable) { |
75 | 84 | if (Array.isArray(data) && data.length > 0) {
|
| 85 | + const colTypes = await getColumnTypes(table); |
76 | 86 | ptInstructs = Object.keys(data[0]).map((key) => ({
|
77 | 87 | key,
|
78 | 88 | title: key,
|
79 |
| - valueType: inferColValsType(data[0][key]), |
| 89 | + valueType: colTypes[key] || inferColValsType(data[0][key]), |
80 | 90 | ...(key.includes("URL") ? { parseAs: "unsafe-html" } : {}),
|
81 | 91 | }));
|
82 | 92 | }
|
|
186 | 196 | console.log(
|
187 | 197 | `Running query on table: ${activeTable}, column: ${selectedColumn}, search value: ${searchValue}`
|
188 | 198 | );
|
189 |
| - const escaped = searchValue.replace(/'/g, "''"); |
190 |
| - sqlQuery = `SELECT * FROM "${activeTable}" WHERE "${selectedColumn}" LIKE '%${escaped}%' LIMIT 20;`; |
| 199 | + const col = ptInstructs.find((c) => c.key === selectedColumn); |
| 200 | + const isNumber = col && /int|real|num|float/i.test(col.valueType); |
| 201 | + let clause; |
| 202 | + if (isNumber && !isNaN(searchValue)) { |
| 203 | + clause = `"${selectedColumn}" = ${Number(searchValue)}`; |
| 204 | + } else { |
| 205 | + const escaped = searchValue.replace(/'/g, "''"); |
| 206 | + clause = `"${selectedColumn}" LIKE '%${escaped}%'`; |
| 207 | + } |
| 208 | + sqlQuery = `SELECT * FROM "${activeTable}" WHERE ${clause};`; |
191 | 209 | runQuery(dbUrl, sqlQuery);
|
192 | 210 | }
|
193 | 211 |
|
194 | 212 | async function runQuery(url = dbUrl, query = sqlQuery) {
|
195 | 213 | result = null;
|
196 | 214 | querying = true;
|
197 | 215 | error = false;
|
198 |
| - let queryData = pTime(() => queryDb(url, query))(); |
199 |
| - await queryData |
200 |
| - .then((data) => { |
201 |
| - result = data.result; |
202 |
| - updateInstructs(result); |
203 |
| - timeTaken = queryData.time; |
204 |
| - bytesRead = data.bytesRead; |
205 |
| - totalRequests = data.stats.totalRequests; |
206 |
| - totalBytes = data.stats.totalBytes; |
207 |
| - querying = false; |
208 |
| - error = false; |
209 |
| - jsonFile = new Blob([JSON.stringify(result, null, 2)], { |
210 |
| - type: "application/json", |
211 |
| - }); |
212 |
| - }) |
213 |
| - .catch((queryError) => { |
214 |
| - error = true; |
215 |
| - errorMessage = queryError.message; |
216 |
| - console.log("Query Error message: ", errorMessage); |
217 |
| - console.log(queryError); |
218 |
| - querying = false; |
219 |
| - updateInstructs([]); |
220 |
| - jsonFile = null; |
| 216 | + try { |
| 217 | + let queryData = pTime(() => queryDb(url, query)); |
| 218 | + const data = await queryData(); |
| 219 | +
|
| 220 | + result = data.result; |
| 221 | + await updateInstructs(result, activeTable); |
| 222 | + timeTaken = queryData.time; |
| 223 | + bytesRead = data.bytesRead; |
| 224 | + totalRequests = data.stats.totalRequests; |
| 225 | + totalBytes = data.stats.totalBytes; |
| 226 | + error = false; |
| 227 | + jsonFile = new Blob([JSON.stringify(result, null, 2)], { |
| 228 | + type: "application/json", |
221 | 229 | });
|
| 230 | + } catch (queryError) { |
| 231 | + error = true; |
| 232 | + errorMessage = queryError.message; |
| 233 | + console.log("Query Error message: ", errorMessage); |
| 234 | + console.log(queryError); |
| 235 | + await updateInstructs([], activeTable); |
| 236 | + jsonFile = null; |
| 237 | + } finally { |
| 238 | + querying = false; |
| 239 | + } |
222 | 240 | }
|
223 | 241 | </script>
|
224 | 242 |
|
|
0 commit comments