120 lines
3.8 KiB
SQL
120 lines
3.8 KiB
SQL
-- Discovered nodes.
|
|
create table if not exists "nodes" (
|
|
-- Node ID.
|
|
"id" text primary key not null,
|
|
-- Node features.
|
|
"features" integer not null,
|
|
-- Node alias.
|
|
"alias" text not null,
|
|
--- Node announcement proof-of-work.
|
|
"pow" integer default 0,
|
|
-- Node announcement timestamp.
|
|
"timestamp" integer not null,
|
|
-- If this node is banned. Used as a boolean.
|
|
"banned" integer default false
|
|
--
|
|
) strict;
|
|
|
|
-- Node addresses.
|
|
create table if not exists "addresses" (
|
|
-- Node ID.
|
|
"node" text not null references "nodes" ("id") on delete cascade,
|
|
-- Address type.
|
|
"type" text not null,
|
|
-- Address value.
|
|
"value" text not null,
|
|
-- Where we got this address from.
|
|
"source" text not null,
|
|
-- When this address was announced.
|
|
"timestamp" integer not null,
|
|
-- Local time at which we last attempted to connect to this node.
|
|
"last_attempt" integer default null,
|
|
-- Local time at which we successfully connected to this node.
|
|
"last_success" integer default null,
|
|
-- If this address is banned from use. Used as a boolean.
|
|
"banned" integer default false,
|
|
-- Nb. This constraint allows more than one node to share the same address.
|
|
-- This is useful in circumstances when a node wants to rotate its key, but
|
|
-- remain reachable at the same address. The old entry will eventually be
|
|
-- pruned.
|
|
unique ("node", "type", "value")
|
|
--
|
|
) strict;
|
|
|
|
-- Routing table. Tracks inventories.
|
|
create table if not exists "routing" (
|
|
-- Repository being seeded.
|
|
"repo" text not null,
|
|
-- Node ID.
|
|
"node" text not null references "nodes" ("id") on delete cascade,
|
|
-- UNIX time at which this entry was added or refreshed.
|
|
"timestamp" integer not null,
|
|
|
|
primary key ("repo", "node")
|
|
);
|
|
|
|
-- Gossip message store.
|
|
create table if not exists "announcements" (
|
|
-- Node ID.
|
|
--
|
|
-- Nb. We don't use a foreign key constraint here, because announcements are
|
|
-- currently added to the database before nodes.
|
|
"node" text not null,
|
|
-- Repo ID, if any, for example in ref announcements.
|
|
-- For other announcement types, this should be an empty string.
|
|
"repo" text not null,
|
|
-- Announcement type.
|
|
--
|
|
-- Valid values are:
|
|
--
|
|
-- "refs"
|
|
-- "node"
|
|
-- "inventory"
|
|
"type" text not null,
|
|
-- Announcement message in wire format (binary).
|
|
"message" blob not null,
|
|
-- Signature over message.
|
|
"signature" blob not null,
|
|
-- Announcement timestamp.
|
|
"timestamp" integer not null,
|
|
--
|
|
unique ("node", "repo", "type")
|
|
--
|
|
) strict;
|
|
|
|
-- Repository sync status.
|
|
create table if not exists "repo-sync-status" (
|
|
-- Repository ID.
|
|
"repo" text not null,
|
|
-- Node ID.
|
|
"node" text not null references "nodes" ("id") on delete cascade,
|
|
-- Head of your `rad/sigrefs` branch that was synced.
|
|
"head" text not null,
|
|
-- When this entry was last updated.
|
|
"timestamp" integer not null,
|
|
--
|
|
unique ("repo", "node")
|
|
--
|
|
) strict;
|
|
|
|
-- Git refs cache.
|
|
create table if not exists "refs" (
|
|
-- Repository ID.
|
|
"repo" text not null,
|
|
-- Ref namespace (NID).
|
|
--
|
|
-- Nb. We don't use a foreign key constraint because we can't guarantee
|
|
-- that we'll have received a node announcement from this node.
|
|
"namespace" text not null,
|
|
-- Ref name (qualified).
|
|
"ref" text not null,
|
|
-- Ref OID.
|
|
"oid" text not null,
|
|
-- When this entry was created or updated.
|
|
"timestamp" integer not null,
|
|
--
|
|
unique ("repo", "namespace", "ref")
|
|
--
|
|
) strict;
|
|
|