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-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-10-08 07:31:37 +02:00
|
|
|
"time"
|
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
|
|
|
|
2019-10-07 01:00:03 +02:00
|
|
|
if dbversion < 13 {
|
|
|
|
log.Fatal("database is too old to upgrade")
|
|
|
|
}
|
2019-04-14 22:43:03 +02:00
|
|
|
switch dbversion {
|
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)
|
2019-10-08 07:31:37 +02:00
|
|
|
now := time.Now().UTC()
|
2019-10-04 22:30:33 +02:00
|
|
|
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)
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Date = now
|
2019-10-04 22:30:33 +02:00
|
|
|
switch wherefore {
|
|
|
|
case "zord":
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Name = "hide " + name
|
2019-10-04 22:30:33 +02:00
|
|
|
f.Text = name
|
|
|
|
f.Hide = true
|
|
|
|
case "zilence":
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Name = "silence " + name
|
2019-10-04 22:30:33 +02:00
|
|
|
f.Text = name
|
|
|
|
f.Collapse = true
|
|
|
|
case "zoggle":
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Name = "skip " + name
|
2019-10-04 22:30:33 +02:00
|
|
|
f.Actor = name
|
|
|
|
f.SkipMedia = true
|
|
|
|
case "zonker":
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Name = "reject " + name
|
2019-10-04 22:30:33 +02:00
|
|
|
f.Actor = name
|
|
|
|
f.IncludeAudience = true
|
|
|
|
f.Reject = true
|
|
|
|
case "zomain":
|
2019-10-08 07:31:37 +02:00
|
|
|
f.Name = "reject " + name
|
2019-10-04 22:30:33 +02:00
|
|
|
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-13 05:36:43 +02:00
|
|
|
doordie(db, "update honks set convoy = 'missing-' || abs(random() % 987654321) where convoy = ''")
|
|
|
|
doordie(db, "update config set value = 25 where key = 'dbversion'")
|
|
|
|
fallthrough
|
|
|
|
case 25:
|
2019-04-14 22:43:03 +02:00
|
|
|
default:
|
|
|
|
log.Fatalf("can't upgrade unknown version %d", dbversion)
|
|
|
|
}
|
|
|
|
os.Exit(0)
|
|
|
|
}
|