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