@@ 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()
}
@@ 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