github.com/orofarne/hammy@v0.0.0-20130409105742-374fadfd6ecb/src/hammy/mysql_triggers.go (about) 1 package hammy 2 3 import ( 4 "fmt" 5 "database/sql" 6 _ "github.com/ziutek/mymysql/godrv" 7 ) 8 9 // Driver for retriving triggers from MySQL database 10 // It's assumes the table structure like this: 11 // 12 // CREATE TABLE `triggers` ( 13 // `host` varchar(255) NOT NULL, 14 // `trigger` text, 15 // PRIMARY KEY (`host`) 16 // ) ENGINE=InnoDB DEFAULT CHARSET=utf8 17 // 18 type MySQLTriggersGetter struct { 19 db *sql.DB 20 tableName string 21 pool chan int 22 } 23 24 func NewMySQLTriggersGetter(cfg Config) (tg *MySQLTriggersGetter, err error) { 25 tg = new(MySQLTriggersGetter) 26 tg.db, err = sql.Open("mymysql", cfg.MySQLTriggers.Database + "/" + cfg.MySQLTriggers.User + "/" + cfg.MySQLTriggers.Password) 27 if err != nil { 28 return 29 } 30 31 tg.tableName = cfg.MySQLTriggers.Table 32 33 tg.pool = make(chan int, cfg.MySQLTriggers.MaxConn) 34 for i := 0; i < cfg.MySQLTriggers.MaxConn; i++ { 35 tg.pool <- 1 36 } 37 38 return 39 } 40 41 func (tg *MySQLTriggersGetter) MGet(keys []string) (triggers map[string]string, err error) { 42 // Pool limits 43 <- tg.pool 44 defer func() { 45 tg.pool <- 1 46 }() 47 48 triggers = make(map[string]string) 49 50 n := len(keys) 51 // Selecting triggers by 10 rows 52 for i := 0; i < n; i += 10 { 53 var subkeys []string 54 if (i + 10) < n { 55 subkeys = keys[i:i+10] 56 } else { 57 subkeys = keys[i:] 58 } 59 60 m := len(subkeys) 61 62 sql := fmt.Sprintf("SELECT `host`, `trigger` FROM `%s` WHERE `host` IN (?", tg.tableName) 63 for j := 1; j < m; j++ { 64 sql += ", ?" 65 } 66 sql += ")" 67 68 args := make([]interface{}, m) 69 for k, s := range subkeys { 70 args[k] = s 71 } 72 73 rows, e := tg.db.Query(sql, args...) 74 if e != nil { 75 err = e 76 return 77 } 78 79 for rows.Next() { 80 var k, tr string 81 err = rows.Scan(&k, &tr) 82 if err != nil { 83 return 84 } 85 86 triggers[k] = tr 87 } 88 } 89 90 return 91 }