summaryrefslogtreecommitdiff
path: root/src/helsinki.at/rhimport/rddb.go
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2015-12-07 16:16:40 (GMT)
committerChristian Pointner <equinox@helsinki.at>2015-12-08 00:34:53 (GMT)
commita1b290f026011276f9c16f6af390a2aceb2f9ccc (patch)
tree2f7be9167b918b16c82d3f71f057a610f6ca749e /src/helsinki.at/rhimport/rddb.go
parent6e5d14f4a2189dbc0f0404c398d11878e356ecd7 (diff)
moved DB into seperate module
Diffstat (limited to 'src/helsinki.at/rhimport/rddb.go')
-rw-r--r--src/helsinki.at/rhimport/rddb.go131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/helsinki.at/rhimport/rddb.go b/src/helsinki.at/rhimport/rddb.go
new file mode 100644
index 0000000..2a87388
--- /dev/null
+++ b/src/helsinki.at/rhimport/rddb.go
@@ -0,0 +1,131 @@
+//
+// rhimportd
+//
+// The Radio Helsinki Rivendell Import Daemon
+//
+//
+// Copyright (C) 2015 Christian Pointner <equinox@helsinki.at>
+//
+// This file is part of rhimportd.
+//
+// rhimportd is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// any later version.
+//
+// rhimportd is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with rhimportd. If not, see <http://www.gnu.org/licenses/>.
+//
+
+package rhimport
+
+import (
+ "database/sql"
+ "fmt"
+ _ "github.com/go-sql-driver/mysql"
+)
+
+type getPasswordResult struct {
+ password string
+ err error
+}
+
+type getPasswordRequest struct {
+ username string
+ cached bool
+ response chan getPasswordResult
+}
+
+type RDDB struct {
+ dbh *sql.DB
+ password_cache map[string]string
+ getPasswordChan chan getPasswordRequest
+ dbGetPasswordStmt *sql.Stmt
+ quit chan bool
+ done chan bool
+}
+
+func (self *RDDB) init(conf *Config) (err error) {
+ dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", conf.db_user, conf.db_passwd, conf.db_host, conf.db_db)
+ if self.dbh, err = sql.Open("mysql", dsn); err != nil {
+ return
+ }
+ if self.dbGetPasswordStmt, err = self.dbh.Prepare("select PASSWORD from USERS where LOGIN_NAME = ?"); err != nil {
+ return
+ }
+
+ return
+}
+
+func (self *RDDB) getPassword(username string, cached bool) (pwd string, err error) {
+
+ if cached {
+ pwd = self.password_cache[username]
+ }
+
+ if pwd == "" {
+ err = self.dbGetPasswordStmt.QueryRow(username).Scan(&pwd)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ err = fmt.Errorf("user '%s' not known by rivendell", username)
+ }
+ return
+ }
+ self.password_cache[username] = pwd
+ }
+
+ return
+}
+
+func (self *RDDB) dispatchRequests() {
+ defer func() { self.done <- true }()
+ for {
+ select {
+ case <-self.quit:
+ return
+ case req := <-self.getPasswordChan:
+ if req.cached {
+ rhdl.Println("RDDB: got getPassword request for", req.username, "(cached)")
+ } else {
+ rhdl.Println("RDDB: got getPassword request for", req.username, "(not cached)")
+ }
+ pwd, err := self.getPassword(req.username, req.cached)
+ req.response <- getPasswordResult{pwd, err}
+ }
+ }
+}
+
+func (self *RDDB) Cleanup() {
+ self.quit <- true
+ <-self.done
+ close(self.quit)
+ close(self.done)
+ close(self.getPasswordChan)
+ if self.dbh != nil {
+ self.dbh.Close()
+ }
+ if self.dbGetPasswordStmt != nil {
+ self.dbGetPasswordStmt.Close()
+ }
+}
+
+func NewRDDB(conf *Config) (db *RDDB, err error) {
+ db = new(RDDB)
+
+ db.quit = make(chan bool)
+ db.done = make(chan bool)
+ db.password_cache = make(map[string]string)
+ db.getPasswordChan = make(chan getPasswordRequest)
+
+ if err = db.init(conf); err != nil {
+ return
+ }
+
+ go db.dispatchRequests()
+ return
+}