Skip to content

Commit 067b180

Browse files
committed
Add methods to read and write strings
1 parent 362f94c commit 067b180

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

pyhost.c

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ static i64 readI64(const u8** const data)
100100
return value;
101101
}
102102

103+
static PyObject* readString(const u8** const data)
104+
{
105+
const i32 size = readI32(data);
106+
PyObject* value = checked(PyUnicode_FromStringAndSize((const char*)*data, size));
107+
*data += size;
108+
return value;
109+
}
110+
103111
// skip type at the current position in the type descriptor
104112
static void skipType(const u8** const type)
105113
{
@@ -234,19 +242,14 @@ static PyObject* doBuildArgs(const u8** const type, const u8** const data)
234242
return checked(PyFloat_FromDouble(value));
235243
}
236244
case DECIMAL: {
237-
const i32 size = readI32(data);
238-
PyObject* number = checked(PyUnicode_FromStringAndSize((const char*)*data, size));
239-
*data += size;
245+
PyObject* number = readString(data);
240246
PyObject* value = checked(PyObject_CallOneArg(decimalClass, number));
241247
Py_DECREF(number);
242248
return value;
243249
}
244250
case VARCHAR:
245251
case JSON: {
246-
const i32 size = readI32(data);
247-
PyObject* value = checked(PyUnicode_FromStringAndSize((const char*)*data, size));
248-
*data += size;
249-
return value;
252+
return readString(data);
250253
}
251254
case VARBINARY: {
252255
const i32 size = readI32(data);
@@ -424,26 +427,38 @@ static void bufferAppend(Buffer* buffer, const u8* data, const i32 size)
424427
buffer->used += size;
425428
}
426429

427-
static void bufferAppendI8(Buffer *buffer, const i8 value)
430+
static void bufferAppendI8(Buffer* buffer, const i8 value)
428431
{
429432
bufferAppend(buffer, (u8*)&value, sizeof(i8));
430433
}
431434

432-
static void bufferAppendI16(Buffer *buffer, const i16 value)
435+
static void bufferAppendI16(Buffer* buffer, const i16 value)
433436
{
434437
bufferAppend(buffer, (u8*)&value, sizeof(i16));
435438
}
436439

437-
static void bufferAppendI32(Buffer *buffer, const i32 value)
440+
static void bufferAppendI32(Buffer* buffer, const i32 value)
438441
{
439442
bufferAppend(buffer, (u8*)&value, sizeof(i32));
440443
}
441444

442-
static void bufferAppendI64(Buffer *buffer, const i64 value)
445+
static void bufferAppendI64(Buffer* buffer, const i64 value)
443446
{
444447
bufferAppend(buffer, (u8*)&value, sizeof(i64));
445448
}
446449

450+
static bool bufferAppendString(Buffer* buffer, PyObject* object)
451+
{
452+
Py_ssize_t size;
453+
const char* value = PyUnicode_AsUTF8AndSize(object, &size);
454+
if (value == NULL) {
455+
return false;
456+
}
457+
bufferAppendI32(buffer, size);
458+
bufferAppend(buffer, (u8*)value, size);
459+
return true;
460+
}
461+
447462
static void overflowError(const char* message)
448463
{
449464
trinoReturnError(NUMERIC_VALUE_OUT_OF_RANGE, (u8*)message, strlen(message), NULL, 0);
@@ -634,15 +649,11 @@ static bool buildResult(const u8** const type, PyObject* input, Buffer* buffer)
634649
resultError(input, "DECIMAL");
635650
return false;
636651
}
637-
Py_ssize_t size;
638-
const char* value = PyUnicode_AsUTF8AndSize(string, &size);
639-
if (value == NULL) {
652+
if (!bufferAppendString(buffer, string)) {
640653
Py_DECREF(string);
641654
resultError(input, "DECIMAL");
642655
return false;
643656
}
644-
bufferAppendI32(buffer, size);
645-
bufferAppend(buffer, (u8*)value, size);
646657
Py_DECREF(string);
647658
return true;
648659
}
@@ -653,14 +664,10 @@ static bool buildResult(const u8** const type, PyObject* input, Buffer* buffer)
653664
resultError(input, typeName);
654665
return false;
655666
}
656-
Py_ssize_t size;
657-
const char* value = PyUnicode_AsUTF8AndSize(input, &size);
658-
if (value == NULL) {
667+
if (!bufferAppendString(buffer, input)) {
659668
resultError(input, typeName);
660669
return false;
661670
}
662-
bufferAppendI32(buffer, size);
663-
bufferAppend(buffer, (u8*)value, size);
664671
return true;
665672
}
666673
case VARBINARY: {

0 commit comments

Comments
 (0)