commit e09bb70470bd81231722e39c5ff71cae0499797e
parent 649ec1abdc4c9af4f0a43cfbf0df833d825ba57e
Author: breadcat <breadcat@users.noreply.github.com>
Date: Tue, 7 Apr 2026 11:31:54 +0100
Add extra logging, preventing silent failures
Diffstat:
10 files changed, 102 insertions(+), 27 deletions(-)
diff --git a/include-admin-orphans.go b/include-admin-orphans.go
@@ -1,6 +1,7 @@
package main
import (
+ "log"
"net/http"
"os"
)
@@ -44,6 +45,7 @@ func getOrphanedFiles(uploadDir string) (OrphanData, error) {
func orphansHandler(w http.ResponseWriter, r *http.Request) {
orphanData, err := getOrphanedFiles(config.UploadDir)
if err != nil {
+ log.Printf("Error: orphansHandler: failed to read orphaned files: %v", err)
renderError(w, "Error reading orphaned files", http.StatusInternalServerError)
return
}
diff --git a/include-admin-thumbnails.go b/include-admin-thumbnails.go
@@ -2,6 +2,7 @@ package main
import (
"fmt"
+ "log"
"net/http"
"net/url"
"os"
@@ -42,6 +43,7 @@ func getVideoFiles() ([]VideoFile, error) {
for rows.Next() {
var v VideoFile
if err := rows.Scan(&v.ID, &v.Filename, &v.Path); err != nil {
+ log.Printf("Warning: getVideoFiles: failed to scan row: %v", err)
continue
}
@@ -78,12 +80,14 @@ func getVideoFiles() ([]VideoFile, error) {
func thumbnailsHandler(w http.ResponseWriter, r *http.Request) {
allVideos, err := getVideoFiles()
if err != nil {
+ log.Printf("Error: thumbnailsHandler: failed to get video files: %v", err)
renderError(w, "Failed to get video files: "+err.Error(), http.StatusInternalServerError)
return
}
missing, err := getMissingThumbnailVideos()
if err != nil {
+ log.Printf("Error: thumbnailsHandler: failed to get missing thumbnail videos: %v", err)
renderError(w, "Failed to get video files: "+err.Error(), http.StatusInternalServerError)
return
}
@@ -121,6 +125,7 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) {
case "generate_all":
missing, err := getMissingThumbnailVideos()
if err != nil {
+ log.Printf("Error: generateThumbnailHandler: failed to get missing thumbnails: %v", err)
http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("Failed to get videos: "+err.Error()), http.StatusSeeOther)
return
}
@@ -129,8 +134,8 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) {
var errors []string
for _, v := range missing {
- err := generateThumbnail(v.Path, config.UploadDir, v.Filename)
- if err != nil {
+ if err := generateThumbnail(v.Path, config.UploadDir, v.Filename); err != nil {
+ log.Printf("Error: generateThumbnailHandler: failed to generate thumbnail for %s: %v", v.Filename, err)
errors = append(errors, fmt.Sprintf("%s: %v", v.Filename, err))
} else {
successCount++
@@ -154,12 +159,13 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) {
var filename, path string
err := db.QueryRow("SELECT filename, path FROM files WHERE id=?", fileID).Scan(&filename, &path)
if err != nil {
+ log.Printf("Error: generateThumbnailHandler: file not found for id=%s: %v", fileID, err)
http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("File not found"), http.StatusSeeOther)
return
}
- err = generateThumbnailAtTime(path, config.UploadDir, filename, timestamp)
- if err != nil {
+ if err = generateThumbnailAtTime(path, config.UploadDir, filename, timestamp); err != nil {
+ log.Printf("Error: generateThumbnailHandler: failed to generate thumbnail for file id=%s at %s: %v", fileID, timestamp, err)
http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("Failed to generate thumbnail: "+err.Error()), http.StatusSeeOther)
return
}
diff --git a/include-admin.go b/include-admin.go
@@ -4,6 +4,7 @@ import (
"database/sql"
"fmt"
"io"
+ "log"
"net/http"
"os"
"path/filepath"
@@ -50,10 +51,16 @@ func validateConfig(newConfig Config) error {
func adminHandler(w http.ResponseWriter, r *http.Request) {
// Get orphaned files
- orphanData, _ := getOrphanedFiles(config.UploadDir)
+ orphanData, err := getOrphanedFiles(config.UploadDir)
+ if err != nil {
+ log.Printf("Warning: adminHandler: failed to get orphaned files: %v", err)
+ }
// Get video files for thumbnails
- missingThumbnails, _ := getMissingThumbnailVideos()
+ missingThumbnails, err := getMissingThumbnailVideos()
+ if err != nil {
+ log.Printf("Warning: adminHandler: failed to get missing thumbnails: %v", err)
+ }
switch r.Method {
case http.MethodPost:
@@ -63,13 +70,19 @@ func adminHandler(w http.ResponseWriter, r *http.Request) {
case "backup":
err := backupDatabase(config.DatabasePath)
+ if err != nil {
+ log.Printf("Error: adminHandler: database backup failed: %v", err)
+ }
data := currentAdminState(r, orphanData, missingThumbnails)
data.Error = errorString(err)
data.Success = successString(err, "Database backup created successfully!")
renderAdminPage(w, r, data)
case "vacuum":
- err := vacuumDatabase(config.DatabasePath)
+ err := vacuumDatabase()
+ if err != nil {
+ log.Printf("Error: adminHandler: database vacuum failed: %v", err)
+ }
data := currentAdminState(r, orphanData, missingThumbnails)
data.Error = errorString(err)
data.Success = successString(err, "Database vacuum completed successfully!")
@@ -107,6 +120,8 @@ func parseAliasesFromForm(r *http.Request) []TagAliasGroup {
}
if len(aliases) >= 2 {
groups = append(groups, TagAliasGroup{Category: category, Aliases: aliases})
+ } else {
+ log.Printf("Warning: parseAliasesFromForm: alias group for category %q has fewer than 2 aliases (%d) and was discarded", category, len(aliases))
}
}
return groups
@@ -136,6 +151,7 @@ func handleSaveAliases(w http.ResponseWriter, r *http.Request, orphanData Orphan
config.TagAliases = parseAliasesFromForm(r)
if err := SaveConfig(db, config); err != nil {
+ log.Printf("Error: handleSaveAliases: failed to save configuration: %v", err)
data := currentAdminState(r, orphanData, missingThumbnails)
data.Error = "Failed to save configuration: " + err.Error()
renderAdminPage(w, r, data)
@@ -162,6 +178,7 @@ func handleSaveSettings(w http.ResponseWriter, r *http.Request, orphanData Orpha
config = newConfig
if err := SaveConfig(db, config); err != nil {
+ log.Printf("Error: handleSaveSettings: failed to save configuration: %v", err)
data := currentAdminState(r, orphanData, missingThumbnails)
data.Error = "Failed to save configuration: " + err.Error()
renderAdminPage(w, r, data)
@@ -185,6 +202,7 @@ func handleSaveSedRules(w http.ResponseWriter, r *http.Request, orphanData Orpha
config.SedRules = rules
if err := SaveConfig(db, config); err != nil {
+ log.Printf("Error: handleSaveSedRules: failed to save configuration: %v", err)
data := currentAdminState(r, orphanData, missingThumbnails)
data.Error = "Failed to save configuration: " + err.Error()
renderAdminPage(w, r, data)
@@ -226,6 +244,7 @@ func backupDatabase(dbPath string) error {
return fmt.Errorf("failed to copy database: %w", err)
}
+ log.Printf("Info: backupDatabase: backup written to %s", backupPath)
return nil
}
diff --git a/include-bulk.go b/include-bulk.go
@@ -3,6 +3,7 @@ package main
import (
"database/sql"
"fmt"
+ "log"
"net/http"
"strconv"
"strings"
@@ -84,7 +85,10 @@ func applyBulkTagOperations(fileIDs []int, category, value, operation string) er
}
func getBulkTagFormData() BulkTagFormData {
- catRows, _ := db.Query("SELECT name FROM categories ORDER BY name")
+ catRows, err := db.Query("SELECT name FROM categories ORDER BY name")
+ if err != nil {
+ log.Printf("Error: getBulkTagFormData: failed to query categories: %v", err)
+ }
var cats []string
for catRows.Next() {
var c string
@@ -93,7 +97,10 @@ func getBulkTagFormData() BulkTagFormData {
}
catRows.Close()
- recentRows, _ := db.Query("SELECT id, filename FROM files ORDER BY id DESC LIMIT 20")
+ recentRows, err := db.Query("SELECT id, filename FROM files ORDER BY id DESC LIMIT 20")
+ if err != nil {
+ log.Printf("Error: getBulkTagFormData: failed to query recent files: %v", err)
+ }
var recentFiles []File
for recentRows.Next() {
var f File
diff --git a/include-cbz.go b/include-cbz.go
@@ -70,14 +70,14 @@ func generateCBZThumbnail(cbzPath, uploadDir, filename string) error {
for _, f := range selectedFiles {
rc, err := f.Open()
if err != nil {
- log.Printf("CBZ Thumbnail: Failed to open %s: %v", f.Name, err)
+ log.Printf("Warning: generateCBZThumbnail: failed to open %s: %v", f.Name, err)
continue
}
img, _, err := image.Decode(rc)
rc.Close()
if err != nil {
- log.Printf("CBZ Thumbnail: Failed to decode %s: %v", f.Name, err)
+ log.Printf("Warning: generateCBZThumbnail: failed to decode %s: %v", f.Name, err)
continue
}
images = append(images, img)
@@ -293,6 +293,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) {
err := db.QueryRow("SELECT id, filename, path, COALESCE(description, '') FROM files WHERE id = ?", fileID).
Scan(&f.ID, &f.Filename, &f.Path, &f.Description)
if err != nil {
+ log.Printf("Error: cbzViewerHandler: file not found for id=%s: %v", fileID, err)
renderError(w, "File not found", http.StatusNotFound)
return
}
@@ -305,6 +306,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) {
fmt.Sscanf(parts[2], "%d", &imageIndex)
if err := serveCBZImage(w, cbzPath, imageIndex); err != nil {
+ log.Printf("Error: cbzViewerHandler: failed to serve image index %d from %s: %v", imageIndex, cbzPath, err)
renderError(w, "Failed to serve image", http.StatusInternalServerError)
}
return
@@ -313,6 +315,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) {
// Get list of images
images, err := getCBZImages(cbzPath)
if err != nil {
+ log.Printf("Error: cbzViewerHandler: failed to read CBZ contents at %s: %v", cbzPath, err)
renderError(w, "Failed to read CBZ contents", http.StatusInternalServerError)
return
}
diff --git a/include-files.go b/include-files.go
@@ -42,33 +42,39 @@ func fileDeleteHandler(w http.ResponseWriter, r *http.Request, parts []string) {
var currentFile File
err := db.QueryRow("SELECT id, filename, path FROM files WHERE id=?", fileID).Scan(¤tFile.ID, ¤tFile.Filename, ¤tFile.Path)
if err != nil {
+ log.Printf("Error: fileDeleteHandler: file not found for id=%s: %v", fileID, err)
renderError(w, "File not found", http.StatusNotFound)
return
}
tx, err := db.Begin()
if err != nil {
+ log.Printf("Error: fileDeleteHandler: failed to start transaction for file id=%s: %v", fileID, err)
renderError(w, "Failed to start transaction", http.StatusInternalServerError)
return
}
defer tx.Rollback()
if _, err = tx.Exec("DELETE FROM file_tags WHERE file_id=?", fileID); err != nil {
+ log.Printf("Error: fileDeleteHandler: failed to delete file_tags for file id=%s: %v", fileID, err)
renderError(w, "Failed to delete file tags", http.StatusInternalServerError)
return
}
if _, err = tx.Exec("DELETE FROM file_properties WHERE file_id=?", fileID); err != nil {
+ log.Printf("Error: fileDeleteHandler: failed to delete file_properties for file id=%s: %v", fileID, err)
renderError(w, "Failed to delete file properties", http.StatusInternalServerError)
return
}
if _, err = tx.Exec("DELETE FROM files WHERE id=?", fileID); err != nil {
+ log.Printf("Error: fileDeleteHandler: failed to delete files record for file id=%s: %v", fileID, err)
renderError(w, "Failed to delete file record", http.StatusInternalServerError)
return
}
if err = tx.Commit(); err != nil {
+ log.Printf("Error: fileDeleteHandler: failed to commit transaction for file id=%s: %v", fileID, err)
renderError(w, "Failed to commit transaction", http.StatusInternalServerError)
return
}
@@ -81,7 +87,7 @@ func fileDeleteHandler(w http.ResponseWriter, r *http.Request, parts []string) {
thumbPath := filepath.Join(config.UploadDir, "thumbnails", currentFile.Filename+".jpg")
if _, err := os.Stat(thumbPath); err == nil {
if err := os.Remove(thumbPath); err != nil {
- log.Printf("Warning: Failed to delete thumbnail %s: %v", thumbPath, err)
+ log.Printf("Warning: fileDeleteHandler: failed to delete thumbnail %s: %v", thumbPath, err)
}
}
@@ -105,6 +111,7 @@ func fileRenameHandler(w http.ResponseWriter, r *http.Request, parts []string) {
var currentFilename, currentPath string
err := db.QueryRow("SELECT filename, path FROM files WHERE id=?", fileID).Scan(¤tFilename, ¤tPath)
if err != nil {
+ log.Printf("Error: fileRenameHandler: file not found for id=%s: %v", fileID, err)
renderError(w, "File not found", http.StatusNotFound)
return
}
@@ -160,6 +167,7 @@ func checkFileConflictStrict(filename string) (string, string, int64, error) {
if _, err := os.Stat(finalPath); err == nil {
existingID, dbErr := getFileIDByName(filename)
if dbErr != nil {
+ log.Printf("Warning: checkFileConflictStrict: file %s exists on disk but not in DB: %v", filename, dbErr)
return "", "", 0, fmt.Errorf("a file with that name already exists")
}
return "", "", existingID, nil
diff --git a/include-filters.go b/include-filters.go
@@ -2,6 +2,7 @@ package main
import (
"fmt"
+ "log"
"net/http"
"net/url"
"strings"
@@ -11,7 +12,10 @@ func untaggedFilesHandler(w http.ResponseWriter, r *http.Request) {
page := pageFromRequest(r)
perPage := perPageFromConfig(50)
- files, total, _ := getUntaggedFilesPaginated(page, perPage)
+ files, total, err := getUntaggedFilesPaginated(page, perPage)
+ if err != nil {
+ log.Printf("Error: untaggedFilesHandler: failed to get untagged files: %v", err)
+ }
pageData := buildPageDataWithPagination("Untagged Files", files, page, total, perPage, r)
renderTemplate(w, "untagged.html", pageData)
}
@@ -93,6 +97,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) {
// Handle preview mode
files, err := getPreviewFiles(filters)
if err != nil {
+ log.Printf("Error: tagFilterHandler: failed to fetch preview files: %v", err)
renderError(w, "Failed to fetch preview files", http.StatusInternalServerError)
return
}
@@ -155,6 +160,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) {
var total int
err := db.QueryRow(countQuery, countArgs...).Scan(&total)
if err != nil {
+ log.Printf("Error: tagFilterHandler: failed to count files: %v", err)
renderError(w, "Failed to count files", http.StatusInternalServerError)
return
}
@@ -203,6 +209,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) {
files, err := queryFilesWithTags(query, args...)
if err != nil {
+ log.Printf("Error: tagFilterHandler: failed to fetch files: %v", err)
renderError(w, "Failed to fetch files", http.StatusInternalServerError)
return
}
diff --git a/include-general.go b/include-general.go
@@ -1,6 +1,7 @@
package main
import (
+ "log"
"net/http"
"net/url"
"strings"
@@ -23,6 +24,7 @@ func renderError(w http.ResponseWriter, message string, statusCode int) {
func renderTemplate(w http.ResponseWriter, tmplName string, data PageData) {
if err := tmpl.ExecuteTemplate(w, tmplName, data); err != nil {
+ log.Printf("Error: renderTemplate: failed to execute template %s: %v", tmplName, err)
renderError(w, "Template rendering failed", http.StatusInternalServerError)
}
}
diff --git a/include-notes.go b/include-notes.go
@@ -231,8 +231,8 @@ func CountLines(content string) int {
func notesViewHandler(w http.ResponseWriter, r *http.Request) {
content, err := GetNotes(db)
if err != nil {
+ log.Printf("Error: notesViewHandler: failed to load notes: %v", err)
http.Error(w, "Failed to load notes", http.StatusInternalServerError)
- log.Printf("Error loading notes: %v", err)
return
}
@@ -254,8 +254,8 @@ func notesViewHandler(w http.ResponseWriter, r *http.Request) {
pageData := buildPageData("Notes", notesData)
if err := tmpl.ExecuteTemplate(w, "notes.html", pageData); err != nil {
+ log.Printf("Error: notesViewHandler: template error: %v", err)
http.Error(w, "Template error", http.StatusInternalServerError)
- log.Printf("Template error: %v", err)
}
}
@@ -270,8 +270,8 @@ func notesSaveHandler(w http.ResponseWriter, r *http.Request) {
// Process (deduplicate and sort) before saving
if err := SaveNotes(db, content); err != nil {
+ log.Printf("Error: notesSaveHandler: failed to save notes: %v", err)
http.Error(w, "Failed to save notes", http.StatusInternalServerError)
- log.Printf("Error saving notes: %v", err)
return
}
@@ -287,6 +287,7 @@ func notesSaveHandler(w http.ResponseWriter, r *http.Request) {
func notesFilterHandler(w http.ResponseWriter, r *http.Request) {
content, err := GetNotes(db)
if err != nil {
+ log.Printf("Error: notesFilterHandler: failed to load notes: %v", err)
http.Error(w, "Failed to load notes", http.StatusInternalServerError)
return
}
@@ -312,6 +313,7 @@ func notesFilterHandler(w http.ResponseWriter, r *http.Request) {
func notesStatsHandler(w http.ResponseWriter, r *http.Request) {
content, err := GetNotes(db)
if err != nil {
+ log.Printf("Error: notesStatsHandler: failed to load notes: %v", err)
http.Error(w, "Failed to load notes", http.StatusInternalServerError)
return
}
@@ -324,10 +326,10 @@ func notesStatsHandler(w http.ResponseWriter, r *http.Request) {
// notesApplySedHandler applies a sed rule to the notes
func notesApplySedHandler(w http.ResponseWriter, r *http.Request) {
- log.Printf("notesApplySedHandler called - Method: %s, Path: %s", r.Method, r.URL.Path)
+ log.Printf("Info: notesApplySedHandler called - Method: %s, Path: %s", r.Method, r.URL.Path)
if r.Method != http.MethodPost {
- log.Printf("Wrong method: %s", r.Method)
+ log.Printf("Warning: notesApplySedHandler: wrong method: %s", r.Method)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusMethodNotAllowed)
json.NewEncoder(w).Encode(map[string]interface{}{
@@ -339,11 +341,11 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) {
content := r.FormValue("content")
ruleIndexStr := r.FormValue("rule_index")
- log.Printf("Received: content length=%d, rule_index=%s", len(content), ruleIndexStr)
+ log.Printf("Info: notesApplySedHandler: content length=%d, rule_index=%s", len(content), ruleIndexStr)
ruleIndex, err := strconv.Atoi(ruleIndexStr)
if err != nil || ruleIndex < 0 || ruleIndex >= len(config.SedRules) {
- log.Printf("Invalid rule index: %s (error: %v, len(rules)=%d)", ruleIndexStr, err, len(config.SedRules))
+ log.Printf("Warning: notesApplySedHandler: invalid rule index: %s (error: %v, len(rules)=%d)", ruleIndexStr, err, len(config.SedRules))
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode(map[string]interface{}{
@@ -354,10 +356,10 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) {
}
rule := config.SedRules[ruleIndex]
- log.Printf("Applying rule: %s (command: %s)", rule.Name, rule.Command)
+ log.Printf("Info: notesApplySedHandler: applying rule: %s (command: %s)", rule.Name, rule.Command)
result, err := ApplySedRule(content, rule.Command)
if err != nil {
- log.Printf("Sed rule error: %v", err)
+ log.Printf("Error: notesApplySedHandler: sed rule error: %v", err)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(map[string]interface{}{
@@ -374,7 +376,7 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) {
"content": result,
"stats": GetNoteStats(result),
}
- log.Printf("Sed rule success, returning %d bytes", len(result))
+ log.Printf("Info: notesApplySedHandler: sed rule success, returning %d bytes", len(result))
json.NewEncoder(w).Encode(response)
}
@@ -403,6 +405,7 @@ func notesPreviewHandler(w http.ResponseWriter, r *http.Request) {
func notesExportHandler(w http.ResponseWriter, r *http.Request) {
content, err := GetNotes(db)
if err != nil {
+ log.Printf("Error: notesExportHandler: failed to load notes: %v", err)
http.Error(w, "Failed to load notes", http.StatusInternalServerError)
return
}
@@ -421,6 +424,7 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) {
file, _, err := r.FormFile("file")
if err != nil {
+ log.Printf("Warning: notesImportHandler: failed to read uploaded file: %v", err)
http.Error(w, "Failed to read file", http.StatusBadRequest)
return
}
@@ -429,6 +433,7 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) {
// Read file content
buf := new(strings.Builder)
if _, err := io.Copy(buf, file); err != nil {
+ log.Printf("Error: notesImportHandler: failed to read file content: %v", err)
http.Error(w, "Failed to read file", http.StatusInternalServerError)
return
}
@@ -440,12 +445,16 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) {
if mergeMode {
// Merge with existing content
- existingContent, _ := GetNotes(db)
+ existingContent, err := GetNotes(db)
+ if err != nil {
+ log.Printf("Warning: notesImportHandler: failed to load existing notes for merge: %v", err)
+ }
content = existingContent + "\n" + content
}
// Save (will auto-process)
if err := SaveNotes(db, content); err != nil {
+ log.Printf("Error: notesImportHandler: failed to save imported notes: %v", err)
http.Error(w, "Failed to save notes", http.StatusInternalServerError)
return
}
diff --git a/include-viewer.go b/include-viewer.go
@@ -4,6 +4,7 @@ import (
"database/sql"
"fmt"
"html"
+ "log"
"net"
"net/http"
"net/url"
@@ -43,6 +44,7 @@ func fileHandler(w http.ResponseWriter, r *http.Request) {
var f File
err := db.QueryRow("SELECT id, filename, path, COALESCE(description, '') as description FROM files WHERE id=?", idStr).Scan(&f.ID, &f.Filename, &f.Path, &f.Description)
if err != nil {
+ log.Printf("Error: fileHandler: file not found for id=%s: %v", idStr, err)
renderError(w, "File not found", http.StatusNotFound)
return
}
@@ -69,6 +71,7 @@ func fileHandler(w http.ResponseWriter, r *http.Request) {
}
if _, err := db.Exec("UPDATE files SET description = ? WHERE id = ?", description, f.ID); err != nil {
+ log.Printf("Error: fileHandler: failed to update description for file id=%d: %v", f.ID, err)
renderError(w, "Failed to update description", http.StatusInternalServerError)
return
}
@@ -106,13 +109,16 @@ func fileHandler(w http.ResponseWriter, r *http.Request) {
return
}
- catRows, _ := db.Query(`
+ catRows, err := db.Query(`
SELECT DISTINCT c.name
FROM categories c
JOIN tags t ON t.category_id = c.id
JOIN file_tags ft ON ft.tag_id = t.id
ORDER BY c.name
`)
+ if err != nil {
+ log.Printf("Warning: fileHandler: failed to query categories for file id=%d: %v", f.ID, err)
+ }
var cats []string
for catRows.Next() {
var c string
@@ -121,11 +127,14 @@ func fileHandler(w http.ResponseWriter, r *http.Request) {
}
catRows.Close()
- propRows, _ := db.Query(`
+ propRows, err := db.Query(`
SELECT key, value FROM file_properties
WHERE file_id = ?
ORDER BY key, value
`, f.ID)
+ if err != nil {
+ log.Printf("Warning: fileHandler: failed to query properties for file id=%d: %v", f.ID, err)
+ }
fileProps := make(map[string]string)
for propRows.Next() {
var k, v string
@@ -146,7 +155,10 @@ func fileHandler(w http.ResponseWriter, r *http.Request) {
func buildPageDataWithIP(title string, data interface{}) PageData {
pageData := buildPageData(title, data)
- ip, _ := getLocalIP()
+ ip, err := getLocalIP()
+ if err != nil {
+ log.Printf("Warning: buildPageDataWithIP: could not determine local IP: %v", err)
+ }
pageData.IP = ip
pageData.Port = strings.TrimPrefix(config.ServerPort, ":")
return pageData