Skip to content

Commit f3c4ef3

Browse files
committed
Use better logging
1 parent b8b1fe5 commit f3c4ef3

File tree

2 files changed

+50
-39
lines changed

2 files changed

+50
-39
lines changed

examples/chi/main.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"database/sql"
55
"fmt"
66
"log"
7+
"log/slog"
78
"net/http"
89

910
"github.com/go-chi/chi/v5"
@@ -20,7 +21,17 @@ func main() {
2021
if err != nil {
2122
log.Fatalf("Error opening database: %v", err)
2223
}
23-
sh := sqliteadmin.NewHandler(db, "user", "password")
24+
25+
logger := slog.Default()
26+
27+
// Setup the handler for SQLiteAdmin
28+
config := sqliteadmin.Config{
29+
Db: db,
30+
Username: "user",
31+
Password: "password",
32+
Logger: logger,
33+
}
34+
sh := sqliteadmin.NewHandler(config)
2435

2536
r := chi.NewRouter()
2637
r.Use(middleware.Logger)
@@ -35,7 +46,7 @@ func main() {
3546
w.Write([]byte("welcome"))
3647
})
3748
// Setup the handler for SQLiteAdmin
38-
r.Post("/admin", sh.Handle)
49+
r.Post("/admin", sh.HandlePost)
3950

4051
fmt.Printf("--> Starting server on %s\n", addr)
4152
http.ListenAndServe(":8080", r)

queryhandlers.go

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ import (
1212
)
1313

1414
func (h *Handler) ping(w http.ResponseWriter) {
15+
h.logger.Info("Command: Ping")
1516
w.WriteHeader(http.StatusOK)
1617
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
1718
}
1819

1920
func (h *Handler) listTables(w http.ResponseWriter) {
21+
h.logger.Info("Command: ListTables")
2022
rows, err := h.db.Query("SELECT name FROM sqlite_master WHERE type='table';")
2123
if err != nil {
22-
http.Error(w, err.Error(), http.StatusInternalServerError)
24+
h.logger.Error(fmt.Sprintf("Error listing tables: %v", err))
25+
writeError(w, apiErrSomethingWentWrong())
2326
return
2427
}
2528
defer rows.Close()
@@ -28,7 +31,8 @@ func (h *Handler) listTables(w http.ResponseWriter) {
2831
for rows.Next() {
2932
var table string
3033
if err := rows.Scan(&table); err != nil {
31-
http.Error(w, err.Error(), http.StatusInternalServerError)
34+
h.logger.Error(fmt.Sprintf("Error scanning rows: %v", err))
35+
writeError(w, apiErrSomethingWentWrong())
3236
return
3337
}
3438
tables = append(tables, table)
@@ -65,23 +69,24 @@ func (h *Handler) getTable(w http.ResponseWriter, params map[string]interface{})
6569
}
6670
}
6771

72+
h.logger.Info(fmt.Sprintf("Command: GetTable, table=%s, limit=%d, offset=%d", table, limit, offset))
73+
6874
var condition *Condition
6975
conditionParam, ok := params["condition"].(interface{})
7076
if ok {
71-
condition, ok = toCondition(conditionParam)
77+
condition, ok = toCondition(conditionParam, h.logger)
7278
if !ok {
73-
// TODO: use better logging
74-
fmt.Println("Could not convert condition")
79+
writeError(w, apiErrBadRequest("Invalid condition"))
80+
return
7581
}
82+
h.logger.Debug(fmt.Sprintf("Condition provided: %v", condition))
7683
} else {
77-
// TODO: use better logging
78-
fmt.Println("No filters provided")
84+
h.logger.Debug(fmt.Sprintf("No condition provided"))
7985
}
8086

81-
data, err := queryTable(h.db, table, condition, limit, offset)
87+
data, err := queryTable(h.db, table, condition, limit, offset, h.logger)
8288
if err != nil {
83-
// TODO: use better logging
84-
fmt.Printf("Error querying table: %v\n", err)
89+
h.logger.Error(fmt.Sprintf("Error querying table: %v", err))
8590
writeError(w, apiErrSomethingWentWrong())
8691
return
8792
}
@@ -90,13 +95,13 @@ func (h *Handler) getTable(w http.ResponseWriter, params map[string]interface{})
9095
if params["includeInfo"] == true {
9196
tableInfo, err := getTableInfo(h.db, table)
9297
if err != nil {
93-
// TODO: use better logging
94-
fmt.Printf("Error getting table info: %v\n", err)
98+
h.logger.Error(fmt.Sprintf("Error getting table info: %v", err))
9599
writeError(w, apiErrSomethingWentWrong())
96100
return
97101
}
98102
response["tableInfo"] = tableInfo
99103
}
104+
h.logger.Info(fmt.Sprintf("Fetched %d rows", len(data)))
100105

101106
json.NewEncoder(w).Encode(response)
102107
}
@@ -114,27 +119,27 @@ func (h *Handler) deleteRows(w http.ResponseWriter, params map[string]interface{
114119
return
115120
}
116121

122+
h.logger.Info(fmt.Sprintf("Command: DeleteRows, table=%s, ids=%v", table, ids))
123+
117124
exists, err := checkTableExists(h.db, table)
118125
if err != nil {
119-
// TODO: use better logging
120-
fmt.Printf("Error checking table existence: %v\n", err)
126+
h.logger.Error(fmt.Sprintf("Error checking table existence: %v", err))
121127
writeError(w, apiErrSomethingWentWrong())
122128
return
123129
}
124130
if !exists {
125-
// TODO: use better logging
126-
fmt.Printf("Error table does not exist: %s\n", table)
131+
h.logger.Error(fmt.Sprintf("Error table does not exist: %s", table))
127132
writeError(w, apiErrBadRequest(ErrInvalidInput.Error()))
128133
return
129134
}
130135

131136
rowsAffected, err := batchDelete(h.db, table, ids)
132137
if err != nil {
133-
// TODO: use better logging
134-
fmt.Printf("Error deleting rows from table: %v\n", err)
138+
h.logger.Error(fmt.Sprintf("Error deleting rows from table: %v", err))
135139
writeError(w, apiErrSomethingWentWrong())
136140
return
137141
}
142+
h.logger.Info(fmt.Sprintf("Deleted %d row(s)", rowsAffected))
138143

139144
json.NewEncoder(w).Encode(map[string]string{"rowsAffected": fmt.Sprintf("%d", rowsAffected)})
140145
}
@@ -152,13 +157,15 @@ func (h *Handler) updateRow(w http.ResponseWriter, params map[string]interface{}
152157
return
153158
}
154159

160+
h.logger.Info(fmt.Sprintf("Command: UpdateRow, table=%s, row=%v", table, row))
161+
155162
err := editRow(h.db, table, row)
156163
if err != nil {
157-
// TODO: use better logging
158-
fmt.Printf("Error editing row: %v\n", err)
164+
h.logger.Error(fmt.Sprintf("Error editing row: %v", err))
159165
writeError(w, apiErrSomethingWentWrong())
160166
return
161167
}
168+
h.logger.Info("Row updated")
162169

163170
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
164171
}
@@ -174,7 +181,7 @@ func checkTableExists(db *sql.DB, tableName string) (bool, error) {
174181
return exists > 0, nil
175182
}
176183

177-
func queryTable(db *sql.DB, tableName string, condition *Condition, limit int, offset int) ([]map[string]interface{}, error) {
184+
func queryTable(db *sql.DB, tableName string, condition *Condition, limit int, offset int, logger Logger) ([]map[string]interface{}, error) {
178185
// First, verify the table exists to prevent SQL injection
179186
exists, err := checkTableExists(db, tableName)
180187
if err != nil {
@@ -205,18 +212,15 @@ func queryTable(db *sql.DB, tableName string, condition *Condition, limit int, o
205212
// Generate the conditions for the where clause
206213
var conditionQuery string
207214
conditionQuery, args = getCondition(condition)
208-
// TODO: use better logging
209-
fmt.Printf("Query: %s\n", conditionQuery)
210-
// TODO: use better logging
211-
fmt.Printf("Args: %v\n", args)
215+
logger.Debug(fmt.Sprintf("ConditionQuery: %s", conditionQuery))
216+
logger.Debug(fmt.Sprintf("Args: %v", args))
212217
query += conditionQuery
213218
query += fmt.Sprintf(" LIMIT %d", limit)
214219
} else {
215220
query = fmt.Sprintf("SELECT * FROM %q LIMIT %d OFFSET %d", tableName, limit, offset)
216221
}
217222

218-
// TODO: use better logging
219-
fmt.Printf("About to perform query: `%s`\n", query)
223+
logger.Info(fmt.Sprintf("About to perform query: `%s`", query))
220224

221225
// Now perform the actual query
222226
rows, err = db.Query(query, args...)
@@ -505,7 +509,7 @@ func convertToStrSlice(val interface{}) ([]any, bool) {
505509
return result, true
506510
}
507511

508-
func toCondition(val interface{}) (*Condition, bool) {
512+
func toCondition(val interface{}, logger Logger) (*Condition, bool) {
509513
// Check if val is a map
510514
valMap, ok := val.(map[string]interface{})
511515
if !ok {
@@ -518,32 +522,28 @@ func toCondition(val interface{}) (*Condition, bool) {
518522
if valMap["cases"] != nil {
519523
cases, ok := valMap["cases"].([]interface{})
520524
if !ok {
521-
// TODO: use better logging
522-
fmt.Println("Cases is not an array")
525+
logger.Debug("Cases is not an array")
523526
return nil, false
524527
}
525528
for _, c := range cases {
526529
caseMap, ok := c.(map[string]interface{})
527530
if !ok {
528-
// TODO: use better logging
529-
fmt.Println("Case is not a map")
531+
logger.Debug("Case is not a map")
530532
return nil, false
531533
}
532534
// If the logicalOperator field exists then it is a Sub-Condition
533535
if caseMap["logicalOperator"] != nil {
534-
subCondition, ok := toCondition(caseMap)
536+
subCondition, ok := toCondition(caseMap, logger)
535537
if !ok {
536-
// TODO: use better logging
537-
fmt.Println("Could not convert sub-condition")
538+
logger.Debug("Could not convert sub-condition")
538539
return nil, false
539540
}
540541
condition.Cases = append(condition.Cases, *subCondition)
541542
} else {
542543
filter := Filter{}
543544
err := mapstructure.Decode(c, &filter)
544545
if err != nil {
545-
// TODO: use better logging
546-
fmt.Printf("Error decoding filter: %v\n", err)
546+
logger.Error(fmt.Sprintf("Error decoding filter: %v", err))
547547
return nil, false
548548
}
549549
condition.Cases = append(condition.Cases, filter)

0 commit comments

Comments
 (0)