mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-29 00:11:01 +00:00
Strip back SQLite startup - don't upgrade anymore, just create the connection
This commit is contained in:
parent
161d9ddbce
commit
ddfc75a238
220
src/db/mod.rs
220
src/db/mod.rs
@ -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"),
|
||||
];
|
||||
|
@ -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;
|
@ -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');
|
@ -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;
|
@ -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';
|
@ -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;
|
@ -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) == '/';
|
@ -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;
|
@ -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;
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE person ADD COLUMN
|
||||
muted INTEGER DEFAULT 0;
|
@ -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';
|
@ -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 '% ';
|
@ -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;
|
||||
|
@ -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');
|
@ -1 +0,0 @@
|
||||
ALTER TABLE person ADD COLUMN contact_list_last_received INTEGER NOT NULL DEFAULT 0;
|
@ -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;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE person_relay DROP COLUMN last_suggested_nip23;
|
@ -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;
|
@ -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';
|
@ -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');
|
@ -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';
|
@ -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);
|
@ -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
|
||||
);
|
@ -1 +0,0 @@
|
||||
ALTER TABLE event_seen RENAME TO event_relay;
|
@ -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)
|
||||
);
|
@ -1 +0,0 @@
|
||||
ALTER TABLE local_settings ADD COLUMN urls_are_normalized INTEGER NOT NULL DEFAULT 0;
|
@ -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;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE relay ADD COLUMN hidden INTEGER DEFAULT 0;
|
@ -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);
|
@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE relay ADD COLUMN nip11 TEXT DEFAULT NULL;
|
||||
ALTER TABLE relay ADD COLUMN last_attempt_nip11 INTEGER DEFAULT NULL;
|
@ -1 +0,0 @@
|
||||
DROP TABLE event_relationship;
|
@ -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;
|
@ -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;
|
@ -1,2 +0,0 @@
|
||||
INSERT INTO settings (key, value) values ('num_relays_per_person', '2');
|
||||
INSERT INTO settings (key, value) values ('max_relays', '15');
|
@ -1 +0,0 @@
|
||||
ALTER TABLE relay ADD COLUMN post INTEGER NOT NULL DEFAULT 0;
|
@ -1 +0,0 @@
|
||||
-- This used to have code which has been removed.
|
@ -1 +0,0 @@
|
||||
ALTER TABLE person_relay RENAME COLUMN last_suggested_nip35 TO last_suggested_nip05;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE person ADD COLUMN followed_last_updated INTEGER NOT NULL DEFAULT 0;
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user