Skip to content

Commit 1d49b63

Browse files
estliberitasSannis
authored andcommitted
Added handling of SET, ENUM, spartials to fetchAll() for prepare statements
1 parent 1e36d2d commit 1d49b63

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/mysql_bindings_statement.cc

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,10 @@ Handle<Value> MysqlStatement::FetchAllSync(const Arguments& args) {
538538
type == MYSQL_TYPE_BLOB || // BLOB, TEXT
539539
type == MYSQL_TYPE_MEDIUM_BLOB || // MEDIUMBLOB, MEDIUMTEXT
540540
type == MYSQL_TYPE_LONG_BLOB || // LONGBLOB, LONGTEXT
541-
type == MYSQL_TYPE_BIT) { // BIT
541+
type == MYSQL_TYPE_BIT || // BIT
542+
type == MYSQL_TYPE_SET || // SET
543+
type == MYSQL_TYPE_ENUM || // ENUM
544+
type == MYSQL_TYPE_GEOMETRY) { // Spatial fields
542545
buf_length = sizeof(char) * fields[i].length;
543546
ptr = (char *) malloc(buf_length);
544547
} else if (
@@ -549,6 +552,9 @@ Handle<Value> MysqlStatement::FetchAllSync(const Arguments& args) {
549552
type == MYSQL_TYPE_TIMESTAMP) { // TIMESTAMP
550553
buf_length = sizeof(MYSQL_TIME);
551554
ptr = (MYSQL_TIME *) malloc(buf_length);
555+
} else { // For others we bind char buffer
556+
buf_length = sizeof(char) * fields[i].length;
557+
ptr = (char *) malloc(buf_length);
552558
}
553559

554560
DEBUG_PRINT("Binding buffer: ptr: %p, size: %d\n", ptr, buf_length);
@@ -637,7 +643,9 @@ Handle<Value> MysqlStatement::FetchAllSync(const Arguments& args) {
637643
type == MYSQL_TYPE_BLOB || // BLOB, TEXT
638644
type == MYSQL_TYPE_MEDIUM_BLOB || // MEDIUMBLOB, MEDIUMTEXT
639645
type == MYSQL_TYPE_LONG_BLOB || // LONGBLOB, LONGTEXT
640-
type == MYSQL_TYPE_BIT) { // BIT
646+
type == MYSQL_TYPE_BIT || // BIT
647+
type == MYSQL_TYPE_ENUM || // ENUM
648+
type == MYSQL_TYPE_GEOMETRY) { // Spatial fields
641649
char *data = (char *) ptr;
642650
// create buffer
643651
if (fields[j].flags & BINARY_FLAG) {
@@ -678,6 +686,20 @@ Handle<Value> MysqlStatement::FetchAllSync(const Arguments& args) {
678686
time_t timestamp = mktime(datetime);
679687

680688
js_field = Date::New(1000 * (double) timestamp);
689+
} else if (type == MYSQL_TYPE_SET) { // SET
690+
// TODO(Sannis): Maybe memory leaks here
691+
char *pch, *last, *field_value = (char *) ptr;
692+
int k = 0;
693+
Local<Array> js_field_array = Array::New();
694+
695+
pch = strtok_r(field_value, ",", &last);
696+
while (pch != NULL) {
697+
js_field_array->Set(Integer::New(k), V8STR(pch));
698+
pch = strtok_r(NULL, ",", &last);
699+
k++;
700+
}
701+
702+
js_field = js_field_array;
681703
} else {
682704
js_field = V8STR2((char *) ptr, length[j]);
683705
}

0 commit comments

Comments
 (0)