documents.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package sqlite
  2. import (
  3. "bytes"
  4. "context"
  5. "excalidraw-complete/core"
  6. "fmt"
  7. "database/sql"
  8. "log"
  9. _ "github.com/mattn/go-sqlite3"
  10. "github.com/oklog/ulid/v2"
  11. )
  12. var savedDocuments = make(map[string]core.Document)
  13. type documentStore struct {
  14. db *sql.DB
  15. }
  16. func NewDocumentStore(dataSourceName string) core.DocumentStore {
  17. // db, err := sql.Open("sqlite3", ":memory:")
  18. db, err := sql.Open("sqlite3", dataSourceName)
  19. if err != nil {
  20. log.Fatal(err)
  21. }
  22. sts := `CREATE TABLE IF NOT EXISTS documents (id TEXT PRIMARY KEY, data BLOB);`
  23. _, err = db.Exec(sts)
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. return &documentStore{db}
  28. }
  29. func (s *documentStore) FindID(ctx context.Context, id string) (*core.Document, error) {
  30. var data []byte
  31. err := s.db.QueryRowContext(ctx, "SELECT data FROM documents WHERE id = ?", id).Scan(&data)
  32. if err != nil {
  33. if err == sql.ErrNoRows {
  34. return nil, fmt.Errorf("document with id %s not found", id)
  35. }
  36. return nil, err
  37. }
  38. document := core.Document{
  39. Data: *bytes.NewBuffer(data),
  40. }
  41. return &document, nil
  42. }
  43. func (s *documentStore) Create(ctx context.Context, document *core.Document) (string, error) {
  44. id := ulid.Make().String()
  45. data := document.Data.Bytes()
  46. _, err := s.db.ExecContext(ctx, "INSERT INTO documents (id, data) VALUES (?, ?)", id, data)
  47. if err != nil {
  48. return "", err
  49. }
  50. return id, nil
  51. }