@@ -12,6 +12,8 @@ import (
1212 "time"
1313
1414 "github.com/skip2/go-qrcode"
15+ "gorm.io/driver/sqlite"
16+ "gorm.io/gorm"
1517)
1618
1719// Make unique titles
@@ -114,15 +116,33 @@ func HealthCheck(w http.ResponseWriter, r *http.Request) {
114116 statusCode := http .StatusOK
115117 status , dbStatus := "ok" , "ok"
116118
117- sqlDB , err := db .DB .DB ()
118- if err != nil {
119- statusCode = http .StatusInternalServerError
120- status = "error"
121- dbStatus = "connection_error"
122- } else if err := sqlDB .Ping (); err != nil {
119+ if db .DB == nil {
120+ // DB not initialized
123121 statusCode = http .StatusInternalServerError
124122 status = "error"
125- dbStatus = "unreachable"
123+ dbStatus = "missing_file"
124+ } else {
125+ // Check DB file exists
126+ if _ , err := os .Stat (db .DBPath ); os .IsNotExist (err ) {
127+ statusCode = http .StatusInternalServerError
128+ status = "error"
129+ dbStatus = "missing_file"
130+ } else {
131+ // Open a new connection to check integrity
132+ tmpDB , err := gorm .Open (sqlite .Open (db .DBPath ), & gorm.Config {})
133+ if err != nil {
134+ statusCode = http .StatusInternalServerError
135+ status = "error"
136+ dbStatus = "corrupted"
137+ } else {
138+ var result string
139+ if err := tmpDB .Raw ("PRAGMA quick_check" ).Scan (& result ).Error ; err != nil || result != "ok" {
140+ statusCode = http .StatusInternalServerError
141+ status = "error"
142+ dbStatus = "corrupted"
143+ }
144+ }
145+ }
126146 }
127147
128148 w .Header ().Set ("Content-Type" , "application/json" )
0 commit comments