44 #define DEBUG DEBUG_NONE
55 clear_handle(db_handle_t *handle)
57 memset(handle, 0,
sizeof(*handle));
59 handle->result_rel =
NULL;
60 handle->left_rel =
NULL;
61 handle->right_rel =
NULL;
62 handle->join_rel =
NULL;
66 aql_execute(db_handle_t *handle, aql_adt_t *adt)
72 aql_attribute_t *attr;
75 optype = AQL_GET_TYPE(adt);
76 if(optype == AQL_TYPE_NONE) {
84 first_rel_arg = !!(adt->flags & AQL_FLAG_ASSIGN);
86 if(optype != AQL_TYPE_CREATE_RELATION &&
87 optype != AQL_TYPE_REMOVE_RELATION &&
88 optype != AQL_TYPE_JOIN) {
89 rel = relation_load(adt->relations[first_rel_arg]);
97 result = DB_RELATIONAL_ERROR;
99 case AQL_TYPE_CREATE_ATTRIBUTE:
100 attr = &adt->attributes[0];
101 if(relation_attribute_add(rel, DB_STORAGE, attr->name, attr->domain,
102 attr->element_size) !=
NULL) {
106 case AQL_TYPE_CREATE_INDEX:
107 relattr = relation_attribute_get(rel, adt->attributes[0].name);
108 if(relattr ==
NULL) {
109 result = DB_NAME_ERROR;
112 result = index_create(AQL_GET_INDEX_TYPE(adt), rel, relattr);
114 case AQL_TYPE_CREATE_RELATION:
115 if(relation_create(adt->relations[0], DB_STORAGE) !=
NULL) {
119 case AQL_TYPE_REMOVE_ATTRIBUTE:
120 result = relation_attribute_remove(rel, adt->attributes[0].name);
122 case AQL_TYPE_REMOVE_INDEX:
123 relattr = relation_attribute_get(rel, adt->attributes[0].name);
124 if(relattr !=
NULL) {
125 if(relattr->index !=
NULL) {
126 result = index_destroy(relattr->index);
131 result = DB_NAME_ERROR;
134 case AQL_TYPE_REMOVE_RELATION:
135 result = relation_remove(adt->relations[0], 1);
137 #if DB_FEATURE_REMOVE
138 case AQL_TYPE_REMOVE_TUPLES:
141 adt->attribute_count = 0;
142 for(relattr =
list_head(rel->attributes);
144 relattr = relattr->next) {
145 AQL_ADD_ATTRIBUTE(adt, relattr->name, DOMAIN_UNSPECIFIED, 0);
147 AQL_SET_FLAG(adt, AQL_FLAG_INVERSE_LOGIC);
149 case AQL_TYPE_SELECT:
151 result = DB_ARGUMENT_ERROR;
154 result = relation_select(handle, rel, adt);
156 case AQL_TYPE_INSERT:
157 result = relation_insert(rel, adt->values);
162 result = DB_ARGUMENT_ERROR;
165 handle->left_rel = relation_load(adt->relations[first_rel_arg]);
166 if(handle->left_rel ==
NULL) {
169 handle->right_rel = relation_load(adt->relations[first_rel_arg + 1]);
170 if(handle->right_rel ==
NULL) {
171 relation_release(handle->left_rel);
174 result = relation_join(handle, adt);
182 if(handle ==
NULL || !(handle->flags & DB_HANDLE_FLAG_PROCESSING)) {
183 relation_release(rel);
191 db_query(db_handle_t *handle,
const char *format, ...)
194 char query_string[AQL_MAX_QUERY_LENGTH];
196 va_start(ap, format);
197 vsnprintf(query_string,
sizeof(query_string), format, ap);
201 clear_handle(handle);
204 if(AQL_ERROR(aql_parse(&adt, query_string))) {
205 return DB_PARSING_ERROR;
210 return aql_execute(handle, &adt);
214 db_process(db_handle_t *handle)
218 optype = ((aql_adt_t *)handle->adt)->optype;
221 #if DB_FEATURE_REMOVE
222 case AQL_TYPE_REMOVE_TUPLES:
223 return relation_process_remove(handle);
226 case AQL_TYPE_SELECT:
227 return relation_process_select(handle);
231 return relation_process_join(handle);
237 PRINTF(
"DB: Invalid operation type: %d\n", optype);
239 return DB_INCONSISTENCY_ERROR;
Definitions and declarations for AQL, the Antelope Query Language.
Declarations for the result acquisition API.
#define NULL
The null pointer.
void * list_head(list_t list)
Get a pointer to the first element of a list.
A set of debugging macros.