20250513000000_initial.sql 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. summary TEXT,
  13. summarized_at TEXT,
  14. updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  15. created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now'))
  16. );
  17. CREATE TRIGGER IF NOT EXISTS update_sessions_updated_at
  18. AFTER UPDATE ON sessions
  19. BEGIN
  20. UPDATE sessions SET updated_at = strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')
  21. WHERE id = new.id;
  22. END;
  23. -- Files
  24. CREATE TABLE IF NOT EXISTS files (
  25. id TEXT PRIMARY KEY,
  26. session_id TEXT NOT NULL,
  27. path TEXT NOT NULL,
  28. content TEXT NOT NULL,
  29. version TEXT NOT NULL,
  30. is_new INTEGER DEFAULT 0,
  31. created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  32. updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  33. FOREIGN KEY (session_id) REFERENCES sessions (id) ON DELETE CASCADE,
  34. UNIQUE(path, session_id, version)
  35. );
  36. CREATE INDEX IF NOT EXISTS idx_files_session_id ON files (session_id);
  37. CREATE INDEX IF NOT EXISTS idx_files_path ON files (path);
  38. CREATE TRIGGER IF NOT EXISTS update_files_updated_at
  39. AFTER UPDATE ON files
  40. BEGIN
  41. UPDATE files SET updated_at = strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')
  42. WHERE id = new.id;
  43. END;
  44. -- Messages
  45. CREATE TABLE IF NOT EXISTS messages (
  46. id TEXT PRIMARY KEY,
  47. session_id TEXT NOT NULL,
  48. role TEXT NOT NULL,
  49. parts TEXT NOT NULL default '[]',
  50. model TEXT,
  51. created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  52. updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  53. finished_at TEXT,
  54. FOREIGN KEY (session_id) REFERENCES sessions (id) ON DELETE CASCADE
  55. );
  56. CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages (session_id);
  57. CREATE TRIGGER IF NOT EXISTS update_messages_updated_at
  58. AFTER UPDATE ON messages
  59. BEGIN
  60. UPDATE messages SET updated_at = strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')
  61. WHERE id = new.id;
  62. END;
  63. CREATE TRIGGER IF NOT EXISTS update_session_message_count_on_insert
  64. AFTER INSERT ON messages
  65. BEGIN
  66. UPDATE sessions SET
  67. message_count = message_count + 1
  68. WHERE id = new.session_id;
  69. END;
  70. CREATE TRIGGER IF NOT EXISTS update_session_message_count_on_delete
  71. AFTER DELETE ON messages
  72. BEGIN
  73. UPDATE sessions SET
  74. message_count = message_count - 1
  75. WHERE id = old.session_id;
  76. END;
  77. -- Logs
  78. CREATE TABLE IF NOT EXISTS logs (
  79. id TEXT PRIMARY KEY,
  80. session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE,
  81. timestamp TEXT NOT NULL,
  82. level TEXT NOT NULL,
  83. message TEXT NOT NULL,
  84. attributes TEXT,
  85. created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')),
  86. updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f000Z', 'now'))
  87. );
  88. CREATE INDEX logs_session_id_idx ON logs(session_id);
  89. CREATE INDEX logs_timestamp_idx ON logs(timestamp);
  90. CREATE TRIGGER IF NOT EXISTS update_logs_updated_at
  91. AFTER UPDATE ON logs
  92. BEGIN
  93. UPDATE logs SET updated_at = strftime('%Y-%m-%dT%H:%M:%f000Z', 'now')
  94. WHERE id = new.id;
  95. END;
  96. -- +goose StatementEnd
  97. -- +goose Down
  98. -- +goose StatementBegin
  99. DROP TRIGGER IF EXISTS update_sessions_updated_at;
  100. DROP TRIGGER IF EXISTS update_messages_updated_at;
  101. DROP TRIGGER IF EXISTS update_files_updated_at;
  102. DROP TRIGGER IF EXISTS update_logs_updated_at;
  103. DROP TRIGGER IF EXISTS update_session_message_count_on_delete;
  104. DROP TRIGGER IF EXISTS update_session_message_count_on_insert;
  105. DROP TABLE IF EXISTS logs;
  106. DROP TABLE IF EXISTS messages;
  107. DROP TABLE IF EXISTS files;
  108. DROP TABLE IF EXISTS sessions;
  109. -- +goose StatementEnd