Skip to content

Instantly share code, notes, and snippets.

@andrielfn
Created April 28, 2015 16:24
Show Gist options
  • Save andrielfn/fa72ae35b48415967600 to your computer and use it in GitHub Desktop.
Save andrielfn/fa72ae35b48415967600 to your computer and use it in GitHub Desktop.
Script to populate MySQL databases up to the *size-limit*. OS X binary download: https://www.dropbox.com/s/2gecxhqkxa7wpmq/bombsql?dl=0.
package main
import (
"database/sql"
"fmt"
"log"
"os"
"strconv"
_ "github.com/go-sql-driver/mysql"
)
type DBSession struct {
DB *sql.DB
Host string
Username string
Password string
Database string
SizeLimit float64
}
func Test(err error) {
if err != nil {
panic(err.Error())
}
}
func NewDBSession(args []string) *DBSession {
host := fmt.Sprintf(
"%v:%v@tcp(%v:3306)/%v",
args[2],
args[3],
args[1],
args[4])
fmt.Println(host)
db, err := sql.Open("mysql", host)
Test(err)
sizeLimit, err := strconv.ParseFloat(args[5], 64)
Test(err)
s := &DBSession{
DB: db,
Host: args[1],
Username: args[2],
Password: args[3],
Database: args[4],
SizeLimit: sizeLimit}
return s
}
func (d *DBSession) Close() {
d.DB.Close()
}
func (d *DBSession) DBSize() int {
rows, err := d.DB.Query(
"SELECT table_schema 'database', SUM(data_length + index_length) 'database_size' " +
"FROM information_schema.TABLES " +
"GROUP BY table_schema " +
"HAVING table_schema='" + d.Database + "'")
Test(err)
cols, err := rows.Columns()
Test(err)
values := make([]sql.RawBytes, len(cols))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
rows.Next()
rows.Scan(scanArgs...)
size, err := strconv.Atoi(string(values[1]))
Test(err)
return size
}
func main() {
if len(os.Args) < 6 {
fmt.Println("Usage: bombsql [host] [user] [pass] [db] [size-limit]")
os.Exit(1)
}
db := NewDBSession(os.Args)
defer db.Close()
stmtCreateTbl, err := db.DB.Prepare("CREATE TABLE bomb(bombed VARCHAR(100) NOT NULL)")
Test(err)
_, err = stmtCreateTbl.Exec()
stmtCreateTbl.Close()
// log.Println(err.Error())
sqlStr := "INSERT INTO bomb VALUES "
for i := 0; i < 10000; i++ {
if i == 0 {
sqlStr += fmt.Sprintf("('%v')", "Bombbbeeeeeeeeerrrrrrrrrrrr")
} else {
sqlStr += fmt.Sprintf(", ('%v')", "Bombbbeeeeeeeeerrrrrrrrrrrrzzzzzz")
}
}
dbSize := float64(db.DBSize()) / 1024.0 / 1024.0
log.Printf("%.2f MB populated so far", dbSize)
for dbSize < db.SizeLimit {
_, err = db.DB.Exec(sqlStr)
Test(err)
log.Printf("%.2f MB populated so far", dbSize)
dbSize = float64(db.DBSize()) / 1024.0 / 1024.0
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment