Skip to content

Commit 3e9dbe5

Browse files
authored
Enable WAL to improve write performance and add db logger (#137)
1 parent ac18821 commit 3e9dbe5

File tree

3 files changed

+98
-3
lines changed

3 files changed

+98
-3
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package repos
2+
3+
import (
4+
"context"
5+
"sync"
6+
"testing"
7+
"time"
8+
9+
"dkhalife.com/tasks/core/internal/models"
10+
"dkhalife.com/tasks/core/internal/utils/test"
11+
"github.com/stretchr/testify/suite"
12+
)
13+
14+
type TaskConcurrencyTestSuite struct {
15+
test.DatabaseTestSuite
16+
repo *TaskRepository
17+
testUser *models.User
18+
}
19+
20+
func TestTaskConcurrencyTestSuite(t *testing.T) {
21+
suite.Run(t, new(TaskConcurrencyTestSuite))
22+
}
23+
24+
func (s *TaskConcurrencyTestSuite) SetupTest() {
25+
s.DatabaseTestSuite.SetupTest()
26+
s.repo = &TaskRepository{db: s.DB}
27+
s.testUser = &models.User{ID: 1, Email: "concurrent@example.com", Password: "pwd", CreatedAt: time.Now()}
28+
s.Require().NoError(s.DB.Create(s.testUser).Error)
29+
}
30+
31+
func (s *TaskConcurrencyTestSuite) TestConcurrentCreateTask() {
32+
ctx := context.Background()
33+
dueDate := time.Now().Add(24 * time.Hour)
34+
35+
wg := sync.WaitGroup{}
36+
errCh := make(chan error, 10)
37+
38+
for i := 0; i < 10; i++ {
39+
wg.Add(1)
40+
go func(title string) {
41+
defer wg.Done()
42+
task := &models.Task{Title: title, CreatedBy: s.testUser.ID, NextDueDate: &dueDate, IsActive: true, Frequency: models.Frequency{Type: models.RepeatOnce}}
43+
_, err := s.repo.CreateTask(ctx, task)
44+
errCh <- err
45+
}("Task" + string(rune('A'+i)))
46+
}
47+
48+
wg.Wait()
49+
close(errCh)
50+
51+
for err := range errCh {
52+
s.NoError(err)
53+
}
54+
}
Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,50 @@
11
package database
22

33
import (
4+
"log"
5+
"os"
6+
"strings"
7+
"time"
8+
49
"dkhalife.com/tasks/core/config"
510
"github.com/glebarez/sqlite"
611
"gorm.io/gorm"
12+
gormLogger "gorm.io/gorm/logger"
713
)
814

915
func NewDatabase(cfg *config.Config) (*gorm.DB, error) {
10-
return gorm.Open(sqlite.Open(cfg.Database.FilePath), &gorm.Config{})
16+
level := gormLogger.Warn
17+
switch strings.ToLower(cfg.Server.LogLevel) {
18+
case "debug", "info":
19+
level = gormLogger.Info
20+
case "warn", "warning":
21+
level = gormLogger.Warn
22+
case "error":
23+
level = gormLogger.Error
24+
case "silent":
25+
level = gormLogger.Silent
26+
}
27+
28+
logger := gormLogger.New(
29+
log.New(os.Stdout, "\r\n", log.LstdFlags),
30+
gormLogger.Config{
31+
SlowThreshold: time.Second,
32+
LogLevel: level,
33+
Colorful: false,
34+
},
35+
)
36+
37+
db, err := gorm.Open(sqlite.Open(cfg.Database.FilePath), &gorm.Config{Logger: logger})
38+
if err != nil {
39+
return nil, err
40+
}
41+
42+
if err := db.Exec("PRAGMA journal_mode=WAL;").Error; err != nil {
43+
return nil, err
44+
}
45+
if err := db.Exec("PRAGMA busy_timeout=5000;").Error; err != nil {
46+
return nil, err
47+
}
48+
49+
return db, nil
1150
}

internal/utils/test/database.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import (
66
"os"
77
"time"
88

9+
"dkhalife.com/tasks/core/config"
10+
dbutil "dkhalife.com/tasks/core/internal/utils/database"
911
"dkhalife.com/tasks/core/internal/utils/migration"
1012
"github.com/stretchr/testify/suite"
11-
"gorm.io/driver/sqlite"
1213
"gorm.io/gorm"
1314
)
1415

@@ -20,7 +21,8 @@ type DatabaseTestSuite struct {
2021

2122
func (suite *DatabaseTestSuite) SetupTest() {
2223
suite.dbFilePath = fmt.Sprintf("%s/testdb_%d.db", os.TempDir(), time.Now().UnixNano())
23-
db, err := gorm.Open(sqlite.Open(suite.dbFilePath), &gorm.Config{})
24+
cfg := &config.Config{Database: config.DatabaseConfig{FilePath: suite.dbFilePath}}
25+
db, err := dbutil.NewDatabase(cfg)
2426
suite.Require().NoError(err)
2527

2628
err = migration.Migration(db)

0 commit comments

Comments
 (0)