aboutsummaryrefslogtreecommitdiff
path: root/src/database.gleam
blob: bba3b29405e563d5d13ee96b4cecb221fd1beb0b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import birl
import gleam/dynamic
import sqlight

pub type Counter {
  Counter(name: String, num: Int, created_at: String, updated_at: String)
}

pub fn setup(connection) {
  let _ =
    sqlight.exec(
      "pragma foreign_keys = on;

      create table if not exists tb_count (
        id integer primary key autoincrement not null unique,
        name text not null unique,
        num int not null default (0)
      ) strict;",
      connection,
    )
  let add_column = fn(name) {
    let _ =
      sqlight.exec(
        "alter table tb_count add column "
          <> name
          <> " text default current_timestamp;",
        connection,
      )

    Nil
  }

  add_column("created_at")
  add_column("updated_at")

  Nil
}

pub fn add_counter(connection, name) {
  sqlight.query(
    "insert into tb_count (name) values (?);",
    with: [sqlight.text(name)],
    on: connection,
    expecting: dynamic.optional(dynamic.int),
  )
}

pub fn get_counter(connection, name) {
  let _ =
    sqlight.query(
      "insert or ignore into tb_count (name) values (?);",
      with: [sqlight.text(name)],
      on: connection,
      expecting: dynamic.optional(dynamic.int),
    )
  let _ =
    sqlight.query(
      "update tb_count set num = num + 1, updated_at = ? where name = ?;",
      with: [sqlight.text(birl.to_iso8601(birl.utc_now())), sqlight.text(name)],
      on: connection,
      expecting: dynamic.int,
    )

  case
    sqlight.query(
      "select name, num, created_at, updated_at from tb_count where name = ?;",
      with: [sqlight.text(name)],
      on: connection,
      expecting: dynamic.tuple4(
        dynamic.string,
        dynamic.int,
        dynamic.string,
        dynamic.string,
      ),
    )
  {
    Ok([first_element]) -> {
      Counter(
        first_element.0,
        first_element.1,
        first_element.2,
        first_element.3,
      )
    }
    _ -> Counter(name, 0, "", "")
  }
}