package sfive import "time" type appendManyToken struct { data []StatisticsData response chan bool } type StatsSinkServer struct { store sqliteStore quit chan bool done chan bool appendData chan StatisticsData appendManyData chan appendManyToken // chan []StatisticsData } func (self StatsSinkServer) appendActor() { defer func() { self.done <- true }() for { select { case <-self.quit: return case value := <-self.appendData: var err error for tryNum := 0; tryNum < 5; tryNum++ { err = self.store.Append(value) if err != nil { time.Sleep(1 * time.Second) } else { break } } if err != nil { s5l.Printf("failed to store data: %v\n", err) } case token := <-self.appendManyData: err := self.store.AppendMany(token.data) if err != nil { s5l.Printf("failed to store many data: %v\n", err) token.response <- false } else { token.response <- true } } } } func (self StatsSinkServer) Close() { self.quit <- true <-self.done close(self.quit) close(self.done) close(self.appendData) close(self.appendManyData) self.store.Close() } func NewServer(mysql bool, dbPath string) (server *StatsSinkServer, err error) { // TODO read configuration and create instance with correct settings server = new(StatsSinkServer) server.store, err = NewStore(mysql, dbPath) if err != nil { return } server.quit = make(chan bool) server.done = make(chan bool) server.appendData = make(chan StatisticsData, 100) server.appendManyData = make(chan appendManyToken, 5) go server.appendActor() return }