From 9463991918c5696202e3e83a8f7aa775642cdee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Sun, 28 Nov 2021 12:43:26 +0100 Subject: [PATCH] Add a note's filename in the index database --- internal/adapter/sqlite/db.go | 58 +++++++++++++++++++++- internal/adapter/sqlite/db_test.go | 2 +- internal/adapter/sqlite/note_dao.go | 6 +-- internal/adapter/sqlite/testdata/sample.db | 2 +- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/internal/adapter/sqlite/db.go b/internal/adapter/sqlite/db.go index 2d51f0b..2528efa 100644 --- a/internal/adapter/sqlite/db.go +++ b/internal/adapter/sqlite/db.go @@ -3,6 +3,7 @@ package sqlite import ( "database/sql" "fmt" + "path/filepath" sqlite "github.com/mattn/go-sqlite3" "github.com/mickael-menu/zk/internal/core" @@ -78,6 +79,7 @@ func (db *DB) migrate() error { migrations := []struct { SQL []string + Migrate func(tx Transaction) error NeedsReindexing bool }{ { // 1 @@ -207,6 +209,46 @@ func (db *DB) migrate() error { LEFT JOIN notes t ON l.target_id = t.id`, }, }, + + { // 7 + SQL: []string{ + // Add a `filename` column to `notes` + `ALTER TABLE notes ADD COLUMN filename TEXT DEFAULT('') NOT NULL`, + }, + Migrate: func(tx Transaction) error { + // Fill the filenames + rows, err := tx.Query(`SELECT id, path FROM notes`) + if err != nil { + return err + } + defer rows.Close() + + filenames := map[int]string{} + + for rows.Next() { + var id int + var path string + err := rows.Scan(&id, &path) + if err != nil { + return err + } + filenames[id] = filepath.Base(path) + } + + for id, filename := range filenames { + _, err = tx.Exec(` + UPDATE notes + SET filename = ? + WHERE id = ? + `, filename, id) + if err != nil { + return err + } + } + + return nil + }, + }, } needsReindexing := false @@ -216,8 +258,20 @@ func (db *DB) migrate() error { continue } - stmts := append(migration.SQL, fmt.Sprintf("PRAGMA user_version = %d", i+1)) - err = tx.ExecStmts(stmts) + err = tx.ExecStmts(migration.SQL) + if err != nil { + return err + } + + // Execute additional migration steps. + if migration.Migrate != nil { + err = migration.Migrate(tx) + if err != nil { + return err + } + } + + _, err = tx.Exec(fmt.Sprintf("PRAGMA user_version = %d", i+1)) if err != nil { return err } diff --git a/internal/adapter/sqlite/db_test.go b/internal/adapter/sqlite/db_test.go index 2c5c650..228aa4f 100644 --- a/internal/adapter/sqlite/db_test.go +++ b/internal/adapter/sqlite/db_test.go @@ -27,7 +27,7 @@ func TestMigrateFrom0(t *testing.T) { var version int err := tx.QueryRow("PRAGMA user_version").Scan(&version) assert.Nil(t, err) - assert.Equal(t, version, 6) + assert.Equal(t, version, 7) _, err = tx.Exec(` INSERT INTO notes (path, sortable_path, title, body, word_count, checksum) diff --git a/internal/adapter/sqlite/note_dao.go b/internal/adapter/sqlite/note_dao.go index 5487022..d5b2a2d 100644 --- a/internal/adapter/sqlite/note_dao.go +++ b/internal/adapter/sqlite/note_dao.go @@ -47,8 +47,8 @@ func NewNoteDAO(tx Transaction, logger util.Logger) *NoteDAO { // Add a new note to the index. addStmt: tx.PrepareLazy(` - INSERT INTO notes (path, sortable_path, title, lead, body, raw_content, word_count, metadata, checksum, created, modified) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + INSERT INTO notes (filename, path, sortable_path, title, lead, body, raw_content, word_count, metadata, checksum, created, modified) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `), // Update the content of a note. @@ -128,7 +128,7 @@ func (d *NoteDAO) Add(note core.Note) (core.NoteID, error) { metadata := d.metadataToJSON(note) res, err := d.addStmt.Exec( - note.Path, sortablePath, note.Title, note.Lead, note.Body, + note.Filename(), note.Path, sortablePath, note.Title, note.Lead, note.Body, note.RawContent, note.WordCount, metadata, note.Checksum, note.Created, note.Modified, ) diff --git a/internal/adapter/sqlite/testdata/sample.db b/internal/adapter/sqlite/testdata/sample.db index f458ebd..9c19d7d 100644 --- a/internal/adapter/sqlite/testdata/sample.db +++ b/internal/adapter/sqlite/testdata/sample.db @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4ed584a5c1177888066b7b63eb3b5a256c5a9a404669134f722144a30314959b +oid sha256:f2575f74e02681445aea64c310372f8fdf327e89215e88284519fb58c1d68fa0 size 86016