Fix binlog integer conversion

The binlog integers were stored as unsigned values instead of signed ones.
This commit is contained in:
Markus Mäkelä
2017-02-09 15:33:17 +02:00
parent 526e48e459
commit 47a1cdad5d

View File

@ -352,44 +352,64 @@ bool handle_row_event(AVRO_INSTANCE *router, REP_HEADER *hdr, uint8_t *ptr)
*/ */
void set_numeric_field_value(avro_value_t *field, uint8_t type, uint8_t *metadata, uint8_t *value) void set_numeric_field_value(avro_value_t *field, uint8_t type, uint8_t *metadata, uint8_t *value)
{ {
int64_t i = 0;
switch (type) switch (type)
{ {
case TABLE_COL_TYPE_TINY: case TABLE_COL_TYPE_TINY:
i = *value; {
avro_value_set_int(field, i); char c = *value;
avro_value_set_int(field, c);
break; break;
}
case TABLE_COL_TYPE_SHORT: case TABLE_COL_TYPE_SHORT:
memcpy(&i, value, 2); {
avro_value_set_int(field, i); short s = gw_mysql_get_byte2(value);
avro_value_set_int(field, s);
break; break;
}
case TABLE_COL_TYPE_INT24: case TABLE_COL_TYPE_INT24:
memcpy(&i, value, 3); {
avro_value_set_int(field, i); int x = gw_mysql_get_byte3(value);
if (x & 0x800000)
{
x = -((0xffffff & (~x)) + 1);
}
avro_value_set_int(field, x);
break; break;
}
case TABLE_COL_TYPE_LONG: case TABLE_COL_TYPE_LONG:
memcpy(&i, value, 4); {
avro_value_set_int(field, i); int x = gw_mysql_get_byte4(value);
avro_value_set_int(field, x);
break; break;
}
case TABLE_COL_TYPE_LONGLONG: case TABLE_COL_TYPE_LONGLONG:
memcpy(&i, value, 8); {
avro_value_set_int(field, i); long l = gw_mysql_get_byte8(value);
avro_value_set_int(field, l);
break; break;
}
case TABLE_COL_TYPE_FLOAT: case TABLE_COL_TYPE_FLOAT:
memcpy(&i, value, 4); {
avro_value_set_float(field, (float)i); float f = 0;
memcpy(&f, value, 4);
avro_value_set_float(field, f);
break; break;
}
case TABLE_COL_TYPE_DOUBLE: case TABLE_COL_TYPE_DOUBLE:
memcpy(&i, value, 8); {
avro_value_set_float(field, (double)i); double d = 0;
memcpy(&d, value, 8);
avro_value_set_double(field, d);
break; break;
}
default: default:
break; break;