From 2d197c65c6d5787b71596ad82eab64600c622374 Mon Sep 17 00:00:00 2001 From: wshager Date: Fri, 6 Dec 2013 14:14:10 +0100 Subject: [PATCH 1/3] updated mysql engine to mysql2 --- engines/node/store-engine/sql.js | 109 +++++++++++++------------------ 1 file changed, 46 insertions(+), 63 deletions(-) diff --git a/engines/node/store-engine/sql.js b/engines/node/store-engine/sql.js index d5bfbe3..f221f10 100644 --- a/engines/node/store-engine/sql.js +++ b/engines/node/store-engine/sql.js @@ -19,91 +19,74 @@ exports.SQLDatabase = function(params) { function MysqlWrapper(params) { var currentConnection; - var x=0; + var x=0; - // adapted from http://github.com/sidorares/nodejs-mysql-native/lib/mysql-native/websql.js return { executeSql: function(query, args, callback, errback) { - var conn = currentConnection; - if(!conn) { - errback(new DatabaseError("No transactional context has been created")); - return; - } - if (!conn.clean) { - errback(new DatabaseError("Cannot commit a transaction with an error")); + var conn = currentConnection; + if(!conn) { + errback(new DatabaseError("No transactional context has been created")); return; } - var charset = require("mysql-native/lib/mysql-native/charset").Charset.by_name(conn.get("charset")); - if(charset && charset.name=="utf8") conn.execute("SET NAMES utf8"); - var cmd = conn.execute(query,args); - - // use result from callback - cmd.on('result', function(result) { - if (conn.clean && callback) { - callback({ - insertId: result.insert_id, - rowsAffected: result.affected_rows, - rows: result.rows - }); - } - }); - cmd.on('error', function(err) { - conn.clean = false; - if(errback) { - var patt=/^duplicate entry/ig; - if(err && patt.test(err.message)) { - errback(new DuplicateEntryError(err.message)); - } else { - errback(err); + var cmd = conn.execute(query,args,function(err,_rows,_fields) { + if(err) { + if(errback) { + var patt=/^duplicate entry/ig; + if(err && patt.test(err)) { + errback(new DuplicateEntryError(err)); + } else { + errback(err); + } + } + } else { + if(callback) { + callback({ + insertId: conn.insertId, + rowsAffected: conn.affectedRows, + rows: _rows + }); } } }); }, transaction: function() { var conn = connectMysql(params); - currentConnection = conn; - throwOnError(conn.query('SET autocommit=0;'), 'disable autocommit'); - throwOnError(conn.query('BEGIN'), 'initialize transaction'); + currentConnection = conn; + conn.query('SET autocommit=0;', function(err) { + if(err) throw new DatabaseError(err); + }); + conn.query('BEGIN', function(err) { + if(err) throw new DatabaseError(err); + }); return { commit: function() { - throwOnError(conn.query("COMMIT"), 'commit SQL transaction'); - throwOnError(conn.close(), 'close connection'); + conn.query("COMMIT", function(err) { + if(err) throw new DatabaseError(err); + }); + conn.end(); }, abort: function() { - throwOnError(conn.query("ROLLBACK"), 'rollback SQL transaction'); - throwOnError(conn.close(), 'close connection'); + conn.query("ROLLBACK", function(err) { + if(err) throw new DatabaseError(err); + }); + conn.end(); }, - suspend: function(){ - currentConnection = null; - }, - resume: function(){ - currentConnection = conn; - } + suspend: function(){ + currentConnection = null; + }, + resume: function(){ + currentConnection = conn; + } }; } }; - function throwOnError(cmd, action) { - cmd.on('error', function(err) { - console.log('Failed to ' + action + - (err && err.message ? ': ' + err.message : '')); - throw new DatabaseError('Failed to ' + action + - (err && err.message ? ': ' + err.message : '')); - }); - } - function connectMysql(params) { - var ret = require("mysql-native/lib/mysql-native/client").createTCPClient(params.host, params.port); - ret.auto_prepare = true; - ret.row_as_hash = true; - ret.clean = true; - - // use charset if available - if(params.charset) ret.set("charset",params.charset); - throwOnError(ret.connection, 'connect to DB'); - throwOnError(ret.auth(params.name, params.username, params.password), 'authenticate'); - + var ret = require("mysql2").createConnection(params); + ret.connect(function(err) { + if(err) throw new DatabaseError(err); + }); return ret; } } From bac72b3af0523e7b6bd7bcfcb2aeae1e8e8ce6a1 Mon Sep 17 00:00:00 2001 From: wshager Date: Fri, 6 Dec 2013 15:25:54 +0100 Subject: [PATCH 2/3] retain compatibility with old connection params --- engines/node/store-engine/sql.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/node/store-engine/sql.js b/engines/node/store-engine/sql.js index f221f10..5edd3dd 100644 --- a/engines/node/store-engine/sql.js +++ b/engines/node/store-engine/sql.js @@ -83,6 +83,9 @@ function MysqlWrapper(params) { }; function connectMysql(params) { + // retain compatibility, database property shouldn't be overwritten + params.database = params.name; + if(params.pass) params.password = params.pass; var ret = require("mysql2").createConnection(params); ret.connect(function(err) { if(err) throw new DatabaseError(err); From fe01c01716a021a0a3b8ef6a7a879bddb28671cb Mon Sep 17 00:00:00 2001 From: Wouter Hager Date: Tue, 14 Jan 2014 16:40:41 +0100 Subject: [PATCH 3/3] Get insertId and affectedRows from this --- engines/node/store-engine/sql.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/node/store-engine/sql.js b/engines/node/store-engine/sql.js index 5edd3dd..664f7ee 100644 --- a/engines/node/store-engine/sql.js +++ b/engines/node/store-engine/sql.js @@ -41,8 +41,8 @@ function MysqlWrapper(params) { } else { if(callback) { callback({ - insertId: conn.insertId, - rowsAffected: conn.affectedRows, + insertId: this.insertId, + rowsAffected: this.affectedRows, rows: _rows }); }