Skip to content

Commit

Permalink
[misc] avoid static use
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed May 22, 2024
1 parent 9aa3e13 commit 40eec18
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 93 deletions.
163 changes: 79 additions & 84 deletions lib/cmd/decoder/text-decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,96 +6,91 @@
const FieldType = require('../../const/field-type');
const Errors = require('../../misc/errors');

class TextDecoder {
static castWrapper(column, packet, opts, nullBitmap, index) {
column.string = () => packet.readStringLengthEncoded();
column.buffer = () => packet.readBufferLengthEncoded();
column.float = () => packet.readFloatLengthCoded();
column.tiny = () => packet.readIntLengthEncoded();
column.short = () => packet.readIntLengthEncoded();
column.int = () => packet.readIntLengthEncoded();
column.long = () => packet.readBigIntLengthEncoded();
column.decimal = () => packet.readDecimalLengthEncoded();
column.date = () => packet.readDate(opts);
column.datetime = () => packet.readDateTime();

column.geometry = () => {
let defaultVal = null;
if (column.dataTypeName) {
switch (column.dataTypeName) {
case 'point':
defaultVal = { type: 'Point' };
break;
case 'linestring':
defaultVal = { type: 'LineString' };
break;
case 'polygon':
defaultVal = { type: 'Polygon' };
break;
case 'multipoint':
defaultVal = { type: 'MultiPoint' };
break;
case 'multilinestring':
defaultVal = { type: 'MultiLineString' };
break;
case 'multipolygon':
defaultVal = { type: 'MultiPolygon' };
break;
default:
defaultVal = { type: column.dataTypeName };
break;
}
module.exports.parser = function (col, opts) {
// set reader function read(col, packet, index, nullBitmap, opts, throwUnexpectedError)
// this permit for multi-row result-set to avoid resolving type parsing each data.

// return constant parser (function not depending on column info other than type)
const defaultParser = DEFAULT_PARSER_TYPE[col.columnType];
if (defaultParser) return defaultParser;

// parser depending on column info
switch (col.columnType) {
case FieldType.DECIMAL:
case FieldType.NEWDECIMAL:
return col.scale === 0 ? readDecimalAsIntLengthCoded : readDecimalLengthCoded;

case FieldType.BIGINT:
if (opts.bigIntAsNumber || opts.supportBigNumbers) return readBigIntAsNumberLengthCoded;
return readBigIntLengthCoded;

case FieldType.GEOMETRY:
let defaultVal = col.__getDefaultGeomVal();
return readGeometry.bind(null, defaultVal);

case FieldType.BIT:
if (col.columnLength === 1 && opts.bitOneIsBoolean) {
return readBitAsBoolean;
}
return readBufferLengthEncoded;

return packet.readGeometry(defaultVal);
};
}

static parser(col, opts) {
// set reader function read(col, packet, index, nullBitmap, opts, throwUnexpectedError)
// this permit for multi-row result-set to avoid resolving type parsing each data.

// return constant parser (function not depending on column info other than type)
const defaultParser = DEFAULT_PARSER_TYPE[col.columnType];
if (defaultParser) return defaultParser;

// parser depending on column info
switch (col.columnType) {
case FieldType.DECIMAL:
case FieldType.NEWDECIMAL:
return col.scale === 0 ? readDecimalAsIntLengthCoded : readDecimalLengthCoded;

case FieldType.BIGINT:
if (opts.bigIntAsNumber || opts.supportBigNumbers) return readBigIntAsNumberLengthCoded;
return readBigIntLengthCoded;

case FieldType.GEOMETRY:
let defaultVal = col.__getDefaultGeomVal();
return readGeometry.bind(null, defaultVal);

case FieldType.BIT:
if (col.columnLength === 1 && opts.bitOneIsBoolean) {
return readBitAsBoolean;
}
default:
if (col.dataTypeFormat && col.dataTypeFormat === 'json' && opts.autoJsonMap) {
return readJson;
}
if (col.collation.index === 63) {
return readBufferLengthEncoded;

default:
if (col.dataTypeFormat && col.dataTypeFormat === 'json' && opts.autoJsonMap) {
return readJson;
}
if (col.collation.index === 63) {
return readBufferLengthEncoded;
}
if (col.isSet()) {
return readSet;
}
return readStringLengthEncoded;
}
}
if (col.isSet()) {
return readSet;
}
return readStringLengthEncoded;
}
}
};

module.exports = TextDecoder;
module.exports.castWrapper = function (column, packet, opts, nullBitmap, index) {
column.string = () => packet.readStringLengthEncoded();
column.buffer = () => packet.readBufferLengthEncoded();
column.float = () => packet.readFloatLengthCoded();
column.tiny = () => packet.readIntLengthEncoded();
column.short = () => packet.readIntLengthEncoded();
column.int = () => packet.readIntLengthEncoded();
column.long = () => packet.readBigIntLengthEncoded();
column.decimal = () => packet.readDecimalLengthEncoded();
column.date = () => packet.readDate(opts);
column.datetime = () => packet.readDateTime();

column.geometry = () => {
let defaultVal = null;
if (column.dataTypeName) {
switch (column.dataTypeName) {
case 'point':
defaultVal = { type: 'Point' };
break;
case 'linestring':
defaultVal = { type: 'LineString' };
break;
case 'polygon':
defaultVal = { type: 'Polygon' };
break;
case 'multipoint':
defaultVal = { type: 'MultiPoint' };
break;
case 'multilinestring':
defaultVal = { type: 'MultiLineString' };
break;
case 'multipolygon':
defaultVal = { type: 'MultiPolygon' };
break;
default:
defaultVal = { type: column.dataTypeName };
break;
}
}

return packet.readGeometry(defaultVal);
};
};
const readGeometry = (defaultVal, packet, opts, throwUnexpectedError) => packet.readGeometry(defaultVal);

const readIntLengthEncoded = (packet, opts, throwUnexpectedError) => packet.readIntLengthEncoded();
Expand Down
2 changes: 1 addition & 1 deletion lib/cmd/execute.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class Execute extends Parser {
val = this.values[i];
}
}
if (val === null || val === undefined) {
if (val == null) {
this.parametersType[i] = NULL_PARAM_TYPE;
} else {
switch (typeof val) {
Expand Down
15 changes: 11 additions & 4 deletions lib/connection-promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class ConnectionPromise {
* @returns {Promise} promise
*/
query(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = paramSetter(sql, values);
this.#capture(cmdParam);
return new Promise(this.#conn.query.bind(this.#conn, cmdParam));
}
Expand All @@ -106,7 +106,7 @@ class ConnectionPromise {
}

execute(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = paramSetter(sql, values);
this.#capture(cmdParam);
return this.#conn.prepareExecute(cmdParam);
}
Expand Down Expand Up @@ -135,7 +135,7 @@ class ConnectionPromise {
* @returns {Promise} promise
*/
batch(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = paramSetter(sql, values);
this.#capture(cmdParam);
return this.#conn.batch(cmdParam);
}
Expand Down Expand Up @@ -176,7 +176,7 @@ class ConnectionPromise {
* @returns {Readable}
*/
queryStream(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = paramSetter(sql, values);
this.#capture(cmdParam);
const cmd = new Stream(cmdParam, this.#conn.opts, this.#conn.socket);
if (this.#conn.opts.logger.error) cmd.on('error', this.#conn.opts.logger.error);
Expand Down Expand Up @@ -366,4 +366,11 @@ class ConnectionPromise {
}
}

const paramSetter = function (sql, values) {
if (typeof sql === 'object') {
return { sql: sql.sql, values: sql.values ? sql.values : values, opts: sql };
} else return { sql: sql, values: values };
};

module.exports = ConnectionPromise;
module.exports.paramSetter = paramSetter;
2 changes: 1 addition & 1 deletion lib/misc/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ module.exports.escapeId = (opts, info, value) => {
};

const escapeParameters = (opts, info, value) => {
if (value === undefined || value === null) return 'NULL';
if (value == null) return 'NULL';

switch (typeof value) {
case 'boolean':
Expand Down
6 changes: 3 additions & 3 deletions lib/pool-promise.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class PoolPromise extends EventEmitter {
* @param values object / array of placeholder values (not mandatory)
*/
query(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = ConnectionPromise.paramSetter(sql, values);
if (this.#pool.opts.connOptions.trace) Error.captureStackTrace(cmdParam);
return this.#pool.getConnection(cmdParam).then((baseConn) => {
return new Promise(baseConn.query.bind(baseConn, cmdParam)).finally(() => {
Expand All @@ -118,7 +118,7 @@ class PoolPromise extends EventEmitter {
* @param values object / array of placeholder values (not mandatory)
*/
execute(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = ConnectionPromise.paramSetter(sql, values);
if (this.#pool.opts.connOptions.trace) Error.captureStackTrace(cmdParam);
return this.#pool.getConnection(cmdParam).then((baseConn) => {
return ConnectionPromise._EXECUTE_CMD(baseConn, cmdParam).finally(() => {
Expand All @@ -135,7 +135,7 @@ class PoolPromise extends EventEmitter {
* @param values array of placeholder values
*/
batch(sql, values) {
const cmdParam = ConnectionPromise._PARAM_DEF(sql, values);
const cmdParam = ConnectionPromise.paramSetter(sql, values);
if (this.#pool.opts.connOptions.trace) Error.captureStackTrace(cmdParam);
return this.#pool.getConnection(cmdParam).then((baseConn) => {
return ConnectionPromise._BATCH_CMD(baseConn, cmdParam).finally(() => {
Expand Down

0 comments on commit 40eec18

Please sign in to comment.