forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package db
2
3import (
4 "database/sql"
5
6 _ "github.com/mattn/go-sqlite3"
7)
8
9type DB struct {
10 *sql.DB
11}
12
13func Make(dbPath string) (*DB, error) {
14 db, err := sql.Open("sqlite3", dbPath)
15 if err != nil {
16 return nil, err
17 }
18
19 _, err = db.Exec(`
20 pragma journal_mode = WAL;
21 pragma synchronous = normal;
22 pragma foreign_keys = on;
23 pragma temp_store = memory;
24 pragma mmap_size = 30000000000;
25 pragma page_size = 32768;
26 pragma auto_vacuum = incremental;
27 pragma busy_timeout = 5000;
28
29 create table if not exists known_dids (
30 did text primary key
31 );
32
33 create table if not exists pipelines (
34 at_uri text not null,
35 status text not null,
36
37 -- only set if status is 'failed'
38 error text,
39 exit_code integer,
40
41 started_at timestamp not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
42 updated_at timestamp not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
43 finished_at timestamp,
44
45 primary key (at_uri)
46 );
47 `)
48 if err != nil {
49 return nil, err
50 }
51
52 return &DB{db}, nil
53}
54
55func (d *DB) SaveLastTimeUs(lastTimeUs int64) error {
56 _, err := d.Exec(`
57 insert into _jetstream (id, last_time_us)
58 values (1, ?)
59 on conflict(id) do update set last_time_us = excluded.last_time_us
60 `, lastTimeUs)
61 return err
62}
63
64func (d *DB) GetLastTimeUs() (int64, error) {
65 var lastTimeUs int64
66 row := d.QueryRow(`select last_time_us from _jetstream where id = 1;`)
67 err := row.Scan(&lastTimeUs)
68 return lastTimeUs, err
69}