5.4.1配置举例要求

运行下面几节中的示例的软件需求如下:

第5.2节,“安装JavaScript连接器”,描述了所有这三个需求的安装过程。

示例数据库、表和数据。所有示例都使用一个名为推特,在测验数据库。该表的定义如下创建表声明:

CREATE TABLE IF NOT EXISTS (id CHAR(36) NOT NULL PRIMARY KEY, author VARCHAR(20), message VARCHAR(140), date_created TIMESTAMP, KEY idx_btree_date_created (date_created), KEY idx_btree_author(author)) ENGINE=NDB

推特表可以通过运行所包含的SQL脚本创建create.sqlmysql客户端。您可以通过调用来实现这一点mysql在您的系统shell中,如下所示:

Shell > mysql < create.sql

所有示例还使用了文件中定义的两个模块lib.js,其内容转载于此:

# FILE: lib.js "use strict";var udebug = unified_debug.getLogger("samples/lib.js");Var exec = require("child_process").exec;var SQL = {};/*伪随机UUID生成器*/ var randomUUID = function(){返回'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'。替换(/[xy]/g,函数(c) {var r = Math.random()*16|0, v = c == 'x' ?接待员:(r&0x3 | 0×8);返回v.toString (16);});};/*推文域对象模型*/ var推文=函数(作者,消息){这个。id = randomUUID (); this.date_created = new Date(); this.author = author; this.message = message; }; /* SQL DDL Utilities */ var runSQL = function(sqlPath, source, callback) { function childProcess(error, stdout, stderr) { udebug.log('harness runSQL process completed.'); udebug.log(source + ' stdout: ' + stdout); udebug.log(source + ' stderr: ' + stderr); if (error !== null) { console.log(source + 'exec error: ' + error); } else { udebug.log(source + ' exec OK'); } if(callback) { callback(error); } } var p = mysql_conn_properties; var cmd = 'mysql'; if(p) { if(p.mysql_socket) { cmd += " --socket=" + p.mysql_socket; } else if(p.mysql_port) { cmd += " --port=" + p.mysql_port; } if(p.mysql_host) { cmd += " -h " + p.mysql_host; } if(p.mysql_user) { cmd += " -u " + p.mysql_user; } if(p.mysql_password) { cmd += " --password=" + p.mysql_password; } } cmd += ' <' + sqlPath; udebug.log('harness runSQL forking process...'); var child = exec(cmd, childProcess); }; SQL.create = function(suite, callback) { var sqlPath = path.join(suite.path, 'create.sql'); udebug.log_detail("createSQL path: " + sqlPath); runSQL(sqlPath, 'createSQL', callback); }; SQL.drop = function(suite, callback) { var sqlPath = path.join(suite.path, 'drop.sql'); udebug.log_detail("dropSQL path: " + sqlPath); runSQL(sqlPath, 'dropSQL', callback); }; /* Exports from this module */ exports.SQL = SQL; exports.Tweet = Tweet;

最后,文件中包含一个用于随机数据生成的模块ndb_loader / lib / RandomData.js所示:

# FILE: RandomData.js var assert = require("assert");函数RandomIntGenerator(min, max){断言(max > min);Var范围= Max - min;这一点。下一步=函数(){var x =数学。地板(数学。随机()*范围);返回min + x;};}函数SequentialIntGenerator(startSeq) {var seq = startSeq - 1;这一点。下一步=函数(){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 = 0, str = "", len = lengthGenerator.next(); for(; i < len ; i++) str += characterGenerator.next(); return str; } } function RandomCharGenerator(length) { var characterGenerator = new RandomCharacterGenerator(); this.next = function() { var i = 0, str = ""; for(; i < length ; i++) str += characterGenerator.next(); return str; }; } function RandomDateGenerator() { var generator = new RandomIntGenerator(0, Date.now()); this.next = function() { return new Date(generator.next()); }; } function RandomGeneratorForColumn(column) { var g = {}, min, max, bits; 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 "CHAR": g = new RandomCharGenerator(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": case "BINARY": case "VARBINARY": default: throw("UNSUPPORTED COLUMN TYPE " + column.columnType); break; } return g; } function RandomRowGenerator(table) { var i = 0, generators = []; for(; i < table.columns.length ; i++) { generators[i] = RandomGeneratorForColumn(table.columns[i]); } this.newRow = function() { var n, col, row = {}; for(n = 0; n < table.columns.length ; n++) { col = table.columns[n]; row[col.name] = generators[n].next(); } return row; }; } exports.RandomRowGenerator = RandomRowGenerator; exports.RandomGeneratorForColumn = RandomGeneratorForColumn;