From c23be08cca801f4bc300d9a44513578b6cced1cf Mon Sep 17 00:00:00 2001 From: aceberg <1502200+aceberg@users.noreply.github.com> Date: Thu, 24 Jul 2025 01:27:02 +0700 Subject: [PATCH] GORM --- CHANGELOG.md | 5 +- go.mod | 23 ++++---- go.sum | 76 +++++++++---------------- internal/api/api.go | 14 ++--- internal/db/choose_db.go | 42 -------------- internal/db/connect.go | 36 ------------ internal/db/edit.go | 92 ------------------------------- internal/db/quote_str.go | 7 --- internal/db/select-exec.go | 42 -------------- internal/gdb/edit.go | 47 ++++++++++++++++ internal/gdb/start.go | 64 +++++++++++++++++++++ internal/models/models.go | 20 +++---- internal/routines/routines-upd.go | 7 +-- internal/routines/scan-routine.go | 10 ++-- internal/routines/trim-history.go | 6 +- 15 files changed, 180 insertions(+), 311 deletions(-) delete mode 100644 internal/db/choose_db.go delete mode 100644 internal/db/connect.go delete mode 100644 internal/db/edit.go delete mode 100644 internal/db/quote_str.go delete mode 100644 internal/db/select-exec.go create mode 100644 internal/gdb/edit.go create mode 100644 internal/gdb/start.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e0b8fb..9090d9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,9 @@ All notable changes to this project will be documented in this file. ## [v2.1.3] - 2025-0 -### Added -- go 1.24.5 +### Changed +- Upd to `go 1.24.5` +- Moved DB handling to GORM ## [v2.1.2] - 2025-03-30 ### Fixed diff --git a/go.mod b/go.mod index 652f102..2158106 100644 --- a/go.mod +++ b/go.mod @@ -6,11 +6,11 @@ require ( github.com/containrrr/shoutrrr v0.8.0 github.com/gin-gonic/gin v1.10.1 github.com/influxdata/influxdb-client-go/v2 v2.14.0 - github.com/jmoiron/sqlx v1.4.0 - github.com/lib/pq v1.10.9 github.com/prometheus/client_golang v1.22.0 github.com/spf13/viper v1.20.1 - modernc.org/sqlite v1.38.0 + gorm.io/driver/postgres v1.6.0 + gorm.io/driver/sqlite v1.6.0 + gorm.io/gorm v1.30.0 ) require ( @@ -21,7 +21,6 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect @@ -33,21 +32,26 @@ require ( github.com/goccy/go-json v0.10.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.6.0 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/ncruces/go-strftime v0.1.9 // indirect github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect @@ -60,13 +64,10 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/net v0.33.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.65.10 // indirect - modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 1678cf4..81b40dd 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= @@ -21,8 +19,6 @@ github.com/containrrr/shoutrrr v0.8.0/go.mod h1:ioyQAyu1LJY6sILuNyKaQaw+9Ttik5Qe github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -45,8 +41,6 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= @@ -58,18 +52,28 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4= github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= -github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= @@ -87,8 +91,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -103,8 +105,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= -github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= @@ -123,8 +123,6 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= @@ -165,23 +163,19 @@ golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -190,29 +184,11 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s= -modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= -modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= -modernc.org/fileutil v1.3.3 h1:3qaU+7f7xxTUmvU1pJTZiDLAIoJVdUSSauJNHg9yXoA= -modernc.org/fileutil v1.3.3/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= -modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= -modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc= -modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po= -modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= -modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= -modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= -modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= -modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI= -modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE= -modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= -modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= +gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/api/api.go b/internal/api/api.go index c96999f..655ccb4 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -8,7 +8,7 @@ import ( "github.com/aceberg/WatchYourLAN/internal/check" "github.com/aceberg/WatchYourLAN/internal/conf" - "github.com/aceberg/WatchYourLAN/internal/db" + "github.com/aceberg/WatchYourLAN/internal/gdb" "github.com/aceberg/WatchYourLAN/internal/models" "github.com/aceberg/WatchYourLAN/internal/notify" "github.com/aceberg/WatchYourLAN/internal/portscan" @@ -16,7 +16,7 @@ import ( func apiAll(c *gin.Context) { - allHosts = db.Select("now") + allHosts = gdb.Select("now") c.IndentedJSON(http.StatusOK, allHosts) } @@ -39,7 +39,7 @@ func apiHistory(c *gin.Context) { var hosts []models.Host if conf.AppConfig.HistInDB { - histHosts = db.Select("history") + histHosts = gdb.Select("history") } mac := c.Param("mac") @@ -68,8 +68,8 @@ func apiHostDel(c *gin.Context) { idStr := c.Param("id") host := getHostByID(idStr, allHosts) // functions.go - db.Delete("now", host.ID) - allHosts = db.Select("now") + gdb.Delete("now", host.ID) + allHosts = gdb.Select("now") slog.Info("Deleting from DB", "host", host) @@ -100,8 +100,8 @@ func apiEdit(c *gin.Context) { } // log.Println("EDIT: ", host) - db.Update("now", host) - allHosts = db.Select("now") + gdb.Update("now", host) + allHosts = gdb.Select("now") } c.IndentedJSON(http.StatusOK, "OK") diff --git a/internal/db/choose_db.go b/internal/db/choose_db.go deleted file mode 100644 index fdce076..0000000 --- a/internal/db/choose_db.go +++ /dev/null @@ -1,42 +0,0 @@ -package db - -import ( - "log/slog" - - "github.com/aceberg/WatchYourLAN/internal/models" -) - -// Data to connect to DB -type Data struct { - Use string - Path string - SQLitePath string - PGConnect string - PrimaryKey string -} - -var currentDB Data - -func setCurrentDB() { - - if currentDB.Use == "postgres" && currentDB.PGConnect != "" { - currentDB.Path = currentDB.PGConnect - currentDB.PrimaryKey = "BIGSERIAL PRIMARY KEY" - } else { - currentDB.Use = "sqlite" - currentDB.Path = currentDB.SQLitePath - currentDB.PrimaryKey = "INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE" - } - - slog.Info("Using DB", "type", currentDB.Use) -} - -// SetCurrent - set paths and which DB to use -func SetCurrent(config models.Conf) { - - currentDB.Use = config.UseDB - currentDB.SQLitePath = config.DBPath - currentDB.PGConnect = config.PGConnect - - setCurrentDB() -} diff --git a/internal/db/connect.go b/internal/db/connect.go deleted file mode 100644 index a2a32b1..0000000 --- a/internal/db/connect.go +++ /dev/null @@ -1,36 +0,0 @@ -package db - -import ( - "log/slog" - - "github.com/jmoiron/sqlx" - - // import postgres - _ "github.com/lib/pq" - - // Import sqlite module - _ "modernc.org/sqlite" - - "github.com/aceberg/WatchYourLAN/internal/check" -) - -func connectDB() (*sqlx.DB, bool) { - var ok bool - - db, err := sqlx.Open(currentDB.Use, currentDB.Path) - check.IfError(err) - - err = db.Ping() - if check.IfError(err) && currentDB.Use == "postgres" { - slog.Warn("PostgreSQL connection error. Falling back to SQLite.") - currentDB.Use = "sqlite" - setCurrentDB() - Create() - } - - if err == nil { - ok = true - } - - return db, ok -} diff --git a/internal/db/edit.go b/internal/db/edit.go deleted file mode 100644 index 13f1c99..0000000 --- a/internal/db/edit.go +++ /dev/null @@ -1,92 +0,0 @@ -package db - -import ( - "fmt" - - "github.com/aceberg/WatchYourLAN/internal/models" -) - -// Create - create DB if not exists -func Create() { - - sqlStatement := `CREATE TABLE IF NOT EXISTS "now" ( - "ID" ` + currentDB.PrimaryKey + `, - "NAME" TEXT NOT NULL, - "DNS" TEXT NOT NULL, - "IFACE" TEXT, - "IP" TEXT, - "MAC" TEXT, - "HW" TEXT, - "DATE" TEXT, - "KNOWN" INTEGER DEFAULT 0, - "NOW" INTEGER DEFAULT 0 - );` - dbExec(sqlStatement) - - sqlStatement = `CREATE TABLE IF NOT EXISTS "history" ( - "ID" ` + currentDB.PrimaryKey + `, - "NAME" TEXT NOT NULL, - "DNS" TEXT NOT NULL, - "IFACE" TEXT, - "IP" TEXT, - "MAC" TEXT, - "HW" TEXT, - "DATE" TEXT, - "KNOWN" INTEGER DEFAULT 0, - "NOW" INTEGER DEFAULT 0 - );` - dbExec(sqlStatement) -} - -// Insert - insert host into table -func Insert(table string, oneHost models.Host) { - oneHost.Name = quoteStr(oneHost.Name) - oneHost.Hw = quoteStr(oneHost.Hw) - sqlStatement := `INSERT INTO %s ("NAME", "DNS", "IFACE", "IP", "MAC", "HW", "DATE", "KNOWN", "NOW") VALUES ('%s','%s','%s','%s','%s','%s','%s','%d','%d');` - sqlStatement = fmt.Sprintf(sqlStatement, table, oneHost.Name, oneHost.DNS, oneHost.Iface, oneHost.IP, oneHost.Mac, oneHost.Hw, oneHost.Date, oneHost.Known, oneHost.Now) - - dbExec(sqlStatement) -} - -// Update - update host -func Update(table string, oneHost models.Host) { - oneHost.Name = quoteStr(oneHost.Name) - oneHost.Hw = quoteStr(oneHost.Hw) - sqlStatement := `UPDATE %s set - "NAME" = '%s', "DNS" = '%s', "IFACE" = '%s', "IP" = '%s', "MAC" = '%s', "HW" = '%s', "DATE" = '%s', "KNOWN" = '%d', "NOW" = '%d' - WHERE "ID" = '%d';` - sqlStatement = fmt.Sprintf(sqlStatement, table, oneHost.Name, oneHost.DNS, oneHost.Iface, oneHost.IP, oneHost.Mac, oneHost.Hw, oneHost.Date, oneHost.Known, oneHost.Now, oneHost.ID) - - dbExec(sqlStatement) -} - -// Delete - delete host from DB -func Delete(table string, id int) { - sqlStatement := `DELETE FROM %s WHERE "ID"='%d';` - sqlStatement = fmt.Sprintf(sqlStatement, table, id) - dbExec(sqlStatement) -} - -// DeleteList - delete a list of hosts from History -func DeleteList(ids []int) { - if len(ids) > 0 { - idString := "" - - for _, id := range ids { - idString = idString + fmt.Sprintf("%d, ", id) - } - idString = idString[:len(idString)-2] - - sqlStatement := `DELETE FROM history WHERE "ID" IN (%s);` - sqlStatement = fmt.Sprintf(sqlStatement, idString) - - dbExec(sqlStatement) - } -} - -// Clear - delete all hosts from table -func Clear(table string) { - sqlStatement := `DELETE FROM %s;` - sqlStatement = fmt.Sprintf(sqlStatement, table) - dbExec(sqlStatement) -} diff --git a/internal/db/quote_str.go b/internal/db/quote_str.go deleted file mode 100644 index aa2d36c..0000000 --- a/internal/db/quote_str.go +++ /dev/null @@ -1,7 +0,0 @@ -package db - -import "strings" - -func quoteStr(str string) string { - return strings.ReplaceAll(str, "'", "''") -} diff --git a/internal/db/select-exec.go b/internal/db/select-exec.go deleted file mode 100644 index e087b1c..0000000 --- a/internal/db/select-exec.go +++ /dev/null @@ -1,42 +0,0 @@ -package db - -import ( - // "log/slog" - "sync" - - "github.com/aceberg/WatchYourLAN/internal/check" - "github.com/aceberg/WatchYourLAN/internal/models" -) - -var mu sync.Mutex - -func dbExec(sqlStatement string) { - - db, ok := connectDB() - defer db.Close() - - if ok { - mu.Lock() - _, err := db.Exec(sqlStatement) - mu.Unlock() - check.IfError(err) - } -} - -// Select - get all hosts -func Select(table string) (dbHosts []models.Host) { - - sqlStatement := `SELECT * FROM ` + table + ` ORDER BY "DATE" DESC` - - db, ok := connectDB() - defer db.Close() - - if ok { - mu.Lock() - err := db.Select(&dbHosts, sqlStatement) - mu.Unlock() - check.IfError(err) - } - - return dbHosts -} diff --git a/internal/gdb/edit.go b/internal/gdb/edit.go new file mode 100644 index 0000000..85f5073 --- /dev/null +++ b/internal/gdb/edit.go @@ -0,0 +1,47 @@ +package gdb + +import ( + "github.com/aceberg/WatchYourLAN/internal/check" + "github.com/aceberg/WatchYourLAN/internal/models" +) + +// Select - get all hosts +func Select(table string) (dbHosts []models.Host) { + + tab := db.Table(table) + tab.Find(&dbHosts) + + return dbHosts +} + +// Update - update or create host +func Update(table string, oneHost models.Host) { + + tab := db.Table(table) + result := tab.Save(&oneHost) + check.IfError(result.Error) +} + +// Delete - delete host from DB +func Delete(table string, id int) { + + tab := db.Table(table) + result := tab.Delete(&models.Host{}, id) + check.IfError(result.Error) +} + +// DeleteList - delete a list of hosts from History +func DeleteList(ids []int) { + + tab := db.Table("history") + result := tab.Where("ID IN ?", ids).Delete(&models.Host{}) + check.IfError(result.Error) +} + +// Clear - delete all hosts from table +func Clear(table string) { + + tab := db.Table(table) + result := tab.Where("1 = 1").Delete(&models.Host{}) + check.IfError(result.Error) +} diff --git a/internal/gdb/start.go b/internal/gdb/start.go new file mode 100644 index 0000000..0ff257d --- /dev/null +++ b/internal/gdb/start.go @@ -0,0 +1,64 @@ +package gdb + +import ( + "log" + "log/slog" + "os" + "time" + + "gorm.io/driver/postgres" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" + + "github.com/aceberg/WatchYourLAN/internal/check" + "github.com/aceberg/WatchYourLAN/internal/conf" + "github.com/aceberg/WatchYourLAN/internal/models" +) + +var db *gorm.DB + +// Start working with DB +func Start() { + var tab *gorm.DB + var err error + var pgFail bool + + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + SlowThreshold: time.Second, + LogLevel: logger.Warn, + IgnoreRecordNotFoundError: true, + Colorful: true, + }, + ) + gormConf := &gorm.Config{Logger: newLogger} + + // Choose DB and connect + if conf.AppConfig.UseDB == "postgres" { + db, err = gorm.Open(postgres.Open(conf.AppConfig.PGConnect), gormConf) + + if err != nil { + pgFail = true + + slog.Error("PostgreSQL connection error:", "err", err) + slog.Warn("Falling back to SQLite") + } + } + + if pgFail || conf.AppConfig.UseDB != "postgres" { + + db, err = gorm.Open(sqlite.Open(conf.AppConfig.DBPath), gormConf) + check.IfError(err) + } + + // Migrate the schema + tab = db.Table("now") + err = tab.AutoMigrate(&models.Host{}) + check.IfError(err) + + tab = db.Table("history") + err = tab.AutoMigrate(&models.Host{}) + check.IfError(err) +} diff --git a/internal/models/models.go b/internal/models/models.go index 6e79dcd..c246019 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -34,16 +34,16 @@ type Conf struct { // Host - one host type Host struct { - ID int `db:"ID"` - Name string `db:"NAME"` - DNS string `db:"DNS"` - Iface string `db:"IFACE"` - IP string `db:"IP"` - Mac string `db:"MAC"` - Hw string `db:"HW"` - Date string `db:"DATE"` - Known int `db:"KNOWN"` - Now int `db:"NOW"` + ID int `gorm:"column:ID;primaryKey"` + Name string `gorm:"column:NAME"` + DNS string `gorm:"column:DNS"` + Iface string `gorm:"column:IFACE"` + IP string `gorm:"column:IP"` + Mac string `gorm:"column:MAC"` + Hw string `gorm:"column:HW"` + Date string `gorm:"column:DATE"` + Known int `gorm:"column:KNOWN"` + Now int `gorm:"column:NOW"` } // Stat - status diff --git a/internal/routines/routines-upd.go b/internal/routines/routines-upd.go index 8b3b9fd..e166108 100644 --- a/internal/routines/routines-upd.go +++ b/internal/routines/routines-upd.go @@ -4,7 +4,7 @@ import ( "log/slog" "github.com/aceberg/WatchYourLAN/internal/conf" - "github.com/aceberg/WatchYourLAN/internal/db" + "github.com/aceberg/WatchYourLAN/internal/gdb" "github.com/aceberg/WatchYourLAN/internal/models" ) @@ -24,10 +24,9 @@ func Update() { setLogLevel() - db.SetCurrent(conf.AppConfig) - db.Create() + gdb.Start() - allHosts = db.Select("now") + allHosts = gdb.Select("now") quitScan = make(chan bool) go startScan(quitScan) // scan-routine.go diff --git a/internal/routines/scan-routine.go b/internal/routines/scan-routine.go index ada162c..9c34b17 100644 --- a/internal/routines/scan-routine.go +++ b/internal/routines/scan-routine.go @@ -8,7 +8,7 @@ import ( "github.com/aceberg/WatchYourLAN/internal/arp" "github.com/aceberg/WatchYourLAN/internal/check" "github.com/aceberg/WatchYourLAN/internal/conf" - "github.com/aceberg/WatchYourLAN/internal/db" + "github.com/aceberg/WatchYourLAN/internal/gdb" "github.com/aceberg/WatchYourLAN/internal/influx" "github.com/aceberg/WatchYourLAN/internal/models" "github.com/aceberg/WatchYourLAN/internal/notify" @@ -31,7 +31,7 @@ func startScan(quit chan bool) { foundHosts = arp.Scan(conf.AppConfig.Ifaces, conf.AppConfig.ArpArgs, conf.AppConfig.ArpStrs) compareHosts(foundHosts) - allHosts = db.Select("now") + allHosts = gdb.Select("now") lastDate = time.Now() } @@ -64,12 +64,12 @@ func compareHosts(foundHosts []models.Host) { } else { aHost.Now = 0 } - db.Update("now", aHost) + gdb.Update("now", aHost) aHost.Date = time.Now().Format("2006-01-02 15:04:05") histHosts = append(histHosts, aHost) if conf.AppConfig.HistInDB { - db.Insert("history", aHost) + gdb.Update("history", aHost) } if conf.AppConfig.InfluxEnable { influx.Add(conf.AppConfig, aHost) @@ -87,6 +87,6 @@ func compareHosts(foundHosts []models.Host) { slog.Warn(msg) notify.Shout(msg, conf.AppConfig.ShoutURL) // Notify through Shoutrrr - db.Insert("now", fHost) + gdb.Update("now", fHost) } } diff --git a/internal/routines/trim-history.go b/internal/routines/trim-history.go index bee0da9..288e587 100644 --- a/internal/routines/trim-history.go +++ b/internal/routines/trim-history.go @@ -5,7 +5,7 @@ import ( "time" "github.com/aceberg/WatchYourLAN/internal/conf" - "github.com/aceberg/WatchYourLAN/internal/db" + "github.com/aceberg/WatchYourLAN/internal/gdb" "github.com/aceberg/WatchYourLAN/internal/models" ) @@ -30,7 +30,7 @@ func trimHistory() { nowMinus := now.Add(-time.Duration(hours) * time.Hour) if conf.AppConfig.HistInDB { - histHosts = db.Select("history") + histHosts = gdb.Select("history") } slog.Info("Removing all History before", "date", nowMinus.Format("2006-01-02 15:04:05")) @@ -52,7 +52,7 @@ func trimHistory() { } } - db.DeleteList(ids) + gdb.DeleteList(ids) histHosts = newHistHosts slog.Info("Removed records from History", "n", n)