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  }