tune update db
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/rs/zerolog/log"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"thuanle.me/ip-info/configs"
|
||||
)
|
||||
@@ -10,6 +14,8 @@ import reader "github.com/oschwald/maxminddb-golang"
|
||||
type IpDb struct {
|
||||
r *reader.Reader
|
||||
mu sync.RWMutex
|
||||
|
||||
dbFile string
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -25,23 +31,92 @@ func Ins() *IpDb {
|
||||
return ins
|
||||
}
|
||||
|
||||
func CleanTempFiles() error {
|
||||
log.Info().Str("dir", configs.GeoDbFolder).Msg("Cleaning temp files")
|
||||
dir, err := os.Open(configs.GeoDbFolder)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dir.Close()
|
||||
|
||||
// List all files in the directory
|
||||
files, err := dir.Readdir(-1) // -1 means read all files
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete each file
|
||||
for _, file := range files {
|
||||
if !file.IsDir() && file.Name() != configs.MmdbDbFileName {
|
||||
filePath := filepath.Join(configs.GeoDbFolder, file.Name())
|
||||
err := os.Remove(filePath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete file %s: %w", filePath, err)
|
||||
}
|
||||
fmt.Printf("Deleted file: %s\n", filePath)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *IpDb) Reload() error {
|
||||
d.mu.Lock()
|
||||
defer d.mu.Unlock()
|
||||
|
||||
if d.r != nil {
|
||||
_ = d.r.Close()
|
||||
wilDeleteFile := d.dbFile
|
||||
|
||||
tmpFile, err := cloneDBFile()
|
||||
if err != nil {
|
||||
log.Err(err).Msg("Failed to clone db file")
|
||||
return err
|
||||
}
|
||||
r, err := reader.Open(configs.MmdbDbFile)
|
||||
|
||||
d.dbFile = tmpFile
|
||||
r, err := reader.Open(tmpFile)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("Failed to open mmdb")
|
||||
return err
|
||||
}
|
||||
|
||||
tmpR := d.r
|
||||
d.r = r
|
||||
|
||||
if tmpR != nil {
|
||||
_ = tmpR.Close()
|
||||
|
||||
if wilDeleteFile != "" {
|
||||
_ = os.Remove(wilDeleteFile)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *IpDb) IsLoaded() bool {
|
||||
return d.r != nil
|
||||
}
|
||||
|
||||
func cloneDBFile() (string, error) {
|
||||
srcFile, err := os.Open(configs.MmdbDbFile)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer srcFile.Close()
|
||||
|
||||
tmpFile, err := os.CreateTemp(configs.GeoDbFolder, "geoip-v4-*.mmdb")
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to create temporary file: %v", err)
|
||||
}
|
||||
defer tmpFile.Close()
|
||||
|
||||
buf := make([]byte, 1024*1024) // 1 MB buffer
|
||||
|
||||
// Copy the data from srcFile to dstFile
|
||||
_, err = io.CopyBuffer(tmpFile, srcFile, buf)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return tmpFile.Name(), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user