From 05556daf26afdb3350fb95b91b4a8c6b9bda0d80 Mon Sep 17 00:00:00 2001 From: Herman Schaaf Date: Sun, 28 Jul 2019 14:35:28 +0100 Subject: [PATCH] start implementation of database package --- .gitignore | 2 ++ database/db.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 37 ++++++-------------- 3 files changed, 104 insertions(+), 26 deletions(-) create mode 100644 database/db.go diff --git a/.gitignore b/.gitignore index ab243a0..434864e 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ _testmain.go _repos goreportcard.db + +var \ No newline at end of file diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..9a7c493 --- /dev/null +++ b/database/db.go @@ -0,0 +1,91 @@ +package database + +import ( + "github.com/go-redis/redis" + "github.com/siddontang/ledisdb/config" + "github.com/siddontang/ledisdb/ledis" +) + +type Database interface { + Get(string) (string, error) + Set(string, string) error + Close() error +} + +// GetConnection connects to the Redis/Ledis database (or creates it if it does not exist, in the case of Ledis), +// and creates a space for saving the repos, also only if it does not exist. +func GetConnection(redisHost string) (Database, error) { + if redisHost == "" { + return newLedisDatabase() + } + return newRedisDatabase(redisHost) +} + +type ledisDatabase struct { + connection *ledis.DB +} + +func (l *ledisDatabase) Get(k string) (string, error) { + b, _ := l.connection.Get([]byte(k)) + return string(b), nil +} + +func (l *ledisDatabase) Set(k, v string) error { + return l.connection.Set([]byte(k), []byte(v)) +} + +func (l *ledisDatabase) Close() error { + return nil +} + +func newLedisDatabase() (*ledisDatabase, error) { + db, err := connectLedis() + if err != nil { + return nil, err + } + return &ledisDatabase{connection: db}, nil +} + +func connectLedis() (*ledis.DB, error) { + // connect to ledis + l, err := ledis.Open(config.NewConfigDefault()) + if err != nil { + return nil, err + } + db, err := l.Select(0) + if err != nil { + return nil, err + } + return db, nil +} + +type redisDatabase struct { + connection *redis.Client +} + +func newRedisDatabase(redisHost string) (*redisDatabase, error) { + db := connectRedis(redisHost) + err := db.Echo("test").Err() + return &redisDatabase{connection: db}, err +} + +func (r *redisDatabase) Get(k string) (string, error) { + return r.connection.Get(k).Result() +} + +func (r *redisDatabase) Set(k, v string) error { + return r.connection.Set(k, v, 0).Err() +} + +func (r *redisDatabase) Close() error { + return r.connection.Close() +} + +func connectRedis(redisHost string) *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: redisHost, + Password: "", // no password set + DB: 0, // use default DB + }) + return client +} diff --git a/main.go b/main.go index dc8a968..7139f3d 100644 --- a/main.go +++ b/main.go @@ -9,15 +9,17 @@ import ( "regexp" "time" + "github.com/gojp/goreportcard/database" + "github.com/gojp/goreportcard/handlers" - "github.com/boltdb/bolt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( - addr = flag.String("http", ":8000", "HTTP listen address") + addr string + redisHost string ) func makeHandler(name string, fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { @@ -57,26 +59,6 @@ func makeHandler(name string, fn func(http.ResponseWriter, *http.Request, string } } -// initDB opens the bolt database file (or creates it if it does not exist), and creates -// a bucket for saving the repos, also only if it does not exist. -func initDB() error { - db, err := bolt.Open(handlers.DBPath, 0600, &bolt.Options{Timeout: 1 * time.Second}) - if err != nil { - return err - } - defer db.Close() - - err = db.Update(func(tx *bolt.Tx) error { - _, err := tx.CreateBucketIfNotExists([]byte(handlers.RepoBucket)) - if err != nil { - return err - } - _, err = tx.CreateBucketIfNotExists([]byte(handlers.MetaBucket)) - return err - }) - return err -} - // metrics provides functionality for monitoring the application status type metrics struct { responseTimes *prometheus.SummaryVec @@ -114,14 +96,17 @@ func (m metrics) instrument(path string, h http.HandlerFunc) (string, http.Handl } func main() { + flag.StringVar(&addr, "http", ":8000", "HTTP listen address") + flag.StringVar(&redisHost, "redis", "", "Address of Redis server") flag.Parse() if err := os.MkdirAll("_repos/src/github.com", 0755); err != nil && !os.IsExist(err) { log.Fatal("ERROR: could not create repos dir: ", err) } // initialize database - if err := initDB(); err != nil { - log.Fatal("ERROR: could not open bolt db: ", err) + _, err := database.GetConnection(redisHost) + if err != nil { + log.Fatal("ERROR: could not connect to db: ", err) } m := setupMetrics() @@ -137,6 +122,6 @@ func main() { http.Handle("/metrics", promhttp.Handler()) - log.Printf("Running on %s ...", *addr) - log.Fatal(http.ListenAndServe(*addr, nil)) + log.Printf("Running on %s ...", addr) + log.Fatal(http.ListenAndServe(addr, nil)) }