Skip to content

Commit

Permalink
refactor: improve error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
thelindat committed Jul 28, 2023
1 parent f3e9aa5 commit 924fd6a
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 62 deletions.
64 changes: 30 additions & 34 deletions src/database/rawExecute.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { pool } from '.';
import { printError, profileBatchStatements, runProfiler } from '../logger';
import { CFXCallback, CFXParameters } from '../types';
import { CFXCallback, CFXParameters, QueryType } from '../types';
import { parseResponse } from '../utils/parseResponse';
import { executeType, parseExecute } from '../utils/parseExecute';
import { scheduleTick } from '../utils/scheduleTick';
import { isServerConnected, waitForConnection } from '../database';
import { setCallback } from '../utils/setCallback'
import { setCallback } from '../utils/setCallback';

export const rawExecute = async (
invokingResource: string,
Expand All @@ -15,20 +15,18 @@ export const rawExecute = async (
isPromise?: boolean,
unpack?: boolean
) => {
if (typeof query !== 'string')
return printError(
invokingResource,
cb,
isPromise,
query,
`Expected query to be a string but received ${typeof query} instead.`
);
cb = setCallback(parameters, cb);

const type = executeType(query);
const placeholders = query.split('?').length - 1;
let type: QueryType;
let placeholders: number;

cb = setCallback(parameters, cb);
parameters = parseExecute(placeholders, parameters);
try {
type = executeType(query);
placeholders = query.split('?').length - 1;
parameters = parseExecute(placeholders, parameters);
} catch (err: any) {
return printError(invokingResource, cb, isPromise, query, err.message);
}

if (!isServerConnected) await waitForConnection();

Expand Down Expand Up @@ -63,32 +61,30 @@ export const rawExecute = async (
if (hasProfiler && ((index > 0 && index % 100 === 0) || index === parametersLength - 1)) {
await profileBatchStatements(connection, invokingResource, query, parameters, index < 100 ? 0 : index);
}
}

if (index === parametersLength - 1) {
if (!cb) return;
if (!cb) return;

try {
if (response.length === 1) {
if (unpack && type === null) {
if (response[0][0] && Object.keys(response[0][0]).length === 1) {
cb(Object.values(response[0][0])[0]);
} else cb(response[0][0]);
} else {
cb(response[0]);
}
} else {
cb(response);
}
} catch (err) {
if (typeof err === 'string') {
if (err.includes('SCRIPT ERROR:')) return console.log(err);
console.log(`^1SCRIPT ERROR in invoking resource ${invokingResource}: ${err}^0`);
}
try {
if (response.length === 1) {
if (unpack && type === null) {
if (response[0][0] && Object.keys(response[0][0]).length === 1) {
cb(Object.values(response[0][0])[0]);
} else cb(response[0][0]);
} else {
cb(response[0]);
}
} else {
cb(response);
}
} catch (err) {
if (typeof err === 'string') {
if (err.includes('SCRIPT ERROR:')) return console.log(err);
console.log(`^1SCRIPT ERROR in invoking resource ${invokingResource}: ${err}^0`);
}
}
} catch (err: any) {
printError(invokingResource, cb, isPromise, query, err.message);
printError(invokingResource, cb, isPromise, `Query: ${query}`, err.message);

TriggerEvent('oxmysql:error', {
query: query,
Expand Down
17 changes: 6 additions & 11 deletions src/database/rawQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,12 @@ export const rawQuery = async (
cb?: CFXCallback,
isPromise?: boolean
) => {
if (typeof query !== 'string')
return printError(
invokingResource,
cb,
isPromise,
query,
`Expected query to be a string but received ${typeof query} instead.`
);

cb = setCallback(parameters, cb);
[query, parameters] = parseArguments(invokingResource, query, parameters);
try {
[query, parameters] = parseArguments(query, parameters);
} catch (err: any) {
return printError(invokingResource, cb, isPromise, `Query: ${query}`, err.message);
}

if (!isServerConnected) await waitForConnection();

Expand Down Expand Up @@ -56,7 +51,7 @@ export const rawQuery = async (
}
}
} catch (err: any) {
printError(invokingResource, cb, isPromise, query, JSON.stringify(parameters), err.message);
printError(invokingResource, cb, isPromise, `Query: ${query}`, JSON.stringify(parameters), err.message);

TriggerEvent('oxmysql:error', {
query: query,
Expand Down
13 changes: 10 additions & 3 deletions src/database/rawTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,24 @@ export const rawTransaction = async (
cb?: CFXCallback,
isPromise?: boolean
) => {
let transactions;
cb = setCallback(parameters, cb);

try {
transactions = parseTransaction(queries, parameters);
} catch (err: any) {
return printError(invokingResource, cb, isPromise, err.message);
}

if (!isServerConnected) await waitForConnection();

scheduleTick();

cb = setCallback(parameters, cb);
const transactions = parseTransaction(invokingResource, queries, parameters);
const connection = await pool.getConnection();
const hasProfiler = await runProfiler(connection, invokingResource);
let response = false;

try {
const hasProfiler = await runProfiler(connection, invokingResource);
await connection.beginTransaction();
const transactionsLength = transactions.length;

Expand Down
2 changes: 1 addition & 1 deletion src/logger/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export function printError(
isPromise: boolean | undefined,
...args: string[]
) {
const err = `${invokingResource} was unable to execute a query!\nQuery: ${args.join('\n')}`;
const err = `${invokingResource} was unable to execute a query!\n${args.join('\n')}`;

if (cb && isPromise) return cb(null, err);

Expand Down
14 changes: 4 additions & 10 deletions src/utils/parseArguments.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import type { CFXParameters } from '../types';
import { convertNamedPlaceholders } from '../config';

export const parseArguments = (
invokingResource: string,
query: string,
parameters?: CFXParameters
): [string, CFXParameters] => {
export const parseArguments = (query: string, parameters?: CFXParameters): [string, CFXParameters] => {
if (typeof query !== 'string') throw new Error(`Expected query to be a string but received ${typeof query} instead.`);

if (convertNamedPlaceholders && parameters && typeof parameters === 'object' && !Array.isArray(parameters))
if (query.includes(':') || query.includes('@')) {
const placeholders = convertNamedPlaceholders(query, parameters);
Expand All @@ -32,11 +30,7 @@ export const parseArguments = (
if (diff > 0) {
for (let i = 0; i < diff; i++) parameters[queryParams.length + i] = null;
} else if (diff < 0) {
throw new Error(
`${invokingResource} was unable to execute a query!\nExpected ${
queryParams.length
} parameters, but received ${parameters.length}.\n${`${query} ${JSON.stringify(parameters)}`}`
);
throw new Error(`Expected ${queryParams.length} parameters, but received ${parameters.length}.`);
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/utils/parseExecute.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { CFXParameters } from '../types';

export const executeType = (query: string) => {
if (typeof query !== 'string') throw new Error(`Expected query to be a string but received ${typeof query} instead.`);

switch (query.substring(0, query.indexOf(' '))) {
case 'INSERT':
return 'insert';
Expand Down
5 changes: 2 additions & 3 deletions src/utils/parseTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { parseArguments } from './parseArguments';
const isTransactionQuery = (query: TransactionQuery | string): query is TransactionQuery =>
(query as TransactionQuery).query !== undefined;

export const parseTransaction = (invokingResource: string, queries: TransactionQuery, parameters: CFXParameters) => {
export const parseTransaction = (queries: TransactionQuery, parameters: CFXParameters) => {
if (!Array.isArray(queries)) throw new Error(`Transaction queries must be array, received '${typeof queries}'.`);

if (!parameters || typeof parameters === 'function') parameters = [];
Expand All @@ -13,7 +13,7 @@ export const parseTransaction = (invokingResource: string, queries: TransactionQ
const transactions = queries.map((query) => {
if (typeof query[1] !== 'object')
throw new Error(`Transaction parameters must be array or object, received '${typeof query[1]}'.`);
const [parsedQuery, parsedParameters] = parseArguments(invokingResource, query[0], query[1]);
const [parsedQuery, parsedParameters] = parseArguments(query[0], query[1]);

return { query: parsedQuery, params: parsedParameters };
});
Expand All @@ -27,7 +27,6 @@ export const parseTransaction = (invokingResource: string, queries: TransactionQ
}

const [parsedQuery, parsedParameters] = parseArguments(
invokingResource,
isTransactionQuery(query) ? query.query : query,
isTransactionQuery(query) ? query.parameters || query.values : parameters
);
Expand Down

0 comments on commit 924fd6a

Please sign in to comment.