(connection, sql, parameters, errStack)
| 45 | } |
| 46 | |
| 47 | async _run(connection, sql, parameters, errStack) { |
| 48 | this.sql = sql; |
| 49 | const { options } = this; |
| 50 | |
| 51 | const complete = this._logQuery(sql, debug, parameters); |
| 52 | |
| 53 | const query = new Promise((resolve, reject) => { |
| 54 | // TRANSACTION SUPPORT |
| 55 | if (sql.startsWith('BEGIN TRANSACTION')) { |
| 56 | return connection.beginTransaction(error => error ? reject(error) : resolve([]), options.transaction.name, connection.lib.ISOLATION_LEVEL[options.isolationLevel]); |
| 57 | } |
| 58 | if (sql.startsWith('COMMIT TRANSACTION')) { |
| 59 | return connection.commitTransaction(error => error ? reject(error) : resolve([])); |
| 60 | } |
| 61 | if (sql.startsWith('ROLLBACK TRANSACTION')) { |
| 62 | return connection.rollbackTransaction(error => error ? reject(error) : resolve([]), options.transaction.name); |
| 63 | } |
| 64 | if (sql.startsWith('SAVE TRANSACTION')) { |
| 65 | return connection.saveTransaction(error => error ? reject(error) : resolve([]), options.transaction.name); |
| 66 | } |
| 67 | |
| 68 | const rows = []; |
| 69 | const request = new connection.lib.Request(sql, (err, rowCount) => err ? reject(err) : resolve([rows, rowCount])); |
| 70 | |
| 71 | if (parameters) { |
| 72 | _.forOwn(parameters, (value, key) => { |
| 73 | const paramType = this.getSQLTypeFromJsType(value, connection.lib.TYPES); |
| 74 | request.addParameter(key, paramType.type, value, paramType.typeOptions); |
| 75 | }); |
| 76 | } |
| 77 | |
| 78 | request.on('row', columns => { |
| 79 | rows.push(columns); |
| 80 | }); |
| 81 | |
| 82 | connection.execSql(request); |
| 83 | }); |
| 84 | |
| 85 | let rows, rowCount; |
| 86 | |
| 87 | try { |
| 88 | [rows, rowCount] = await query; |
| 89 | } catch (err) { |
| 90 | err.sql = sql; |
| 91 | err.parameters = parameters; |
| 92 | |
| 93 | throw this.formatError(err, errStack); |
| 94 | } |
| 95 | |
| 96 | complete(); |
| 97 | |
| 98 | if (Array.isArray(rows)) { |
| 99 | rows = rows.map(columns => { |
| 100 | const row = {}; |
| 101 | for (const column of columns) { |
| 102 | const typeid = column.metadata.type.id; |
| 103 | const parse = parserStore.get(typeid); |
| 104 | let value = column.value; |
no test coverage detected