From 9a6cddc11e1cfd089f7e530b8130103db9fed258 Mon Sep 17 00:00:00 2001 From: Andrew Regner Date: Tue, 9 Jul 2019 16:15:33 -0700 Subject: [PATCH 1/2] Add support for generating binary data in blob/binary columns --- .gitignore | 1 + internal/getters/binary.go | 48 ++++++++++++++++++++++++++++++++++++++ main.go | 4 ++-- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 internal/getters/binary.go diff --git a/.gitignore b/.gitignore index e099c55..97dd544 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ random_data_load* vendor/ bin/* +build/* diff --git a/internal/getters/binary.go b/internal/getters/binary.go new file mode 100644 index 0000000..2cb3a81 --- /dev/null +++ b/internal/getters/binary.go @@ -0,0 +1,48 @@ +package getters + +import ( + "fmt" + "math/rand" +) + +// RandomString getter +type RandomBinary struct { + name string + maxSize int64 + allowNull bool +} + +func (r *RandomBinary) Value() interface{} { + if r.allowNull && rand.Int63n(100) < nilFrequency { + return nil + } + maxSize := uint64(r.maxSize) + if maxSize == 0 { + maxSize = uint64(rand.Int63n(100)) + } + + data := make([]byte, maxSize) + rand.Read(data) + + return data +} + +func (r *RandomBinary) String() string { + v := r.Value() + if v == nil { + return NULL + } + return v.(string) +} + +func (r *RandomBinary) Quote() string { + v := r.Value() + if v == nil { + return NULL + } + return fmt.Sprintf("%q", v) +} + +func NewRandomBinary(name string, maxSize int64, allowNull bool) *RandomBinary { + return &RandomBinary{name, maxSize, allowNull} +} diff --git a/main.go b/main.go index 9ff7f83..8768ec1 100644 --- a/main.go +++ b/main.go @@ -413,7 +413,7 @@ func makeValueFuncs(conn *sql.DB, fields []tableparser.Field) insertValues { values = append(values, getters.NewRandomDate(field.ColumnName, field.IsNullable)) case "datetime", "timestamp": values = append(values, getters.NewRandomDateTime(field.ColumnName, field.IsNullable)) - case "tinyblob", "tinytext", "blob", "text", "mediumtext", "mediumblob", "longblob", "longtext": + case "tinytext", "text", "mediumtext", "longtext": values = append(values, getters.NewRandomString(field.ColumnName, field.CharacterMaximumLength.Int64, field.IsNullable)) case "time": @@ -423,7 +423,7 @@ func makeValueFuncs(conn *sql.DB, fields []tableparser.Field) insertValues { int64(time.Now().Year()), field.IsNullable)) case "enum", "set": values = append(values, getters.NewRandomEnum(field.SetEnumVals, field.IsNullable)) - case "binary", "varbinary": + case "binary", "varbinary", "tinyblob", "blob", "mediumblob", "longblob": values = append(values, getters.NewRandomBinary(field.ColumnName, field.CharacterMaximumLength.Int64, field.IsNullable)) default: log.Printf("cannot get field type: %s: %s\n", field.ColumnName, field.DataType) From 9a9040f31d0beb63c3c45b640d826a1ad47008b3 Mon Sep 17 00:00:00 2001 From: Andrew Regner Date: Tue, 27 Sep 2022 14:45:02 -0700 Subject: [PATCH 2/2] Fix tabs --- internal/getters/binary.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/getters/binary.go b/internal/getters/binary.go index d8b1053..cf36e06 100644 --- a/internal/getters/binary.go +++ b/internal/getters/binary.go @@ -33,13 +33,13 @@ func (r *RandomBinary) Value() interface{} { } if len(s) < int(maxSize) { - extraData := make([]byte, int(maxSize)-len(s)) - rand.Read(extraData) - return append([]byte(s), extraData...) - } else { - s = s[:int(maxSize)] - return s - } + extraData := make([]byte, int(maxSize)-len(s)) + rand.Read(extraData) + return append([]byte(s), extraData...) + } else { + s = s[:int(maxSize)] + return s + } } func (r *RandomBinary) String() string {