1 #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL
2
3 #include "Yap.h"
4 #include <string.h>
5 #include <stdlib.h>
6 #include "cut_c.h"
7 #include "myddas.h"
8 #include "myddas_structs.h"
9 #ifdef MYDDAS_STATS
10 #include "myddas_statistics.h"
11 #endif
12 #ifdef MYDDAS_ODBC
13 #include <sql.h>
14 #endif /*MYDDAS_ODBC*/
15 #ifdef MYDDAS_MYSQL
16 #include <mysql/mysql.h>
17 #endif /*MYDDAS_MYSQL*/
18
19
20
21 /* Search for the predicate in the given predicate list*/
22 static MYDDAS_UTIL_PREDICATE
23 myddas_util_find_predicate(char *, Int , char *, MYDDAS_UTIL_PREDICATE);
24 /* Deletes a predicate list */
25 static void
26 myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE);
27
28 /* Prints a error message */
29 static void
30 myddas_util_error_message(char *,Int,char *);
31
32
33 #ifdef MYDDAS_MYSQL
34 /* Auxilary function to table_write*/
35 static void
36 n_print(Int , char );
37 #endif
38
39 /* Type: MYSQL->1 ODBC->2*/
40 Short
myddas_util_connection_type(void * con)41 myddas_util_connection_type(void *con){
42
43 MYDDAS_UTIL_CONNECTION con_node =
44 myddas_util_search_connection(con);
45
46 if (con_node == NULL)
47 return 0;
48
49 if (con_node->odbc_enviromment != NULL) /* ODBC */
50 return 2;
51 else
52 return 1;
53 }
54
55
56 MYDDAS_UTIL_PREDICATE
myddas_util_search_predicate(char * pred_name,Int pred_arity,char * pred_module)57 myddas_util_search_predicate(char *pred_name, Int pred_arity,
58 char *pred_module){
59 MYDDAS_UTIL_PREDICATE pred=NULL;
60 MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
61
62 for (;top!=NULL;top=top->next)
63 {
64 if ((pred=myddas_util_find_predicate(pred_name,pred_arity,pred_module,top->predicates)))
65 return pred;
66 }
67 return NULL;
68 }
69
70 /* When using this function, we must guarante that this predicate
71 it's unique */
72 MYDDAS_UTIL_CONNECTION
myddas_util_add_predicate(char * pred_name,Int pred_arity,char * pred_module,void * con)73 myddas_util_add_predicate(char *pred_name, Int pred_arity,
74 char *pred_module, void *con){
75
76 MYDDAS_UTIL_CONNECTION node_con =
77 myddas_util_search_connection(con);
78
79 MYDDAS_UTIL_PREDICATE new =
80 myddas_init_initialize_predicate(pred_name,pred_arity,pred_module,node_con->predicates);
81
82 if (new == NULL)
83 {
84 myddas_util_error_message("Could not initialize predicate node",__LINE__,__FILE__);
85 return NULL;
86 }
87
88 node_con->predicates=new;
89 return node_con;
90 }
91
92 void
myddas_util_delete_predicate(MYDDAS_UTIL_PREDICATE to_delete)93 myddas_util_delete_predicate(MYDDAS_UTIL_PREDICATE to_delete){
94
95 if (to_delete->next != NULL)
96 to_delete->next->previous = to_delete->previous;
97 if (to_delete->previous != NULL)
98 to_delete->previous->next = to_delete->next;
99 else //First predicate of the predicate list
100 {
101 MYDDAS_UTIL_CONNECTION con_node = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
102 for(;con_node != NULL; con_node = con_node->next)
103 if (con_node->predicates == to_delete)
104 break;
105 con_node->predicates = to_delete->next;
106 }
107 MYDDAS_FREE(to_delete,struct myddas_list_preds);
108 }
109
110 void
myddas_util_delete_connection(void * conn)111 myddas_util_delete_connection(void *conn){
112
113 MYDDAS_UTIL_CONNECTION to_delete = myddas_util_search_connection(conn);
114
115 if (to_delete == NULL)
116 return;
117 else
118 {
119 /* Removes the predicates list */
120 myddas_util_delete_predicate_list(to_delete->predicates);
121
122 #ifdef MYDDAS_STATS
123 /* Removes the stats list */
124 myddas_stats_delete_stats_list(to_delete->stats);
125 #endif
126 /* List Integrety */
127 /* Is the last element of the list */
128 if ((to_delete->next) != NULL)
129 to_delete->next->previous = to_delete->previous;
130
131 /* Is the first element of the list */
132 if (to_delete == (Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections))
133 Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections = to_delete->next;
134 else
135 to_delete->previous->next=to_delete->next;
136
137 MYDDAS_FREE(to_delete,struct myddas_list_connection);
138 return;
139 }
140 }
141
142 MYDDAS_UTIL_CONNECTION
myddas_util_search_connection(void * conn)143 myddas_util_search_connection(void *conn){
144 MYDDAS_UTIL_CONNECTION list = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
145
146 #ifdef MYDDAS_STATS
147 if (conn == 0) { /* We want all the statistics */
148 return list;
149 }
150 #endif
151
152 for (;list!=NULL;list=list->next)
153 if (list->connection == conn)
154 return list;
155 return NULL;
156 }
157
158 MYDDAS_UTIL_CONNECTION
myddas_util_add_connection(void * conn,void * enviromment)159 myddas_util_add_connection(void *conn, void *enviromment){
160
161 MYDDAS_UTIL_CONNECTION node=NULL;
162 MYDDAS_UTIL_CONNECTION temp=NULL;
163
164 if ((node = myddas_util_search_connection(conn)) != NULL)
165 {
166 return node;
167 }
168 //put the new connection node on the top of the list
169 temp = myddas_init_initialize_connection(conn,enviromment,Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections);
170 if (temp == NULL)
171 {
172 #ifdef DEBUG
173 myddas_util_error_message("Could not initialize connection node",__LINE__,__FILE__);
174 #endif
175 return NULL;
176 }
177 Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections = temp;
178 return Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
179 }
180
181 #ifdef MYDDAS_ODBC
182 /* This function searches the MYDDAS list for odbc connections
183 If there isn't any, it returns NULL. This is a nice way to know
184 if there is any odbc connections left on the list*/
185 SQLHENV
myddas_util_get_odbc_enviromment(SQLHDBC connection)186 myddas_util_get_odbc_enviromment(SQLHDBC connection){
187 MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
188
189 for (;top != NULL;top=top->next)
190 if (top->connection == ((void *)connection))
191 return top->odbc_enviromment;
192
193 return NULL;
194 }
195 #endif
196
197 UInt
myddas_util_get_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con)198 myddas_util_get_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con){
199 return con->total_number_queries;
200 }
201
202 void
myddas_util_set_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con,UInt number)203 myddas_util_set_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con,
204 UInt number){
205 con->total_number_queries = number;
206 }
207
208 #ifdef MYDDAS_MYSQL
209 /* Auxilary function to table_write*/
210 static void
n_print(Int n,char c)211 n_print(Int n, char c)
212 {
213 for(;n>0;n--) printf("%c",c);
214 }
215 #endif
216
217 static
myddas_util_error_message(char * message,Int line,char * file)218 void myddas_util_error_message(char *message ,Int line,char *file){
219 #ifdef DEBUG
220 printf ("ERROR: %s at line %d in file %s\n",message,(int)line,file);
221 #else
222 printf ("ERROR: %s\n",message);
223 #endif
224 }
225
226 static MYDDAS_UTIL_PREDICATE
myddas_util_find_predicate(char * pred_name,Int pred_arity,char * pred_module,MYDDAS_UTIL_PREDICATE list)227 myddas_util_find_predicate(char *pred_name, Int pred_arity,
228 char *pred_module, MYDDAS_UTIL_PREDICATE list){
229
230 for(;list != NULL ; list = list->next)
231 if (pred_arity == list->pred_arity &&
232 !strcmp(pred_name,list->pred_name) &&
233 !strcmp(pred_module,list->pred_module))
234 return list;
235
236 return NULL;
237 }
238
239 static void
myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE preds_list)240 myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE preds_list){
241 MYDDAS_UTIL_PREDICATE to_delete = NULL;
242
243 for (;preds_list != NULL;)
244 {
245 to_delete = preds_list;
246 preds_list = preds_list->next;
247
248 MYDDAS_FREE(to_delete,struct myddas_list_preds);
249 }
250 return;
251 }
252
253 #ifdef MYDDAS_MYSQL
254 void
myddas_util_table_write(MYSQL_RES * res_set)255 myddas_util_table_write(MYSQL_RES *res_set){
256
257 MYSQL_ROW row;
258 MYSQL_FIELD *fields;
259 Int i,f;
260
261 if (mysql_num_rows(res_set) == 0)
262 {
263 printf ("Empty Set\n");
264 return;
265 }
266
267 f = mysql_num_fields(res_set);
268
269 fields = mysql_fetch_field(res_set);
270 for(i=0;i<f;i++)
271 {
272 printf("+");
273 if (strlen(fields[i].name)>fields[i].max_length) fields[i].max_length=strlen(fields[i].name);
274 n_print(fields[i].max_length+2,'-');
275 }
276 printf("+\n");
277
278 for(i=0;i<f;i++)
279 {
280 printf("|");
281 printf(" %s ",fields[i].name);
282 n_print(fields[i].max_length - strlen(fields[i].name),' ');
283 }
284 printf("|\n");
285
286 for(i=0;i<f;i++)
287 {
288 printf("+");
289 n_print(fields[i].max_length+2,'-');
290 }
291 printf("+\n");
292
293 while ((row = mysql_fetch_row(res_set)) != NULL)
294 {
295 for(i=0;i<f;i++)
296 {
297 printf("|");
298 if (row[i] != NULL)
299 {
300 printf(" %s ",row[i]);
301 n_print(fields[i].max_length - strlen(row[i]),' ');
302 }
303 else
304 {
305 printf(" NULL ");
306 n_print(fields[i].max_length - 4,' ');
307 }
308 }
309 printf("|\n");
310 }
311
312 for(i=0;i<f;i++)
313 {
314 printf("+");
315 n_print(fields[i].max_length+2,'-');
316 }
317 printf("+\n");
318
319 }
320 #endif
321
322 //DELETE THIS WHEN DB_STATS IS COMPLETED
323 MyddasInt
get_myddas_top()324 get_myddas_top(){
325 if (Yap_REGS.MYDDAS_GLOBAL_POINTER == NULL)
326 return 0;
327 return (Int)Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
328 }
329
330 void *
myddas_util_get_pred_next(void * pointer)331 myddas_util_get_pred_next(void *pointer){
332 MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
333 return (void *) (temp->next);
334 }
335
336 MyddasInt
myddas_util_get_pred_arity(void * pointer)337 myddas_util_get_pred_arity(void *pointer){
338 MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
339 return temp->pred_arity;
340 }
341
342 char *
myddas_util_get_pred_name(void * pointer)343 myddas_util_get_pred_name(void *pointer){
344 MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
345 return temp->pred_name;
346 }
347
348 char *
myddas_util_get_pred_module(void * pointer)349 myddas_util_get_pred_module(void *pointer){
350 MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
351 return temp->pred_module;
352 }
353
354 void *
myddas_util_get_list_pred(MYDDAS_UTIL_CONNECTION node)355 myddas_util_get_list_pred(MYDDAS_UTIL_CONNECTION node){
356 return (void *)(node->predicates);
357 }
358
359 #ifdef DEBUG
check_int()360 void check_int(){
361 Int i;
362 MYDDAS_UTIL_PREDICATE pred = NULL;
363 MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
364 for (i=1 ; top!=NULL ; top=top->next)
365 {
366 printf ("***************\n");
367 printf ("===== top =====\n");
368 printf ("======= %p =====\n",top);
369 printf ("CONN: = %p =====\n",top->connection);
370 printf ("ENV : = %p =====\n",top->odbc_enviromment);
371 printf ("PRED: = %p =====\n",top->predicates);
372 printf ("======= %p =====\n",top->previous);
373 printf ("======= %p =====\n",top->next);
374 if (top->predicates != NULL)
375 {
376 printf ("\t******\n");
377 printf ("\t===== PREDICADOS =====\n");
378 for (pred = top->predicates ; pred != NULL ; pred = pred->next)
379 {
380 printf ("\t--------------\n");
381 printf ("\t===== %p =====\n",pred);
382 printf ("\t===== %s =====\n",pred->pred_name);
383 printf ("\t===== %d =====\n",pred->pred_arity);
384 printf ("\t===== %s =====\n",pred->pred_module);
385 printf ("\t===== %p =====\n",pred->previous);
386 printf ("\t===== %p =====\n",pred->next);
387 }
388 }
389
390 }
391
392 return;
393 }
394 #endif
395
396
397 #endif /*defined MYDDAS_ODBC || defined MYDDAS_MYSQL*/
398
399
400