Strip back SQLite startup - don't upgrade anymore, just create the connection

This commit is contained in:
Mike Dilger 2023-07-22 13:24:26 +12:00
parent 161d9ddbce
commit ddfc75a238
40 changed files with 0 additions and 740 deletions

View File

@ -1,10 +1,7 @@
use crate::error::Error;
use crate::globals::GLOBALS;
use crate::profile::Profile;
use fallible_iterator::FallibleIterator;
use rusqlite::Connection;
use std::sync::atomic::Ordering;
use tokio::task;
pub fn init_database() -> Result<Connection, Error> {
let profile_dir = Profile::current()?.profile_dir;
@ -29,12 +26,6 @@ pub fn init_database() -> Result<Connection, Error> {
// This sets up the database
#[allow(clippy::or_fun_call)]
pub fn setup_database() -> Result<(), Error> {
// Check and upgrade our data schema
check_and_upgrade()?;
// Normalize URLs
normalize_urls()?;
let db = GLOBALS.db.blocking_lock();
// Enforce foreign key relationships
@ -48,214 +39,3 @@ pub fn setup_database() -> Result<(), Error> {
Ok(())
}
fn check_and_upgrade() -> Result<(), Error> {
let db = GLOBALS.db.blocking_lock();
match db.query_row(
"SELECT schema_version FROM local_settings LIMIT 1",
[],
|row| row.get::<usize, usize>(0),
) {
Ok(version) => upgrade(&db, version),
Err(e) => {
if let rusqlite::Error::SqliteFailure(_, Some(ref s)) = e {
if s.contains("no such table") {
return old_check_and_upgrade(&db);
}
}
Err(e.into())
}
}
}
fn old_check_and_upgrade(db: &Connection) -> Result<(), Error> {
match db.query_row(
"SELECT value FROM settings WHERE key='version'",
[],
|row| row.get::<usize, String>(0),
) {
Ok(v) => {
let version = v.parse::<usize>().unwrap();
if version < 2 {
GLOBALS.first_run.store(true, Ordering::Relaxed);
}
upgrade(db, version)
}
Err(_e) => {
GLOBALS.first_run.store(true, Ordering::Relaxed);
// Check the error first!
upgrade(db, 0)
}
}
}
fn upgrade(db: &Connection, mut version: usize) -> Result<(), Error> {
if version > UPGRADE_SQL.len() {
panic!(
"Database version {} is newer than this binary which expects version {}.",
version,
UPGRADE_SQL.len()
);
}
// Disable foreign key checks during upgrades (some foreign keys relationships
// may be broken, we don't want that to stop us)
db.pragma_update(None, "foreign_keys", "OFF")?;
while version < UPGRADE_SQL.len() {
tracing::info!("Upgrading database to version {}", version + 1);
db.execute_batch(UPGRADE_SQL[version + 1 - 1])?;
version += 1;
if version < 24 {
// 24 is when we switched to local_settings
db.execute(
"UPDATE settings SET value=? WHERE key='version'",
(version,),
)?;
} else {
db.execute("UPDATE local_settings SET schema_version=?", (version,))?;
}
}
db.pragma_update(None, "foreign_keys", "ON")?;
tracing::info!("Database is at version {}", version);
Ok(())
}
pub async fn prune() -> Result<(), Error> {
task::spawn_blocking(move || {
let db = GLOBALS.db.blocking_lock();
db.execute_batch(include_str!("sql/prune.sql"))?;
Ok::<(), Error>(())
})
.await??;
GLOBALS
.status_queue
.write()
.write("Database prune has completed.".to_owned());
Ok(())
}
fn normalize_urls() -> Result<(), Error> {
let db = GLOBALS.db.blocking_lock();
let urls_are_normalized: bool = db.query_row(
"SELECT urls_are_normalized FROM local_settings LIMIT 1",
[],
|row| row.get::<usize, bool>(0),
)?;
if urls_are_normalized {
return Ok(());
}
tracing::info!("Normalizing Database URLs (this will take some time)");
db.pragma_update(None, "foreign_keys", "OFF")?;
// relay.url
let sql = "SELECT url FROM relay";
let mut stmt = db.prepare(sql)?;
let rows = stmt.query([])?;
let all_rows: Vec<String> = rows.map(|row| row.get(0)).collect()?;
for urlkey in all_rows.iter() {
match nostr_types::RelayUrl::try_from_str(urlkey) {
Ok(url) => {
let urlstr = url.as_str().to_owned();
// Update if not equal
if *urlkey != urlstr {
// this one is too verbose
// tracing::debug!("Updating non-canonical URL from {} to {}", urlkey, urlstr);
let usql = "UPDATE relay SET url=? WHERE url=?";
let mut stmt = db.prepare(usql)?;
if let Err(e) = stmt.execute((&urlstr, urlkey)) {
if let rusqlite::Error::SqliteFailure(_, Some(ref s)) = e {
if s.contains("constraint failed") {
// Delete this row instead, there is some other row that is already
// what we are trying to turn this row into
let dsql = "DELETE FROM relay WHERE url=?";
let mut stmt = db.prepare(dsql)?;
stmt.execute((&urlkey,))?;
}
} else {
return Err(e.into());
}
}
let usql = "UPDATE person_relay SET relay=? WHERE relay=?";
let mut stmt = db.prepare(usql)?;
stmt.execute((&urlstr, urlkey))?;
let usql = "UPDATE event_relay SET relay=? WHERE relay=?";
let mut stmt = db.prepare(usql)?;
stmt.execute((&urlstr, urlkey))?;
}
}
Err(_) => {
// Delete if did not parse properly
tracing::debug!("Deleting invalid relay url {}", urlkey);
let dsql = "DELETE FROM relay WHERE url=?";
let mut stmt = db.prepare(dsql)?;
stmt.execute((urlkey,))?;
let dsql = "DELETE FROM person_relay WHERE relay=?";
let mut stmt = db.prepare(dsql)?;
stmt.execute((urlkey,))?;
let dsql = "DELETE FROM event_relay WHERE relay=?";
let mut stmt = db.prepare(dsql)?;
stmt.execute((urlkey,))?;
}
};
}
let sql = "UPDATE local_settings SET urls_are_normalized=1";
let mut stmt = db.prepare(sql)?;
stmt.execute(())?;
Ok(())
}
const UPGRADE_SQL: [&str; 37] = [
include_str!("sql/schema1.sql"),
include_str!("sql/schema2.sql"),
include_str!("sql/schema3.sql"),
include_str!("sql/schema4.sql"),
include_str!("sql/schema5.sql"),
include_str!("sql/schema6.sql"),
include_str!("sql/schema7.sql"),
include_str!("sql/schema8.sql"),
include_str!("sql/schema9.sql"),
include_str!("sql/schema10.sql"),
include_str!("sql/schema11.sql"),
include_str!("sql/schema12.sql"),
include_str!("sql/schema13.sql"),
include_str!("sql/schema14.sql"),
include_str!("sql/schema15.sql"),
include_str!("sql/schema16.sql"),
include_str!("sql/schema17.sql"),
include_str!("sql/schema18.sql"),
include_str!("sql/schema19.sql"),
include_str!("sql/schema20.sql"),
include_str!("sql/schema21.sql"),
include_str!("sql/schema22.sql"),
include_str!("sql/schema23.sql"),
include_str!("sql/schema24.sql"),
include_str!("sql/schema25.sql"),
include_str!("sql/schema26.sql"),
include_str!("sql/schema27.sql"),
include_str!("sql/schema28.sql"),
include_str!("sql/schema29.sql"),
include_str!("sql/schema30.sql"),
include_str!("sql/schema31.sql"),
include_str!("sql/schema32.sql"),
include_str!("sql/schema33.sql"),
include_str!("sql/schema34.sql"),
include_str!("sql/schema35.sql"),
include_str!("sql/schema36.sql"),
include_str!("sql/schema37.sql"),
];

View File

@ -1,22 +0,0 @@
PRAGMA foreign_keys = ON;
-- Delete stale kind=0,3 events (keep the last one)
DELETE FROM event WHERE kind IN (0,3) AND created_at != (SELECT max(created_at) FROM event as event_inner WHERE kind=event.kind AND pubkey=event.pubkey);
-- Delete overridden replaceable events
DELETE FROM event WHERE kind>=10000 and kind<20000 AND created_at != (SELECT max(created_at) FROM event as event_inner WHERE kind=event.kind AND pubkey=event.pubkey);
-- Delete all ephemeral events
DELETE FROM event WHERE kind>=20000 and kind<30000;
-- Delete kind=1 events older than 1 week
DELETE FROM event WHERE kind!=0 AND kind!=3 AND kind!=10001 AND created_at < strftime('%s', 'now') - 60*60*24*7;
-- Due to foreign keys and cascades, the following will also be cleaned up
-- event_relationship
-- event_hashtag
-- event_tag
-- event_seen
VACUUM;

View File

@ -1,78 +0,0 @@
CREATE TABLE settings (
key TEXT PRIMARY KEY NOT NULL,
value TEXT NOT NULL
) WITHOUT ROWID;
CREATE TABLE person (
pubkey TEXT PRIMARY KEY NOT NULL,
name TEXT DEFAULT NULL,
about TEXT DEFAULT NULL,
picture TEXT DEFAULT NULL,
dns_id TEXT DEFAULT NULL,
dns_id_valid INTEGER DEFAULT 0,
dns_id_last_checked INTEGER DEFAULT NULL,
metadata_at INTEGER DEFAULT NULL,
followed INTEGER DEFAULT 0
) WITHOUT ROWID;
CREATE TABLE relay (
url TEXT PRIMARY KEY NOT NULL,
success_count INTEGER NOT NULL DEFAULT 0,
failure_count INTEGER NOT NULL DEFAULT 0,
rank INTEGER DEFAULT 3
) WITHOUT ROWID;
CREATE TABLE person_relay (
person TEXT NOT NULL,
relay TEXT NOT NULL,
recommended INTEGER DEFAULT 0,
last_fetched INTEGER DEFAULT NULL,
UNIQUE(person, relay)
);
CREATE TABLE contact (
source TEXT NOT NULL,
contact TEXT NOT NULL,
relay TEXT DEFAULT NULL,
petname TEXT DEFAULT NULL,
UNIQUE(source, contact)
);
CREATE TABLE event (
id TEXT PRIMARY KEY NOT NULL,
raw TEXT NOT NULL,
pubkey TEXT NOT NULL,
created_at INTEGER NOT NULL,
kind INTEGER NOT NULL,
content TEXT NOT NULL,
ots TEXT DEFAULT NULL
) WITHOUT ROWID;
CREATE TABLE event_tag (
event TEXT NOT NULL,
seq INTEGER NOT NULL,
label TEXT DEFAULT NULL,
field0 TEXT DEFAULT NULL,
field1 TEXT DEFAULT NULL,
field2 TEXT DEFAULT NULL,
field3 TEXT DEFAULT NULL,
CONSTRAINT fk_event
FOREIGN KEY (event) REFERENCES event (id)
ON DELETE CASCADE
);
CREATE TABLE event_seen (
event TEXT NOT NULL,
relay TEXT NOT NULL,
when_seen INTEGER NOT NULL,
UNIQUE (event, relay),
CONSTRAINT fk_event
FOREIGN KEY (event) REFERENCES event (id)
ON DELETE CASCADE
);
INSERT INTO settings (key, value) values ('version', '1');
-- INSERT INTO settings (key, value) values ('user_private_key', ''); -- no setting if no key
INSERT INTO settings (key, value) values ('overlap', '600');
INSERT INTO settings (key, value) values ('feed_chunk', '43200');
INSERT INTO settings (key, value) values ('autofollow', '0');

View File

@ -1,5 +0,0 @@
ALTER TABLE relay RENAME COLUMN last_success_at TO last_connected_at;
ALTER TABLE relay ADD COLUMN last_general_eose_at INTEGER DEFAULT NULL;
-- Start at last_connected_at
UPDATE relay SET last_general_eose_at = last_connected_at;

View File

@ -1,2 +0,0 @@
UPDATE settings SET key='thread_view_ancestors' WHERE key='view_posts_referred_to';
UPDATE settings SET key='thread_view_replies' WHERE key='view_posts_referring_to';

View File

@ -1,24 +0,0 @@
ALTER TABLE event_hashtag RENAME TO event_hashtag_old;
CREATE TABLE event_hashtag (
event TEXT NOT NULL,
hashtag TEXT NOT NULL,
UNIQUE(event, hashtag),
CONSTRAINT fk_event FOREIGN KEY (event) REFERENCES event (id) ON DELETE CASCADE
);
INSERT OR IGNORE INTO event_hashtag (event, hashtag) SELECT event, hashtag FROM event_hashtag_old;
DROP TABLE event_hashtag_old;
ALTER TABLE event_relationship RENAME TO event_relationship_old;
CREATE TABLE event_relationship (
original TEXT NOT NULL,
refers_to TEXT NOT NULL,
relationship TEXT CHECK (relationship IN ('reply', 'quote', 'reaction', 'deletion')) NOT NULL,
content TEXT DEFAULT NULL,
CONSTRAINT fk_original FOREIGN KEY (original) REFERENCES event (id) ON DELETE CASCADE,
UNIQUE(original, refers_to)
);
INSERT OR IGNORE INTO event_relationship (original, refers_to, relationship, content)
SELECT original, referring, relationship, content FROM event_relationship_old;
DROP TABLE event_relationship_old;

View File

@ -1,7 +0,0 @@
-- I tried to merge records with relays ending in '/' to records where they didn't, but SQLITE makes it very hard to update joins (you can't do it directly, and I think the join ON clause is too complex to use EXISTS tricks).
-- So I'm just going to delete such records. The data lost is statistical and not critical.
DELETE FROM event_seen WHERE SUBSTR(relay, LENGTH(relay), 1) == '/';
DELETE FROM person_relay WHERE SUBSTR(relay, LENGTH(relay), 1) == '/';
DELETE FROM relay WHERE SUBSTR(url, LENGTH(url), 1) == '/';

View File

@ -1,31 +0,0 @@
ALTER TABLE person RENAME TO person_old;
CREATE TABLE person (
pubkey TEXT PRIMARY KEY NOT NULL,
metadata TEXT DEFAULT NULL,
metadata_at integer default null,
nip05_valid INTEGER DEFAULT 0,
nip05_last_checked INTEGER DEFAULT NULL,
followed INTEGER DEFAULT 0,
followed_last_updated INTEGER NOT NULL DEFAULT 0
) WITHOUT ROWID;
INSERT INTO person (
pubkey,
metadata, metadata_at,
nip05_valid, nip05_last_checked,
followed, followed_last_updated
)
SELECT
pubkey,
json_object('name', name, 'about', about, 'picture', picture, 'nip05', dns_id),
metadata_at,
dns_id_valid, dns_id_last_checked,
followed, followed_last_updated
FROM person_old;
UPDATE person SET metadata=null WHERE metadata_at is null;
DROP TABLE person_old;

View File

@ -1,3 +0,0 @@
-- Reset every person.metadata_at so it will be reloaded (probably from local events)
-- with code that now handles the additional fields
update person set metadata_at = null;

View File

@ -1,2 +0,0 @@
ALTER TABLE person ADD COLUMN
muted INTEGER DEFAULT 0;

View File

@ -1,11 +0,0 @@
-- I tried to merge records with relays ending in '/' to records where they didn't, but SQLITE makes it very hard to update joins (you can't do it directly, and I think the join ON clause is too complex to use EXISTS tricks).
-- So I'm just going to delete such records. The data lost is statistical and not critical.
DELETE FROM event_seen WHERE SUBSTR(relay, LENGTH(relay), 1) == '/';
DELETE FROM person_relay WHERE SUBSTR(relay, LENGTH(relay), 1) == '/';
DELETE FROM relay WHERE SUBSTR(url, LENGTH(url), 1) == '/';
DELETE FROM event_seen WHERE SUBSTR(relay, 0, 15) == 'wss://127.0.0.1';
DELETE FROM person_relay WHERE SUBSTR(relay, 0, 15) == 'wss://127.0.0.1';
DELETE FROM relay WHERE SUBSTR(url, 0, 15) == 'wss://127.0.0.1';

View File

@ -1,17 +0,0 @@
-- Again this is a PITA to merge these.
-- So I'm just going to delete such records
-- This data is mostly just statistical (but we might lose some person-relay pairs)
DELETE FROM relay WHERE url LIKE ' %';
DELETE FROM relay WHERE url LIKE '% ';
DELETE FROM relay WHERE url LIKE ' %';
DELETE FROM relay WHERE url LIKE '% ';
DELETE FROM person_relay WHERE relay LIKE ' %';
DELETE FROM person_relay WHERE relay LIKE '% ';
DELETE FROM person_relay WHERE relay LIKE ' %';
DELETE FROM person_relay WHERE relay LIKE '% ';
DELETE FROM event_seen WHERE relay LIKE ' %';
DELETE FROM event_seen WHERE relay LIKE '% ';
DELETE FROM event_seen WHERE relay LIKE ' %';
DELETE FROM event_seen WHERE relay LIKE '% ';

View File

@ -1,5 +0,0 @@
ALTER TABLE relay ADD COLUMN rank_new INTEGER NOT NULL DEFAULT 3;
UPDATE relay SET rank_new = rank;
ALTER TABLE relay DROP COLUMN rank;
ALTER TABLE relay RENAME COLUMN rank_new TO rank;

View File

@ -1,4 +0,0 @@
INSERT INTO settings (key, value) values ('view_posts_referred_to', '1');
INSERT INTO settings (key, value) values ('view_posts_referring_to', '0');
INSERT INTO settings (key, value) values ('view_threaded', '1');

View File

@ -1 +0,0 @@
ALTER TABLE person ADD COLUMN contact_list_last_received INTEGER NOT NULL DEFAULT 0;

View File

@ -1,8 +0,0 @@
ALTER TABLE person_relay ADD COLUMN read INTEGER NOT NULL DEFAULT 0;
ALTER TABLE person_relay ADD COLUMN write INTEGER NOT NULL DEFAULT 0;
ALTER TABLE person RENAME COLUMN contact_list_last_received TO relay_list_last_received;
ALTER TABLE person ADD COLUMN relay_list_created_at INTEGER NOT NULL DEFAULT 0;
ALTER TABLE relay RENAME COLUMN post TO write;
ALTER TABLE relay ADD COLUMN read INTEGER NOT NULL DEFAULT 0;
ALTER TABLE relay ADD COLUMN advertise INTEGER NOT NULL DEFAULT 0;

View File

@ -1 +0,0 @@
ALTER TABLE person_relay DROP COLUMN last_suggested_nip23;

View File

@ -1,3 +0,0 @@
ALTER TABLE person_relay DROP COLUMN last_suggested_kind2;
ALTER TABLE person_relay ADD COLUMN manually_paired_read INTEGER NOT NULL DEFAULT 0;
ALTER TABLE person_relay ADD COLUMN manually_paired_write INTEGER NOT NULL DEFAULT 0;

View File

@ -1,27 +0,0 @@
-- unused setting
DELETE FROM settings WHERE key='autofollow';
DELETE FROM settings WHERE key='thread_view_ancestors';
DELETE FROM settings WHERE key='thread_view_replies';
DELETE FROM settings WHERE key='view_posts_referred_to';
DELETE FROM settings WHERE key='view_posts_referring_to';
DELETE FROM settings WHERE key='view_threaded';
-- unused table
DROP TABLE contact;
-- missing data
ALTER TABLE person ADD COLUMN petname TEXT DEFAULT NULL;
-- move local settings
CREATE TABLE local_settings (
schema_version INTEGER DEFAULT 0,
encrypted_private_key TEXT DEFAULT NULL
);
INSERT INTO local_settings (schema_version, encrypted_private_key)
SELECT
(SELECT value FROM settings WHERE settings.key='version'),
(SELECT value FROM settings WHERE settings.key='encrypted_private_key');
DELETE FROM settings WHERE key='version';
DELETE FROM settings WHERE key='encrypted_private_key';

View File

@ -1,2 +0,0 @@
-- This just lets pre-version-24 code know that this database is beyond them
INSERT INTO settings (key, value) VALUES ('version', '25');

View File

@ -1,2 +0,0 @@
insert into settings (key, value) values ('dark_mode', 1 - coalesce((SELECT value FROM settings WHERE key='light_mode'), 1));
delete from settings where key = 'light_mode';

View File

@ -1,13 +0,0 @@
-- New indices for event_tag
-- The sub-query in build_tag_condition filters by label and field0
CREATE INDEX event_tag_lf0 ON event_tag(label, field0);
-- populate_new_relays filters by label and field1
CREATE INDEX event_tag_lf1 ON event_tag(label, field1);
-- The LEFT JOIN in fetch_reply_related filters by event, label and field0
CREATE INDEX event_tag_elf0 ON event_tag(event, label, field0);
-- New indices for event
-- fetch_last_contact_list filters by kind and pubkey, then sorts by created_at
CREATE INDEX event_pkc ON event(pubkey, kind, created_at);
-- The LEFT JOIN in fetch_reply_related filters by id, kind and created_at
CREATE UNIQUE INDEX event_ikc ON event(id, kind, created_at);

View File

@ -1,5 +0,0 @@
CREATE TABLE event_flags (
event TEXT PRIMARY KEY NOT NULL,
viewed INTEGER NOT NULL DEFAULT 0,
CONSTRAINT fk_event FOREIGN KEY (event) REFERENCES event (id) ON DELETE CASCADE
);

View File

@ -1 +0,0 @@
ALTER TABLE event_seen RENAME TO event_relay;

View File

@ -1,21 +0,0 @@
ALTER TABLE person_relay ADD COLUMN last_suggested_kind2 INTEGER DEFAULT NULL;
ALTER TABLE person_relay ADD COLUMN last_suggested_kind3 INTEGER DEFAULT NULL;
ALTER TABLE person_relay ADD COLUMN last_suggested_nip23 INTEGER DEFAULT NULL;
ALTER TABLE person_relay ADD COLUMN last_suggested_nip35 INTEGER DEFAULT NULL;
ALTER TABLE person_relay ADD COLUMN last_suggested_bytag INTEGER DEFAULT NULL;
ALTER TABLE person_relay DROP COLUMN recommended;
CREATE TABLE event_relationship (
original TEXT NOT NULL,
referring TEXT NOT NULL,
relationship TEXT CHECK (relationship IN ('reply', 'quote', 'reaction', 'deletion')) NOT NULL,
content TEXT DEFAULT NULL,
UNIQUE(original, referring)
);
CREATE TABLE event_hashtag (
event TEXT NOT NULL,
hashtag TEXT NOT NULL,
UNIQUE(event, hashtag)
);

View File

@ -1 +0,0 @@
ALTER TABLE local_settings ADD COLUMN urls_are_normalized INTEGER NOT NULL DEFAULT 0;

View File

@ -1,39 +0,0 @@
INSERT INTO person (pubkey) SELECT distinct person FROM person_relay WHERE person NOT IN (select pubkey from person);
ALTER TABLE person_relay RENAME TO old_person_relay;
CREATE TABLE person_relay (
person TEXT NOT NULL,
relay TEXT NOT NULL,
last_fetched INTEGER DEFAULT NULL,
last_suggested_kind3 INTEGER DEFAULT NULL,
last_suggested_nip05 INTEGER DEFAULT NULL,
last_suggested_bytag INTEGER DEFAULT NULL,
read INTEGER NOT NULL DEFAULT 0,
write INTEGER NOT NULL DEFAULT 0,
manually_paired_read INTEGER NOT NULL DEFAULT 0,
manually_paired_write INTEGER NOT NULL DEFAULT 0,
UNIQUE(person, relay),
CONSTRAINT person_relay_fk_person FOREIGN KEY (person) REFERENCES person (pubkey) ON DELETE CASCADE,
CONSTRAINT person_relay_fk_relay FOREIGN KEY (relay) REFERENCES relay (url) ON DELETE CASCADE
);
INSERT OR IGNORE INTO person_relay (person, relay, last_fetched, last_suggested_kind3, last_suggested_nip05,
last_suggested_bytag, read, write, manually_paired_read, manually_paired_write)
SELECT person, relay, last_fetched, last_suggested_kind3, last_suggested_nip05,
last_suggested_bytag, read, write, manually_paired_read, manually_paired_write
FROM old_person_relay;
DROP TABLE old_person_relay;
DELETE FROM event_relay WHERE event NOT IN (select id from event);
ALTER TABLE event_relay RENAME TO old_event_relay;
CREATE TABLE event_relay (
event TEXT NOT NULL,
relay TEXT NOT NULL,
when_seen INTEGER NOT NULL,
UNIQUE (event, relay),
CONSTRAINT event_relay_fk_event FOREIGN KEY (event) REFERENCES event (id) ON DELETE CASCADE,
CONSTRAINT event_relay_fk_relay FOREIGN KEY (relay) REFERENCES relay (url) ON DELETE CASCADE
);
INSERT OR IGNORE INTO event_relay (event, relay, when_seen)
SELECT event, relay, when_seen FROM old_event_relay;
DROP TABLE old_event_relay;

View File

@ -1 +0,0 @@
ALTER TABLE relay ADD COLUMN hidden INTEGER DEFAULT 0;

View File

@ -1,4 +0,0 @@
ALTER TABLE local_settings ADD COLUMN last_contact_list_edit INTEGER NOT NULL DEFAULT 0;
-- Initial value (may not be correct but we don't have the actual value)
UPDATE OR IGNORE local_settings SET last_contact_list_edit=(SELECT created_at FROM event WHERE pubkey=(SELECT value FROM settings WHERE key='public_key') AND kind=3 ORDER BY created_at DESC LIMIT 1);

View File

@ -1,77 +0,0 @@
CREATE TABLE relay_new (
url TEXT PRIMARY KEY NOT NULL,
success_count INTEGER NOT NULL DEFAULT 0,
failure_count INTEGER NOT NULL DEFAULT 0,
last_connected_at INTEGER DEFAULT NULL,
last_general_eose_at INTEGER DEFAULT NULL,
rank INTEGER NOT NULL DEFAULT 3,
hidden INTEGER NOT NULL DEFAULT 0,
usage_bits INTEGER NOT NULL DEFAULT 0
) WITHOUT ROWID;
INSERT INTO relay_new (
url, success_count, failure_count, last_connected_at, last_general_eose_at,
rank, hidden, usage_bits
) SELECT
url, success_count, failure_count, last_connected_at, last_general_eose_at,
rank, hidden, ((read * 1) + (write * 2) + (advertise * 4) + (read * 8) + (write * 16) + (read * 32))
FROM relay;
-- We have to rebuild person_relay since its foreign key now needs to point to relay_new
CREATE TABLE person_relay_new (
person TEXT NOT NULL,
relay TEXT NOT NULL,
last_fetched INTEGER DEFAULT NULL,
last_suggested_kind3 INTEGER DEFAULT NULL,
last_suggested_nip05 INTEGER DEFAULT NULL,
last_suggested_bytag INTEGER DEFAULT NULL,
read INTEGER NOT NULL DEFAULT 0,
write INTEGER NOT NULL DEFAULT 0,
manually_paired_read INTEGER NOT NULL DEFAULT 0,
manually_paired_write INTEGER NOT NULL DEFAULT 0,
UNIQUE(person, relay),
CONSTRAINT person_relay_fk_person FOREIGN KEY (person) REFERENCES person (pubkey) ON DELETE CASCADE,
CONSTRAINT person_relay_fk_relay FOREIGN KEY (relay) REFERENCES relay_new (url) ON DELETE CASCADE
);
INSERT INTO person_relay_new (
person, relay, last_fetched, last_suggested_kind3,
last_suggested_nip05, last_suggested_bytag, read, write,
manually_paired_read, manually_paired_write
) SELECT
person, relay, last_fetched, last_suggested_kind3,
last_suggested_nip05, last_suggested_bytag, read, write,
manually_paired_read, manually_paired_write
FROM person_relay;
-- We have to rebuild event_relay since its foreign key now needs to point to relay_new
CREATE TABLE event_relay_new (
event TEXT NOT NULL,
relay TEXT NOT NULL,
when_seen INTEGER NOT NULL,
UNIQUE (event, relay),
CONSTRAINT event_relay_fk_event FOREIGN KEY (event) REFERENCES event (id) ON DELETE CASCADE,
CONSTRAINT event_relay_fk_relay FOREIGN KEY (relay) REFERENCES relay_new (url) ON DELETE CASCADE
);
INSERT INTO event_relay_new (event, relay, when_seen) SELECT event, relay, when_seen FROM event_relay;
-- Now lets replace the tables
ALTER TABLE person_relay RENAME TO person_relay_old;
ALTER TABLE person_relay_new RENAME TO person_relay;
ALTER TABLE event_relay RENAME TO event_relay_old;
ALTER TABLE event_relay_new RENAME TO event_relay;
ALTER TABLE relay RENAME TO relay_old;
ALTER TABLE relay_new RENAME TO relay;
-- And drop the old ones
DROP TABLE person_relay_old;
DROP TABLE event_relay_old;
DROP TABLE relay_old;

View File

@ -1,2 +0,0 @@
ALTER TABLE relay ADD COLUMN nip11 TEXT DEFAULT NULL;
ALTER TABLE relay ADD COLUMN last_attempt_nip11 INTEGER DEFAULT NULL;

View File

@ -1 +0,0 @@
DROP TABLE event_relationship;

View File

@ -1,60 +0,0 @@
CREATE TABLE person_new (
pubkey TEXT PRIMARY KEY NOT NULL,
petname TEXT DEFAULT NULL,
followed INTEGER NOT NULL DEFAULT 0,
followed_last_updated INTEGER NOT NULL DEFAULT 0,
muted INTEGER NOT NULL DEFAULT 0,
metadata TEXT DEFAULT NULL,
metadata_created_at INTEGER DEFAULT NULL,
metadata_last_received INTEGER NOT NULL DEFAULT 0,
nip05_valid INTEGER NOT NULL DEFAULT 0,
nip05_last_checked INTEGER DEFAULT NULL,
relay_list_created_at INTEGER DEFAULT NULL,
relay_list_last_received INTEGER NOT NULL DEFAULT 0
) WITHOUT ROWID;
INSERT INTO person_new (
pubkey, petname, followed, followed_last_updated, muted,
metadata, metadata_created_at, metadata_last_received,
nip05_valid, nip05_last_checked,
relay_list_created_at, relay_list_last_received
) SELECT
pubkey, petname, IFNULL(followed,0), followed_last_updated, IFNULL(muted,0),
metadata, IFNULL(metadata_at,0), 0,
IFNULL(nip05_valid,0), nip05_last_checked,
relay_list_created_at, relay_list_last_received
FROM person;
-- SQLite does not update constraints when you rename tables.
-- so we have to do this manually.
CREATE TABLE IF NOT EXISTS "person_relay_new" (
person TEXT NOT NULL,
relay TEXT NOT NULL,
last_fetched INTEGER DEFAULT NULL,
last_suggested_kind3 INTEGER DEFAULT NULL,
last_suggested_nip05 INTEGER DEFAULT NULL,
last_suggested_bytag INTEGER DEFAULT NULL,
read INTEGER NOT NULL DEFAULT 0,
write INTEGER NOT NULL DEFAULT 0,
manually_paired_read INTEGER NOT NULL DEFAULT 0,
manually_paired_write INTEGER NOT NULL DEFAULT 0,
UNIQUE(person, relay),
CONSTRAINT person_relay_fk_person FOREIGN KEY (person) REFERENCES "person_new" (pubkey) ON DELETE CASCADE,
CONSTRAINT person_relay_fk_relay FOREIGN KEY (relay) REFERENCES "relay" (url) ON DELETE CASCADE
);
INSERT INTO person_relay_new
SELECT person, relay, last_fetched, last_suggested_kind3, last_suggested_nip05,
last_suggested_bytag, read, write, manually_paired_read, manually_paired_write
FROM person_relay;
UPDATE person_new SET relay_list_created_at=NULL WHERE relay_list_created_at=0;
ALTER TABLE person RENAME TO person_old;
ALTER TABLE person_relay RENAME TO person_relay_old;
ALTER TABLE person_new RENAME TO person;
ALTER TABLE person_relay_new RENAME TO person_relay;
DROP TABLE person_old;
DROP TABLE person_relay_old;

View File

@ -1,23 +0,0 @@
ALTER TABLE relay ADD COLUMN last_success_at INTEGER DEFAULT NULL;
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE event_tag RENAME TO event_tag_old;
CREATE TABLE event_tag (
event TEXT NOT NULL,
seq INTEGER NOT NULL,
label TEXT DEFAULT NULL,
field0 TEXT DEFAULT NULL,
field1 TEXT DEFAULT NULL,
field2 TEXT DEFAULT NULL,
field3 TEXT DEFAULT NULL,
UNIQUE (event, seq),
CONSTRAINT fk_event
FOREIGN KEY (event) REFERENCES event (id)
ON DELETE CASCADE
);
INSERT OR IGNORE INTO event_tag SELECT * FROM event_tag_old;
COMMIT;
PRAGMA foreign_keys=on;
DROP TABLE event_tag_old;

View File

@ -1,2 +0,0 @@
INSERT INTO settings (key, value) values ('num_relays_per_person', '2');
INSERT INTO settings (key, value) values ('max_relays', '15');

View File

@ -1 +0,0 @@
ALTER TABLE relay ADD COLUMN post INTEGER NOT NULL DEFAULT 0;

View File

@ -1 +0,0 @@
-- This used to have code which has been removed.

View File

@ -1 +0,0 @@
ALTER TABLE person_relay RENAME COLUMN last_suggested_nip35 TO last_suggested_nip05;

View File

@ -1 +0,0 @@
ALTER TABLE person ADD COLUMN followed_last_updated INTEGER NOT NULL DEFAULT 0;

View File

@ -288,17 +288,6 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
ui.add_space(12.0);
ui.separator();
ui.add_space(12.0);
if ui.button("Prune Database")
.on_hover_text("This will delete overridden events, events older than a week, and related data while keeping everything important. It can take MANY MINUTES to complete, and when complete there will be a status message indicating so. Also, because the database will be very busy, best not to use gossip while pruning, just wait.")
.clicked() {
GLOBALS.status_queue.write().write(
"Pruning database, please wait (this takes a long time)...".to_owned()
);
let _ = GLOBALS.to_overlord.send(ToOverlordMessage::PruneDatabase);
}
ui.add_space(12.0);
});
});
});