loader/lib/RandomData.js (150 lines of code) (raw):
/*
Copyright (c) 2013, Oracle and/or its affiliates. All rights
reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
"use strict";
var assert = require("assert");
function RandomIntGenerator(min, max) {
assert(max > min);
var range = max - min;
this.next = function() {
var x = Math.floor(Math.random() * range);
return min + x;
};
}
function SequentialIntGenerator(startSeq) {
var seq = startSeq - 1;
this.next = function() {
seq += 1;
return seq;
};
}
function RandomFloatGenerator(min, max, prec, scale) {
assert(max > min);
this.next = function() {
var x = Math.random();
/* fixme! */
return 100 * x;
};
}
function RandomCharacterGenerator() {
var intGenerator = new RandomIntGenerator(32, 126);
this.next = function() {
return String.fromCharCode(intGenerator.next());
};
}
function RandomVarcharGenerator(length) {
var lengthGenerator = new RandomIntGenerator(0, length),
characterGenerator = new RandomCharacterGenerator();
this.next = function() {
var i,
str = "",
len = lengthGenerator.next();
for(i = 0; i < len ; i++) { str += characterGenerator.next(); }
return str;
};
}
function RandomVarbinaryGenerator(length) {
var lengthGenerator = new RandomIntGenerator(0, length),
byteGenerator = new RandomIntGenerator(0, 255);
this.next = function() {
var i,
sz = lengthGenerator.next(),
buffer = Buffer.alloc(sz);
for(i = 0; i < sz ; i++) { buffer[i] = byteGenerator.next(); }
return buffer;
};
}
function RandomCharGenerator(length) {
var characterGenerator = new RandomCharacterGenerator();
this.next = function() {
var i,
str = "";
for(i = 0; i < length ; i++) { str += characterGenerator.next(); }
return str;
};
}
function RandomBinaryGenerator(length) {
var byteGenerator = new RandomIntGenerator(0, 255);
this.next = function() {
var i,
buffer = Buffer.alloc(length);
for(i = 0; i < length ; i++) { buffer[i] = byteGenerator.next(); }
return buffer;
};
}
function RandomDateGenerator() {
var generator = new RandomIntGenerator(0, Date.now());
this.next = function() {
return new Date(generator.next());
};
}
function getRandomGeneratorForColumn(column) {
var g = {},
min, max, bits;
// TODO: This should rely on generic metadata rather than
// MySQL-specific column type names
switch(column.columnType.toLocaleUpperCase()) {
case "TINYINT":
case "SMALLINT":
case "MEDIUMINT":
case "INT":
case "BIGINT":
if(column.isInPrimaryKey) {
g = new SequentialIntGenerator(0);
}
else {
bits = column.intSize * 8;
max = column.isUnsigned ? Math.pow(2,bits)-1 : Math.pow(2, bits-1);
min = column.isUnsigned ? 0 : 1 - max;
g = new RandomIntGenerator(min, max);
}
break;
case "FLOAT":
case "DOUBLE":
case "DECIMAL":
g = new RandomFloatGenerator(0, 100000); // fixme
break;
case "BINARY":
g = new RandomBinaryGenerator(column.length);
break;
case "CHAR":
g = new RandomCharGenerator(column.length);
break;
case "VARBINARY":
g = new RandomVarbinaryGenerator(column.length);
break;
case "VARCHAR":
g = new RandomVarcharGenerator(column.length);
break;
case "TIMESTAMP":
g = new RandomIntGenerator(0, Math.pow(2,32)-1);
break;
case "YEAR":
g = new RandomIntGenerator(1900, 2155);
break;
case "DATE":
case "TIME":
case "DATETIME":
g = new RandomDateGenerator();
break;
// case "BLOB":
// case "TEXT":
// case "BIT":
default:
throw("UNSUPPORTED COLUMN TYPE " + column.columnType);
}
return g;
}
function DummyConstructor() { }
function RandomRowGenerator(tableHandler) {
var i, column, names, generators, Ctor;
generators = [];
names = [];
Ctor = tableHandler.newObjectConstructor || DummyConstructor;
for(i = 0; i < tableHandler.getNumberOfColumns() ; i++) {
column = tableHandler.getColumnMetadata(i);
names[i] = tableHandler.getField(i).fieldName; // FIXME
generators[i] = getRandomGeneratorForColumn(column);
}
this.newRow = function() {
var n, row;
row = new Ctor();
for(n = 0; n < names.length ; n++) {
row[names[n]] = generators[n].next();
}
return row;
};
}
exports.RandomRowGenerator = RandomRowGenerator;
exports.RandomGeneratorForColumn = getRandomGeneratorForColumn;