Fix sourceDevice column type in unprocessed

This commit is contained in:
Fedor Indutny 2025-01-22 11:04:28 -08:00 committed by GitHub
parent 649d24b623
commit 96718464ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 119 additions and 5 deletions

View file

@ -34,7 +34,7 @@ export function updateToVersion(db: WritableDB, version: number): void {
}
type TableRows = ReadonlyArray<
Record<string, string | number | null | Record<string, unknown>>
Record<string, string | number | Buffer | null | Record<string, unknown>>
>;
export function insertData(
@ -52,6 +52,9 @@ export function insertData(
`
).run(
Object.values(row).map(v => {
if (Buffer.isBuffer(v)) {
return v;
}
if (v != null && typeof v === 'object') {
return JSON.stringify(v);
}
@ -65,7 +68,7 @@ export function getTableData(db: ReadableDB, table: string): TableRows {
return db
.prepare(`SELECT * FROM ${table}`)
.all()
.map((row: Record<string, string | number | null>) => {
.map((row: Record<string, string | number | Buffer | null>) => {
const result: Record<
string,
string | number | null | Record<string, unknown>
@ -79,7 +82,7 @@ export function getTableData(db: ReadableDB, table: string): TableRows {
continue;
}
try {
if (typeof value !== 'string') {
if (typeof value !== 'string' || !value.trim().startsWith('{')) {
throw new Error('skip');
}
result[key] = JSON.parse(value) as Record<string, unknown>;

View file

@ -0,0 +1,75 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import { type WritableDB } from '../../sql/Interface';
import { createDB, updateToVersion, insertData, getTableData } from './helpers';
const DEFAULTS = {
id: 'id',
type: 0,
timestamp: 1,
attempts: 2,
receivedAtCounter: 3,
urgent: 1,
story: 1,
serverGuid: 'guid',
serverTimestamp: 1,
isEncrypted: 0,
content: Buffer.from('68656c6c6f', 'hex'),
messageAgeSec: 1,
destinationServiceId: 'dest',
};
describe('SQL/updateToSchemaVersion1290', () => {
let db: WritableDB;
afterEach(() => {
db.close();
});
beforeEach(() => {
db = createDB();
updateToVersion(db, 1280);
});
it('transitions null sourceDevice', () => {
insertData(db, 'unprocessed', [
{
...DEFAULTS,
sourceDevice: null,
},
]);
updateToVersion(db, 1290);
assert.deepStrictEqual(getTableData(db, 'unprocessed'), [
{
...DEFAULTS,
content: '68656c6c6f',
},
]);
});
it('transitions number sourceDevice', () => {
insertData(db, 'unprocessed', [
{
...DEFAULTS,
sourceDevice: '123',
},
]);
updateToVersion(db, 1290);
assert.deepStrictEqual(getTableData(db, 'unprocessed'), [
{
...DEFAULTS,
content: '68656c6c6f',
sourceDevice: 123,
},
]);
});
});