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 ?#$NIE-z$DwqGhO*+&}kiRPWn
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
Date: Sat, 6 May 2017 14:43:15 +0200
Subject: [PATCH 4/9] filesize as int
---
model/torrent.go | 4 ++--
util/format.go | 24 ++++++++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
create mode 100644 util/format.go
diff --git a/model/torrent.go b/model/torrent.go
index a1a84d98..eedbefdb 100644
--- a/model/torrent.go
+++ b/model/torrent.go
@@ -49,7 +49,7 @@ type Torrents struct {
Hash string `gorm:"column:torrent_hash"`
Date int64 `gorm:"column:date"`
Downloads int `gorm:"column:downloads"`
- Filesize string `gorm:"column:filesize"`
+ Filesize int64 `gorm:"column:filesize"`
Description []byte `gorm:"column:description"`
Comments []byte `gorm:"column:comments"`
Statuses Statuses `gorm:"ForeignKey:status_id;AssociationForeignKey:status_id"`
@@ -112,7 +112,7 @@ func (t *Torrents) ToJson() TorrentsJson {
Status: t.Status,
Hash: t.Hash,
Date: time.Unix(t.Date, 0).Format(time.RFC3339),
- Filesize: t.Filesize,
+ Filesize: util.FormatFilesize(t.Filesize),
Description: template.HTML(util.UnZlib(t.Description)),
Comments: b,
Sub_Category: t.Sub_Categories.ToJson(),
diff --git a/util/format.go b/util/format.go
new file mode 100644
index 00000000..fb2cbb1d
--- /dev/null
+++ b/util/format.go
@@ -0,0 +1,24 @@
+package util
+
+import (
+ "fmt"
+)
+
+func FormatFilesize(bytes int64) string {
+ var unit string
+ var value float64
+ if bytes > 1024*1024*1024 {
+ unit = "GiB"
+ value = float64(bytes) / (1024*1024*1024)
+ } else if bytes > 1024*1024 {
+ unit = "MiB"
+ value = float64(bytes) / (1024*1024)
+ } else if bytes > 1024 {
+ unit = "KiB"
+ value = float64(bytes) / (1024)
+ } else {
+ unit = "B"
+ value = float64(bytes)
+ }
+ return fmt.Sprintf("%.1f %s", value, unit)
+}
From 461db47a01b479e9e4d00d95552ae5958a715021 Mon Sep 17 00:00:00 2001
From: ayame-git
Date: Sat, 6 May 2017 20:52:41 +0300
Subject: [PATCH 5/9] fixed parameters
---
main.go | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/main.go b/main.go
index 7b91acff..eedbc938 100755
--- a/main.go
+++ b/main.go
@@ -33,6 +33,11 @@ func main() {
conf_bind := conf.BindFlags()
defaults := flag.Bool("print-defaults", false, "print the default configuration file on stdout")
flag.Parse()
+ err := conf_bind()
+ if err != nil {
+ log.CheckError(err)
+ }
+ fmt.Println(conf)
if *defaults {
stdout := bufio.NewWriter(os.Stdout)
conf.Pretty(stdout)
From a515959ad3b2ef46c6e45a0343a051da71fea20f Mon Sep 17 00:00:00 2001
From: ayame-git
Date: Sat, 6 May 2017 20:55:27 +0300
Subject: [PATCH 6/9] oops
---
main.go | 1 -
1 file changed, 1 deletion(-)
diff --git a/main.go b/main.go
index eedbc938..6767a816 100755
--- a/main.go
+++ b/main.go
@@ -37,7 +37,6 @@ func main() {
if err != nil {
log.CheckError(err)
}
- fmt.Println(conf)
if *defaults {
stdout := bufio.NewWriter(os.Stdout)
conf.Pretty(stdout)
From 86049d80b0011b16c5030ad7c8be2225caac3793 Mon Sep 17 00:00:00 2001
From: ayame-git
Date: Sat, 6 May 2017 21:27:26 +0300
Subject: [PATCH 7/9] fixed for good now
---
db/gorm.go | 7 +++----
dbdb | Bin 0 -> 20480 bytes
main.go | 13 +++++++------
3 files changed, 10 insertions(+), 10 deletions(-)
create mode 100644 dbdb
diff --git a/db/gorm.go b/db/gorm.go
index 42ba2bf9..693352e2 100644
--- a/db/gorm.go
+++ b/db/gorm.go
@@ -2,18 +2,17 @@ package db
import (
"github.com/ewhal/nyaa/config"
- "github.com/ewhal/nyaa/util/log"
"github.com/ewhal/nyaa/model"
+ "github.com/ewhal/nyaa/util/log"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
// _ "github.com/go-sql-driver/mysql"
)
-var ORM, Errs = GormInit()
+var ORM *gorm.DB
// GormInit init gorm ORM.
-func GormInit() (*gorm.DB, error) {
- conf := config.NewConfig()
+func GormInit(conf *config.Config) (*gorm.DB, error) {
db, err := gorm.Open(conf.DBType, conf.DBParams)
// db, err := gorm.Open("mysql", config.MysqlDSL())
//db, err := gorm.Open("sqlite3", "/tmp/gorm.db")
diff --git a/dbdb b/dbdb
new file mode 100644
index 0000000000000000000000000000000000000000..691e845934c3ed2d4b38d34703d081670d3980e5
GIT binary patch
literal 20480
zcmeI#O;5rw7{KvOXNU)kH@pz*5)&2|4;t^jgc}!M?xetgM%c(!HG0GN?fe3M96MmL
z4fO*o|0d1)vh8{LYcIXO?I<0HVH8iL7U$N!W!u)J5SC>*rtX-Um9(GMtk_xOpQmG;
z?zZaY1*hJ(_P+Lp^-t5FAbP2D-*8Jb4o!AlZ(*nk=IfJ`I*f$e0L_}Ak_Jfgg4u&HI9z#`N<-)
zbyn-vb}^&%M4HX2SIXpPbTbR#y&u~P^^fKvq>kb=t0a4F6~kr2X|Pp0zX1Pda5I$u
zM|L^zQr^og{{8=BnT(73>bnE8iLU6WkvRmW7rlg&NDh+Rp%^N2uGCxUM3{Gjq#vu9
zR#9kvFo}95*=RaVA(nmNrFV04>8Buo00IagfB*srAb
Date: Sat, 6 May 2017 21:28:47 +0300
Subject: [PATCH 8/9] fixed for good now
---
dbdb | Bin 20480 -> 0 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 dbdb
diff --git a/dbdb b/dbdb
deleted file mode 100644
index 691e845934c3ed2d4b38d34703d081670d3980e5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 20480
zcmeI#O;5rw7{KvOXNU)kH@pz*5)&2|4;t^jgc}!M?xetgM%c(!HG0GN?fe3M96MmL
z4fO*o|0d1)vh8{LYcIXO?I<0HVH8iL7U$N!W!u)J5SC>*rtX-Um9(GMtk_xOpQmG;
z?zZaY1*hJ(_P+Lp^-t5FAbP2D-*8Jb4o!AlZ(*nk=IfJ`I*f$e0L_}Ak_Jfgg4u&HI9z#`N<-)
zbyn-vb}^&%M4HX2SIXpPbTbR#y&u~P^^fKvq>kb=t0a4F6~kr2X|Pp0zX1Pda5I$u
zM|L^zQr^og{{8=BnT(73>bnE8iLU6WkvRmW7rlg&NDh+Rp%^N2uGCxUM3{Gjq#vu9
zR#9kvFo}95*=RaVA(nmNrFV04>8Buo00IagfB*srAb
Date: Sat, 6 May 2017 21:43:15 +0300
Subject: [PATCH 9/9] config file works now
---
config/config.go | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/config/config.go b/config/config.go
index d7597ecc..931a8e74 100644
--- a/config/config.go
+++ b/config/config.go
@@ -16,7 +16,7 @@ type Config struct {
DBType string `json: "db_type"`
// This will be directly passed to Gorm, and its internal
// structure depends on the dialect for each db type
- DBParams string `json: "db_type"`
+ DBParams string `json: "db_params"`
}
var Defaults = Config{"localhost", 9999, "sqlite3", "./nyaa.db?cache_size=50"}
@@ -50,15 +50,15 @@ func (config *Config) BindFlags() processFlags {
db_params := flag.String("dbparams", Defaults.DBParams, "parameters to open the database (see Gorm's doc)")
return func() error {
- err := config.HandleConfFileFlag(*conf_file)
- if err != nil {
- return err
- }
// You can override fields in the config file with flags.
config.Host = *host
config.Port = *port
config.DBParams = *db_params
- err = config.SetDBType(*db_type)
+ err := config.SetDBType(*db_type)
+ if err != nil {
+ return err
+ }
+ err = config.HandleConfFileFlag(*conf_file)
return err
}
}