TODO:
- [x] merge main
- [x] nonshrinking `set_excerpts_for_path`
- [x] Test-drive potential problem areas in the app
- [x] prepare cloud side
- [x] test collaboration
- [ ] docstrings
- [ ] ???
## Context
### Background
Currently, a multibuffer consists of an arbitrary list of
anchor-delimited excerpts from individual buffers. Excerpt ranges for a
fixed buffer are permitted to overlap, and can appear in any order in
the multibuffer, possibly separated by excerpts from other buffers.
However, in practice all code that constructs multibuffers does so using
the APIs defined in the `path_key` submodule of the `multi_buffer` crate
(`set_excerpts_for_path` etc.) If you only use these APIs, the resulting
multibuffer will maintain the following invariants:
- All excerpts for the same buffer appear contiguously in the
multibuffer
- Excerpts for the same buffer cannot overlap
- Excerpts for the same buffer appear in order
- The placement of the excerpts for a specific buffer in the multibuffer
are determined by the `PathKey` passed to `set_excerpts_for_path`. There
is exactly one `PathKey` per buffer in the multibuffer
### Purpose of this PR
This PR changes the multibuffer so that the invariants maintained by the
`path_key` APIs *always* hold. It's no longer possible to construct a
multibuffer with overlapping excerpts, etc. The APIs that permitted
this, like `insert_excerpts_with_ids_after`, have been removed in favor
of the `path_key` suite.
The main upshot of this is that given a `text::Anchor` and a
multibuffer, it's possible to efficiently figure out the unique excerpt
that includes that anchor, if any:
```
impl MultiBufferSnapshot {
fn buffer_anchor_to_anchor(&self, anchor: text::Anchor) -> Option<multi_buffer::Anchor>;
}
```
And in the other direction, given a `multi_buffer::Anchor`, we can look
at its `text::Anchor` to locate the excerpt that contains it. That means
we don't need an `ExcerptId` to create or resolve
`multi_buffer::Anchor`, and in fact we can delete `ExcerptId` entirely,
so that excerpts no longer have any identity outside their
`Range<text::Anchor>`.
There are a large number of changes to `editor` and other downstream
crates as a result of removing `ExcerptId` and multibuffer APIs that
assumed it.
### Other changes
There are some other improvements that are not immediate consequences of
that big change, but helped make it smoother. Notably:
- The `buffer_id` field of `text::Anchor` is no longer optional.
`text::Anchor::{MIN, MAX}` have been removed in favor of
`min_for_buffer`, etc.
- `multi_buffer::Anchor` is now a three-variant enum (inlined slightly):
```
enum Anchor {
Min,
Excerpt {
text_anchor: text::Anchor,
path_key_index: PathKeyIndex,
diff_base_anchor: Option<text::Anchor>,
},
Max,
}
```
That means it's no longer possible to unconditionally access the
`text_anchor` field, which is good because most of the places that were
doing that were buggy for min/max! Instead, we have a new API that
correctly resolves min/max to the start of the first excerpt or the end
of the last excerpt:
```
impl MultiBufferSnapshot {
fn anchor_to_buffer_anchor(&self, anchor: multi_buffer::Anchor) -> Option<text::Anchor>;
}
```
- `MultiBufferExcerpt` has been removed in favor of a new
`map_excerpt_ranges` API directly on `MultiBufferSnapshot`.
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
---------
Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Co-authored-by: Conrad <conrad@zed.dev>
445 lines
17 KiB
SQL
445 lines
17 KiB
SQL
CREATE TABLE "users" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"github_login" VARCHAR,
|
|
"admin" BOOLEAN,
|
|
"email_address" VARCHAR(255) DEFAULT NULL,
|
|
"name" TEXT,
|
|
"connected_once" BOOLEAN NOT NULL DEFAULT false,
|
|
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"metrics_id" TEXT,
|
|
"github_user_id" INTEGER NOT NULL,
|
|
"accepted_tos_at" TIMESTAMP WITHOUT TIME ZONE,
|
|
"github_user_created_at" TIMESTAMP WITHOUT TIME ZONE,
|
|
"custom_llm_monthly_allowance_in_cents" INTEGER
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_users_github_login" ON "users" ("github_login");
|
|
|
|
CREATE INDEX "index_users_on_email_address" ON "users" ("email_address");
|
|
|
|
CREATE UNIQUE INDEX "index_users_on_github_user_id" ON "users" ("github_user_id");
|
|
|
|
CREATE TABLE "contacts" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"user_id_a" INTEGER REFERENCES users (id) NOT NULL,
|
|
"user_id_b" INTEGER REFERENCES users (id) NOT NULL,
|
|
"a_to_b" BOOLEAN NOT NULL,
|
|
"should_notify" BOOLEAN NOT NULL,
|
|
"accepted" BOOLEAN NOT NULL
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_contacts_user_ids" ON "contacts" ("user_id_a", "user_id_b");
|
|
|
|
CREATE INDEX "index_contacts_user_id_b" ON "contacts" ("user_id_b");
|
|
|
|
CREATE TABLE "rooms" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"live_kit_room" VARCHAR NOT NULL,
|
|
"environment" VARCHAR,
|
|
"channel_id" INTEGER REFERENCES channels (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_rooms_on_channel_id" ON "rooms" ("channel_id");
|
|
|
|
CREATE TABLE "projects" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"room_id" INTEGER REFERENCES rooms (id) ON DELETE CASCADE,
|
|
"host_user_id" INTEGER REFERENCES users (id),
|
|
"host_connection_id" INTEGER,
|
|
"host_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE CASCADE,
|
|
"unregistered" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
"windows_paths" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
"features" TEXT NOT NULL DEFAULT ''
|
|
);
|
|
|
|
CREATE INDEX "index_projects_on_host_connection_server_id" ON "projects" ("host_connection_server_id");
|
|
|
|
CREATE INDEX "index_projects_on_host_connection_id_and_host_connection_server_id" ON "projects" ("host_connection_id", "host_connection_server_id");
|
|
|
|
CREATE TABLE "worktrees" (
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"id" INTEGER NOT NULL,
|
|
"root_name" VARCHAR NOT NULL,
|
|
"abs_path" VARCHAR NOT NULL,
|
|
"visible" BOOL NOT NULL,
|
|
"scan_id" INTEGER NOT NULL,
|
|
"is_complete" BOOL NOT NULL DEFAULT FALSE,
|
|
"completed_scan_id" INTEGER NOT NULL,
|
|
PRIMARY KEY (project_id, id)
|
|
);
|
|
|
|
CREATE INDEX "index_worktrees_on_project_id" ON "worktrees" ("project_id");
|
|
|
|
CREATE TABLE "worktree_entries" (
|
|
"project_id" INTEGER NOT NULL,
|
|
"worktree_id" INTEGER NOT NULL,
|
|
"scan_id" INTEGER NOT NULL,
|
|
"id" INTEGER NOT NULL,
|
|
"is_dir" BOOL NOT NULL,
|
|
"path" VARCHAR NOT NULL,
|
|
"canonical_path" TEXT,
|
|
"inode" INTEGER NOT NULL,
|
|
"mtime_seconds" INTEGER NOT NULL,
|
|
"mtime_nanos" INTEGER NOT NULL,
|
|
"is_external" BOOL NOT NULL,
|
|
"is_ignored" BOOL NOT NULL,
|
|
"is_deleted" BOOL NOT NULL,
|
|
"is_hidden" BOOL NOT NULL,
|
|
"git_status" INTEGER,
|
|
"is_fifo" BOOL NOT NULL,
|
|
PRIMARY KEY (project_id, worktree_id, id),
|
|
FOREIGN KEY (project_id, worktree_id) REFERENCES worktrees (project_id, id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE INDEX "index_worktree_entries_on_project_id" ON "worktree_entries" ("project_id");
|
|
|
|
CREATE INDEX "index_worktree_entries_on_project_id_and_worktree_id" ON "worktree_entries" ("project_id", "worktree_id");
|
|
|
|
CREATE TABLE "project_repositories" (
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"abs_path" VARCHAR,
|
|
"id" INTEGER NOT NULL,
|
|
"entry_ids" VARCHAR,
|
|
"legacy_worktree_id" INTEGER,
|
|
"branch" VARCHAR,
|
|
"scan_id" INTEGER NOT NULL,
|
|
"is_deleted" BOOL NOT NULL,
|
|
"current_merge_conflicts" VARCHAR,
|
|
"merge_message" VARCHAR,
|
|
"branch_summary" VARCHAR,
|
|
"head_commit_details" VARCHAR,
|
|
"remote_upstream_url" VARCHAR,
|
|
"remote_origin_url" VARCHAR,
|
|
"linked_worktrees" VARCHAR,
|
|
PRIMARY KEY (project_id, id)
|
|
);
|
|
|
|
CREATE INDEX "index_project_repositories_on_project_id" ON "project_repositories" ("project_id");
|
|
|
|
CREATE TABLE "project_repository_statuses" (
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"repository_id" INTEGER NOT NULL,
|
|
"repo_path" VARCHAR NOT NULL,
|
|
"status" INT8 NOT NULL,
|
|
"status_kind" INT4 NOT NULL,
|
|
"first_status" INT4 NULL,
|
|
"second_status" INT4 NULL,
|
|
"lines_added" INT4 NULL,
|
|
"lines_deleted" INT4 NULL,
|
|
"scan_id" INT8 NOT NULL,
|
|
"is_deleted" BOOL NOT NULL,
|
|
PRIMARY KEY (project_id, repository_id, repo_path)
|
|
);
|
|
|
|
CREATE INDEX "index_project_repos_statuses_on_project_id" ON "project_repository_statuses" ("project_id");
|
|
|
|
CREATE INDEX "index_project_repos_statuses_on_project_id_and_repo_id" ON "project_repository_statuses" ("project_id", "repository_id");
|
|
|
|
CREATE TABLE "worktree_settings_files" (
|
|
"project_id" INTEGER NOT NULL,
|
|
"worktree_id" INTEGER NOT NULL,
|
|
"path" VARCHAR NOT NULL,
|
|
"content" TEXT,
|
|
"kind" VARCHAR,
|
|
"outside_worktree" BOOL NOT NULL DEFAULT FALSE,
|
|
PRIMARY KEY (project_id, worktree_id, path),
|
|
FOREIGN KEY (project_id, worktree_id) REFERENCES worktrees (project_id, id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE INDEX "index_worktree_settings_files_on_project_id" ON "worktree_settings_files" ("project_id");
|
|
|
|
CREATE INDEX "index_worktree_settings_files_on_project_id_and_worktree_id" ON "worktree_settings_files" ("project_id", "worktree_id");
|
|
|
|
CREATE TABLE "worktree_diagnostic_summaries" (
|
|
"project_id" INTEGER NOT NULL,
|
|
"worktree_id" INTEGER NOT NULL,
|
|
"path" VARCHAR NOT NULL,
|
|
"language_server_id" INTEGER NOT NULL,
|
|
"error_count" INTEGER NOT NULL,
|
|
"warning_count" INTEGER NOT NULL,
|
|
PRIMARY KEY (project_id, worktree_id, path),
|
|
FOREIGN KEY (project_id, worktree_id) REFERENCES worktrees (project_id, id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE INDEX "index_worktree_diagnostic_summaries_on_project_id" ON "worktree_diagnostic_summaries" ("project_id");
|
|
|
|
CREATE INDEX "index_worktree_diagnostic_summaries_on_project_id_and_worktree_id" ON "worktree_diagnostic_summaries" ("project_id", "worktree_id");
|
|
|
|
CREATE TABLE "language_servers" (
|
|
"id" INTEGER NOT NULL,
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"name" VARCHAR NOT NULL,
|
|
"capabilities" TEXT NOT NULL,
|
|
"worktree_id" BIGINT,
|
|
PRIMARY KEY (project_id, id)
|
|
);
|
|
|
|
CREATE INDEX "index_language_servers_on_project_id" ON "language_servers" ("project_id");
|
|
|
|
CREATE TABLE "project_collaborators" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"connection_id" INTEGER NOT NULL,
|
|
"connection_server_id" INTEGER NOT NULL REFERENCES servers (id) ON DELETE CASCADE,
|
|
"user_id" INTEGER NOT NULL,
|
|
"replica_id" INTEGER NOT NULL,
|
|
"is_host" BOOLEAN NOT NULL,
|
|
"committer_name" VARCHAR,
|
|
"committer_email" VARCHAR
|
|
);
|
|
|
|
CREATE INDEX "index_project_collaborators_on_project_id" ON "project_collaborators" ("project_id");
|
|
|
|
CREATE UNIQUE INDEX "index_project_collaborators_on_project_id_and_replica_id" ON "project_collaborators" ("project_id", "replica_id");
|
|
|
|
CREATE INDEX "index_project_collaborators_on_connection_server_id" ON "project_collaborators" ("connection_server_id");
|
|
|
|
CREATE INDEX "index_project_collaborators_on_connection_id" ON "project_collaborators" ("connection_id");
|
|
|
|
CREATE UNIQUE INDEX "index_project_collaborators_on_project_id_connection_id_and_server_id" ON "project_collaborators" (
|
|
"project_id",
|
|
"connection_id",
|
|
"connection_server_id"
|
|
);
|
|
|
|
CREATE TABLE "room_participants" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"room_id" INTEGER NOT NULL REFERENCES rooms (id),
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id),
|
|
"answering_connection_id" INTEGER,
|
|
"answering_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE CASCADE,
|
|
"answering_connection_lost" BOOLEAN NOT NULL,
|
|
"location_kind" INTEGER,
|
|
"location_project_id" INTEGER,
|
|
"initial_project_id" INTEGER,
|
|
"calling_user_id" INTEGER NOT NULL REFERENCES users (id),
|
|
"calling_connection_id" INTEGER NOT NULL,
|
|
"calling_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE SET NULL,
|
|
"participant_index" INTEGER,
|
|
"role" TEXT,
|
|
"in_call" BOOLEAN NOT NULL DEFAULT FALSE
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_room_participants_on_user_id" ON "room_participants" ("user_id");
|
|
|
|
CREATE INDEX "index_room_participants_on_room_id" ON "room_participants" ("room_id");
|
|
|
|
CREATE INDEX "index_room_participants_on_answering_connection_server_id" ON "room_participants" ("answering_connection_server_id");
|
|
|
|
CREATE INDEX "index_room_participants_on_calling_connection_server_id" ON "room_participants" ("calling_connection_server_id");
|
|
|
|
CREATE INDEX "index_room_participants_on_answering_connection_id" ON "room_participants" ("answering_connection_id");
|
|
|
|
CREATE UNIQUE INDEX "index_room_participants_on_answering_connection_id_and_answering_connection_server_id" ON "room_participants" (
|
|
"answering_connection_id",
|
|
"answering_connection_server_id"
|
|
);
|
|
|
|
CREATE TABLE "servers" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"environment" VARCHAR NOT NULL
|
|
);
|
|
|
|
CREATE TABLE "followers" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"room_id" INTEGER NOT NULL REFERENCES rooms (id) ON DELETE CASCADE,
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"leader_connection_server_id" INTEGER NOT NULL REFERENCES servers (id) ON DELETE CASCADE,
|
|
"leader_connection_id" INTEGER NOT NULL,
|
|
"follower_connection_server_id" INTEGER NOT NULL REFERENCES servers (id) ON DELETE CASCADE,
|
|
"follower_connection_id" INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_followers_on_project_id_and_leader_connection_server_id_and_leader_connection_id_and_follower_connection_server_id_and_follower_connection_id" ON "followers" (
|
|
"project_id",
|
|
"leader_connection_server_id",
|
|
"leader_connection_id",
|
|
"follower_connection_server_id",
|
|
"follower_connection_id"
|
|
);
|
|
|
|
CREATE INDEX "index_followers_on_room_id" ON "followers" ("room_id");
|
|
|
|
CREATE TABLE "channels" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"name" VARCHAR NOT NULL,
|
|
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"visibility" VARCHAR NOT NULL,
|
|
"parent_path" TEXT NOT NULL,
|
|
"requires_zed_cla" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
"channel_order" INTEGER NOT NULL DEFAULT 1
|
|
);
|
|
|
|
CREATE INDEX "index_channels_on_parent_path" ON "channels" ("parent_path");
|
|
|
|
CREATE INDEX "index_channels_on_parent_path_and_order" ON "channels" ("parent_path", "channel_order");
|
|
|
|
CREATE TABLE IF NOT EXISTS "channel_chat_participants" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id),
|
|
"channel_id" INTEGER NOT NULL REFERENCES channels (id) ON DELETE CASCADE,
|
|
"connection_id" INTEGER NOT NULL,
|
|
"connection_server_id" INTEGER NOT NULL REFERENCES servers (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE INDEX "index_channel_chat_participants_on_channel_id" ON "channel_chat_participants" ("channel_id");
|
|
|
|
CREATE TABLE "channel_members" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"channel_id" INTEGER NOT NULL REFERENCES channels (id) ON DELETE CASCADE,
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
"role" VARCHAR NOT NULL,
|
|
"accepted" BOOLEAN NOT NULL DEFAULT false,
|
|
"updated_at" TIMESTAMP NOT NULL DEFAULT now
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_channel_members_on_channel_id_and_user_id" ON "channel_members" ("channel_id", "user_id");
|
|
|
|
CREATE TABLE "buffers" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"channel_id" INTEGER NOT NULL REFERENCES channels (id) ON DELETE CASCADE,
|
|
"epoch" INTEGER NOT NULL DEFAULT 0,
|
|
"latest_operation_epoch" INTEGER,
|
|
"latest_operation_replica_id" INTEGER,
|
|
"latest_operation_lamport_timestamp" INTEGER
|
|
);
|
|
|
|
CREATE INDEX "index_buffers_on_channel_id" ON "buffers" ("channel_id");
|
|
|
|
CREATE TABLE "buffer_operations" (
|
|
"buffer_id" INTEGER NOT NULL REFERENCES buffers (id) ON DELETE CASCADE,
|
|
"epoch" INTEGER NOT NULL,
|
|
"replica_id" INTEGER NOT NULL,
|
|
"lamport_timestamp" INTEGER NOT NULL,
|
|
"value" BLOB NOT NULL,
|
|
PRIMARY KEY (buffer_id, epoch, lamport_timestamp, replica_id)
|
|
);
|
|
|
|
CREATE TABLE "buffer_snapshots" (
|
|
"buffer_id" INTEGER NOT NULL REFERENCES buffers (id) ON DELETE CASCADE,
|
|
"epoch" INTEGER NOT NULL,
|
|
"text" TEXT NOT NULL,
|
|
"operation_serialization_version" INTEGER NOT NULL,
|
|
PRIMARY KEY (buffer_id, epoch)
|
|
);
|
|
|
|
CREATE TABLE "channel_buffer_collaborators" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"channel_id" INTEGER NOT NULL REFERENCES channels (id) ON DELETE CASCADE,
|
|
"connection_id" INTEGER NOT NULL,
|
|
"connection_server_id" INTEGER NOT NULL REFERENCES servers (id) ON DELETE CASCADE,
|
|
"connection_lost" BOOLEAN NOT NULL DEFAULT false,
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
"replica_id" INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE INDEX "index_channel_buffer_collaborators_on_channel_id" ON "channel_buffer_collaborators" ("channel_id");
|
|
|
|
CREATE UNIQUE INDEX "index_channel_buffer_collaborators_on_channel_id_and_replica_id" ON "channel_buffer_collaborators" ("channel_id", "replica_id");
|
|
|
|
CREATE INDEX "index_channel_buffer_collaborators_on_connection_server_id" ON "channel_buffer_collaborators" ("connection_server_id");
|
|
|
|
CREATE INDEX "index_channel_buffer_collaborators_on_connection_id" ON "channel_buffer_collaborators" ("connection_id");
|
|
|
|
CREATE UNIQUE INDEX "index_channel_buffer_collaborators_on_channel_id_connection_id_and_server_id" ON "channel_buffer_collaborators" (
|
|
"channel_id",
|
|
"connection_id",
|
|
"connection_server_id"
|
|
);
|
|
|
|
CREATE TABLE "observed_buffer_edits" (
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
"buffer_id" INTEGER NOT NULL REFERENCES buffers (id) ON DELETE CASCADE,
|
|
"epoch" INTEGER NOT NULL,
|
|
"lamport_timestamp" INTEGER NOT NULL,
|
|
"replica_id" INTEGER NOT NULL,
|
|
PRIMARY KEY (user_id, buffer_id)
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_observed_buffers_user_and_buffer_id" ON "observed_buffer_edits" ("user_id", "buffer_id");
|
|
|
|
CREATE TABLE "notification_kinds" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"name" VARCHAR NOT NULL
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_notification_kinds_on_name" ON "notification_kinds" ("name");
|
|
|
|
CREATE TABLE "notifications" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"created_at" TIMESTAMP NOT NULL default CURRENT_TIMESTAMP,
|
|
"recipient_id" INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
"kind" INTEGER NOT NULL REFERENCES notification_kinds (id),
|
|
"entity_id" INTEGER,
|
|
"content" TEXT,
|
|
"is_read" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
"response" BOOLEAN
|
|
);
|
|
|
|
CREATE INDEX "index_notifications_on_recipient_id_is_read_kind_entity_id" ON "notifications" ("recipient_id", "is_read", "kind", "entity_id");
|
|
|
|
CREATE TABLE contributors (
|
|
user_id INTEGER REFERENCES users (id),
|
|
signed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (user_id)
|
|
);
|
|
|
|
CREATE TABLE extensions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
external_id TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
latest_version TEXT NOT NULL,
|
|
total_download_count INTEGER NOT NULL DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE extension_versions (
|
|
extension_id INTEGER REFERENCES extensions (id),
|
|
version TEXT NOT NULL,
|
|
published_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
authors TEXT NOT NULL,
|
|
repository TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
schema_version INTEGER NOT NULL DEFAULT 0,
|
|
wasm_api_version TEXT,
|
|
download_count INTEGER NOT NULL DEFAULT 0,
|
|
provides_themes BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_icon_themes BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_languages BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_grammars BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_language_servers BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_context_servers BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_agent_servers BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_slash_commands BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_indexed_docs_providers BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_snippets BOOLEAN NOT NULL DEFAULT FALSE,
|
|
provides_debug_adapters BOOLEAN NOT NULL DEFAULT FALSE,
|
|
PRIMARY KEY (extension_id, version)
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "index_extensions_external_id" ON "extensions" ("external_id");
|
|
|
|
CREATE INDEX "index_extensions_total_download_count" ON "extensions" ("total_download_count");
|
|
|
|
CREATE TABLE IF NOT EXISTS "breakpoints" (
|
|
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
"project_id" INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
"position" INTEGER NOT NULL,
|
|
"log_message" TEXT NULL,
|
|
"worktree_id" BIGINT NOT NULL,
|
|
"path" TEXT NOT NULL,
|
|
"kind" VARCHAR NOT NULL
|
|
);
|
|
|
|
CREATE INDEX "index_breakpoints_on_project_id" ON "breakpoints" ("project_id");
|
|
|
|
CREATE TABLE IF NOT EXISTS "shared_threads" (
|
|
"id" TEXT PRIMARY KEY NOT NULL,
|
|
"user_id" INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
"title" VARCHAR(512) NOT NULL,
|
|
"data" BLOB NOT NULL,
|
|
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX "index_shared_threads_user_id" ON "shared_threads" ("user_id");
|