Skip to content

Commit db6bbf3

Browse files
committed
bin srch -ve val working
1 parent 55b6738 commit db6bbf3

File tree

2 files changed

+44
-30
lines changed

2 files changed

+44
-30
lines changed

src/test_ulog_sqlite.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ int test_multilevel(char *filename) {
110110
txt[21] = '0' + (tv.tv_usec / 10000) % 10;
111111
txt[22] = '0' + (tv.tv_usec / 1000) % 10;
112112
uls_set_col_val(&ctx, 0, ULS_TYPE_TEXT, txt, 23);
113-
uls_set_col_val(&ctx, 1, ULS_TYPE_INT, &i, sizeof(i));
113+
int32_t ival = i - max_rows / 2;
114+
uls_set_col_val(&ctx, 1, ULS_TYPE_INT, &ival, sizeof(ival));
114115
uls_set_col_val(&ctx, 2, ULS_TYPE_REAL, &d, sizeof(d));
115116
d = rand();
116117
d /= 1000;

src/ulog_sqlite.c

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ int read_last_val(struct uls_read_context *rctx, uint32_t pos,
983983
u32 = uls_derive_data_len(*out_col_type);
984984
if (u32 > val_len)
985985
u32 = val_len;
986-
memcpy(val_at, data_ptr, val_len);
986+
memcpy(val_at, data_ptr, u32);
987987
}
988988
return ULS_RES_OK;
989989
}
@@ -1097,40 +1097,53 @@ int compare_bin(const byte *v1, byte len1, const byte *v2, byte len2) {
10971097
return (len1 < len2 ? -k : k);
10981098
}
10991099

1100+
int64_t convert_to_i64(byte *val, int len, byte is_big_endian) {
1101+
int64_t ival_at = 0;
1102+
switch (len) {
1103+
case 4: {
1104+
uint32_t u32_val_at = (is_big_endian ? read_uint32(val) : *((uint32_t *) val));
1105+
if (u32_val_at & 0x80000000) {
1106+
ival_at = 0xFFFFFFFF - u32_val_at;
1107+
ival_at = 0xFFFFFFFFFFFFFFFF - ival_at;
1108+
} else
1109+
ival_at = u32_val_at;
1110+
break;
1111+
}
1112+
case 2: {
1113+
uint16_t u16_val_at = (is_big_endian ? read_uint16(val) : *((uint16_t *) val));
1114+
ival_at = u16_val_at & 0x7FFF;
1115+
if (u16_val_at & 0x8000) {
1116+
ival_at = 0xFFFF - u16_val_at;
1117+
ival_at = 0xFFFFFFFFFFFFFFFF - ival_at;
1118+
} else
1119+
ival_at = u16_val_at;
1120+
break;
1121+
}
1122+
case 6:
1123+
case 8:
1124+
ival_at = (is_big_endian ? read_uint64(val) : *((int64_t *) val));
1125+
break;
1126+
case 1: {
1127+
uint8_t u8_val_at = (is_big_endian ? read_uint8(val) : *((uint8_t *) val));
1128+
ival_at = u8_val_at & 0x7F;
1129+
if (u8_val_at & 0x80) {
1130+
ival_at = 0xFF - u8_val_at;
1131+
ival_at = 0xFFFFFFFFFFFFFFFF - ival_at;
1132+
} else
1133+
ival_at = u8_val_at;
1134+
}
1135+
}
1136+
return ival_at;
1137+
}
1138+
11001139
// Compare values for binary search and return 1, -1 or 0
11011140
int compare_values(byte *val_at, uint32_t u32_at, int val_type, void *val, uint16_t len, byte is_rowid) {
11021141
if (is_rowid)
11031142
return (u32_at > *((uint32_t *) val) ? 1 : u32_at < *((uint32_t *) val) ? -1 : 0);
11041143
switch (val_type) {
11051144
case ULS_TYPE_INT: {
1106-
int64_t ival_at;
1107-
switch (u32_at) {
1108-
case 4:
1109-
ival_at = (int64_t) read_uint32(val_at);
1110-
break;
1111-
case 2:
1112-
ival_at = (int64_t) read_uint16(val_at);
1113-
break;
1114-
case 6:
1115-
ival_at = read_uint64(val_at);
1116-
break;
1117-
case 1:
1118-
ival_at = (int64_t) read_uint8(val_at);
1119-
}
1120-
int64_t ival;
1121-
switch (len) {
1122-
case 4:
1123-
ival = *((int32_t *) val);
1124-
break;
1125-
case 2:
1126-
ival = *((int16_t *) val);
1127-
break;
1128-
case 8:
1129-
ival = *((int64_t *) val);
1130-
break;
1131-
case 1:
1132-
ival = *((int8_t *) val);
1133-
}
1145+
int64_t ival_at = convert_to_i64(val_at, u32_at, 1);
1146+
int64_t ival = convert_to_i64(val, len, 0);
11341147
return ival_at > ival ? 1 : (ival_at < ival ? -1 : 0);
11351148
}
11361149
case ULS_TYPE_REAL:

0 commit comments

Comments
 (0)