···33import (
44 "context"
55 "database/sql"
66+ "fmt"
67 "log/slog"
78 "strings"
89···104105 issue_at text,
105106 unique(repo_at, issue_id),
106107 foreign key (repo_at) references repos(at_uri) on delete cascade
107107- );
108108- create table if not exists comments (
109109- id integer primary key autoincrement,
110110- owner_did text not null,
111111- issue_id integer not null,
112112- repo_at text not null,
113113- comment_id integer not null,
114114- comment_at text not null,
115115- body text not null,
116116- created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
117117- unique(issue_id, comment_id),
118118- foreign key (repo_at, issue_id) references issues(repo_at, issue_id) on delete cascade
119108 );
120109 create table if not exists pulls (
121110 -- identifiers
···657646 create index if not exists idx_notifications_recipient_read on notifications(recipient_did, read);
658647 create index if not exists idx_references_from_at on reference_links(from_at);
659648 create index if not exists idx_references_to_at on reference_links(to_at);
660660- create index if not exists idx_webhooks_repo_at on webhooks(repo_at);
661649 create index if not exists idx_webhook_deliveries_webhook_id on webhook_deliveries(webhook_id);
662662- create index if not exists idx_site_deploys_repo_at on site_deploys(repo_at);
663650 `)
664651 if err != nil {
665652 return nil, err
···1408139514091396 return err
14101397 })
13981398+13991399+ orm.RunMigration(conn, logger, "add-repo-renames", func(tx *sql.Tx) error {
14001400+ res, err := tx.Exec(`
14011401+ update repos
14021402+ set name = name || '-renamed-' || id || '-' || lower(hex(randomblob(4)))
14031403+ where id in (
14041404+ select id from (
14051405+ select id, row_number() over (
14061406+ partition by did, knot, name
14071407+ order by created desc, id desc
14081408+ ) as rn
14091409+ from repos
14101410+ ) where rn > 1
14111411+ );
14121412+ `)
14131413+ if err != nil {
14141414+ return err
14151415+ }
14161416+ if n, _ := res.RowsAffected(); n > 0 {
14171417+ logger.Warn("suffixed legacy duplicate repo names before adding unique index", "rows", n)
14181418+ }
14191419+14201420+ var remaining int
14211421+ if err := tx.QueryRow(`
14221422+ select count(*) from (
14231423+ select 1 from repos group by did, knot, name having count(*) > 1
14241424+ )
14251425+ `).Scan(&remaining); err != nil {
14261426+ return fmt.Errorf("checking for residual duplicate (did, knot, name) groups: %w", err)
14271427+ }
14281428+ if remaining > 0 {
14291429+ return fmt.Errorf("add-repo-renames: %d duplicate (did, knot, name) groups remain after suffix pass; manual cleanup required before unique index can be created", remaining)
14301430+ }
14311431+14321432+ _, err = tx.Exec(`
14331433+ create table if not exists repo_renames (
14341434+ owner_did text not null,
14351435+ old_rkey text not null,
14361436+ repo_did text not null,
14371437+ renamed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
14381438+ primary key (owner_did, old_rkey)
14391439+ );
14401440+ create unique index if not exists idx_repos_owner_knot_name
14411441+ on repos(did, knot, name);
14421442+ `)
14431443+ return err
14441444+ })
14451445+14461446+ orm.RunMigration(conn, logger, "repos-canonical-rkey-uniqueness", func(tx *sql.Tx) error {
14471447+ _, err := tx.Exec(`
14481448+ drop index if exists idx_repos_owner_knot_name;
14491449+ create unique index if not exists idx_repos_did_rkey
14501450+ on repos(did, rkey);
14511451+ `)
14521452+ return err
14531453+ })
14541454+14551455+ orm.RunMigration(conn, logger, "repo-did-references", func(tx *sql.Tx) error {
14561456+ tables := []struct{ table, oldCol, newCol string }{
14571457+ {"issues", "repo_at", "repo_did"},
14581458+ {"pulls", "repo_at", "repo_did"},
14591459+ {"pull_comments", "repo_at", "repo_did"},
14601460+ {"stars", "subject_at", "subject_did"},
14611461+ {"artifacts", "repo_at", "repo_did"},
14621462+ {"webhooks", "repo_at", "repo_did"},
14631463+ {"repo_sites", "repo_at", "repo_did"},
14641464+ {"site_deploys", "repo_at", "repo_did"},
14651465+ {"collaborators", "repo_at", "repo_did"},
14661466+ {"repo_issue_seqs", "repo_at", "repo_did"},
14671467+ {"repo_pull_seqs", "repo_at", "repo_did"},
14681468+ {"repo_languages", "repo_at", "repo_did"},
14691469+ {"repo_labels", "repo_at", "repo_did"},
14701470+ }
14711471+14721472+ stmts := ""
14731473+ for _, t := range tables {
14741474+ stmts += fmt.Sprintf(
14751475+ `ALTER TABLE %s ADD COLUMN %s TEXT;
14761476+ UPDATE %s SET %s = (SELECT repos.repo_did FROM repos WHERE repos.at_uri = %s.%s);
14771477+ CREATE INDEX IF NOT EXISTS idx_%s_%s ON %s(%s);
14781478+ `, t.table, t.newCol, t.table, t.newCol, t.table, t.oldCol, t.table, t.newCol, t.table, t.newCol)
14791479+ }
14801480+14811481+ stmts += `ALTER TABLE pulls ADD COLUMN source_repo_did TEXT;
14821482+ UPDATE pulls SET source_repo_did = (SELECT repos.repo_did FROM repos WHERE repos.at_uri = pulls.source_repo_at);
14831483+14841484+ UPDATE profile_pinned_repositories SET pin = (
14851485+ SELECT repos.repo_did FROM repos WHERE repos.at_uri = profile_pinned_repositories.pin
14861486+ ) WHERE pin LIKE 'at://%'
14871487+ AND EXISTS (SELECT 1 FROM repos WHERE repos.at_uri = profile_pinned_repositories.pin AND repos.repo_did IS NOT NULL AND repos.repo_did != '');
14881488+ `
14891489+14901490+ _, err := tx.Exec(stmts)
14911491+ return err
14921492+ })
14931493+14941494+ orm.RunMigration(conn, logger, "drop-old-repo-at-from-pds-rewrite-status", func(tx *sql.Tx) error {
14951495+ _, err := tx.Exec(`ALTER TABLE pds_rewrite_status DROP COLUMN old_repo_at`)
14961496+ return err
14971497+ })
14981498+14991499+ orm.RunMigration(conn, logger, "backfill-pds-rewrites-star-issue-pull-collab", func(tx *sql.Tx) error {
15001500+ type source struct {
15011501+ userDidCol string
15021502+ table string
15031503+ nsid string
15041504+ fkCol string
15051505+ }
15061506+ sources := []source{
15071507+ {"did", "stars", "sh.tangled.feed.star", "subject_at"},
15081508+ {"did", "issues", "sh.tangled.repo.issue", "repo_at"},
15091509+ {"owner_did", "pulls", "sh.tangled.repo.pull", "repo_at"},
15101510+ {"did", "collaborators", "sh.tangled.repo.collaborator", "repo_at"},
15111511+ }
15121512+15131513+ for _, src := range sources {
15141514+ _, err := tx.Exec(fmt.Sprintf(`
15151515+ INSERT INTO pds_rewrite_status (user_did, repo_did, record_nsid, record_rkey, status)
15161516+ SELECT t.%s, r.repo_did, '%s', t.rkey, 'pending'
15171517+ FROM %s t
15181518+ JOIN repos r ON r.at_uri = t.%s
15191519+ WHERE r.repo_did IS NOT NULL AND r.repo_did != ''
15201520+ ON CONFLICT(user_did, record_nsid, record_rkey) DO NOTHING
15211521+ `, src.userDidCol, src.nsid, src.table, src.fkCol))
15221522+ if err != nil {
15231523+ return fmt.Errorf("backfill pds rewrites for %s: %w", src.table, err)
15241524+ }
15251525+ }
15261526+15271527+ return nil
15281528+ })
15291529+15301530+ orm.RunMigration(conn, logger, "backfill-pds-rewrites-profiles", func(tx *sql.Tx) error {
15311531+ _, err := tx.Exec(`
15321532+ INSERT INTO pds_rewrite_status (user_did, repo_did, record_nsid, record_rkey, status)
15331533+ SELECT DISTINCT pp.did, r.repo_did, 'sh.tangled.actor.profile', 'self', 'pending'
15341534+ FROM profile_pinned_repositories pp
15351535+ JOIN repos r ON r.at_uri = pp.pin
15361536+ WHERE pp.pin LIKE 'at://%'
15371537+ AND r.repo_did IS NOT NULL AND r.repo_did != ''
15381538+ ON CONFLICT(user_did, record_nsid, record_rkey) DO NOTHING
15391539+ `)
15401540+ if err != nil {
15411541+ return fmt.Errorf("backfill pds rewrites for profiles: %w", err)
15421542+ }
15431543+ return nil
15441544+ })
15451545+15461546+ conn.ExecContext(ctx, "pragma foreign_keys = off;")
15471547+ orm.RunMigration(conn, logger, "drop-old-at-uri-columns", func(tx *sql.Tx) error {
15481548+ _, err := tx.Exec(`
15491549+ CREATE TABLE repos_new (
15501550+ id INTEGER PRIMARY KEY AUTOINCREMENT,
15511551+ did TEXT NOT NULL,
15521552+ name TEXT NOT NULL,
15531553+ knot TEXT NOT NULL,
15541554+ rkey TEXT NOT NULL,
15551555+ at_uri TEXT NOT NULL UNIQUE,
15561556+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
15571557+ description TEXT CHECK (length(description) <= 200),
15581558+ source TEXT,
15591559+ spindle TEXT,
15601560+ website TEXT,
15611561+ topics TEXT,
15621562+ repo_did TEXT,
15631563+ UNIQUE(did, rkey)
15641564+ );
15651565+ INSERT INTO repos_new (id, did, name, knot, rkey, at_uri, created, description, source, spindle, website, topics, repo_did)
15661566+ SELECT id, did, name, knot, rkey, at_uri, created, description, source, spindle, website, topics, repo_did
15671567+ FROM repos;
15681568+ DROP TABLE repos;
15691569+ ALTER TABLE repos_new RENAME TO repos;
15701570+ CREATE UNIQUE INDEX idx_repos_repo_did ON repos(repo_did);
15711571+ CREATE UNIQUE INDEX idx_repos_did_rkey ON repos(did, rkey);
15721572+15731573+ CREATE TABLE issues_new (
15741574+ id INTEGER PRIMARY KEY AUTOINCREMENT,
15751575+ did TEXT NOT NULL,
15761576+ rkey TEXT NOT NULL,
15771577+ at_uri TEXT GENERATED ALWAYS AS ('at://' || did || '/' || 'sh.tangled.repo.issue' || '/' || rkey) STORED,
15781578+ repo_did TEXT NOT NULL,
15791579+ issue_id INTEGER NOT NULL,
15801580+ title TEXT NOT NULL,
15811581+ body TEXT NOT NULL,
15821582+ open INTEGER NOT NULL DEFAULT 1,
15831583+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
15841584+ edited TEXT,
15851585+ deleted TEXT,
15861586+ UNIQUE(did, rkey),
15871587+ UNIQUE(repo_did, issue_id),
15881588+ UNIQUE(at_uri),
15891589+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
15901590+ );
15911591+ INSERT INTO issues_new (id, did, rkey, repo_did, issue_id, title, body, open, created, edited, deleted)
15921592+ SELECT id, did, rkey, repo_did, issue_id, title, body, open, created, edited, deleted
15931593+ FROM issues WHERE repo_did IS NOT NULL AND repo_did != '';
15941594+ DROP TABLE issues;
15951595+ ALTER TABLE issues_new RENAME TO issues;
15961596+ CREATE INDEX idx_issues_repo_did ON issues(repo_did);
15971597+15981598+ CREATE TABLE pulls_new (
15991599+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16001600+ pull_id INTEGER NOT NULL,
16011601+ at_uri TEXT GENERATED ALWAYS AS ('at://' || owner_did || '/' || 'sh.tangled.repo.pull' || '/' || rkey) STORED,
16021602+ repo_did TEXT NOT NULL,
16031603+ owner_did TEXT NOT NULL,
16041604+ rkey TEXT NOT NULL,
16051605+ title TEXT NOT NULL,
16061606+ body TEXT NOT NULL,
16071607+ target_branch TEXT NOT NULL,
16081608+ state INTEGER NOT NULL DEFAULT 0 CHECK (state IN (0, 1, 2, 3)),
16091609+ source_branch TEXT,
16101610+ source_repo_did TEXT,
16111611+ change_id TEXT,
16121612+ dependent_on TEXT,
16131613+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
16141614+ UNIQUE(repo_did, pull_id),
16151615+ UNIQUE(at_uri),
16161616+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
16171617+ );
16181618+ INSERT INTO pulls_new (id, pull_id, repo_did, owner_did, rkey, title, body, target_branch, state, source_branch, source_repo_did, change_id, dependent_on, created)
16191619+ SELECT id, pull_id, repo_did, owner_did, rkey, title, body, target_branch, state, source_branch, source_repo_did, change_id, dependent_on, created
16201620+ FROM pulls WHERE repo_did IS NOT NULL AND repo_did != '';
16211621+ DROP TABLE pulls;
16221622+ ALTER TABLE pulls_new RENAME TO pulls;
16231623+ CREATE INDEX idx_pulls_repo_did ON pulls(repo_did);
16241624+ CREATE INDEX idx_pulls_source_repo_did ON pulls(source_repo_did);
16251625+16261626+ CREATE TABLE pull_comments_new (
16271627+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16281628+ pull_id INTEGER NOT NULL,
16291629+ submission_id INTEGER NOT NULL,
16301630+ repo_did TEXT NOT NULL,
16311631+ owner_did TEXT NOT NULL,
16321632+ comment_at TEXT NOT NULL,
16331633+ body TEXT NOT NULL,
16341634+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
16351635+ FOREIGN KEY (repo_did, pull_id) REFERENCES pulls(repo_did, pull_id) ON DELETE CASCADE,
16361636+ FOREIGN KEY (submission_id) REFERENCES pull_submissions(id) ON DELETE CASCADE
16371637+ );
16381638+ INSERT INTO pull_comments_new (id, pull_id, submission_id, repo_did, owner_did, comment_at, body, created)
16391639+ SELECT id, pull_id, submission_id, repo_did, owner_did, comment_at, body, created
16401640+ FROM pull_comments WHERE repo_did IS NOT NULL AND repo_did != '';
16411641+ DROP TABLE pull_comments;
16421642+ ALTER TABLE pull_comments_new RENAME TO pull_comments;
16431643+ CREATE INDEX idx_pull_comments_repo_did ON pull_comments(repo_did);
16441644+16451645+ CREATE TABLE stars_new (
16461646+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16471647+ did TEXT NOT NULL,
16481648+ rkey TEXT NOT NULL,
16491649+ subject_type TEXT NOT NULL CHECK (subject_type IN ('repo', 'string')),
16501650+ subject TEXT NOT NULL,
16511651+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
16521652+ UNIQUE(did, rkey),
16531653+ UNIQUE(did, subject)
16541654+ );
16551655+ INSERT INTO stars_new (id, did, rkey, subject_type, subject, created)
16561656+ SELECT id, did, rkey, 'repo', subject_did, created
16571657+ FROM stars
16581658+ WHERE subject_did IS NOT NULL AND subject_did != '';
16591659+ INSERT OR IGNORE INTO stars_new (id, did, rkey, subject_type, subject, created)
16601660+ SELECT id, did, rkey, 'string', subject_at, created
16611661+ FROM stars
16621662+ WHERE (subject_did IS NULL OR subject_did = '')
16631663+ AND subject_at LIKE 'at://%/sh.tangled.string/%';
16641664+ DROP TABLE stars;
16651665+ ALTER TABLE stars_new RENAME TO stars;
16661666+ CREATE INDEX idx_stars_subject ON stars(subject);
16671667+ CREATE INDEX idx_stars_subject_type ON stars(subject_type);
16681668+ CREATE INDEX idx_stars_created ON stars(created);
16691669+16701670+ CREATE TABLE collaborators_new (
16711671+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16721672+ did TEXT NOT NULL,
16731673+ rkey TEXT,
16741674+ subject_did TEXT NOT NULL,
16751675+ repo_did TEXT NOT NULL,
16761676+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
16771677+ UNIQUE(did, rkey),
16781678+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
16791679+ );
16801680+ INSERT INTO collaborators_new (id, did, rkey, subject_did, repo_did, created)
16811681+ SELECT id, did, NULLIF(rkey, ''), subject_did, repo_did, created
16821682+ FROM collaborators WHERE repo_did IS NOT NULL AND repo_did != '';
16831683+ DROP TABLE collaborators;
16841684+ ALTER TABLE collaborators_new RENAME TO collaborators;
16851685+ CREATE INDEX idx_collaborators_repo_did ON collaborators(repo_did);
16861686+16871687+ CREATE TABLE artifacts_new (
16881688+ id INTEGER PRIMARY KEY AUTOINCREMENT,
16891689+ did TEXT NOT NULL,
16901690+ rkey TEXT NOT NULL,
16911691+ repo_did TEXT NOT NULL,
16921692+ tag BINARY(20) NOT NULL,
16931693+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
16941694+ blob_cid TEXT NOT NULL,
16951695+ name TEXT NOT NULL,
16961696+ size INTEGER NOT NULL DEFAULT 0,
16971697+ mimetype TEXT NOT NULL DEFAULT '*/*',
16981698+ UNIQUE(did, rkey),
16991699+ UNIQUE(repo_did, tag, name),
17001700+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17011701+ );
17021702+ INSERT INTO artifacts_new (id, did, rkey, repo_did, tag, created, blob_cid, name, size, mimetype)
17031703+ SELECT id, did, rkey, repo_did, tag, created, blob_cid, name, size, mimetype
17041704+ FROM artifacts WHERE repo_did IS NOT NULL AND repo_did != '';
17051705+ DROP TABLE artifacts;
17061706+ ALTER TABLE artifacts_new RENAME TO artifacts;
17071707+ CREATE INDEX idx_artifacts_repo_did ON artifacts(repo_did);
17081708+17091709+ CREATE TABLE webhooks_new (
17101710+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17111711+ repo_did TEXT NOT NULL,
17121712+ url TEXT NOT NULL,
17131713+ secret TEXT,
17141714+ active INTEGER NOT NULL DEFAULT 1,
17151715+ events TEXT NOT NULL,
17161716+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
17171717+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
17181718+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17191719+ );
17201720+ INSERT INTO webhooks_new (id, repo_did, url, secret, active, events, created_at, updated_at)
17211721+ SELECT id, repo_did, url, secret, active, events, created_at, updated_at
17221722+ FROM webhooks WHERE repo_did IS NOT NULL AND repo_did != '';
17231723+ DROP TABLE webhooks;
17241724+ ALTER TABLE webhooks_new RENAME TO webhooks;
17251725+ CREATE INDEX idx_webhooks_repo_did ON webhooks(repo_did);
17261726+17271727+ CREATE TABLE repo_sites_new (
17281728+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17291729+ repo_did TEXT NOT NULL UNIQUE,
17301730+ branch TEXT NOT NULL,
17311731+ dir TEXT NOT NULL DEFAULT '/',
17321732+ is_index INTEGER NOT NULL DEFAULT 0,
17331733+ created TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
17341734+ updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
17351735+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17361736+ );
17371737+ INSERT INTO repo_sites_new (id, repo_did, branch, dir, is_index, created, updated)
17381738+ SELECT id, repo_did, branch, dir, is_index, created, updated
17391739+ FROM repo_sites WHERE repo_did IS NOT NULL AND repo_did != '';
17401740+ DROP TABLE repo_sites;
17411741+ ALTER TABLE repo_sites_new RENAME TO repo_sites;
17421742+17431743+ CREATE TABLE site_deploys_new (
17441744+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17451745+ repo_did TEXT NOT NULL,
17461746+ branch TEXT NOT NULL,
17471747+ dir TEXT NOT NULL DEFAULT '/',
17481748+ commit_sha TEXT NOT NULL DEFAULT '',
17491749+ status TEXT NOT NULL CHECK (status IN ('success', 'failure')),
17501750+ trigger TEXT NOT NULL CHECK (trigger IN ('config_change', 'push')),
17511751+ error TEXT NOT NULL DEFAULT '',
17521752+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
17531753+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17541754+ );
17551755+ INSERT INTO site_deploys_new (id, repo_did, branch, dir, commit_sha, status, trigger, error, created_at)
17561756+ SELECT id, repo_did, branch, dir, commit_sha, status, trigger, error, created_at
17571757+ FROM site_deploys WHERE repo_did IS NOT NULL AND repo_did != '';
17581758+ DROP TABLE site_deploys;
17591759+ ALTER TABLE site_deploys_new RENAME TO site_deploys;
17601760+ CREATE INDEX idx_site_deploys_repo_did ON site_deploys(repo_did);
17611761+17621762+ CREATE TABLE repo_issue_seqs_new (
17631763+ repo_did TEXT PRIMARY KEY,
17641764+ next_issue_id INTEGER NOT NULL DEFAULT 1,
17651765+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17661766+ );
17671767+ INSERT INTO repo_issue_seqs_new (repo_did, next_issue_id)
17681768+ SELECT repo_did, next_issue_id
17691769+ FROM repo_issue_seqs WHERE repo_did IS NOT NULL AND repo_did != '';
17701770+ DROP TABLE repo_issue_seqs;
17711771+ ALTER TABLE repo_issue_seqs_new RENAME TO repo_issue_seqs;
17721772+17731773+ CREATE TABLE repo_pull_seqs_new (
17741774+ repo_did TEXT PRIMARY KEY,
17751775+ next_pull_id INTEGER NOT NULL DEFAULT 1,
17761776+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17771777+ );
17781778+ INSERT INTO repo_pull_seqs_new (repo_did, next_pull_id)
17791779+ SELECT repo_did, next_pull_id
17801780+ FROM repo_pull_seqs WHERE repo_did IS NOT NULL AND repo_did != '';
17811781+ DROP TABLE repo_pull_seqs;
17821782+ ALTER TABLE repo_pull_seqs_new RENAME TO repo_pull_seqs;
17831783+17841784+ CREATE TABLE repo_languages_new (
17851785+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17861786+ repo_did TEXT NOT NULL,
17871787+ ref TEXT NOT NULL,
17881788+ is_default_ref INTEGER NOT NULL DEFAULT 0,
17891789+ language TEXT NOT NULL,
17901790+ bytes INTEGER NOT NULL CHECK (bytes >= 0),
17911791+ UNIQUE(repo_did, ref, language),
17921792+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
17931793+ );
17941794+ INSERT INTO repo_languages_new (id, repo_did, ref, is_default_ref, language, bytes)
17951795+ SELECT id, repo_did, ref, is_default_ref, language, bytes
17961796+ FROM repo_languages WHERE repo_did IS NOT NULL AND repo_did != '';
17971797+ DROP TABLE repo_languages;
17981798+ ALTER TABLE repo_languages_new RENAME TO repo_languages;
17991799+18001800+ CREATE TABLE repo_labels_new (
18011801+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18021802+ repo_did TEXT NOT NULL,
18031803+ label_at TEXT NOT NULL,
18041804+ UNIQUE(repo_did, label_at),
18051805+ FOREIGN KEY (repo_did) REFERENCES repos(repo_did) ON DELETE CASCADE
18061806+ );
18071807+ INSERT INTO repo_labels_new (id, repo_did, label_at)
18081808+ SELECT id, repo_did, label_at
18091809+ FROM repo_labels WHERE repo_did IS NOT NULL AND repo_did != '';
18101810+ DROP TABLE repo_labels;
18111811+ ALTER TABLE repo_labels_new RENAME TO repo_labels;
18121812+ `)
18131813+ return err
18141814+ })
18151815+ conn.ExecContext(ctx, "pragma foreign_keys = on;")
1411181614121817 return &DB{
14131818 db,
+1-1
appview/models/artifact.go
···1515 Did string
1616 Rkey string
17171818- RepoAt syntax.ATURI
1818+ RepoDid syntax.DID
1919 Tag plumbing.Hash
2020 CreatedAt time.Time
2121
+1-1
appview/models/collaborator.go
···14141515 // content
1616 SubjectDid syntax.DID
1717- RepoAt syntax.ATURI
1717+ RepoDid syntax.DID
18181919 // meta
2020 Created time.Time