int mdb_test_sargs(MdbHandle *mdb, MdbColumn *col, int offset, int len) { MdbSarg *sarg; int i; for (i=0;i<col->num_sargs;i++) { sarg = g_ptr_array_index (col->sargs, i); if (!mdb_test_sarg(mdb, col, sarg, offset, len)) { /* sarg didn't match, no sense going on */ return 0; } } return 1; }
int mdb_test_sarg_node(MdbHandle *mdb, MdbSargNode *node, MdbField *fields, int num_fields) { int elem; MdbColumn *col; int rc; if (mdb_is_relational_op(node->op)) { col = node->col; /* for const = const expressions */ if (!col) { return (node->value.i); } elem = mdb_find_field(col->col_num, fields, num_fields); if (!mdb_test_sarg(mdb, col, node, &fields[elem])) return 0; } else { /* logical op */ switch (node->op) { case MDB_NOT: rc = mdb_test_sarg_node(mdb, node->left, fields, num_fields); return !rc; break; case MDB_AND: if (!mdb_test_sarg_node(mdb, node->left, fields, num_fields)) return 0; return mdb_test_sarg_node(mdb, node->right, fields, num_fields); break; case MDB_OR: if (mdb_test_sarg_node(mdb, node->left, fields, num_fields)) return 1; return mdb_test_sarg_node(mdb, node->right, fields, num_fields); break; } } return 1; }
static int mdb_index_test_sargs(MdbHandle *mdb, MdbIndex *idx, unsigned char *buf, int len) { unsigned int i, j; MdbColumn *col; MdbTableDef *table = idx->table; MdbSarg *idx_sarg; MdbSarg *sarg; MdbField field; MdbSargNode node; //int c_offset = 0, int c_len; #if 0 fprintf(stderr,"mdb_index_test_sargs called on "); for (i=0;i<len;i++) fprintf(stderr,"%02x ",buf[i]); //mdb->pg_buf[offset+i]); fprintf(stderr,"\n"); #endif for (i=0;i<idx->num_keys;i++) { //c_offset++; /* the per column null indicator/flags */ col=g_ptr_array_index(table->columns,idx->key_col_num[i]-1); /* * This will go away eventually */ if (col->col_type==MDB_TEXT) { //c_len = strlen(&mdb->pg_buf[offset + c_offset]); c_len = strlen((char*) buf); } else { c_len = col->col_size; //fprintf(stderr,"Only text types currently supported. How did we get here?\n"); } /* * If we have no cached index values for this column, * create them. */ if (col->num_sargs && !col->idx_sarg_cache) { col->idx_sarg_cache = g_ptr_array_new(); for (j=0;j<col->num_sargs;j++) { sarg = g_ptr_array_index (col->sargs, j); idx_sarg = g_memdup(sarg,sizeof(MdbSarg)); //printf("calling mdb_index_cache_sarg\n"); mdb_index_cache_sarg(col, sarg, idx_sarg); g_ptr_array_add(col->idx_sarg_cache, idx_sarg); } } for (j=0;j<col->num_sargs;j++) { sarg = g_ptr_array_index (col->idx_sarg_cache, j); /* XXX - kludge */ node.op = sarg->op; node.value = sarg->value; //field.value = &mdb->pg_buf[offset + c_offset]; field.value = buf; field.siz = c_len; field.is_null = FALSE; if (!mdb_test_sarg(mdb, col, &node, &field)) { /* sarg didn't match, no sense going on */ return 0; } } } return 1; }