feat: cgo free sqlite
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user