2019-04-14 22:43:03 +02:00
//
// Copyright (c) 2019 Ted Unangst <tedu@tedunangst.com>
//
// Permission to use, copy, modify, and distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package main
import (
2019-04-15 03:35:42 +02:00
"database/sql"
2019-05-20 16:48:02 +02:00
"fmt"
2019-04-14 22:43:03 +02:00
"log"
"os"
2019-08-28 17:51:44 +02:00
"regexp"
2019-08-25 05:03:05 +02:00
"strings"
2019-04-14 22:43:03 +02:00
)
2019-05-20 16:48:02 +02:00
func doordie ( db * sql . DB , s string , args ... interface { } ) {
_ , err := db . Exec ( s , args ... )
2019-04-15 03:35:42 +02:00
if err != nil {
2019-10-02 23:10:01 +02:00
log . Fatalf ( "can't run %s: %s" , s , err )
2019-04-15 03:35:42 +02:00
}
}
2019-04-14 22:43:03 +02:00
func upgradedb ( ) {
db := opendatabase ( )
dbversion := 0
getconfig ( "dbversion" , & dbversion )
2019-05-20 16:48:02 +02:00
getconfig ( "servername" , & serverName )
2019-04-14 22:43:03 +02:00
switch dbversion {
case 0 :
2019-04-15 03:35:42 +02:00
doordie ( db , "insert into config (key, value) values ('dbversion', 1)" )
2019-04-14 22:43:03 +02:00
fallthrough
case 1 :
2019-04-15 03:35:42 +02:00
doordie ( db , "create table doovers(dooverid integer primary key, dt text, tries integer, username text, rcpt text, msg blob)" )
doordie ( db , "update config set value = 2 where key = 'dbversion'" )
fallthrough
case 2 :
2019-04-19 17:08:22 +02:00
doordie ( db , "alter table honks add column convoy text" )
doordie ( db , "update honks set convoy = ''" )
doordie ( db , "create index idx_honksconvoy on honks(convoy)" )
doordie ( db , "create table xonkers (xonkerid integer primary key, xid text, ibox text, obox text, sbox text, pubkey text)" )
doordie ( db , "insert into xonkers (xid, ibox, obox, sbox, pubkey) select xid, '', '', '', pubkey from honkers where flavor = 'key'" )
doordie ( db , "delete from honkers where flavor = 'key'" )
doordie ( db , "create index idx_xonkerxid on xonkers(xid)" )
2019-04-20 04:34:39 +02:00
doordie ( db , "create table zonkers (zonkerid integer primary key, userid integer, name text, wherefore text)" )
2019-04-19 17:08:22 +02:00
doordie ( db , "create index idx_zonkersname on zonkers(name)" )
doordie ( db , "update config set value = 3 where key = 'dbversion'" )
fallthrough
case 3 :
2019-04-20 17:17:00 +02:00
doordie ( db , "alter table honks add column whofore integer" )
doordie ( db , "update honks set whofore = 0" )
doordie ( db , "update honks set whofore = 1 where honkid in (select honkid from honks join users on honks.userid = users.userid where instr(audience, username) > 0)" )
doordie ( db , "update config set value = 4 where key = 'dbversion'" )
fallthrough
case 4 :
2019-04-22 23:03:55 +02:00
doordie ( db , "alter table honkers add column combos text" )
doordie ( db , "update honkers set combos = ''" )
doordie ( db , "update config set value = 5 where key = 'dbversion'" )
fallthrough
case 5 :
2019-05-06 16:43:00 +02:00
doordie ( db , "delete from donks where honkid in (select honkid from honks where what = 'zonk')" )
2019-05-03 19:42:39 +02:00
doordie ( db , "delete from honks where what = 'zonk'" )
doordie ( db , "update config set value = 6 where key = 'dbversion'" )
fallthrough
case 6 :
2019-05-15 22:27:50 +02:00
doordie ( db , "alter table honks add column format" )
doordie ( db , "update honks set format = 'html'" )
doordie ( db , "alter table honks add column precis" )
doordie ( db , "update honks set precis = ''" )
doordie ( db , "alter table honks add column oonker" )
doordie ( db , "update honks set oonker = ''" )
doordie ( db , "update config set value = 7 where key = 'dbversion'" )
fallthrough
case 7 :
2019-05-20 16:48:02 +02:00
users := allusers ( )
for _ , u := range users {
h := fmt . Sprintf ( "https://%s/u/%s" , serverName , u . Username )
2019-05-20 17:56:07 +02:00
doordie ( db , fmt . Sprintf ( "update honks set xid = '%s/h/' || xid, honker = ?, whofore = 2 where userid = ? and honker = '' and (what = 'honk' or what = 'tonk')" , h ) , h , u . UserID )
2019-05-20 16:48:02 +02:00
doordie ( db , "update honks set honker = ?, whofore = 2 where userid = ? and honker = '' and what = 'bonk'" , h , u . UserID )
}
doordie ( db , "update config set value = 8 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-05-20 16:48:02 +02:00
case 8 :
2019-05-25 19:34:41 +02:00
doordie ( db , "alter table files add column local integer" )
doordie ( db , "update files set local = 1" )
doordie ( db , "update config set value = 9 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-05-25 19:34:41 +02:00
case 9 :
2019-06-03 06:15:06 +02:00
doordie ( db , "drop table xonkers" )
doordie ( db , "create table xonkers (xonkerid integer primary key, name text, info text, flavor text)" )
doordie ( db , "create index idx_xonkername on xonkers(name)" )
doordie ( db , "update config set value = 10 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-06-03 06:15:06 +02:00
case 10 :
2019-06-24 04:21:59 +02:00
doordie ( db , "update zonkers set wherefore = 'zomain' where wherefore = 'zurl'" )
doordie ( db , "update zonkers set wherefore = 'zord' where wherefore = 'zword'" )
doordie ( db , "update config set value = 11 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-06-24 04:21:59 +02:00
case 11 :
2019-06-28 04:15:59 +02:00
doordie ( db , "alter table users add column options text" )
doordie ( db , "update users set options = ''" )
doordie ( db , "update config set value = 12 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-06-28 05:19:22 +02:00
case 12 :
2019-07-10 05:45:50 +02:00
doordie ( db , "create index idx_honksoonker on honks(oonker)" )
doordie ( db , "update config set value = 13 where key = 'dbversion'" )
2019-07-25 15:53:53 +02:00
fallthrough
2019-07-10 05:45:50 +02:00
case 13 :
2019-08-16 21:13:33 +02:00
doordie ( db , "alter table honks add column flags integer" )
doordie ( db , "update honks set flags = 0" )
doordie ( db , "update config set value = 14 where key = 'dbversion'" )
fallthrough
case 14 :
2019-08-25 05:03:05 +02:00
doordie ( db , "create table onts (ontology text, honkid integer)" )
doordie ( db , "create index idx_ontology on onts(ontology)" )
2019-08-28 17:51:44 +02:00
doordie ( db , "update config set value = 15 where key = 'dbversion'" )
fallthrough
case 15 :
doordie ( db , "delete from onts" )
2019-08-25 05:03:05 +02:00
ontmap := make ( map [ int64 ] [ ] string )
rows , err := db . Query ( "select honkid, noise from honks" )
if err != nil {
log . Fatalf ( "can't query honks: %s" , err )
}
2019-08-28 17:51:44 +02:00
re_more := regexp . MustCompile ( ` #<span>[[:alpha:]][[:alnum:]-]* ` )
2019-08-25 05:03:05 +02:00
for rows . Next ( ) {
var honkid int64
var noise string
err := rows . Scan ( & honkid , & noise )
if err != nil {
log . Fatalf ( "can't scan honks: %s" , err )
}
2019-08-28 17:51:44 +02:00
onts := ontologies ( noise )
mo := re_more . FindAllString ( noise , - 1 )
for _ , o := range mo {
2019-08-28 18:07:46 +02:00
onts = append ( onts , "#" + o [ 7 : ] )
2019-08-28 17:51:44 +02:00
}
if len ( onts ) > 0 {
ontmap [ honkid ] = oneofakind ( onts )
2019-08-25 05:03:05 +02:00
}
}
rows . Close ( )
tx , err := db . Begin ( )
if err != nil {
log . Fatalf ( "can't begin: %s" , err )
}
stmtOnts , err := tx . Prepare ( "insert into onts (ontology, honkid) values (?, ?)" )
if err != nil {
log . Fatal ( err )
}
for honkid , onts := range ontmap {
for _ , o := range onts {
_ , err = stmtOnts . Exec ( strings . ToLower ( o ) , honkid )
if err != nil {
log . Fatal ( err )
}
}
}
err = tx . Commit ( )
if err != nil {
log . Fatalf ( "can't commit: %s" , err )
}
2019-08-28 17:51:44 +02:00
doordie ( db , "update config set value = 16 where key = 'dbversion'" )
2019-08-25 05:03:05 +02:00
fallthrough
2019-08-28 17:51:44 +02:00
case 16 :
2019-09-09 15:55:04 +02:00
doordie ( db , "alter table files add column description text" )
doordie ( db , "update files set description = name" )
doordie ( db , "update config set value = 17 where key = 'dbversion'" )
fallthrough
case 17 :
2019-09-17 00:01:56 +02:00
doordie ( db , "create table forsaken (honkid integer, precis text, noise text)" )
2019-09-17 00:00:13 +02:00
doordie ( db , "update config set value = 18 where key = 'dbversion'" )
fallthrough
case 18 :
2019-09-22 23:00:14 +02:00
doordie ( db , "create index idx_onthonkid on onts(honkid)" )
doordie ( db , "update config set value = 19 where key = 'dbversion'" )
2019-09-30 03:40:37 +02:00
fallthrough
2019-09-22 23:00:14 +02:00
case 19 :
2019-09-28 06:12:50 +02:00
doordie ( db , "create table places (honkid integer, name text, latitude real, longitude real)" )
doordie ( db , "create index idx_placehonkid on places(honkid)" )
2019-09-30 03:40:37 +02:00
fallthrough
2019-09-28 06:12:50 +02:00
case 20 :
2019-09-29 22:07:35 +02:00
doordie ( db , "alter table places add column url text" )
doordie ( db , "update places set url = ''" )
doordie ( db , "update config set value = 21 where key = 'dbversion'" )
2019-09-30 03:40:37 +02:00
fallthrough
2019-09-29 22:07:35 +02:00
case 21 :
2019-09-30 03:40:37 +02:00
// here we go...
initblobdb ( )
blobdb , err := sql . Open ( "sqlite3" , blobdbname )
if err != nil {
log . Fatal ( err )
}
tx , err := blobdb . Begin ( )
if err != nil {
log . Fatalf ( "can't begin: %s" , err )
}
doordie ( db , "drop index idx_filesxid" )
doordie ( db , "drop index idx_filesurl" )
doordie ( db , "create table filemeta (fileid integer primary key, xid text, name text, description text, url text, media text, local integer)" )
doordie ( db , "insert into filemeta select fileid, xid, name, description, url, media, local from files" )
doordie ( db , "create index idx_filesxid on filemeta(xid)" )
doordie ( db , "create index idx_filesurl on filemeta(url)" )
2019-09-30 22:42:59 +02:00
rows , err := db . Query ( "select xid, media, content from files where local = 1" )
2019-09-30 03:40:37 +02:00
if err != nil {
log . Fatal ( err )
}
for rows . Next ( ) {
var xid , media string
var data [ ] byte
err = rows . Scan ( & xid , & media , & data )
2019-10-04 22:30:33 +02:00
if err == nil {
_ , err = tx . Exec ( "insert into filedata (xid, media, content) values (?, ?, ?)" , xid , media , data )
2019-09-30 03:40:37 +02:00
}
if err != nil {
2019-10-04 22:30:33 +02:00
log . Fatalf ( "can't save filedata: %s" , err )
2019-09-30 03:40:37 +02:00
}
}
rows . Close ( )
err = tx . Commit ( )
if err != nil {
log . Fatalf ( "can't commit: %s" , err )
}
doordie ( db , "drop table files" )
doordie ( db , "vacuum" )
doordie ( db , "update config set value = 22 where key = 'dbversion'" )
fallthrough
case 22 :
2019-10-02 23:10:01 +02:00
doordie ( db , "create table honkmeta (honkid integer, genus text, json text)" )
doordie ( db , "create index idx_honkmetaid on honkmeta(honkid)" )
doordie ( db , "drop table forsaken" ) // don't bother saving this one
rows , err := db . Query ( "select honkid, name, latitude, longitude, url from places" )
if err != nil {
log . Fatal ( err )
}
places := make ( map [ int64 ] * Place )
for rows . Next ( ) {
var honkid int64
p := new ( Place )
err = rows . Scan ( & honkid , & p . Name , & p . Latitude , & p . Longitude , & p . Url )
if err != nil {
log . Fatal ( err )
}
places [ honkid ] = p
}
rows . Close ( )
tx , err := db . Begin ( )
if err != nil {
log . Fatalf ( "can't begin: %s" , err )
}
for honkid , p := range places {
j , err := jsonify ( p )
2019-10-04 22:30:33 +02:00
if err == nil {
_ , err = tx . Exec ( "insert into honkmeta (honkid, genus, json) values (?, ?, ?)" ,
honkid , "place" , j )
}
2019-10-02 23:10:01 +02:00
if err != nil {
log . Fatal ( err )
}
}
err = tx . Commit ( )
if err != nil {
log . Fatalf ( "can't commit: %s" , err )
}
doordie ( db , "update config set value = 23 where key = 'dbversion'" )
fallthrough
case 23 :
2019-10-04 22:30:33 +02:00
doordie ( db , "create table hfcs (hfcsid integer primary key, userid integer, json text)" )
doordie ( db , "create index idx_hfcsuser on hfcs(userid)" )
rows , err := db . Query ( "select userid, name, wherefore from zonkers where wherefore in ('zord', 'zilence', 'zoggle', 'zonker', 'zomain')" )
if err != nil {
log . Fatalf ( "can't query zonkers: %s" , err )
}
filtmap := make ( map [ int64 ] [ ] * Filter )
for rows . Next ( ) {
var userid int64
var name , wherefore string
err = rows . Scan ( & userid , & name , & wherefore )
if err != nil {
2019-10-06 20:57:06 +02:00
log . Fatalf ( "error scanning zonker: %s" , err )
2019-10-04 22:30:33 +02:00
}
f := new ( Filter )
switch wherefore {
case "zord" :
f . Text = name
f . Hide = true
case "zilence" :
f . Text = name
f . Collapse = true
case "zoggle" :
f . Actor = name
f . SkipMedia = true
case "zonker" :
f . Actor = name
f . IncludeAudience = true
f . Reject = true
case "zomain" :
f . Actor = name
f . IncludeAudience = true
f . Reject = true
}
filtmap [ userid ] = append ( filtmap [ userid ] , f )
}
rows . Close ( )
tx , err := db . Begin ( )
if err != nil {
log . Fatalf ( "can't begin: %s" , err )
}
for userid , filts := range filtmap {
for _ , f := range filts {
j , err := jsonify ( f )
if err == nil {
_ , err = tx . Exec ( "insert into hfcs (userid, json) values (?, ?)" , userid , j )
}
if err != nil {
log . Fatalf ( "can't save filter: %s" , err )
}
}
}
err = tx . Commit ( )
if err != nil {
log . Fatalf ( "can't commit: %s" , err )
}
doordie ( db , "delete from zonkers where wherefore in ('zord', 'zilence', 'zoggle', 'zonker', 'zomain')" )
doordie ( db , "update config set value = 24 where key = 'dbversion'" )
fallthrough
case 24 :
2019-10-02 23:10:01 +02:00
2019-04-14 22:43:03 +02:00
default :
log . Fatalf ( "can't upgrade unknown version %d" , dbversion )
}
os . Exit ( 0 )
}