Skip to content
This repository was archived by the owner on Apr 29, 2025. It is now read-only.

Commit 0691160

Browse files
committed
fix(database/connection): disable typecasting for execute method
1 parent 0f38590 commit 0691160

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

src/database/connection.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import type { Connection, PoolConnection } from 'mysql2/promise';
1+
import type { Connection, PoolConnection, TypeCast } from 'mysql2/promise';
22
import { scheduleTick } from '../utils/scheduleTick';
33
import { sleep } from '../utils/sleep';
44
import { pool } from './pool';
55
import type { CFXParameters } from 'types';
6+
import { typeCastExecute } from 'utils/typeCast';
67

78
(Symbol as any).dispose ??= Symbol('Symbol.dispose');
89

@@ -34,7 +35,11 @@ export class MySql {
3435
async execute(query: string, values: CFXParameters = []) {
3536
scheduleTick();
3637

37-
const [result] = await this.connection.execute(query, values);
38+
const [result] = await this.connection.execute({
39+
sql: query,
40+
values: values,
41+
typeCast: typeCastExecute as TypeCast,
42+
});
3843
return result;
3944
}
4045

src/utils/typeCast.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
1-
import { FieldPacket } from 'mysql2';
1+
import type { TypeCastField, TypeCastNext } from 'mysql2/promise';
22

33
const BINARY_CHARSET = 63;
44

5-
type Field = {
6-
type: string;
7-
length: number;
8-
packet: FieldPacket;
5+
interface Field extends TypeCastField {
96
charset: number;
10-
string: () => string;
11-
buffer: () => number[];
12-
};
7+
}
138

14-
export const typeCast = (field: Field, next: () => void) => {
9+
/**
10+
* node-mysql2 v3.9.0 introduced (breaking) typecasting for execute methods.
11+
*/
12+
export function typeCastExecute(field: Field, next: TypeCastNext) {
13+
return next();
14+
}
15+
16+
/**
17+
* mysql-async compatible typecasting.
18+
*/
19+
export function typeCast(field: Field, next: TypeCastNext) {
1520
switch (field.type) {
1621
case 'DATETIME':
1722
case 'DATETIME2':
1823
case 'TIMESTAMP':
1924
case 'TIMESTAMP2':
2025
case 'NEWDATE':
21-
return new Date(field.string()).getTime();
26+
return new Date(field.string() || '').getTime();
2227
case 'DATE':
2328
return new Date(field.string() + ' 00:00:00').getTime();
2429
case 'TINY':
2530
return field.length === 1 ? field.string() === '1' : next();
2631
case 'BIT':
27-
return field.length === 1 ? field.buffer()[0] === 1 : field.buffer()[0];
32+
return field.length === 1 ? field.buffer()?.[0] === 1 : field.buffer()?.[0];
2833
case 'TINY_BLOB':
2934
case 'MEDIUM_BLOB':
3035
case 'LONG_BLOB':
@@ -38,4 +43,4 @@ export const typeCast = (field: Field, next: () => void) => {
3843
default:
3944
return next();
4045
}
41-
};
46+
}

0 commit comments

Comments
 (0)