3 #include <AssignQuery.h>
6 static void AssignQuery_reclaim(Query *this) {
7 AssignQuery *q = (AssignQuery*) this;
12 static int AssignQuery_check(Tuple *a,Tuple *b) {
14 for ( i = 0; i < a->size; i++ ) {
15 char *value = a->elements[i];
16 char *current = b->elements[i];
17 if ( value && current && current != value &&
18 strcmp( current, value ) != 0 ) {
25 // Make names have given values and return 1. If any name has a
26 // different value then return 0. Values are strings.
27 static int AssignQuery_next(
28 Query *this,BindingTable *bt,enum NextState state) {
29 AssignQuery *q = (AssignQuery*) this;
32 if ( q->saved == 0 ) {
33 q->saved = Tuple_clone( q->names );
35 memcpy( q->saved, q->names, q->names->size * sizeof( void* ) );
37 BindingTable_deref( bt, q->saved );
38 // Check with new values
39 if ( AssignQuery_check( q->values, q->saved ) ) {
40 BindingTable_set_all( bt, q->names, q->values, 0 );
47 BindingTable_set_all( bt, q->names, q->saved, 1 );
56 static void AssignQuery_variables(Query *this,HashVector *hv) {
57 AssignQuery *q = (AssignQuery*) this;
59 for ( i = 0; i < q->names->size; i++ ) {
60 HashVector_add( hv, q->names->elements[i] );
64 static struct QueryCallbacks AssignQuery_def = {
65 .reclaim = AssignQuery_reclaim,
66 .next = AssignQuery_next,
67 .variables = AssignQuery_variables
71 * Return a Query object representing an assignment of one or more
74 Query *Query_assign(int arity,Tuple *names,Tuple *values) {
75 AssignQuery *q = (AssignQuery*)
76 malloc( sizeof( AssignQuery ) );
77 (*q) = (AssignQuery) {
78 .def = &AssignQuery_def,