Skip to content

Commit 19b0d86

Browse files
author
Daniele Briggi
committed
fix(unicode): count bytes not characters
1 parent 490844e commit 19b0d86

File tree

5 files changed

+51
-23
lines changed

5 files changed

+51
-23
lines changed

bun.lockb

-354 Bytes
Binary file not shown.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sqlitecloud/drivers",
3-
"version": "1.0.354",
3+
"version": "1.0.399",
44
"description": "SQLiteCloud drivers for Typescript/Javascript in edge, web and node clients",
55
"main": "./lib/index.js",
66
"types": "./lib/index.d.ts",

src/drivers/protocol.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ export function formatCommand(command: SQLiteCloudCommand): string {
346346
return serializeData(command.query, false)
347347
}
348348

349-
function serializeCommand(data: any[], zeroString: boolean = false): string {
349+
function serializeCommand(data: SQLiteCloudDataTypes[], zeroString: boolean = false): string {
350350
const n = data.length
351351
let serializedData = `${n} `
352352

@@ -356,11 +356,12 @@ function serializeCommand(data: any[], zeroString: boolean = false): string {
356356
serializedData += serializeData(data[i], zs)
357357
}
358358

359-
const header = `${CMD_ARRAY}${serializedData.length} `
359+
const bytesTotal = Buffer.byteLength(serializedData, 'utf-8')
360+
const header = `${CMD_ARRAY}${bytesTotal} `
360361
return header + serializedData
361362
}
362363

363-
function serializeData(data: any, zeroString: boolean = false): string {
364+
function serializeData(data: SQLiteCloudDataTypes, zeroString: boolean = false): string {
364365
if (typeof data === 'string') {
365366
let cmd = CMD_STRING
366367
if (zeroString) {

test/database.test.ts

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -515,28 +515,55 @@ describe('Database.sql (async)', () => {
515515
})
516516

517517
it('should throw exception when using table name as binding', async () => {
518-
const database = await getTestingDatabaseAsync()
519-
const table = 'people'
520-
await expect(database.sql`SELECT * FROM ${table}`).rejects.toThrow('near "?": syntax error')
518+
let database
519+
try {
520+
database = await getTestingDatabaseAsync()
521+
const table = 'people'
522+
await expect(database.sql`SELECT * FROM ${table}`).rejects.toThrow('near "?": syntax error')
523+
} finally {
524+
await removeDatabaseAsync(database)
525+
}
521526
})
522527

523-
it('should built in commands accept bindings', async () => {
524-
const database = await getTestingDatabaseAsync()
528+
it('should commands accept bindings', async () => {
529+
let database
530+
try {
531+
database = await getTestingDatabaseAsync()
525532

526-
const databaseName = database.getConfiguration().database || ''
527-
await expect(database.sql`USE DATABASE ${databaseName}`).resolves.toBe('OK')
533+
const databaseName = database.getConfiguration().database || ''
534+
await expect(database.sql`USE DATABASE ${databaseName}`).resolves.toBe('OK')
528535

529-
const databaseNameInjectSQL = `${databaseName}; SELECT * FROM people`
530-
await expect(database.sql`USE DATABASE ${databaseNameInjectSQL}`).rejects.toThrow(`Database name contains invalid characters (${databaseNameInjectSQL}).`)
536+
const databaseNameInjectSQL = `${databaseName}; SELECT * FROM people`
537+
await expect(database.sql`USE DATABASE ${databaseNameInjectSQL}`).rejects.toThrow(`Database name contains invalid characters (${databaseNameInjectSQL}).`)
531538

532-
let key = 'logo_level'
533-
let value = 'debug'
534-
await expect(database.sql`SET KEY ${key} TO ${value}`).resolves.toBe('OK')
539+
let key = 'logo_level'
540+
let value = 'debug'
541+
await expect(database.sql`SET KEY ${key} TO ${value}`).resolves.toBe('OK')
535542

536-
key = 'logo_level'
537-
value = 'debug; DROP TABLE people'
538-
await expect(database.sql`SET KEY ${key} TO ${value}`).resolves.toBe('OK')
539-
const result = await database.sql`SELECT * FROM people`
540-
expect(result.length).toBeGreaterThan(0)
543+
key = 'logo_level'
544+
value = 'debug; DROP TABLE people'
545+
await expect(database.sql`SET KEY ${key} TO ${value}`).resolves.toBe('OK')
546+
const result = await database.sql`SELECT * FROM people`
547+
expect(result.length).toBeGreaterThan(0)
548+
} finally {
549+
await removeDatabaseAsync(database)
550+
}
551+
})
552+
553+
it('binding should work with unicode character', async () => {
554+
let database
555+
try {
556+
database = await getTestingDatabaseAsync()
557+
const name = 'unicorn-🦄'
558+
559+
let results = await database.sql('INSERT INTO people (name, age, hobby) VALUES (?, 11, "");', name)
560+
expect(results.changes).toEqual(1)
561+
562+
results = await database.sql('SELECT * FROM people WHERE name = ?;', name)
563+
expect(results).toHaveLength(1)
564+
expect(results[0].name).toEqual(name)
565+
} finally {
566+
await removeDatabaseAsync(database)
567+
}
541568
})
542569
})

test/shared.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ export const WARN_SPEED_MS = 500
2525
export const EXPECT_SPEED_MS = 6 * 1000
2626

2727
/** Number of times or size of stress (when repeated in sequence) */
28-
export const SEQUENCE_TEST_SIZE = 150
28+
export const SEQUENCE_TEST_SIZE = 90
2929
/** Concurrency size for multiple connection tests */
30-
export const SIMULTANEOUS_TEST_SIZE = 150
30+
export const SIMULTANEOUS_TEST_SIZE = 90
3131

3232
/** Testing database from .env file */
3333
export const CHINOOK_DATABASE_URL = process.env.CHINOOK_DATABASE_URL as string

0 commit comments

Comments
 (0)