sql_exp * exps_bind_column( list *exps, char *cname, int *ambiguous ) { sql_exp *e = NULL; if (exps && cname) { node *en; if (exps && !exps->ht && list_length(exps) > HASH_MIN_SIZE) { exps->ht = hash_new(exps->sa, list_length(exps), (fkeyvalue)&exp_key); for (en = exps->h; en; en = en->next ) { sql_exp *e = en->data; if (e->name) { int key = exp_key(e); hash_add(exps->ht, key, e); } } } if (exps && exps->ht) { int key = hash_key(cname); sql_hash_e *he = exps->ht->buckets[key&(exps->ht->size-1)]; for (; he; he = he->chain) { sql_exp *ce = he->value; if (ce->name && strcmp(ce->name, cname) == 0) { if (e) { if (ambiguous) *ambiguous = 1; return NULL; } e = ce; } } return e; } for (en = exps->h; en; en = en->next ) { sql_exp *ce = en->data; if (ce->name && strcmp(ce->name, cname) == 0) { if (e) { if (ambiguous) *ambiguous = 1; return NULL; } e = ce; } } } return e; }
sql_exp * exps_bind_column2( list *exps, char *rname, char *cname ) { if (exps) { node *en; if (exps && !exps->ht && list_length(exps) > HASH_MIN_SIZE) { exps->ht = hash_new(exps->sa, list_length(exps), (fkeyvalue)&exp_key); for (en = exps->h; en; en = en->next ) { sql_exp *e = en->data; if (e->name) { int key = exp_key(e); hash_add(exps->ht, key, e); } } } if (exps && exps->ht) { int key = hash_key(cname); sql_hash_e *he = exps->ht->buckets[key&(exps->ht->size-1)]; for (; he; he = he->chain) { sql_exp *e = he->value; if (e && is_column(e->type) && e->name && e->rname && strcmp(e->name, cname) == 0 && strcmp(e->rname, rname) == 0) return e; if (e && e->type == e_column && e->name && !e->rname && e->l && strcmp(e->name, cname) == 0 && strcmp(e->l, rname) == 0) return e; } return NULL; } for (en = exps->h; en; en = en->next ) { sql_exp *e = en->data; if (e && is_column(e->type) && e->name && e->rname && strcmp(e->name, cname) == 0 && strcmp(e->rname, rname) == 0) return e; if (e && e->type == e_column && e->name && !e->rname && e->l && strcmp(e->name, cname) == 0 && strcmp(e->l, rname) == 0) return e; if (e && e->type == e_column && !e->name && !e->rname && e->l && e->r && strcmp(e->r, cname) == 0 && strcmp(e->l, rname) == 0) { assert(0); return e; } } } return NULL; }
bool operator()(const CScriptID &id) const { uint160 exp_key(exp_payload); return exp_key == id; }
bool operator()(const ckeyid &id) const { uint160 exp_key(exp_payload); return exp_key == id; }