···11CREATE TABLE migrations (
22 id INTEGER PRIMARY KEY,
33- name TEXT NOT NULL,
33+ name TEXT NOT NULL UNIQUE,
44 applied_at DATE
55);
6677CREATE TABLE album (
88 id TEXT PRIMARY KEY,
99 title TEXT NOT NULL,
1010- mb_id TEXT,
1111- mb_rg_id TEXT
1010+ mb_id TEXT UNIQUE,
1111+ mb_rg_id TEXT UNIQUE
1212);
13131414CREATE TABLE artist (
1515 id TEXT PRIMARY KEY,
1616 name TEXT NOT NULL UNIQUE,
1717- mb_id TEXT,
1818- acoust_id TEXT
1717+ mb_id TEXT UNIQUE,
1818+ acoust_id TEXT UNIQUE
1919);
20202121CREATE TABLE track (
+91-19
src/db/repo/album.odin
···1212 db: ^sqlite.Connection,
1313 album: types.Album,
1414 allocator := context.allocator,
1515-) -> sqlite.Result_Code {
1515+) -> (
1616+ new_id: string,
1717+ err: db_pkg.DatabaseErrors,
1818+) {
1919+2020+ ok: bool
2121+ mb_id, mb_rg_id: string
16221723 id := db_pkg.gen_id("album", allocator)
1818- defer delete(id, allocator)
2424+ new_id = id
2525+ c_id := strings.clone_to_cstring(id, allocator)
2626+ c_title := strings.clone_to_cstring(album.title, allocator)
19272828+ defer {
2929+ delete(c_id, allocator)
3030+ delete(c_title, allocator)
3131+ }
20322121- params := make([dynamic]sa.Query_Param, 2, 4, allocator)
2222- defer delete_dynamic_array(params)
3333+ query: cstring = "INSERT INTO album (id, title, mb_id, mb_rg_id) VALUES (?, ?, ?, ?)"
23342424- params[0] = sa.Query_Param{1, id}
2525- params[1] = sa.Query_Param{2, album.title}
3535+ stmt: ^sqlite.Statement
26363737+ if rc := sqlite.prepare_v2(db, query, c.int(len(query)), &stmt, nil); rc != .Ok {
3838+ return new_id, .UnknownError
3939+ }
4040+ defer sqlite.finalize(stmt)
27412828- mb_id, mb_rg_id: string
2929- ok: bool
4242+ if rc := sqlite.bind_text(
4343+ stmt,
4444+ param_idx = 1,
4545+ param_value = c_id,
4646+ param_len = c.int(len(id)),
4747+ free = {behaviour = .Static},
4848+ ); rc != .Ok {
4949+ fmt.eprintfln("failed to bind value to ArtistId. result code: {}", rc)
5050+ return new_id, .UnknownError
5151+ }
30523131- mb_id, ok = album.mb_id.?
3232- if ok do append(¶ms, sa.Query_Param{3, mb_id})
33533434- mb_rg_id, ok = album.mb_rg_id.?
3535- if ok do append(¶ms, sa.Query_Param{4, mb_rg_id})
5454+ if rc := sqlite.bind_text(
5555+ stmt,
5656+ param_idx = 2,
5757+ param_value = c_title,
5858+ param_len = c.int(len(album.title)),
5959+ free = {behaviour = .Static},
6060+ ); rc != .Ok {
6161+ fmt.eprintfln("failed to bind value to artist title. result code: {}", rc)
6262+ return new_id, .UnknownError
6363+ }
36643737- return sa.execute(
3838- db,
3939- "INSERT INTO album (id, title, mb_id, mb_rg_id) VALUES (?, ?, ?, ?)",
4040- params[:],
4141- )
6565+ if mb_id, ok := album.mb_id.?; ok {
6666+ c_mb_id := strings.clone_to_cstring(mb_id, allocator)
6767+ defer delete(c_mb_id, allocator)
6868+6969+ if rc := sqlite.bind_text(
7070+ stmt,
7171+ param_idx = 3,
7272+ param_value = c_mb_id,
7373+ param_len = c.int(len(mb_id)),
7474+ free = {behaviour = .Static},
7575+ ); rc != .Ok {
7676+ fmt.eprintfln("failed to bind value to mb_id. result code: {}", rc)
7777+ return new_id, .UnknownError
7878+ }
7979+8080+ }
8181+8282+8383+ if mb_rg_id, ok := album.mb_rg_id.?; ok {
8484+ c_mb_rg_id := strings.clone_to_cstring(mb_rg_id, allocator)
8585+ defer delete(c_mb_rg_id, allocator)
8686+8787+ if rc := sqlite.bind_text(
8888+ stmt,
8989+ param_idx = 4,
9090+ param_value = c_mb_rg_id,
9191+ param_len = c.int(len(mb_rg_id)),
9292+ free = {behaviour = .Static},
9393+ ); rc != .Ok {
9494+ fmt.eprintfln("failed to bind value to mb_rg_id. result code: {}", rc)
9595+ return new_id, .UnknownError
9696+ }
9797+9898+ }
9999+100100+101101+ fmt.printfln("prepared sql: {}\n", sqlite.expanded_sql(stmt))
102102+103103+104104+ rc := sqlite.step(stmt)
105105+ fmt.printfln("Step RC: %v", rc)
106106+ if (rc == .Constraint) {
107107+ return new_id, .UniqueConstraint
108108+ }
109109+ if (rc != .Done) {
110110+ return new_id, .UnknownError
111111+ }
112112+113113+ return new_id, .None
42114}
4311544116···5913160132 for album in albums {
61133 fmt.printfln("Inserting %v", album)
6262- rc = new_album(db, album, allocator)
6363- assert(rc == .Ok)
134134+ new_id, err := new_album(db, album, allocator)
135135+ assert(err == .None)
64136 }
6513766138 fmt.printfln("Commiting transaction")