Get DB size from Postgres
This commit is contained in:
parent
273bb20baa
commit
7b056a4a41
5 changed files with 46 additions and 44 deletions
21
db/stats.sql.go
Normal file
21
db/stats.sql.go
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.25.0
|
||||||
|
// source: stats.sql
|
||||||
|
|
||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const dBSize = `-- name: DBSize :one
|
||||||
|
SELECT pg_size_pretty(pg_database_size(current_database()))
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) DBSize(ctx context.Context) (string, error) {
|
||||||
|
row := q.db.QueryRow(ctx, dBSize)
|
||||||
|
var pg_size_pretty string
|
||||||
|
err := row.Scan(&pg_size_pretty)
|
||||||
|
return pg_size_pretty, err
|
||||||
|
}
|
||||||
12
handlers.go
12
handlers.go
|
|
@ -31,7 +31,7 @@ func FeedsHandler(w http.ResponseWriter, _ *http.Request) {
|
||||||
Keywords: "RSS, Atom, Feed, Archive",
|
Keywords: "RSS, Atom, Feed, Archive",
|
||||||
Author: "TheLovinator",
|
Author: "TheLovinator",
|
||||||
CanonicalURL: "http://localhost:8000/feeds",
|
CanonicalURL: "http://localhost:8000/feeds",
|
||||||
Content: "<p>Here be </p>",
|
Content: "<p>No feeds yet.</p>",
|
||||||
}
|
}
|
||||||
html := FullHTML(htmlData)
|
html := FullHTML(htmlData)
|
||||||
_, err := w.Write([]byte(html))
|
_, err := w.Write([]byte(html))
|
||||||
|
|
@ -163,7 +163,10 @@ func IndexHandler(w http.ResponseWriter, _ *http.Request) {
|
||||||
Content: content,
|
Content: content,
|
||||||
}
|
}
|
||||||
html := FullHTML(htmlData)
|
html := FullHTML(htmlData)
|
||||||
w.Write([]byte(html))
|
_, err := w.Write([]byte(html))
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error writing response:", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func UploadOpmlHandler(w http.ResponseWriter, r *http.Request) {
|
func UploadOpmlHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
@ -218,5 +221,8 @@ func UploadOpmlHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
ParseResult: parseResult,
|
ParseResult: parseResult,
|
||||||
}
|
}
|
||||||
html := FullHTML(htmlData)
|
html := FullHTML(htmlData)
|
||||||
w.Write([]byte(html))
|
_, err = w.Write([]byte(html))
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error writing response:", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
sql/queries/stats.sql
Normal file
2
sql/queries/stats.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
-- name: DBSize :one
|
||||||
|
SELECT pg_size_pretty(pg_database_size(current_database()));
|
||||||
|
|
@ -8,7 +8,5 @@ sql:
|
||||||
out: "db"
|
out: "db"
|
||||||
sql_package: "pgx/v5"
|
sql_package: "pgx/v5"
|
||||||
emit_prepared_queries: true
|
emit_prepared_queries: true
|
||||||
emit_interface: true
|
|
||||||
emit_empty_slices: true
|
emit_empty_slices: true
|
||||||
emit_exported_queries: true
|
|
||||||
emit_json_tags: true
|
emit_json_tags: true
|
||||||
|
|
|
||||||
53
stats.go
53
stats.go
|
|
@ -1,8 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"context"
|
||||||
"os"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -14,46 +13,22 @@ type Cache struct {
|
||||||
var cache Cache
|
var cache Cache
|
||||||
|
|
||||||
func GetDBSize() (string, error) {
|
func GetDBSize() (string, error) {
|
||||||
// If cache is less than 10 minutes old, return cached data
|
// If the cache is older than 5 minutes, get the database size from the database
|
||||||
if time.Since(cache.timestamp).Minutes() < 10 {
|
if time.Since(cache.timestamp) > 5*time.Minute {
|
||||||
return cache.data, nil
|
dbSize, err := getDBSizeFromDB()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
cache = Cache{timestamp: time.Now(), data: dbSize}
|
||||||
}
|
}
|
||||||
|
return cache.data, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: This should be read from the environment
|
func getDBSizeFromDB() (string, error) {
|
||||||
fileInfo, err := os.Stat("feedvault.db")
|
// Get database size from the PostgreSQL database
|
||||||
|
dbSize, err := DB.DBSize(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
return dbSize, nil
|
||||||
// Get the file size in bytes
|
|
||||||
fileSize := fileInfo.Size()
|
|
||||||
|
|
||||||
// Convert to human readable size and append the unit (KiB, MiB, GiB, TiB)
|
|
||||||
var size float64
|
|
||||||
|
|
||||||
if fileSize < 1024*1024 {
|
|
||||||
// If the file size is less than 1 KiB, return the size in bytes
|
|
||||||
size = float64(fileSize) / 1024
|
|
||||||
cache.data = fmt.Sprintf("%.2f KiB", size)
|
|
||||||
|
|
||||||
} else if fileSize < 1024*1024*1024 {
|
|
||||||
// If the file size is less than 1 MiB, return the size in KiB
|
|
||||||
size = float64(fileSize) / (1024 * 1024)
|
|
||||||
cache.data = fmt.Sprintf("%.2f MiB", size)
|
|
||||||
|
|
||||||
} else if fileSize < 1024*1024*1024*1024 {
|
|
||||||
// If the file size is less than 1 GiB, return the size in MiB
|
|
||||||
size = float64(fileSize) / (1024 * 1024 * 1024)
|
|
||||||
cache.data = fmt.Sprintf("%.2f GiB", size)
|
|
||||||
} else {
|
|
||||||
// If the file size is 1 GiB or more, return the size in TiB
|
|
||||||
size = float64(fileSize) / (1024 * 1024 * 1024 * 1024)
|
|
||||||
cache.data = fmt.Sprintf("%.2f TiB", size)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update cache timestamp
|
|
||||||
cache.timestamp = time.Now()
|
|
||||||
|
|
||||||
// Return the human readable size
|
|
||||||
return cache.data, nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue