From 8fc2a9c93d566feae576c1421b3c64dabc4b4976 Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@helsinki.at>
Date: Sun, 20 Dec 2015 02:29:13 +0100
Subject: improved type safety


diff --git a/src/helsinki.at/rhimport/fetcher.go b/src/helsinki.at/rhimport/fetcher.go
index 300abef..a8ac22c 100644
--- a/src/helsinki.at/rhimport/fetcher.go
+++ b/src/helsinki.at/rhimport/fetcher.go
@@ -101,7 +101,7 @@ func FetchFileCurl(ctx *ImportContext, res *FetchResult, uri *url.URL) (err erro
 
 		cbdata := &FetcherCurlCBData{remotename: path.Base(uri.Path)}
 		defer cbdata.Cleanup()
-		if cbdata.basepath, err = ioutil.TempDir(ctx.Config.TempDir, "rhimportd-"); err != nil {
+		if cbdata.basepath, err = ioutil.TempDir(ctx.conf.TempDir, "rhimportd-"); err != nil {
 			return
 		}
 
@@ -142,7 +142,7 @@ func FetchFileLocal(ctx *ImportContext, res *FetchResult, uri *url.URL) (err err
 		ctx.ProgressCallBack(1, "fetching", 1.0, ctx.ProgressCallBackData)
 	}
 
-	ctx.SourceFile = filepath.Join(ctx.Config.LocalFetchDir, path.Clean("/"+uri.Path))
+	ctx.SourceFile = filepath.Join(ctx.conf.LocalFetchDir, path.Clean("/"+uri.Path))
 	var src *os.File
 	if src, err = os.Open(ctx.SourceFile); err != nil {
 		res.ResponseCode = http.StatusBadRequest
@@ -194,13 +194,14 @@ func checkPassword(ctx *ImportContext, result *FetchResult) (err error) {
 	cached := true
 
 	for {
+		res_ch := make(chan getPasswordResult)
 		req := getPasswordRequest{}
 		req.username = ctx.UserName
 		req.cached = cached
-		req.response = make(chan getPasswordResult)
-		ctx.RdDb.getPasswordChan <- req
+		req.response = res_ch
+		ctx.rddb.getPasswordChan <- req
 
-		res := <-req.response
+		res := <-res_ch
 		if res.err != nil {
 			return res.err
 		}
diff --git a/src/helsinki.at/rhimport/importer.go b/src/helsinki.at/rhimport/importer.go
index 1404259..f65515b 100644
--- a/src/helsinki.at/rhimport/importer.go
+++ b/src/helsinki.at/rhimport/importer.go
@@ -40,8 +40,8 @@ var (
 )
 
 type ImportContext struct {
-	*Config
-	*RdDb
+	conf                 *Config
+	rddb                 *RdDbChan
 	UserName             string
 	Password             string
 	Trusted              bool
@@ -63,10 +63,10 @@ type ImportContext struct {
 	ProgressCallBackData interface{}
 }
 
-func NewImportContext(conf *Config, rddb *RdDb, user string) *ImportContext {
+func NewImportContext(conf *Config, rddb *RdDbChan, user string) *ImportContext {
 	ctx := new(ImportContext)
-	ctx.Config = conf
-	ctx.RdDb = rddb
+	ctx.conf = conf
+	ctx.rddb = rddb
 	ctx.UserName = user
 	ctx.Password = ""
 	ctx.Trusted = false
@@ -121,13 +121,14 @@ func (ctx *ImportContext) SanityCheck() error {
 }
 
 func (ctx *ImportContext) getPassword(cached bool) (err error) {
+	res_ch := make(chan getPasswordResult)
 	req := getPasswordRequest{}
 	req.username = ctx.UserName
 	req.cached = cached
-	req.response = make(chan getPasswordResult)
-	ctx.RdDb.getPasswordChan <- req
+	req.response = res_ch
+	ctx.rddb.getPasswordChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		return res.err
 	}
@@ -136,12 +137,13 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) {
 }
 
 func (ctx *ImportContext) getGroupOfCart() error {
+	res_ch := make(chan getGroupOfCartResult)
 	req := getGroupOfCartRequest{}
 	req.cart = ctx.Cart
-	req.response = make(chan getGroupOfCartResult)
-	ctx.RdDb.getGroupOfCartChan <- req
+	req.response = res_ch
+	ctx.rddb.getGroupOfCartChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		return res.err
 	}
@@ -150,12 +152,13 @@ func (ctx *ImportContext) getGroupOfCart() error {
 }
 
 func (ctx *ImportContext) getShowInfo() (carts []uint, err error) {
+	res_ch := make(chan getShowInfoResult)
 	req := getShowInfoRequest{}
 	req.showid = ctx.ShowId
-	req.response = make(chan getShowInfoResult)
-	ctx.RdDb.getShowInfoChan <- req
+	req.response = res_ch
+	ctx.rddb.getShowInfoChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		err = res.err
 		return
@@ -170,12 +173,13 @@ func (ctx *ImportContext) getShowInfo() (carts []uint, err error) {
 }
 
 func (ctx *ImportContext) checkMusicGroup() (bool, error) {
+	res_ch := make(chan checkMusicGroupResult)
 	req := checkMusicGroupRequest{}
 	req.group = ctx.GroupName
-	req.response = make(chan checkMusicGroupResult)
-	ctx.RdDb.checkMusicGroupChan <- req
+	req.response = res_ch
+	ctx.rddb.checkMusicGroupChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		return false, res.err
 	}
@@ -183,12 +187,13 @@ func (ctx *ImportContext) checkMusicGroup() (bool, error) {
 }
 
 func (ctx *ImportContext) getMusicInfo() (err error) {
+	res_ch := make(chan getMusicInfoResult)
 	req := getMusicInfoRequest{}
 	req.group = ctx.GroupName
-	req.response = make(chan getMusicInfoResult)
-	ctx.RdDb.getMusicInfoChan <- req
+	req.response = res_ch
+	ctx.rddb.getMusicInfoChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		return res.err
 	}
@@ -251,7 +256,7 @@ func add_cart(ctx *ImportContext, res *ImportResult) (err error) {
 	w.Close()
 
 	var resp *http.Response
-	if resp, err = send_post_request(ctx.Config.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
+	if resp, err = send_post_request(ctx.conf.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
 		return
 	}
 	defer resp.Body.Close()
@@ -296,7 +301,7 @@ func add_cut(ctx *ImportContext, res *ImportResult) (err error) {
 	w.Close()
 
 	var resp *http.Response
-	if resp, err = send_post_request(ctx.Config.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
+	if resp, err = send_post_request(ctx.conf.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
 		return
 	}
 	defer resp.Body.Close()
@@ -343,7 +348,7 @@ func remove_cart(ctx *ImportContext, res *ImportResult) (err error) {
 	w.Close()
 
 	var resp *http.Response
-	if resp, err = send_post_request(ctx.Config.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
+	if resp, err = send_post_request(ctx.conf.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
 		return
 	}
 	defer resp.Body.Close()
@@ -380,7 +385,7 @@ func remove_cut(ctx *ImportContext, res *ImportResult) (err error) {
 	w.Close()
 
 	var resp *http.Response
-	if resp, err = send_post_request(ctx.Config.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
+	if resp, err = send_post_request(ctx.conf.RDXportEndpoint, &b, w.FormDataContentType()); err != nil {
 		return
 	}
 	defer resp.Body.Close()
@@ -455,7 +460,7 @@ func import_audio(ctx *ImportContext, res *ImportResult) (err error) {
 	if easy != nil {
 		defer easy.Cleanup()
 
-		easy.Setopt(curl.OPT_URL, ctx.Config.RDXportEndpoint)
+		easy.Setopt(curl.OPT_URL, ctx.conf.RDXportEndpoint)
 		easy.Setopt(curl.OPT_POST, true)
 
 		var form *curl.Form
diff --git a/src/helsinki.at/rhimport/rddb.go b/src/helsinki.at/rhimport/rddb.go
index 25ef876..f596171 100644
--- a/src/helsinki.at/rhimport/rddb.go
+++ b/src/helsinki.at/rhimport/rddb.go
@@ -49,7 +49,7 @@ type getPasswordResult struct {
 type getPasswordRequest struct {
 	username string
 	cached   bool
-	response chan getPasswordResult
+	response chan<- getPasswordResult
 }
 
 type getGroupOfCartResult struct {
@@ -59,7 +59,7 @@ type getGroupOfCartResult struct {
 
 type getGroupOfCartRequest struct {
 	cart     uint
-	response chan getGroupOfCartResult
+	response chan<- getGroupOfCartResult
 }
 
 type getShowInfoResult struct {
@@ -73,7 +73,7 @@ type getShowInfoResult struct {
 
 type getShowInfoRequest struct {
 	showid   uint
-	response chan getShowInfoResult
+	response chan<- getShowInfoResult
 }
 
 type checkMusicGroupResult struct {
@@ -83,7 +83,7 @@ type checkMusicGroupResult struct {
 
 type checkMusicGroupRequest struct {
 	group    string
-	response chan checkMusicGroupResult
+	response chan<- checkMusicGroupResult
 }
 
 type getMusicInfoResult struct {
@@ -94,7 +94,15 @@ type getMusicInfoResult struct {
 
 type getMusicInfoRequest struct {
 	group    string
-	response chan getMusicInfoResult
+	response chan<- getMusicInfoResult
+}
+
+type RdDbChan struct {
+	getPasswordChan     chan<- getPasswordRequest
+	getGroupOfCartChan  chan<- getGroupOfCartRequest
+	getShowInfoChan     chan<- getShowInfoRequest
+	checkMusicGroupChan chan<- checkMusicGroupRequest
+	getMusicInfoChan    chan<- getMusicInfoRequest
 }
 
 type RdDb struct {
@@ -289,6 +297,16 @@ func (self *RdDb) dispatchRequests() {
 	}
 }
 
+func (self *RdDb) GetChannels() *RdDbChan {
+	ch := &RdDbChan{}
+	ch.getPasswordChan = self.getPasswordChan
+	ch.getGroupOfCartChan = self.getGroupOfCartChan
+	ch.getShowInfoChan = self.getShowInfoChan
+	ch.checkMusicGroupChan = self.checkMusicGroupChan
+	ch.getMusicInfoChan = self.getMusicInfoChan
+	return ch
+}
+
 func (self *RdDb) Cleanup() {
 	self.quit <- true
 	<-self.done
diff --git a/src/helsinki.at/rhimport/session.go b/src/helsinki.at/rhimport/session.go
index 219c233..718d13e 100644
--- a/src/helsinki.at/rhimport/session.go
+++ b/src/helsinki.at/rhimport/session.go
@@ -61,7 +61,7 @@ type sessionRunResponse struct {
 type sessionRunRequest struct {
 	user     string
 	id       string
-	response chan sessionRunResponse
+	response chan<- sessionRunResponse
 }
 
 type sessionAddProgressHandlerResponse struct {
@@ -72,8 +72,8 @@ type sessionAddProgressHandlerRequest struct {
 	user     string
 	id       string
 	userdata interface{}
-	handler  chan ProgressData
-	response chan sessionAddProgressHandlerResponse
+	handler  chan<- ProgressData
+	response chan<- sessionAddProgressHandlerResponse
 }
 
 type sessionAddDoneHandlerResponse struct {
@@ -84,8 +84,8 @@ type sessionAddDoneHandlerRequest struct {
 	user     string
 	id       string
 	userdata interface{}
-	handler  chan ImportResult
-	response chan sessionAddDoneHandlerResponse
+	handler  chan<- ImportResult
+	response chan<- sessionAddDoneHandlerResponse
 }
 
 type sessionRemoveResponse struct {
@@ -125,12 +125,13 @@ func (self *SessionStore) newSession(ctx ImportContext) (resp newSessionResponse
 }
 
 func (self *SessionStore) NewSession(ctx ImportContext) (string, error) {
+	res_ch := make(chan newSessionResponse)
 	req := newSessionRequest{}
 	req.ctx = ctx
-	req.response = make(chan newSessionResponse)
+	req.response = res_ch
 	self.newChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	if res.err != nil {
 		return "", res.err
 	}
@@ -147,17 +148,18 @@ func (self *SessionStore) run(user, id string) (resp sessionRunResponse) {
 }
 
 func (self *SessionStore) Run(user, id string) error {
+	res_ch := make(chan sessionRunResponse)
 	req := sessionRunRequest{}
 	req.user = user
 	req.id = id
-	req.response = make(chan sessionRunResponse)
+	req.response = res_ch
 	self.runChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	return res.err
 }
 
-func (self *SessionStore) addProgressHandler(user, id string, userdata interface{}, handler chan ProgressData) (resp sessionAddProgressHandlerResponse) {
+func (self *SessionStore) addProgressHandler(user, id string, userdata interface{}, handler chan<- ProgressData) (resp sessionAddProgressHandlerResponse) {
 	if _, exists := self.store[user][id]; exists {
 		rhdl.Printf("SessionStore: adding progress handler to '%s/%s'", user, id)
 	} else {
@@ -166,20 +168,21 @@ func (self *SessionStore) addProgressHandler(user, id string, userdata interface
 	return
 }
 
-func (self *SessionStore) AddProgressHandler(user, id string, userdata interface{}, handler chan ProgressData) error {
+func (self *SessionStore) AddProgressHandler(user, id string, userdata interface{}, handler chan<- ProgressData) error {
+	res_ch := make(chan sessionAddProgressHandlerResponse)
 	req := sessionAddProgressHandlerRequest{}
 	req.user = user
 	req.id = id
 	req.userdata = userdata
 	req.handler = handler
-	req.response = make(chan sessionAddProgressHandlerResponse)
+	req.response = res_ch
 	self.addProgressChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	return res.err
 }
 
-func (self *SessionStore) addDoneHandler(user, id string, userdata interface{}, handler chan ImportResult) (resp sessionAddDoneHandlerResponse) {
+func (self *SessionStore) addDoneHandler(user, id string, userdata interface{}, handler chan<- ImportResult) (resp sessionAddDoneHandlerResponse) {
 	if _, exists := self.store[user][id]; exists {
 		rhdl.Printf("SessionStore: adding done handler to '%s/%s'", user, id)
 	} else {
@@ -188,16 +191,17 @@ func (self *SessionStore) addDoneHandler(user, id string, userdata interface{},
 	return
 }
 
-func (self *SessionStore) AddDoneHandler(user, id string, userdata interface{}, handler chan ImportResult) error {
+func (self *SessionStore) AddDoneHandler(user, id string, userdata interface{}, handler chan<- ImportResult) error {
+	res_ch := make(chan sessionAddDoneHandlerResponse)
 	req := sessionAddDoneHandlerRequest{}
 	req.user = user
 	req.id = id
 	req.userdata = userdata
 	req.handler = handler
-	req.response = make(chan sessionAddDoneHandlerResponse)
+	req.response = res_ch
 	self.addDoneChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	return res.err
 }
 
@@ -218,13 +222,14 @@ func (self *SessionStore) remove(user, id string) (resp sessionRemoveResponse) {
 }
 
 func (self *SessionStore) Remove(user, id string) error {
+	res_ch := make(chan sessionRemoveResponse)
 	req := sessionRemoveRequest{}
 	req.user = user
 	req.id = id
-	req.response = make(chan sessionRemoveResponse)
+	req.response = res_ch
 	self.removeChan <- req
 
-	res := <-req.response
+	res := <-res_ch
 	return res.err
 }
 
diff --git a/src/helsinki.at/rhimportd/ctrlTelnet.go b/src/helsinki.at/rhimportd/ctrlTelnet.go
index 49971e1..04d90da 100644
--- a/src/helsinki.at/rhimportd/ctrlTelnet.go
+++ b/src/helsinki.at/rhimportd/ctrlTelnet.go
@@ -43,7 +43,7 @@ type TelnetClient struct {
 	scanner *bufio.Scanner
 	writer  *bufio.Writer
 	conf    *rhimport.Config
-	rddb    *rhimport.RdDb
+	rddb    *rhimport.RdDbChan
 	ctx     *rhimport.ImportContext
 }
 
@@ -148,7 +148,7 @@ func (c *TelnetClient) handle_cmd_set(args []string) {
 	}
 	if c.ctx == nil {
 		c.ctx = rhimport.NewImportContext(c.conf, c.rddb, "")
-		c.ctx.Trusted = false
+		c.ctx.Trusted = true
 	}
 	switch strings.ToLower(args[0]) {
 	case "username":
@@ -365,7 +365,7 @@ func (c *TelnetClient) handle() {
 	}
 }
 
-func newTelnetClient(conn net.Conn, conf *rhimport.Config, rddb *rhimport.RdDb) (c *TelnetClient) {
+func newTelnetClient(conn net.Conn, conf *rhimport.Config, rddb *rhimport.RdDbChan) (c *TelnetClient) {
 	rhl.Println("telnet-ctrl: new client from:", conn.RemoteAddr())
 	c = &TelnetClient{}
 	c.conn = conn
@@ -377,7 +377,7 @@ func newTelnetClient(conn net.Conn, conf *rhimport.Config, rddb *rhimport.RdDb)
 	return c
 }
 
-func StartControlTelnet(addr_s string, conf *rhimport.Config, rddb *rhimport.RdDb) {
+func StartControlTelnet(addr_s string, conf *rhimport.Config, rddb *rhimport.RdDbChan) {
 	rhl.Println("telnet-ctrl: listening on", addr_s)
 
 	server, err := net.Listen("tcp", addr_s)
diff --git a/src/helsinki.at/rhimportd/ctrlWeb.go b/src/helsinki.at/rhimportd/ctrlWeb.go
index 8aff492..6b6568d 100644
--- a/src/helsinki.at/rhimportd/ctrlWeb.go
+++ b/src/helsinki.at/rhimportd/ctrlWeb.go
@@ -32,16 +32,16 @@ import (
 
 type webHandler struct {
 	*rhimport.Config
-	*rhimport.RdDb
+	*rhimport.RdDbChan
 	trusted bool
-	H       func(*rhimport.Config, *rhimport.RdDb, bool, http.ResponseWriter, *http.Request)
+	H       func(*rhimport.Config, *rhimport.RdDbChan, bool, http.ResponseWriter, *http.Request)
 }
 
 func (self webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	self.H(self.Config, self.RdDb, self.trusted, w, r)
+	self.H(self.Config, self.RdDbChan, self.trusted, w, r)
 }
 
-func StartControlWeb(addr_s string, conf *rhimport.Config, rddb *rhimport.RdDb) {
+func StartControlWeb(addr_s string, conf *rhimport.Config, rddb *rhimport.RdDbChan) {
 	http.Handle("/public/simple", webHandler{conf, rddb, false, webSimpleHandler})
 	http.Handle("/trusted/simple", webHandler{conf, rddb, true, webSimpleHandler})
 
diff --git a/src/helsinki.at/rhimportd/ctrlWebSimple.go b/src/helsinki.at/rhimportd/ctrlWebSimple.go
index da240a8..8ea5ac3 100644
--- a/src/helsinki.at/rhimportd/ctrlWebSimple.go
+++ b/src/helsinki.at/rhimportd/ctrlWebSimple.go
@@ -91,7 +91,7 @@ func webSimpleResponse(w http.ResponseWriter, result *rhimport.ImportResult) {
 	encoder.Encode(respdata)
 }
 
-func webSimpleParseRequest(conf *rhimport.Config, rddb *rhimport.RdDb, trusted bool, r *http.Request) (ctx *rhimport.ImportContext, err error) {
+func webSimpleParseRequest(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bool, r *http.Request) (ctx *rhimport.ImportContext, err error) {
 
 	decoder := json.NewDecoder(r.Body)
 	reqdata := newWebSimpleRequestData(conf)
@@ -121,7 +121,7 @@ func webSimpleParseRequest(conf *rhimport.Config, rddb *rhimport.RdDb, trusted b
 	return
 }
 
-func webSimpleHandler(conf *rhimport.Config, rddb *rhimport.RdDb, trusted bool, w http.ResponseWriter, r *http.Request) {
+func webSimpleHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bool, w http.ResponseWriter, r *http.Request) {
 	rhdl.Printf("SimpleHandler: request for '%s'", html.EscapeString(r.URL.Path))
 
 	var ctx *rhimport.ImportContext
diff --git a/src/helsinki.at/rhimportd/main.go b/src/helsinki.at/rhimportd/main.go
index b6ac68b..d599cd5 100644
--- a/src/helsinki.at/rhimportd/main.go
+++ b/src/helsinki.at/rhimportd/main.go
@@ -82,7 +82,7 @@ func main() {
 	go func() {
 		defer wg.Done()
 		rhl.Println("starting web-ctrl")
-		StartControlWeb(*web_addr_s, conf, rddb)
+		StartControlWeb(*web_addr_s, conf, rddb.GetChannels())
 		rhl.Println("web-ctrl finished")
 	}()
 
@@ -90,7 +90,7 @@ func main() {
 	go func() {
 		defer wg.Done()
 		rhl.Println("starting telnet-ctrl")
-		StartControlTelnet(*telnet_addr_s, conf, rddb)
+		StartControlTelnet(*telnet_addr_s, conf, rddb.GetChannels())
 		rhl.Println("telnet-ctrl finished")
 	}()
 
-- 
cgit v0.10.2