package main import ( "database/sql" "errors" "log" "os" "time" ) type Memo struct { ID int64 `json:"id"` Time string `json:"time"` Message string `json:"message"` } func openOrCreateDb(name string) *sql.DB { new := false if _, err := os.Stat(name); errors.Is(err, os.ErrNotExist) { log.Println("memos db does not exist, creating.") new = true } db, err := sql.Open("sqlite3", name) if err != nil { log.Fatal(err) } if new { _, err = db.Exec(`create table memos ( ID integer primary key autoincrement, time text not null, Message text not null )`) if err != nil { log.Fatal(err) } } return db } func insertMemo(db *sql.DB, message string) int64 { tx, err := db.Begin() if err != nil { log.Fatal(err) } stmt, err := tx.Prepare("insert into memos (time, Message) values (?, ?)") if err != nil { log.Fatal(err) } defer stmt.Close() timeStr := time.Now().Format(time.RFC3339) row, err := stmt.Exec(timeStr, message) if err != nil { log.Fatal(err) } err = tx.Commit() if err != nil { log.Fatal(err) } id, err := row.LastInsertId() if err != nil { log.Fatal(err) } return id } func getMemos(db *sql.DB) []Memo { rows, err := db.Query("select * from memos order by id desc") if err != nil { log.Fatal(err) } defer rows.Close() var memos []Memo for rows.Next() { var memo Memo err = rows.Scan(&memo.ID, &memo.Time, &memo.Message) if err != nil { log.Fatal(err) } memos = append(memos, memo) } err = rows.Err() if err != nil { log.Fatal(err) } return memos }