SQLite support

This commit is contained in:
Maxime-J 2022-08-11 17:32:00 +00:00
parent 2181ca4ec8
commit 578a96ee09
7 changed files with 319 additions and 5 deletions

View file

@ -6,6 +6,8 @@ import {
MYSQL_DATE_FORMATS,
POSTGRESQL,
POSTGRESQL_DATE_FORMATS,
SQLITE,
SQLITE_DATE_FORMATS,
CLICKHOUSE,
RELATIONAL,
FILTER_IGNORED,
@ -83,6 +85,10 @@ export function getDatabase() {
return POSTGRESQL;
}
if (type === 'file') {
return SQLITE;
}
return type;
}
@ -95,6 +101,10 @@ export function getAnalyticsDatabase() {
return POSTGRESQL;
}
if (type === 'file') {
return SQLITE;
}
if (!type) {
return getDatabase();
}
@ -122,9 +132,16 @@ export function getDateQuery(field, unit, timezone) {
return `date_format(convert_tz(${field},'+00:00','${tz}'), '${MYSQL_DATE_FORMATS[unit]}')`;
}
return `date_format(${field}, '${MYSQL_DATE_FORMATS[unit]}')`;
}
if (db === SQLITE) {
if(timezone) {
const tz = moment.tz(timezone).format('Z').substring(0,3);
return `strftime('${SQLITE_DATE_FORMATS[unit]}', substr(${field}, 1, LENGTH(${field}) - 3), 'unixepoch', '${tz} hours')`;
}
return `strftime('${SQLITE_DATE_FORMATS[unit]}', substr(${field}, 1, LENGTH(${field}) - 3), 'unixepoch')`;
}
}
export function getDateQueryClickhouse(field, unit, timezone) {
@ -153,6 +170,10 @@ export function getTimestampInterval(field) {
if (db === MYSQL) {
return `floor(unix_timestamp(max(${field})) - unix_timestamp(min(${field})))`;
}
if (db === SQLITE) {
return `max(substr(${field}, 1, LENGTH(${field}) - 3)) - min(substr(${field}, 1, LENGTH(${field}) - 3))`;
}
}
export function getFilterQuery(table, column, filters = {}, params = []) {
@ -265,11 +286,19 @@ export async function runQuery(query) {
export async function rawQuery(query, params = []) {
const db = getDatabase();
if (db !== POSTGRESQL && db !== MYSQL) {
if (db !== POSTGRESQL && db !== MYSQL && db !== SQLITE) {
return Promise.reject(new Error('Unknown database.'));
}
const sql = db === MYSQL ? query.replace(/\$[0-9]+/g, '?') : query;
const sql = db !== POSTGRESQL ? query.replace(/\$[0-9]+/g, '?') : query;
if (db === SQLITE) {
params.forEach((param, index) => {
if (param instanceof Date) {
params[index] = param.getTime();
}
});
}
return runQuery(prisma.$queryRawUnsafe.apply(prisma, [sql, ...params]));
}
@ -295,7 +324,7 @@ export async function findUnique(data) {
export async function runAnalyticsQuery(queries) {
const db = getAnalyticsDatabase();
if (db === POSTGRESQL || db === MYSQL) {
if (db === POSTGRESQL || db === MYSQL || db === SQLITE) {
return queries[RELATIONAL]();
}