mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-07-17 04:19:25 +08:00
Support comparisons with MDB_FLOAT and MDB_DOUBLE
See https://github.com/mdbtools/mdbtools/issues/105
This commit is contained in:
parent
aa0ce8fb3e
commit
a13936bd77
@ -107,28 +107,29 @@ static double poor_mans_trunc(double x)
|
|||||||
|
|
||||||
int mdb_test_double(int op, double vd, double d)
|
int mdb_test_double(int op, double vd, double d)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case MDB_EQUAL:
|
case MDB_EQUAL:
|
||||||
//fprintf(stderr, "comparing %lf and %lf\n", d, node->value.d);
|
//fprintf(stderr, "comparing %lf and %lf\n", d, node->value.d);
|
||||||
if (vd == d) return 1;
|
ret = (vd == d);
|
||||||
break;
|
break;
|
||||||
case MDB_GT:
|
case MDB_GT:
|
||||||
if (vd < d) return 1;
|
ret = (vd < d);
|
||||||
break;
|
break;
|
||||||
case MDB_LT:
|
case MDB_LT:
|
||||||
if (vd > d) return 1;
|
ret = (vd > d);
|
||||||
break;
|
break;
|
||||||
case MDB_GTEQ:
|
case MDB_GTEQ:
|
||||||
if (vd <= d) return 1;
|
ret = (vd <= d);
|
||||||
break;
|
break;
|
||||||
case MDB_LTEQ:
|
case MDB_LTEQ:
|
||||||
if (vd >= d) return 1;
|
ret = (vd >= d);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_double() for operator %d\n",op);
|
fprintf(stderr, "Calling mdb_test_sarg on unknown operator. Add code to mdb_test_double() for operator %d\n",op);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // Obsolete
|
#if 0 // Obsolete
|
||||||
@ -210,42 +211,49 @@ mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field
|
|||||||
{
|
{
|
||||||
char tmpbuf[256];
|
char tmpbuf[256];
|
||||||
char* val;
|
char* val;
|
||||||
int ret;
|
int ret = 1;
|
||||||
|
|
||||||
if (node->op == MDB_ISNULL)
|
if (node->op == MDB_ISNULL)
|
||||||
return field->is_null?1:0;
|
ret = field->is_null;
|
||||||
else if (node->op == MDB_NOTNULL)
|
else if (node->op == MDB_NOTNULL)
|
||||||
return field->is_null?0:1;
|
ret = !field->is_null;
|
||||||
switch (col->col_type) {
|
switch (col->col_type) {
|
||||||
case MDB_BOOL:
|
case MDB_BOOL:
|
||||||
return mdb_test_int(node, !field->is_null);
|
ret = mdb_test_int(node, !field->is_null);
|
||||||
break;
|
break;
|
||||||
case MDB_BYTE:
|
case MDB_BYTE:
|
||||||
return mdb_test_int(node, (gint32)((char *)field->value)[0]);
|
ret = mdb_test_int(node, (gint32)((char *)field->value)[0]);
|
||||||
break;
|
break;
|
||||||
case MDB_INT:
|
case MDB_INT:
|
||||||
return mdb_test_int(node, (gint32)mdb_get_int16(field->value, 0));
|
ret = mdb_test_int(node, (gint32)mdb_get_int16(field->value, 0));
|
||||||
break;
|
break;
|
||||||
case MDB_LONGINT:
|
case MDB_LONGINT:
|
||||||
return mdb_test_int(node, (gint32)mdb_get_int32(field->value, 0));
|
ret = mdb_test_int(node, (gint32)mdb_get_int32(field->value, 0));
|
||||||
|
break;
|
||||||
|
case MDB_FLOAT:
|
||||||
|
ret = mdb_test_double(node->op, node->value.d, mdb_get_single(field->value, 0));
|
||||||
|
break;
|
||||||
|
case MDB_DOUBLE:
|
||||||
|
ret = mdb_test_double(node->op, node->value.d, mdb_get_double(field->value, 0));
|
||||||
break;
|
break;
|
||||||
case MDB_TEXT:
|
case MDB_TEXT:
|
||||||
mdb_unicode2ascii(mdb, field->value, field->siz, tmpbuf, 256);
|
mdb_unicode2ascii(mdb, field->value, field->siz, tmpbuf, 256);
|
||||||
return mdb_test_string(node, tmpbuf);
|
ret = mdb_test_string(node, tmpbuf);
|
||||||
|
break;
|
||||||
case MDB_MEMO:
|
case MDB_MEMO:
|
||||||
val = mdb_col_to_string(mdb, mdb->pg_buf, field->start, col->col_type, (gint32)mdb_get_int32(field->value, 0));
|
val = mdb_col_to_string(mdb, mdb->pg_buf, field->start, col->col_type, (gint32)mdb_get_int32(field->value, 0));
|
||||||
//printf("%s\n",val);
|
//printf("%s\n",val);
|
||||||
ret = mdb_test_string(node, val);
|
ret = mdb_test_string(node, val);
|
||||||
g_free(val);
|
g_free(val);
|
||||||
return ret;
|
|
||||||
break;
|
break;
|
||||||
case MDB_DATETIME:
|
case MDB_DATETIME:
|
||||||
return mdb_test_double(node->op, poor_mans_trunc(node->value.d), poor_mans_trunc(mdb_get_double(field->value, 0)));
|
ret = mdb_test_double(node->op, poor_mans_trunc(node->value.d), poor_mans_trunc(mdb_get_double(field->value, 0)));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Calling mdb_test_sarg on unknown type. Add code to mdb_test_sarg() for type %d\n",col->col_type);
|
fprintf(stderr, "Calling mdb_test_sarg on unknown type. Add code to mdb_test_sarg() for type %d\n",col->col_type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return ret;
|
||||||
}
|
}
|
||||||
int
|
int
|
||||||
mdb_find_field(int col_num, MdbField *fields, int num_fields)
|
mdb_find_field(int col_num, MdbField *fields, int num_fields)
|
||||||
|
Loading…
Reference in New Issue
Block a user