# HG changeset patch # User Ted Unangst # Date 1712061588 14400 # Tue Apr 02 08:39:48 2024 -0400 # Node ID 633c76d8ca94d102452ff27162f4721fdfbb1b66 # Parent cdcafa1ff99f5851b810b9f5c4c0bf991ff0cf76 fix backup to work with various data stores diff --git a/backupdb.go b/backupdb.go --- a/backupdb.go +++ b/backupdb.go @@ -178,35 +178,48 @@ if err != nil { elog.Fatalf("can't commit backp: %s", err) } + tx = nil backup.Close() - backupblobname := fmt.Sprintf("%s/blob-%d.db", dirname, now) - blob, err := sql.Open("sqlite3", backupblobname) - if err != nil { - elog.Fatalf("can't open backup blob database") + var blob *sql.DB + if storeTheFilesInTheFileSystem { + filesavepath = fmt.Sprintf("%s/attachments-%d", dirname, now) + os.Mkdir(filesavepath, 0700) + filesavepath += "/" + } else { + backupblobname := fmt.Sprintf("%s/blob-%d.db", dirname, now) + blob, err = sql.Open("sqlite3", backupblobname) + if err != nil { + elog.Fatalf("can't open backup blob database") + } + _, err = blob.Exec("PRAGMA journal_mode=WAL") + doordie(blob, "create table filedata (xid text, content blob)") + doordie(blob, "create index idx_filexid on filedata(xid)") + tx, err = blob.Begin() + if err != nil { + elog.Fatalf("can't start transaction: %s", err) + } + stmtSaveBlobData, err = tx.Prepare("insert into filedata (xid, content) values (?, ?)") + checkErr(err) } - _, err = blob.Exec("PRAGMA journal_mode=WAL") - doordie(blob, "create table filedata (xid text, content blob)") - doordie(blob, "create index idx_filexid on filedata(xid)") - tx, err = blob.Begin() - if err != nil { - elog.Fatalf("can't start transaction: %s", err) - } - origblob := openblobdb() - for x := range filexids { - rows = qordie(origblob, "select xid, content from filedata where xid = ?", x) - for rows.Next() { - var xid string - var content sql.RawBytes - scanordie(rows, &xid, &content) - doordie(tx, "insert into filedata (xid, content) values (?, ?)", xid, content) + for xid := range filexids { + data, closer, err := loaddata(xid) + if err != nil { + elog.Printf("lost a file: %s", xid) + continue } - rows.Close() + err = savefiledata(xid, data) + if err != nil { + elog.Printf("failed to save file %s: %s", xid, err) + } + closer() } - err = tx.Commit() - if err != nil { - elog.Fatalf("can't commit blobs: %s", err) + if blob != nil { + err = tx.Commit() + if err != nil { + elog.Fatalf("can't commit blobs: %s", err) + } + blob.Close() } - blob.Close() } diff --git a/filestoragemanagerfactory.go b/filestoragemanagerfactory.go --- a/filestoragemanagerfactory.go +++ b/filestoragemanagerfactory.go @@ -50,17 +50,17 @@ return fileid, err } +var filesavepath = "" // used to redirect backups + func savefiledata(xid string, data []byte) error { if storeTheFilesInTheFileSystem { fname := filepath(xid) + if filesavepath != "" { + fname = filesavepath + fname[14:] + } os.Mkdir(fname[:strings.LastIndexByte(fname, '/')], 0700) - fd, err := os.Create(fname) - if err != nil { - return err - } - defer fd.Close() - fd.Write(data) - return nil + err := os.WriteFile(fname, data, 0700) + return err } else { _, err := stmtSaveBlobData.Exec(xid, data) return err