84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"database/sql"
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	"os"
 | 
						|
	"time"
 | 
						|
 | 
						|
	_ "github.com/mattn/go-sqlite3"
 | 
						|
)
 | 
						|
 | 
						|
type DB struct {
 | 
						|
	Ready     bool
 | 
						|
	path      string
 | 
						|
	readConn  *sql.DB
 | 
						|
	writeConn *sql.DB
 | 
						|
}
 | 
						|
 | 
						|
func (db *DB) Open() error {
 | 
						|
	if db.path == "" {
 | 
						|
		return fmt.Errorf("database path not set")
 | 
						|
	}
 | 
						|
 | 
						|
	file, err := os.Open(db.path)
 | 
						|
	if err != nil {
 | 
						|
		if os.IsNotExist(err) {
 | 
						|
			log.Printf("Database file does not exist at %s, creating", db.path)
 | 
						|
			file, err := os.Create(db.path)
 | 
						|
			if err != nil {
 | 
						|
				return fmt.Errorf("failed to create database file: %v", err)
 | 
						|
			}
 | 
						|
			log.Printf("Database created at %s", db.path)
 | 
						|
			file.Close()
 | 
						|
		} else {
 | 
						|
			return fmt.Errorf("failed to open database file: %v", err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	file.Close()
 | 
						|
 | 
						|
	writeConn, err := sql.Open("sqlite3", db.path+"?_journal=WAL&_synchronous=NORMAL")
 | 
						|
	if err != nil {
 | 
						|
		Error.Printf("%++v", err)
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	writeConn.SetMaxOpenConns(1)
 | 
						|
	writeConn.SetConnMaxIdleTime(30 * time.Second)
 | 
						|
	writeConn.SetConnMaxLifetime(30 * time.Second)
 | 
						|
	db.writeConn = writeConn
 | 
						|
 | 
						|
	readConn, err := sql.Open("sqlite3", db.path+"?mode=ro&_journal=WAL&_synchronous=NORMAL&_mode=ro")
 | 
						|
	if err != nil {
 | 
						|
		Error.Printf("%++v", err)
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	readConn.SetMaxOpenConns(4)
 | 
						|
	readConn.SetConnMaxIdleTime(30 * time.Second)
 | 
						|
	readConn.SetConnMaxLifetime(30 * time.Second)
 | 
						|
	db.readConn = readConn
 | 
						|
 | 
						|
	db.Ready = true
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (db *DB) Init(ddl string) error {
 | 
						|
	if !db.Ready {
 | 
						|
		return fmt.Errorf("database not ready")
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (db *DB) Close() error {
 | 
						|
	err := db.writeConn.Close()
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	err = db.readConn.Close()
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
} |