| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | /* * Copyright (c) 2015-present, Vitaly Tomilov * * See the LICENSE file at the top-level directory of this distribution * for licensing information. * * Removal or modification of this copyright notice is prohibited. */const npm = {    os: require('os'),    utils: require('../utils'),    text: require('../text')};/** * @enum {number} * @alias errors.queryResultErrorCode * @readonly * @description * `queryResultErrorCode` enumerator, available from the {@link errors} namespace. * * Represents an integer code for each type of error supported by type {@link errors.QueryResultError}. * * @see {@link errors.QueryResultError} */const queryResultErrorCode = {    /** No data returned from the query. */    noData: 0,    /** No return data was expected. */    notEmpty: 1,    /** Multiple rows were not expected. */    multiple: 2};const errorMessages = [    {name: 'noData', message: npm.text.noData},    {name: 'notEmpty', message: npm.text.notEmpty},    {name: 'multiple', message: npm.text.multiple}];/** * @class errors.QueryResultError * @augments external:Error * @description * * This error is specified as the rejection reason for all result-specific methods when the result doesn't match * the expectation, i.e. when a query result doesn't match its Query Result Mask - the value of {@link queryResult}. * * The error applies to the result from the following methods: {@link Database#none none}, * {@link Database#one one}, {@link Database#oneOrNone oneOrNone} and {@link Database#many many}. * * Supported errors: * * - `No return data was expected.`, method {@link Database#none none} * - `No data returned from the query.`, methods {@link Database#one one} and {@link Database#many many} * - `Multiple rows were not expected.`, methods {@link Database#one one} and {@link Database#oneOrNone oneOrNone} * * Like any other error, this one is notified with through the global event {@link event:error error}. * * The type is available from the {@link errors} namespace. * * @property {string} name * Standard {@link external:Error Error} property - error type name = `QueryResultError`. * * @property {string} message * Standard {@link external:Error Error} property - the error message. * * @property {string} stack * Standard {@link external:Error Error} property - the stack trace. * * @property {object} result * The original $[Result] object that was received. * * @property {number} received * Total number of rows received. It is simply the value of `result.rows.length`. * * @property {number} code * Error code - {@link errors.queryResultErrorCode queryResultErrorCode} value. * * @property {string} query * Query that was executed. * * Normally, it is the query already formatted with values, if there were any. * But if you are using initialization option `pgFormatting`, then the query string is before formatting. * * @property {*} values * Values passed in as query parameters. Available only when initialization option `pgFormatting` is used. * Otherwise, the values are within the pre-formatted `query` string. * * @example * * const QueryResultError = pgp.errors.QueryResultError; * const qrec = pgp.errors.queryResultErrorCode; * * const initOptions = { * *   // pg-promise initialization options... * *   error(err, e) { *       if (err instanceof QueryResultError) { *           // A query returned unexpected number of records, and thus rejected; *            *           // we can check the error code, if we want specifics: *           if(err.code === qrec.noData) { *               // expected some data, but received none; *           } * *           // If you write QueryResultError into the console, *           // you will get a nicely formatted output. * *           console.log(err); *            *           // See also: err, e.query, e.params, etc. *       } *   } * }; * * @see * {@link queryResult}, {@link Database#none none}, {@link Database#one one}, * {@link Database#oneOrNone oneOrNone}, {@link Database#many many} * */class QueryResultError extends Error {    constructor(code, result, query, values) {        const message = errorMessages[code].message;        super(message);        this.name = this.constructor.name;        this.code = code;        this.result = result;        this.query = query;        this.values = values;        this.received = result.rows.length;        Error.captureStackTrace(this, this.constructor);    }}/** * @method errors.QueryResultError#toString * @description * Creates a well-formatted multi-line string that represents the error. * * It is called automatically when writing the object into the console. * * @param {number} [level=0] * Nested output level, to provide visual offset. * * @returns {string} */QueryResultError.prototype.toString = function (level) {    level = level > 0 ? parseInt(level) : 0;    const gap0 = npm.utils.messageGap(level),        gap1 = npm.utils.messageGap(level + 1),        lines = [            'QueryResultError {',            gap1 + 'code: queryResultErrorCode.' + errorMessages[this.code].name,            gap1 + 'message: "' + this.message + '"',            gap1 + 'received: ' + this.received,            gap1 + 'query: ' + (typeof this.query === 'string' ? '"' + this.query + '"' : npm.utils.toJson(this.query))        ];    if (this.values !== undefined) {        lines.push(gap1 + 'values: ' + npm.utils.toJson(this.values));    }    lines.push(gap0 + '}');    return lines.join(npm.os.EOL);};npm.utils.addInspection(QueryResultError, function () {    return this.toString();});module.exports = {    QueryResultError,    queryResultErrorCode};
 |