|
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