-
Notifications
You must be signed in to change notification settings - Fork 384
/
db_state_keeper.go
95 lines (72 loc) · 2.51 KB
/
db_state_keeper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package messengerdb
import (
"go.uber.org/zap"
"gorm.io/gorm"
"berty.tech/berty/v2/go/pkg/messengertypes"
)
func keepDisplayName(db *gorm.DB, logger *zap.Logger) string {
return keepAccountStringField(db, "display_name", logger)
}
func keepAccountBoolField(db *gorm.DB, flagName string, defaultValue bool, logger *zap.Logger) bool {
if logger == nil {
logger = zap.NewNop()
}
result := int64(0)
count := int64(0)
if err := db.Table("accounts").Count(&count).Order("ROWID").Limit(1).Pluck(flagName, &result).Error; err == nil {
if count != 1 {
logger.Warn("expected one result", zap.Int64("count", count))
}
if count > 0 {
return result != 0
}
} else {
logger.Warn("attempt at retrieving value failed", zap.Error(err))
}
logger.Warn("nothing found returning a default value")
return defaultValue
}
func keepAutoReplicateFlag(db *gorm.DB, logger *zap.Logger) bool {
return keepAccountBoolField(db, "replicate_new_groups_automatically", true, logger)
}
func keepConversationsLocalData(db *gorm.DB, logger *zap.Logger) []*messengertypes.LocalConversationState {
if logger == nil {
logger = zap.NewNop()
}
result := []*messengertypes.LocalConversationState{}
err := db.Table("conversations").Scan(&result).Error
if err == nil {
return result
}
logger.Warn("attempt at retrieving conversation information", zap.Error(err))
return nil
}
func keepAccountStringField(db *gorm.DB, field string, logger *zap.Logger) string {
if logger == nil {
logger = zap.NewNop()
}
result := ""
count := int64(0)
if err := db.Table("accounts").Count(&count).Order("ROWID").Limit(1).Pluck(field, &result).Error; err == nil {
if count != 1 {
logger.Warn("expected one result", zap.Int64("count", count))
}
if result != "" && count > 0 {
return result
}
} else {
logger.Warn("attempt at retrieving field failed", zap.String("field-name", field), zap.Error(err))
}
logger.Warn("nothing found returning an empty value")
return ""
}
func keepDatabaseLocalState(db *gorm.DB, logger *zap.Logger) *messengertypes.LocalDatabaseState {
return &messengertypes.LocalDatabaseState{
PublicKey: keepAccountStringField(db, "public_key", logger),
DisplayName: keepDisplayName(db, logger),
ReplicateFlag: keepAutoReplicateFlag(db, logger),
LocalConversationsState: keepConversationsLocalData(db, logger),
AccountLink: keepAccountStringField(db, "link", logger),
AutoSharePushTokenFlag: keepAccountBoolField(db, "auto_share_push_token_flag", true, logger),
}
}