633c76d8ca94 — Ted Unangst a month ago
fix backup to work with various data stores
2 files changed, 44 insertions(+), 31 deletions(-)

M backupdb.go
M filestoragemanagerfactory.go
M backupdb.go +37 -24
@@ 178,35 178,48 @@ func svalbard(dirname string) {
 	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()
 }

          
M filestoragemanagerfactory.go +7 -7
@@ 50,17 50,17 @@ func savefile(name string, desc string, 
 	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