mirror of
https://github.com/umami-software/umami.git
synced 2026-02-19 12:05:41 +01:00
SQLite support
This commit is contained in:
parent
2181ca4ec8
commit
578a96ee09
7 changed files with 319 additions and 5 deletions
|
|
@ -70,6 +70,7 @@ export const EVENT_COLORS = [
|
|||
export const RELATIONAL = 'relational';
|
||||
export const POSTGRESQL = 'postgresql';
|
||||
export const MYSQL = 'mysql';
|
||||
export const SQLITE = 'sqlite';
|
||||
export const CLICKHOUSE = 'clickhouse';
|
||||
|
||||
export const MYSQL_DATE_FORMATS = {
|
||||
|
|
@ -88,6 +89,14 @@ export const POSTGRESQL_DATE_FORMATS = {
|
|||
year: 'YYYY-01-01',
|
||||
};
|
||||
|
||||
export const SQLITE_DATE_FORMATS = {
|
||||
minute: '%Y-%m-%d %H:%M:00',
|
||||
hour: '%Y-%m-%d %H:00:00',
|
||||
day: '%Y-%m-%d',
|
||||
month: '%Y-%m-01',
|
||||
year: '%Y-01-01',
|
||||
};
|
||||
|
||||
export const CLICKHOUSE_DATE_FORMATS = {
|
||||
minute: '%Y-%m-%d %H:%M:00',
|
||||
hour: '%Y-%m-%d %H:00:00',
|
||||
|
|
|
|||
37
lib/db.js
37
lib/db.js
|
|
@ -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]();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue