feat: cgo free sqlite

This commit is contained in:
2025-03-14 23:24:45 +07:00
parent c1e59e3bb8
commit 1e0f2b7f4a
6 changed files with 80 additions and 17 deletions

View File

@@ -2,12 +2,17 @@ package database
import (
"app/internal/dal"
"context"
"github.com/ncruces/go-sqlite3/driver"
"log"
"log/slog"
"os"
"sync"
"time"
"gorm.io/driver/sqlite"
_ "github.com/ncruces/go-sqlite3/embed"
"github.com/ncruces/go-sqlite3/ext/unicode"
"github.com/ncruces/go-sqlite3/gormlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
@@ -31,13 +36,14 @@ func initialize() error {
Colorful: true, // Disable color
},
)
db, err = gorm.Open(sqlite.Open("file:"+Path+"?_fk=1"), &gorm.Config{
db, err = gorm.Open(gormlite.Open("file:"+Path+"?_fk=1"), &gorm.Config{
Logger: newLogger,
FullSaveAssociations: false,
})
if err != nil {
return err
}
RegisterUnicodeExtension(db)
if res := db.Exec(`PRAGMA foreign_keys = ON`); res.Error != nil {
return res.Error
}
@@ -85,3 +91,49 @@ func GetInstance() *gorm.DB {
})
return db
}
func RegisterUnicodeExtension(db *gorm.DB) {
sqlDB, err := db.DB()
if err != nil {
panic(err)
}
ctx := context.Background()
conn, err := sqlDB.Conn(ctx)
if err != nil {
panic(err)
}
defer conn.Close()
err = conn.Raw(func(driverConn any) error {
c := driverConn.(driver.Conn)
sqliteConn := c.Raw()
if err := unicode.Register(sqliteConn); err != nil {
return err
}
if err := sqliteConn.Exec(`SELECT icu_load_collation('ru-RU', 'russian')`); err != nil {
return err
}
if err := sqliteConn.Exec(`SELECT icu_load_collation('en-US', 'english')`); err != nil {
return err
}
stmt, _, err := sqliteConn.Prepare(`SELECT 'ы' LIKE 'Ы'`)
if err != nil {
return err
}
defer stmt.Close()
if stmt.Step() {
slog.Info("ICU test result", "value", stmt.ColumnBool(0))
}
return stmt.Err()
})
if err != nil {
panic(err)
}
}