Add DittoSQLite module
This commit is contained in:
parent
f6945ecd1c
commit
29102d272a
|
@ -0,0 +1,66 @@
|
||||||
|
export interface DittoTables {
|
||||||
|
events: EventRow;
|
||||||
|
events_fts: EventFTSRow;
|
||||||
|
tags: TagRow;
|
||||||
|
relays: RelayRow;
|
||||||
|
unattached_media: UnattachedMediaRow;
|
||||||
|
author_stats: AuthorStatsRow;
|
||||||
|
event_stats: EventStatsRow;
|
||||||
|
pubkey_domains: PubkeyDomainRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AuthorStatsRow {
|
||||||
|
pubkey: string;
|
||||||
|
followers_count: number;
|
||||||
|
following_count: number;
|
||||||
|
notes_count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EventStatsRow {
|
||||||
|
event_id: string;
|
||||||
|
replies_count: number;
|
||||||
|
reposts_count: number;
|
||||||
|
reactions_count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EventRow {
|
||||||
|
id: string;
|
||||||
|
kind: number;
|
||||||
|
pubkey: string;
|
||||||
|
content: string;
|
||||||
|
created_at: number;
|
||||||
|
tags: string;
|
||||||
|
sig: string;
|
||||||
|
deleted_at: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EventFTSRow {
|
||||||
|
id: string;
|
||||||
|
content: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TagRow {
|
||||||
|
tag: string;
|
||||||
|
value: string;
|
||||||
|
event_id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RelayRow {
|
||||||
|
url: string;
|
||||||
|
domain: string;
|
||||||
|
active: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UnattachedMediaRow {
|
||||||
|
id: string;
|
||||||
|
pubkey: string;
|
||||||
|
url: string;
|
||||||
|
data: string;
|
||||||
|
uploaded_at: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PubkeyDomainRow {
|
||||||
|
pubkey: string;
|
||||||
|
domain: string;
|
||||||
|
last_updated_at: number;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
import { Conf } from '@/config.ts';
|
||||||
|
import { DittoTables } from '@/db/DittoTables.ts';
|
||||||
|
import { Kysely, PolySqliteDialect } from '@/deps.ts';
|
||||||
|
import { setPragma } from '@/pragma.ts';
|
||||||
|
import SqliteWorker from '@/workers/sqlite.ts';
|
||||||
|
|
||||||
|
export class DittoSQLite {
|
||||||
|
static db: Kysely<DittoTables> | undefined;
|
||||||
|
|
||||||
|
static async getInstance(): Promise<Kysely<DittoTables>> {
|
||||||
|
if (!this.db) {
|
||||||
|
const sqliteWorker = new SqliteWorker();
|
||||||
|
await sqliteWorker.open(this.path);
|
||||||
|
|
||||||
|
this.db = new Kysely<DittoTables>({
|
||||||
|
dialect: new PolySqliteDialect({
|
||||||
|
database: sqliteWorker,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set PRAGMA values.
|
||||||
|
await Promise.all([
|
||||||
|
setPragma(this.db, 'synchronous', 'normal'),
|
||||||
|
setPragma(this.db, 'temp_store', 'memory'),
|
||||||
|
setPragma(this.db, 'mmap_size', Conf.sqlite.mmapSize),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return this.db;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the relative or absolute path based on the `DATABASE_URL`. */
|
||||||
|
static get path() {
|
||||||
|
if (Deno.env.get('DATABASE_URL') === 'sqlite://:memory:') {
|
||||||
|
return ':memory:';
|
||||||
|
}
|
||||||
|
|
||||||
|
const { host, pathname } = Conf.databaseUrl;
|
||||||
|
|
||||||
|
if (!pathname) return '';
|
||||||
|
|
||||||
|
// Get relative path.
|
||||||
|
if (host === '') {
|
||||||
|
return pathname;
|
||||||
|
} else if (host === '.') {
|
||||||
|
return pathname;
|
||||||
|
} else if (host) {
|
||||||
|
return host + pathname;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue