PiwigoDirectoryUploader/internal/app/datastore.go

135 lines
2.8 KiB
Go

package app
import (
"database/sql"
"errors"
_ "github.com/mattn/go-sqlite3"
"log"
"time"
)
type ImageMetaData struct {
ImageId int
PiwigoId int
RelativeImagePath string
Filename string
Md5Sum string
LastChange time.Time
CategoryPath string
CategoryId int
}
type ImageMetadataLoader interface {
GetImageMetadata(relativePath string) (ImageMetaData, error)
}
type ImageMetadataSaver interface {
SaveImageMetadata(m ImageMetaData) error
}
type localDataStore struct {
connectionString string
}
func (d *localDataStore) Initialize(connectionString string) error {
if connectionString == "" {
return errors.New("connection string could not be empty.")
}
d.connectionString = connectionString
db, err := d.openDatabase()
if err != nil {
return err
}
defer db.Close()
err = d.createTablesIfNeeded(db)
return err
}
func (d *localDataStore) GetImageMetadata(relativePath string) (ImageMetaData, error) {
db, err := d.openDatabase()
if err != nil {
return ImageMetaData{}, err
}
defer db.Close()
tx, err := db.Begin()
if err != nil {
return ImageMetaData{}, err
}
//TODO: select entry by path
//stmt, err := tx.Prepare("select * from image WHERE relativePath = '?'")
//if err != nil {
// log.Fatal(err)
//}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
return ImageMetaData{}, nil
}
func (d *localDataStore) SaveImageMetadata(m ImageMetaData) error {
db, err := d.openDatabase()
if err != nil {
return err
}
defer db.Close()
tx, err := db.Begin()
if err != nil {
return err
}
if m.ImageId <= 0 {
err = d.insertImageMetaData(tx, m)
if err != nil {
return err
}
} else {
// TODO: update existing entry
}
err = tx.Commit()
return err
}
func (d *localDataStore) insertImageMetaData(tx *sql.Tx, m ImageMetaData) error {
stmt, err := tx.Prepare("INSERT INTO image (piwigoId, relativePath, fileName, md5sum, lastChanged, categoryPath, categoryId) VALUES (?,?,?,?,?,?,?)")
if err != nil {
return err
}
_, err = stmt.Exec(m.PiwigoId, m.RelativeImagePath, m.Filename, m.Md5Sum, m.LastChange, m.CategoryPath, m.CategoryId)
return err
}
func (d *localDataStore) openDatabase() (*sql.DB, error) {
db, err := sql.Open("sqlite3", d.connectionString)
if err != nil {
return nil, err
}
db.SetMaxOpenConns(1)
return db, err
}
func (d *localDataStore) createTablesIfNeeded(db *sql.DB) error {
_, err := db.Exec("CREATE TABLE IF NOT EXISTS image (" +
"imageId INTEGER PRIMARY KEY AUTOINCREMENT," +
"piwigoId INTEGER NULL," +
"relativePath NVARCHAR(1000) NOT NULL," +
"fileName NVARCHAR(255) NOT NULL," +
"md5sum NVARCHAR(50) NOT NULL," +
"lastChanged DATETIME NOT NULL," +
"categoryPath NVARCHAR(1000) NOT NULL," +
"categoryId INTEGER NULL" +
");")
return err
}