func FactoidDriver(db *db.Database, l logging.Logger) *factoidDriver { fc := factoids.Collection(db, l) return &factoidDriver{ FactoidCollection: fc, lastseen: make(map[string]bson.ObjectId), plugins: make([]base.Plugin, 0), l: l, } }
func main() { flag.Parse() log = logging.NewFromFlags() // Let's go find some mongo. mdb, err := db.Connect("localhost") if err != nil { log.Fatal("Oh no: %v", err) } defer mdb.Session.Close() fc := factoids.Collection(mdb, log) // A communication channel of Factoids. facts := make(chan *factoids.Factoid) rows := make(chan []interface{}) // Function to feed rows into the rows channel. row_feeder := func(sth *sqlite3.Statement, row ...interface{}) { rows <- row } // Function to execute a query on the SQLite db. db_query := func(dbh *sqlite3.Database) { n, err := dbh.Execute("SELECT * FROM Factoids;", row_feeder) if err == nil { log.Info("Read %d rows from database.\n", n) } else { log.Error("DB error: %s\n", err) } } // Open up the factoid database in a goroutine and feed rows // in on the input_rows channel. go func() { sqlite3.Session(*file, db_query) // once we've done the query, close the channel to indicate this close(rows) }() // Another goroutine to munge the rows into factoids. // This was originally done inside the SQLite callbacks, but // cgo or sqlite3 obscures runtime panics and makes fail happen. go func() { for row := range rows { parseFactoid(row, facts) } close(facts) }() // And finally... count := 0 for fact := range facts { // ... push each fact into mongo err = fc.Insert(fact) if err != nil { log.Error("Awww: %v\n", err) } else { if count%1000 == 0 { fmt.Printf("%d...", count) } count++ } } fmt.Println("done.") log.Info("Inserted %d factoids.\n", count) }