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 {
log . Fatal ( err )
}
}
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 , "alter table honks add column onts text" )
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 , "update honks set onts = ''" )
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 )
}
stmtHonk , err := tx . Prepare ( "update honks set onts = ? where honkid = ?" )
if err != nil {
log . Fatal ( err )
}
stmtOnts , err := tx . Prepare ( "insert into onts (ontology, honkid) values (?, ?)" )
if err != nil {
log . Fatal ( err )
}
for honkid , onts := range ontmap {
_ , err = stmtHonk . Exec ( strings . Join ( onts , " " ) , honkid )
if err != nil {
log . Fatal ( err )
}
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-04-14 22:43:03 +02:00
default :
log . Fatalf ( "can't upgrade unknown version %d" , dbversion )
}
os . Exit ( 0 )
}