20250424200609_initial.sql 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. -- +goose Up
  2. -- +goose StatementBegin
  3. -- Sessions
  4. CREATE TABLE IF NOT EXISTS sessions (
  5. id TEXT PRIMARY KEY,
  6. parent_session_id TEXT,
  7. title TEXT NOT NULL,
  8. message_count INTEGER NOT NULL DEFAULT 0 CHECK (message_count >= 0),
  9. prompt_tokens INTEGER NOT NULL DEFAULT 0 CHECK (prompt_tokens >= 0),
  10. completion_tokens INTEGER NOT NULL DEFAULT 0 CHECK (completion_tokens>= 0),
  11. cost REAL NOT NULL DEFAULT 0.0 CHECK (cost >= 0.0),
  12. updated_at INTEGER NOT NULL, -- Unix timestamp in milliseconds
  13. created_at INTEGER NOT NULL -- Unix timestamp in milliseconds
  14. );
  15. CREATE TRIGGER IF NOT EXISTS update_sessions_updated_at
  16. AFTER UPDATE ON sessions
  17. BEGIN
  18. UPDATE sessions SET updated_at = strftime('%s', 'now')
  19. WHERE id = new.id;
  20. END;
  21. -- Files
  22. CREATE TABLE IF NOT EXISTS files (
  23. id TEXT PRIMARY KEY,
  24. session_id TEXT NOT NULL,
  25. path TEXT NOT NULL,
  26. content TEXT NOT NULL,
  27. version INTEGER NOT NULL DEFAULT 0,
  28. created_at INTEGER NOT NULL, -- Unix timestamp in milliseconds
  29. updated_at INTEGER NOT NULL, -- Unix timestamp in milliseconds
  30. FOREIGN KEY (session_id) REFERENCES sessions (id) ON DELETE CASCADE,
  31. UNIQUE(path, session_id, version)
  32. );
  33. CREATE INDEX IF NOT EXISTS idx_files_session_id ON files (session_id);
  34. CREATE INDEX IF NOT EXISTS idx_files_path ON files (path);
  35. CREATE TRIGGER IF NOT EXISTS update_files_updated_at
  36. AFTER UPDATE ON files
  37. BEGIN
  38. UPDATE files SET updated_at = strftime('%s', 'now')
  39. WHERE id = new.id;
  40. END;
  41. -- Messages
  42. CREATE TABLE IF NOT EXISTS messages (
  43. id TEXT PRIMARY KEY,
  44. session_id TEXT NOT NULL,
  45. role TEXT NOT NULL,
  46. parts TEXT NOT NULL default '[]',
  47. model TEXT,
  48. created_at INTEGER NOT NULL, -- Unix timestamp in milliseconds
  49. updated_at INTEGER NOT NULL, -- Unix timestamp in milliseconds
  50. finished_at INTEGER, -- Unix timestamp in milliseconds
  51. FOREIGN KEY (session_id) REFERENCES sessions (id) ON DELETE CASCADE
  52. );
  53. CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages (session_id);
  54. CREATE TRIGGER IF NOT EXISTS update_messages_updated_at
  55. AFTER UPDATE ON messages
  56. BEGIN
  57. UPDATE messages SET updated_at = strftime('%s', 'now')
  58. WHERE id = new.id;
  59. END;
  60. CREATE TRIGGER IF NOT EXISTS update_session_message_count_on_insert
  61. AFTER INSERT ON messages
  62. BEGIN
  63. UPDATE sessions SET
  64. message_count = message_count + 1
  65. WHERE id = new.session_id;
  66. END;
  67. CREATE TRIGGER IF NOT EXISTS update_session_message_count_on_delete
  68. AFTER DELETE ON messages
  69. BEGIN
  70. UPDATE sessions SET
  71. message_count = message_count - 1
  72. WHERE id = old.session_id;
  73. END;
  74. -- +goose StatementEnd
  75. -- +goose Down
  76. -- +goose StatementBegin
  77. DROP TRIGGER IF EXISTS update_sessions_updated_at;
  78. DROP TRIGGER IF EXISTS update_messages_updated_at;
  79. DROP TRIGGER IF EXISTS update_files_updated_at;
  80. DROP TRIGGER IF EXISTS update_session_message_count_on_delete;
  81. DROP TRIGGER IF EXISTS update_session_message_count_on_insert;
  82. DROP TABLE IF EXISTS sessions;
  83. DROP TABLE IF EXISTS messages;
  84. DROP TABLE IF EXISTS files;
  85. -- +goose StatementEnd