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