Skip to content
Permalink
Browse files
[CONJS-44] Create option to permit setting Object to one prepareState…
…ment parameter
  • Loading branch information
rusher committed Aug 22, 2018
1 parent 50b338d commit 852ca61
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 30 deletions.
@@ -56,19 +56,17 @@ module.exports.initFct = function(conn) {
return Promise.all([
conn.query("DROP TABLE IF EXISTS testn.perfTestText"),
conn.query(sqlTable + " COLLATE='utf8mb4_unicode_ci'")
])
]);
})
.catch(e => {
console.log(e);
throw e;
});

};

module.exports.onComplete = function(conn) {
conn.query("TRUNCATE TABLE testn.perfTestText")
.catch(e => {
console.log(e);
throw e;
});
conn.query("TRUNCATE TABLE testn.perfTestText").catch(e => {
console.log(e);
throw e;
});
};
@@ -41,7 +41,6 @@ module.exports.benchFct = function(conn, deferred) {
}
};


module.exports.initFct = function(conn) {
return Promise.all([
conn.query("DROP TABLE IF EXISTS testn.perfTestTextPipe"),
@@ -52,19 +51,17 @@ module.exports.initFct = function(conn) {
return Promise.all([
conn.query("DROP TABLE IF EXISTS testn.perfTestTextPipe"),
conn.query(sqlTable + " COLLATE='utf8mb4_unicode_ci'")
])
]);
})
.catch(e => {
console.log(e);
throw e;
});

};

module.exports.onComplete = function(conn) {
conn.query("TRUNCATE TABLE testn.perfTestTextPipe")
.catch(e => {
console.log(e);
throw e;
});
conn.query("TRUNCATE TABLE testn.perfTestTextPipe").catch(e => {
console.log(e);
throw e;
});
};
@@ -250,11 +250,10 @@ Bench.prototype.endConnection = function(conn) {
console.log(err);
}
if (conn.pool) {
conn.pool.end()
.catch(err => {
console.log("ending error for pool '" + conn.desc + "'");
console.log(err);
});
conn.pool.end().catch(err => {
console.log("ending error for pool '" + conn.desc + "'");
console.log(err);
});
}
};

@@ -413,16 +412,16 @@ const pingAll = function(conns) {
conns[keys[k]].drv.ping();
if (conns[keys[k]].pool) {
for (let i = 0; i < 4; i++) {
conns[keys[k]].pool.getConnection()
.then(conn => {
conn.ping()
.then(() => {
conn.release();
})
.catch(err => {
conn.release();
})
})
conns[keys[k]].pool.getConnection().then(conn => {
conn
.ping()
.then(() => {
conn.release();
})
.catch(err => {
conn.release();
});
});
}
}
}
@@ -318,6 +318,7 @@ mariadb.createConnection({
| **typeCast** | Allows you to cast result types. |*function* |
| **connectAttributes** | Sends information, (client name, version, operating system, Node.js version, and so on) to the [Performance Schema](https://mariadb.com/kb/en/library/performance-schema-session_connect_attrs-table/). When enabled, the Connector sends JSON attributes in addition to the defaults. |*boolean/json* |false|
| **metaAsArray** | Compatibility option, causes Promise to return an array object, `[rows, metadata]` rather than the rows as JSON objects with a `meta` property. |*boolean* |false|
| **permitSetMultiParamEntries** | Compatibility option to permit setting multiple value by a JSON object to replace one question mark. key values will replace the question mark with format like `key1`=val,`key2`='val2'. Since it doesn't respect the usual prepared statement format that one value is for one question mark, this can lead to incomprehension, even if badly use to possible injection.|*boolean* |false|

## F.A.Q.

@@ -233,6 +233,21 @@ class Query extends ResultSet {
out.writeInt8(QUOTE);
} else if (typeof value.toSqlString === "function") {
out.writeStringEscapeQuote(String(value.toSqlString()));
} else if (opts.permitSetMultiParamEntries) {
let first = true;
for (let key in value) {
const val = value[key];
if (typeof val === "function") continue;
if (first) {
first = false;
} else {
out.writeStringAscii(",");
}
out.writeString("`" + key + "`");
out.writeStringAscii("=");
this.writeParam(out, val, opts);
}
if (first) out.writeStringEscapeQuote(JSON.stringify(value));
} else {
out.writeStringEscapeQuote(JSON.stringify(value));
}
@@ -101,6 +101,9 @@ class ResultSet extends Command {
this.opts.supportBigNumbers = opt.supportBigNumbers
? opt.supportBigNumbers
: connOpts.supportBigNumbers;
this.opts.permitSetMultiParamEntries = opt.permitSetMultiParamEntries
? opt.permitSetMultiParamEntries
: connOpts.permitSetMultiParamEntries;
this.opts.bigNumberStrings = opt.bigNumberStrings
? opt.bigNumberStrings
: connOpts.bigNumberStrings;
@@ -24,6 +24,7 @@ class ConnectionOptions {
this.collation = Collations.fromIndex(opts.charsetNumber) || Collations.fromIndex(224); //UTF8MB4_UNICODE_CI;
}
this.compress = opts.compress || false;
this.permitSetMultiParamEntries = opts.permitSetMultiParamEntries || false;
this.metaAsArray = opts.metaAsArray || false;
this.connectAttributes = opts.connectAttributes || false;
this.connectTimeout = opts.connectTimeout === undefined ? 10000 : opts.connectTimeout;
@@ -39,6 +39,25 @@ describe("basic query", () => {
.catch(done);
});

it("permitSetMultiParamEntries set", done => {
const jsonValue = { id: 1, val: "test" };
base
.createConnection({ permitSetMultiParamEntries: true })
.then(conn => {
conn.query("CREATE TEMPORARY TABLE setTable(id int, val varchar(128))");
conn.query("INSERT INTO setTable SET ?", jsonValue);
conn
.query("select * from setTable")
.then(res => {
assert.deepEqual(res[0], jsonValue);
conn.end();
done();
})
.catch(done);
})
.catch(done);
});

it("query with escape values", function(done) {
base
.createConnection()

0 comments on commit 852ca61

Please sign in to comment.