MYDDAS is too closely integreated to be a package.
This commit is contained in:
@@ -1,159 +0,0 @@
|
||||
#ifndef __MYDDAS_H__
|
||||
#define __MYDDAS_H__
|
||||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef MYDDAS_ODBC
|
||||
#include <sql.h>
|
||||
#endif
|
||||
|
||||
#ifdef MYDDAS_MYSQL
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
/* MYDDAS TYPES */
|
||||
/* sizeof(MyddasPointer) Equal to the size of a integer on the given architecture */
|
||||
/* sizeof(MyddasInt32) = 4 (Always) */
|
||||
/* sizeof(MyddasUInt32) = 4 (Always) */
|
||||
|
||||
#if SIZEOF_INT_P==4
|
||||
|
||||
# if SIZEOF_INT==4
|
||||
/* */ typedef int MyddasInt;
|
||||
/* */ typedef unsigned int MyddasUInt;
|
||||
/* */ typedef unsigned int MyddasPointer;
|
||||
/* */ typedef int MyddasInt32;
|
||||
/* */ typedef unsigned int MyddasUInt32;
|
||||
# elif SIZEOF_LONG_INT==4
|
||||
/* */ typedef long int MyddasInt;
|
||||
/* */ typedef unsigned long int MyddasUInt;
|
||||
/* */ typedef unsigned long int MyddasPointer;
|
||||
/* */ typedef long int MyddasInt32;
|
||||
/* */ typedef unsigned long int MyddasUInt32;
|
||||
# else
|
||||
# error MYDDAS require integer types of the same size as a pointer
|
||||
# endif
|
||||
|
||||
# if SIZEOF_SHORT_INT==2
|
||||
/* */ typedef short int MyddasSInt;
|
||||
/* */ typedef unsigned short int MyddasUSInt;
|
||||
# else
|
||||
# error MYDDAS requires integer types half the size of a pointer
|
||||
# endif
|
||||
|
||||
# if SIZEOF_LONG_INT==8
|
||||
/* */ typedef long int MyddasLInt;
|
||||
/* */ typedef unsigned long int MyddasULInt;
|
||||
# elif SIZEOF_LONG_LONG_INT==8
|
||||
/* */ typedef long long int MyddasLInt;
|
||||
/* */ typedef unsigned long long int MyddasULInt;
|
||||
# else
|
||||
# error MYDDAS requires integer types double the size of a pointer
|
||||
# endif
|
||||
|
||||
#elif SIZEOF_INT_P==8
|
||||
|
||||
# if SIZEOF_INT==8
|
||||
/* */ typedef int MyddasInt;
|
||||
/* */ typedef unsigned int MyddasUInt;
|
||||
/* */ typedef int MyddasLInt;
|
||||
/* */ typedef unsigned int MyddasULInt;
|
||||
/* */ typedef unsigned int MyddasPointer;
|
||||
# elif SIZEOF_LONG_INT==8
|
||||
/* */ typedef long int MyddasInt;
|
||||
/* */ typedef unsigned long int MyddasUInt;
|
||||
/* */ typedef int MyddasLInt;
|
||||
/* */ typedef unsigned int MyddasULInt;
|
||||
/* */ typedef unsigned long int MyddasPointer;
|
||||
# elif SIZEOF_LONG_LONG_INT==8
|
||||
/* */ typedef long long int MyddasInt;
|
||||
/* */ typedef unsigned long long int MyddasUInt;
|
||||
/* */ typedef int MyddasLInt;
|
||||
/* */ typedef unsigned int MyddasULInt;
|
||||
/* */ typedef unsigned long long int MyddasPointer;
|
||||
# else
|
||||
# error MYDDAS requires integer types of the same size as a pointer
|
||||
# endif
|
||||
|
||||
# if SIZEOF_SHORT_INT==4
|
||||
/* */ typedef short int MyddasSInt;
|
||||
/* */ typedef unsigned short int MyddasUSInt;
|
||||
/* */ typedef short int MyddasInt32;
|
||||
/* */ typedef unsigned short int MyddasUInt32;
|
||||
# elif SIZEOF_INT==4
|
||||
/* */ typedef int MyddasSInt;
|
||||
/* */ typedef unsigned int MyddasUSInt;
|
||||
/* */ typedef int MyddasInt32;
|
||||
/* */ typedef unsigned int MyddasUInt32;
|
||||
# else
|
||||
# error MYDDAS requires integer types half the size of a pointer
|
||||
# endif
|
||||
|
||||
#else
|
||||
# error MYDDAS requires pointers of size 4 or 8
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* Passar para o myddas_statictics.h ???????? */
|
||||
#ifdef MYDDAS_STATS
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
typedef struct myddas_global *MYDDAS_GLOBAL;
|
||||
typedef struct myddas_util_query *MYDDAS_UTIL_QUERY;
|
||||
typedef struct myddas_list_connection *MYDDAS_UTIL_CONNECTION;
|
||||
typedef struct myddas_list_preds *MYDDAS_UTIL_PREDICATE;
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
typedef struct myddas_stats_time_struct *MYDDAS_STATS_TIME;
|
||||
typedef struct myddas_global_stats *MYDDAS_GLOBAL_STATS;
|
||||
typedef struct myddas_stats_struct *MYDDAS_STATS_STRUCT;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#define MYDDAS_MALLOC(POINTER,TYPE) \
|
||||
{ \
|
||||
POINTER = (TYPE *) malloc(sizeof(TYPE)); \
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_allocated+=sizeof(TYPE); \
|
||||
/*printf ("MALLOC %p %s %d\n",POINTER,__FILE__,__LINE__);*/ \
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->malloc_called++; \
|
||||
}
|
||||
#else
|
||||
#define MYDDAS_MALLOC(POINTER,TYPE) \
|
||||
{ \
|
||||
POINTER = (TYPE *) malloc(sizeof(TYPE)); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#define MYDDAS_FREE(POINTER,TYPE) \
|
||||
{ \
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_freed+=sizeof(TYPE); \
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->free_called++; \
|
||||
/*printf ("FREE %p %s %d\n",POINTER,__FILE__,__LINE__);*/ \
|
||||
free(POINTER); \
|
||||
}
|
||||
#else
|
||||
#define MYDDAS_FREE(POINTER,TYPE) \
|
||||
{ \
|
||||
free(POINTER); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#define MYDDAS_MEMORY_MALLOC_NR(NUMBER) \
|
||||
NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->malloc_called;
|
||||
#define MYDDAS_MEMORY_MALLOC_SIZE(NUMBER) \
|
||||
NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_allocated;
|
||||
#define MYDDAS_MEMORY_FREE_NR(NUMBER) \
|
||||
NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->free_called;
|
||||
#define MYDDAS_MEMORY_FREE_SIZE(NUMBER) \
|
||||
NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_freed;
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*__MYDDAS_H__*/
|
||||
@@ -1,112 +0,0 @@
|
||||
#if defined MYDDAS_ODBC || defined MYDDAS_MYSQL
|
||||
|
||||
#include "Yap.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "myddas.h"
|
||||
#include "myddas_structs.h"
|
||||
#ifdef MYDDAS_STATS
|
||||
#include "myddas_statistics.h"
|
||||
#endif
|
||||
|
||||
MYDDAS_GLOBAL
|
||||
myddas_init_initialize_myddas(void){
|
||||
MYDDAS_GLOBAL global = NULL;
|
||||
|
||||
/* We cannot call MYDDAS_MALLOC were because the global
|
||||
register isn't yet initialized */
|
||||
global = (MYDDAS_GLOBAL) malloc (sizeof(struct myddas_global));
|
||||
#ifdef DEBUG
|
||||
printf ("MALLOC %p %s %d\n",global,__FILE__,__LINE__);
|
||||
#endif
|
||||
global->myddas_top_connections = NULL;
|
||||
#ifdef MYDDAS_TOP_LEVEL
|
||||
global->myddas_top_level_connection = NULL;
|
||||
#endif
|
||||
#ifdef MYDDAS_STATS
|
||||
global->myddas_statistics = (MYDDAS_GLOBAL_STATS) malloc (sizeof(struct myddas_global_stats));
|
||||
#ifdef DEBUG
|
||||
printf ("MALLOC %p %s %d\n",global->myddas_statistics,__FILE__,__LINE__);
|
||||
#endif
|
||||
global->myddas_statistics->stats = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
/* We first malloc for this struct and the stats struct */
|
||||
#ifdef MYDDAS_STATS
|
||||
global->malloc_called = 2;
|
||||
global->memory_allocated = sizeof(struct myddas_global) + sizeof(struct myddas_global_stats);
|
||||
#else
|
||||
global->malloc_called = 1;
|
||||
global->memory_allocated = sizeof(struct myddas_global);
|
||||
#endif /* MYDDAS_STATS */
|
||||
global->free_called = 0;
|
||||
global->memory_freed = 0;
|
||||
#endif
|
||||
|
||||
return global;
|
||||
}
|
||||
|
||||
/* Inserts the new node on the front of the list */
|
||||
MYDDAS_UTIL_CONNECTION
|
||||
myddas_init_initialize_connection(void *conn,void *enviromment,
|
||||
MYDDAS_UTIL_CONNECTION next){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION new = NULL;
|
||||
MYDDAS_MALLOC(new,struct myddas_list_connection);
|
||||
|
||||
if (new == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
new->predicates=NULL;
|
||||
new->connection=conn;
|
||||
new->odbc_enviromment=enviromment;
|
||||
|
||||
/* It saves n queries, doing at once n+1 queries */
|
||||
new->total_number_queries=0; //Default
|
||||
new->actual_number_queries=0;
|
||||
new->queries = NULL;
|
||||
|
||||
/* List integrity */
|
||||
new->next=next;
|
||||
new->previous=NULL;
|
||||
/* If there's already at least one node
|
||||
on the list */
|
||||
if (next != NULL)
|
||||
next->previous=new;
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
new->stats = NULL;
|
||||
new->stats = myddas_stats_initialize_connection_stats();
|
||||
#endif
|
||||
return new;
|
||||
}
|
||||
|
||||
MYDDAS_UTIL_PREDICATE
|
||||
myddas_init_initialize_predicate(char *pred_name, int pred_arity,
|
||||
char *pred_module, MYDDAS_UTIL_PREDICATE next){
|
||||
|
||||
MYDDAS_UTIL_PREDICATE new = NULL;
|
||||
MYDDAS_MALLOC(new,struct myddas_list_preds);
|
||||
|
||||
if (new == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
new->pred_name=pred_name;
|
||||
new->pred_arity=pred_arity;
|
||||
new->pred_module=pred_module;
|
||||
|
||||
/* List integrity */
|
||||
new->next=next;
|
||||
new->previous=NULL;
|
||||
/* If there's already at least one node
|
||||
on the list */
|
||||
if (next != NULL)
|
||||
next->previous=new;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,725 +0,0 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: myddas_mysql.c *
|
||||
* Last rev: 22/03/05 *
|
||||
* mods: *
|
||||
* comments: Predicates for comunicating with a mysql database system *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#if defined MYDDAS_MYSQL
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <mysql/mysql.h>
|
||||
#include "Yap.h"
|
||||
#include "Yatom.h"
|
||||
#include "cut_c.h"
|
||||
#include "myddas.h"
|
||||
#ifdef MYDDAS_STATS
|
||||
#include "myddas_structs.h"
|
||||
#include "myddas_statistics.h"
|
||||
#endif
|
||||
#include "myddas_wkb2prolog.h"
|
||||
|
||||
#define IS_SQL_INT(FIELD) FIELD == FIELD_TYPE_INT24 || \
|
||||
FIELD == FIELD_TYPE_LONG || \
|
||||
FIELD == FIELD_TYPE_LONGLONG || \
|
||||
FIELD == FIELD_TYPE_SHORT || \
|
||||
FIELD == FIELD_TYPE_TINY
|
||||
|
||||
#define IS_SQL_FLOAT(FIELD) FIELD == FIELD_TYPE_DECIMAL || \
|
||||
FIELD == FIELD_TYPE_DOUBLE || \
|
||||
FIELD == FIELD_TYPE_FLOAT
|
||||
|
||||
#define IS_SQL_GEOMETRY(FIELD) FIELD == FIELD_TYPE_GEOMETRY
|
||||
|
||||
static Int null_id = 0;
|
||||
|
||||
STATIC_PROTO(Int c_db_my_connect,(void));
|
||||
STATIC_PROTO(Int c_db_my_disconnect,(void));
|
||||
STATIC_PROTO(Int c_db_my_number_of_fields,(void));
|
||||
STATIC_PROTO(Int c_db_my_get_attributes_types,(void));
|
||||
STATIC_PROTO(Int c_db_my_query,(void));
|
||||
STATIC_PROTO(Int c_db_my_table_write,(void));
|
||||
STATIC_PROTO(Int c_db_my_row,(void));
|
||||
STATIC_PROTO(Int c_db_my_row_cut,(void));
|
||||
STATIC_PROTO(Int c_db_my_get_fields_properties,(void));
|
||||
STATIC_PROTO(Int c_db_my_get_next_result_set,(void));
|
||||
STATIC_PROTO(Int c_db_my_get_database,(void));
|
||||
STATIC_PROTO(Int c_db_my_change_database,(void));
|
||||
|
||||
void Yap_InitMYDDAS_MySQLPreds(void)
|
||||
{
|
||||
/* db_connect: Host x User x Passwd x Database x Connection x ERROR_CODE */
|
||||
Yap_InitCPred("c_db_my_connect", 7, c_db_my_connect, 0);
|
||||
|
||||
/* db_number_of_fields: Relation x Connection x NumberOfFields */
|
||||
Yap_InitCPred("c_db_my_number_of_fields",3, c_db_my_number_of_fields, 0);
|
||||
|
||||
/* db_get_attributes_types: Relation x TypesList */
|
||||
Yap_InitCPred("c_db_my_get_attributes_types", 3, c_db_my_get_attributes_types, 0);
|
||||
|
||||
/* db_query: SQLQuery x ResultSet x Connection */
|
||||
Yap_InitCPred("c_db_my_query", 5, c_db_my_query, 0);
|
||||
|
||||
/* db_disconnect: Connection */
|
||||
Yap_InitCPred("c_db_my_disconnect", 1,c_db_my_disconnect, 0);
|
||||
|
||||
/* db_table_write: Result Set */
|
||||
Yap_InitCPred("c_db_my_table_write", 1, c_db_my_table_write, 0);
|
||||
|
||||
/* db_get_fields_properties: PredName x Connnection x PropertiesList*/
|
||||
Yap_InitCPred("c_db_my_get_fields_properties",3,c_db_my_get_fields_properties,0);
|
||||
|
||||
|
||||
Yap_InitCPred("c_db_my_get_next_result_set",2,c_db_my_get_next_result_set,0);
|
||||
|
||||
/* c_db_my_get_database: Connnection x DataBaseName */
|
||||
Yap_InitCPred("c_db_my_get_database",2,c_db_my_get_database,0);
|
||||
|
||||
/* c_db_my_change_database: Connnection x DataBaseName */
|
||||
Yap_InitCPred("c_db_my_change_database",2,c_db_my_change_database,0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Yap_InitBackMYDDAS_MySQLPreds(void)
|
||||
{
|
||||
/* db_row: ResultSet x Arity x ListOfArgs */
|
||||
Yap_InitCPredBackCut("c_db_my_row", 3, sizeof(Int),
|
||||
c_db_my_row,
|
||||
c_db_my_row,
|
||||
c_db_my_row_cut, 0);
|
||||
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_connect(void) {
|
||||
Term arg_host = Deref(ARG1);
|
||||
Term arg_user = Deref(ARG2);
|
||||
Term arg_passwd = Deref(ARG3);
|
||||
Term arg_database = Deref(ARG4);
|
||||
Term arg_port = Deref(ARG5);
|
||||
Term arg_socket = Deref(ARG6);
|
||||
Term arg_conn = Deref(ARG7);
|
||||
|
||||
MYSQL *conn;
|
||||
|
||||
MYDDAS_UTIL_CONNECTION new = NULL;
|
||||
|
||||
char *host = AtomName(AtomOfTerm(arg_host));
|
||||
char *user = AtomName(AtomOfTerm(arg_user));
|
||||
char *passwd = AtomName(AtomOfTerm(arg_passwd));
|
||||
char *database = AtomName(AtomOfTerm(arg_database));
|
||||
Int port = IntegerOfTerm(arg_port);
|
||||
|
||||
char *socket;
|
||||
if (IsNonVarTerm(arg_socket))
|
||||
socket = AtomName(AtomOfTerm(arg_socket));
|
||||
else
|
||||
socket = NULL;
|
||||
|
||||
conn = mysql_init(NULL);
|
||||
if (conn == NULL) {
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: ** c_db_my_connect ** error on init\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (mysql_real_connect(conn, host, user, passwd, database, port, socket, CLIENT_MULTI_STATEMENTS) == NULL) {
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: ** c_db_my_connect ** error on connect\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_conn, MkIntegerTerm((Int)conn)))
|
||||
return FALSE;
|
||||
else
|
||||
{
|
||||
/* Criar um novo no na lista de ligacoes*/
|
||||
new = myddas_util_add_connection(conn,NULL);
|
||||
|
||||
if (new == NULL){
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: ** c_db_my_connect ** Error allocating memory\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* db_query: SQLQuery x ResultSet x Connection */
|
||||
static Int
|
||||
c_db_my_query(void) {
|
||||
Term arg_sql_query = Deref(ARG1);
|
||||
Term arg_result_set = Deref(ARG2);
|
||||
Term arg_conn = Deref(ARG3);
|
||||
Term arg_mode = Deref(ARG4);
|
||||
Term arg_arity = Deref(ARG5);
|
||||
|
||||
char *sql = AtomName(AtomOfTerm(arg_sql_query));
|
||||
char *mode = AtomName(AtomOfTerm(arg_mode));
|
||||
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
|
||||
|
||||
MYSQL_RES *res_set;
|
||||
|
||||
MyddasInt length=strlen(sql);
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
MYDDAS_UTIL_CONNECTION node = myddas_util_search_connection(conn);
|
||||
MyddasULInt count = 0;
|
||||
|
||||
/* Count the number of querys made to the server */
|
||||
MyddasULInt number_querys;
|
||||
MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE(node,number_querys);
|
||||
MYDDAS_STATS_CON_SET_NUMBER_QUERIES_MADE(node,++number_querys);
|
||||
MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_NUMBER_QUERIES_MADE_COUNT(node,++count);
|
||||
|
||||
/* Measure time spent by the MySQL Server
|
||||
processing the SQL Query */
|
||||
MYDDAS_STATS_TIME start,end,total_time,diff;
|
||||
start = myddas_stats_walltime();
|
||||
#endif
|
||||
|
||||
/* Send query to server and process it */
|
||||
if (mysql_real_query(conn, sql, length) != 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: **c_db_my_query** Error on query! %s\n",sql);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
/* Measure time spent by the MySQL Server
|
||||
processing the SQL Query */
|
||||
end = myddas_stats_walltime();
|
||||
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(diff,time_copy);
|
||||
myddas_stats_subtract_time(diff,end,start);
|
||||
diff = myddas_stats_time_copy_to_final(diff);
|
||||
|
||||
MYDDAS_FREE(end,struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(start,struct myddas_stats_time_struct);
|
||||
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER(node,total_time);
|
||||
/* Automacally updates the MYDDAS_STRUCTURE */
|
||||
myddas_stats_add_time(total_time,diff,total_time);
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_TOTAL_TIME_DBSERVER_COUNT(node,++count);
|
||||
|
||||
MYDDAS_STATS_TIME time = NULL;
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_DBSERVER(node,time);
|
||||
myddas_stats_move_time(diff,time);
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_DBSERVER_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_LAST_TIME_DBSERVER_COUNT(node,++count);
|
||||
#endif
|
||||
|
||||
/* guardar os tuplos do lado do cliente */
|
||||
if (strcmp(mode,"store_result")!=0) //True
|
||||
res_set = mysql_use_result(conn);
|
||||
else{
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
/* Measure time spent by the MySQL Server
|
||||
transferring the result of the last query
|
||||
back to the client */
|
||||
start = myddas_stats_walltime();
|
||||
#endif
|
||||
res_set = mysql_store_result(conn);
|
||||
#ifdef MYDDAS_STATS
|
||||
/* Measure time spent by the MySQL Server
|
||||
transferring the result of the last query
|
||||
back to the client */
|
||||
end = myddas_stats_walltime();
|
||||
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(diff,time_copy);
|
||||
myddas_stats_subtract_time(diff,end,start);
|
||||
diff = myddas_stats_time_copy_to_final(diff);
|
||||
|
||||
MYDDAS_FREE(end,struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(start,struct myddas_stats_time_struct);
|
||||
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING(node,total_time);
|
||||
/* Automacally updates the MYDDAS_STRUCTURE */
|
||||
myddas_stats_add_time(total_time,diff,total_time);
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_TOTAL_TIME_TRANSFERING_COUNT(node,++count);
|
||||
|
||||
time = NULL;
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING(node,time);
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_LAST_TIME_TRANSFERING_COUNT(node,++count);
|
||||
myddas_stats_move_time(diff,time);
|
||||
|
||||
/* Measure the number of Rows returned from the server */
|
||||
if (res_set != NULL)
|
||||
{
|
||||
/* With an INSERT statement, mysql_(use or store)_result()
|
||||
returns a NULL pointer*/
|
||||
|
||||
/* This is only works if we use mysql_store_result */
|
||||
MyddasUInt numberRows = mysql_num_rows(res_set);
|
||||
MyddasUInt rows;
|
||||
|
||||
MYDDAS_STATS_CON_GET_TOTAL_ROWS(node,rows);
|
||||
numberRows = numberRows + rows;
|
||||
MYDDAS_STATS_CON_SET_TOTAL_ROWS(node,numberRows);
|
||||
MYDDAS_STATS_CON_GET_TOTAL_ROWS_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_TOTAL_ROWS_COUNT(node,++count);
|
||||
|
||||
/* Calculate the ammount of data sent by the server */
|
||||
MyddasUInt total,number_fields = mysql_num_fields(res_set);
|
||||
MYSQL_ROW row;
|
||||
MyddasULInt i;
|
||||
total=0;
|
||||
while ((row = mysql_fetch_row(res_set)) != NULL){
|
||||
mysql_field_seek(res_set,0);
|
||||
|
||||
for(i=0;i<number_fields;i++){
|
||||
if (row[i] != NULL)
|
||||
total = total + strlen(row[i]);
|
||||
}
|
||||
}
|
||||
MYDDAS_STATS_CON_SET_LAST_BYTES_TRANSFERING_FROM_DBSERVER(node,total);
|
||||
MYDDAS_STATS_CON_GET_LAST_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_LAST_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(node,++count);
|
||||
|
||||
MyddasUInt bytes = 0;
|
||||
MYDDAS_STATS_CON_GET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER(node,bytes);
|
||||
total = total + bytes;
|
||||
MYDDAS_STATS_CON_SET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER(node,total);
|
||||
MYDDAS_STATS_CON_GET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(node,count);
|
||||
MYDDAS_STATS_CON_SET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(node,++count);
|
||||
mysql_data_seek(res_set,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
if (res_set == NULL)
|
||||
{
|
||||
//INSERT statements don't return any res_set
|
||||
if (mysql_field_count(conn) == 0)
|
||||
return TRUE;
|
||||
#ifdef DEBUG
|
||||
printf("Empty Query!\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_arity, MkIntegerTerm(mysql_num_fields(res_set)))){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_result_set, MkIntegerTerm((Int) res_set)))
|
||||
{
|
||||
mysql_free_result(res_set);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_number_of_fields(void) {
|
||||
Term arg_relation = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term arg_fields = Deref(ARG3);
|
||||
|
||||
char *relation = AtomName(AtomOfTerm(arg_relation));
|
||||
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
|
||||
|
||||
char sql[256];
|
||||
|
||||
MYSQL_RES *res_set;
|
||||
|
||||
sprintf(sql,"DESCRIBE `%s`",relation);
|
||||
|
||||
/* executar a query SQL */
|
||||
if (mysql_query(conn, sql) != 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: **c_db_my_number_of_fields** Error on the query! %s\n",sql);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* guardar os tuplos do lado do cliente */
|
||||
if ((res_set = mysql_store_result(conn)) == NULL)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("ERROR: **c_db_my_number_of_fields** Error storing the query! %s\n",sql);
|
||||
#endif
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_fields, MkIntegerTerm(mysql_num_rows(res_set)))){
|
||||
mysql_free_result(res_set);
|
||||
return FALSE;
|
||||
}
|
||||
mysql_free_result(res_set);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* db_get_attributes_types: RelName x Connection -> TypesList */
|
||||
static Int
|
||||
c_db_my_get_attributes_types(void) {
|
||||
Term arg_relation = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term arg_types_list = Deref(ARG3);
|
||||
|
||||
char *relation = AtomName(AtomOfTerm(arg_relation));
|
||||
MYSQL *conn = (MYSQL *) IntegerOfTerm(arg_conn);
|
||||
char sql[256];
|
||||
|
||||
MYSQL_RES *res_set;
|
||||
MYSQL_ROW row;
|
||||
Term head, list;
|
||||
|
||||
sprintf(sql,"DESCRIBE `%s`",relation);
|
||||
|
||||
Int length = strlen(sql);
|
||||
|
||||
/* executar a query SQL */
|
||||
if (mysql_real_query(conn, sql, length) != 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("Erro na query! %s\n",sql);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
/* guardar os tuplos do lado do cliente */
|
||||
if ((res_set = mysql_store_result(conn)) == NULL)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("Query vazia!\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
list = arg_types_list;
|
||||
|
||||
while ((row = mysql_fetch_row(res_set)) != NULL)
|
||||
{
|
||||
head = HeadOfTerm(list);
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom(row[0])));
|
||||
list = TailOfTerm(list);
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
if (strncmp(row[1], "smallint",8) == 0 || strncmp(row[1],"int",3) == 0 ||
|
||||
strncmp(row[1], "mediumint",9) == 0 || strncmp(row[1], "tinyint",7) == 0 ||
|
||||
strncmp(row[1], "bigint",6) == 0 || strcmp(row[1], "year") == 0)
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom("integer")));
|
||||
else if (strcmp(row[1], "float") == 0 || strncmp(row[1], "double",6) == 0
|
||||
|| strcmp(row[1], "real") == 0)
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom("real")));
|
||||
else Yap_unify(head, MkAtomTerm(Yap_LookupAtom("string")));
|
||||
}
|
||||
|
||||
mysql_free_result(res_set);
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/* db_disconnect */
|
||||
static Int
|
||||
c_db_my_disconnect(void) {
|
||||
Term arg_conn = Deref(ARG1);
|
||||
|
||||
MYSQL *conn = (MYSQL *) IntegerOfTerm(arg_conn);
|
||||
|
||||
if ((myddas_util_search_connection(conn)) != NULL)
|
||||
{
|
||||
myddas_util_delete_connection(conn);
|
||||
mysql_close(conn);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* db_table_write: Result Set */
|
||||
static Int
|
||||
c_db_my_table_write(void) {
|
||||
Term arg_res_set = Deref(ARG1);
|
||||
|
||||
MYSQL_RES *res_set = (MYSQL_RES *) IntegerOfTerm(arg_res_set);
|
||||
|
||||
myddas_util_table_write(res_set);
|
||||
mysql_free_result(res_set);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_row_cut(void) {
|
||||
MYSQL_RES *mysql_res=NULL;
|
||||
|
||||
mysql_res = (MYSQL_RES *) IntegerOfTerm(EXTRA_CBACK_CUT_ARG(Term,1));
|
||||
mysql_free_result(mysql_res);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* db_row: ResultSet x Arity_ListOfArgs x ListOfArgs -> */
|
||||
static Int
|
||||
c_db_my_row(void) {
|
||||
#ifdef MYDDAS_STATS
|
||||
/* Measure time used by the */
|
||||
/* c_db_my_row function */
|
||||
MYDDAS_STATS_TIME start,end,total_time,diff;
|
||||
MyddasULInt count = 0;
|
||||
start = myddas_stats_walltime();
|
||||
#endif
|
||||
Term arg_result_set = Deref(ARG1);
|
||||
Term arg_arity = Deref(ARG2);
|
||||
Term arg_list_args = Deref(ARG3);
|
||||
|
||||
MYSQL_RES *res_set = (MYSQL_RES *) IntegerOfTerm(arg_result_set);
|
||||
EXTRA_CBACK_ARG(3,1)=(CELL) MkIntegerTerm((Int)res_set);
|
||||
MYSQL_ROW row;
|
||||
MYSQL_FIELD *field;
|
||||
|
||||
|
||||
Term head, list, null_atom[1];
|
||||
Int i, arity;
|
||||
|
||||
arity = IntegerOfTerm(arg_arity);
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if ((row = mysql_fetch_row(res_set)) != NULL)
|
||||
{
|
||||
mysql_field_seek(res_set,0);
|
||||
list = arg_list_args;
|
||||
|
||||
for (i = 0; i < arity; i++)
|
||||
{
|
||||
/* Aqui ser<65>o feitas as convers<72>es de tipos de dados */
|
||||
field = mysql_fetch_field(res_set);
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
if (row[i] == NULL)
|
||||
{
|
||||
null_atom[0] = MkIntegerTerm(null_id++);
|
||||
|
||||
if (!Yap_unify(head, Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom("null"),1),1,null_atom)))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IS_SQL_INT(field->type))
|
||||
{
|
||||
if (!Yap_unify(head, MkIntegerTerm(atoi(row[i]))))
|
||||
continue;
|
||||
}
|
||||
else if (IS_SQL_FLOAT(field->type))
|
||||
{
|
||||
if (!Yap_unify(head, MkFloatTerm(atof(row[i]))))
|
||||
continue;
|
||||
}
|
||||
else if (IS_SQL_GEOMETRY(field->type))
|
||||
{
|
||||
if (!Yap_unify(head, wkb2prolog(row[i])))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Yap_unify(head, MkAtomTerm(Yap_LookupAtom(row[i]))))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef MYDDAS_STATS
|
||||
end = myddas_stats_walltime();
|
||||
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(diff,time_copy);
|
||||
myddas_stats_subtract_time(diff,end,start);
|
||||
diff = myddas_stats_time_copy_to_final(diff);
|
||||
|
||||
MYDDAS_FREE(end,struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(start,struct myddas_stats_time_struct);
|
||||
|
||||
MYDDAS_STATS_GET_DB_ROW_FUNCTION(total_time);
|
||||
myddas_stats_add_time(total_time,diff,total_time);
|
||||
MYDDAS_STATS_GET_DB_ROW_FUNCTION_COUNT(count);
|
||||
MYDDAS_STATS_SET_DB_ROW_FUNCTION_COUNT(++count);
|
||||
|
||||
MYDDAS_FREE(diff,struct myddas_stats_time_struct);
|
||||
#endif /* MYDDAS_STATS */
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
mysql_free_result(res_set);
|
||||
#ifdef MYDDAS_STATS
|
||||
end = myddas_stats_walltime();
|
||||
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(diff,time_copy);
|
||||
myddas_stats_subtract_time(diff,end,start);
|
||||
diff = myddas_stats_time_copy_to_final(diff);
|
||||
|
||||
MYDDAS_FREE(end,struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(start,struct myddas_stats_time_struct);
|
||||
|
||||
MYDDAS_STATS_GET_DB_ROW_FUNCTION(total_time);
|
||||
myddas_stats_add_time(total_time,diff,total_time);
|
||||
MYDDAS_STATS_GET_DB_ROW_FUNCTION_COUNT(count);
|
||||
MYDDAS_STATS_SET_DB_ROW_FUNCTION_COUNT(++count);
|
||||
|
||||
MYDDAS_FREE(diff,struct myddas_stats_time_struct);
|
||||
#endif /* MYDDAS_STATS */
|
||||
cut_fail(); /* This macro already does a return FALSE */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_get_fields_properties(void) {
|
||||
Term nome_relacao = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term fields_properties_list = Deref(ARG3);
|
||||
Term head, list;
|
||||
|
||||
char *relacao = AtomName(AtomOfTerm(nome_relacao));
|
||||
char sql[256];
|
||||
Int num_fields,i;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_RES *res_set;
|
||||
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
|
||||
|
||||
|
||||
/* LIMIT 0 -> We only need the meta information about the fields
|
||||
to know their properties, we don't need the results of the
|
||||
query*/
|
||||
sprintf (sql,"SELECT * FROM `%s` LIMIT 0",relacao);
|
||||
|
||||
Int length=strlen(sql);
|
||||
|
||||
/* executar a query SQL */
|
||||
if (mysql_real_query(conn, sql, length) != 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("Erro na query! %s\n",sql);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Functor functor = Yap_MkFunctor(Yap_LookupAtom("property"),4);
|
||||
|
||||
Term properties[4];
|
||||
|
||||
|
||||
/* guardar os tuplos do lado do cliente */
|
||||
/* nao precisamos do resultado, mas apenas no res_set */
|
||||
/* para obter a informa<6D><61>o atrav<61>s do mysql_fetch_fields*/
|
||||
res_set = mysql_store_result(conn);
|
||||
|
||||
num_fields = mysql_num_fields(res_set);
|
||||
fields = mysql_fetch_fields(res_set);
|
||||
|
||||
list = fields_properties_list;
|
||||
|
||||
|
||||
|
||||
for (i=0;i<num_fields;i++)
|
||||
{
|
||||
head = HeadOfTerm(list);
|
||||
|
||||
properties[0] = MkAtomTerm(Yap_LookupAtom(fields[i].name));
|
||||
|
||||
if (fields[i].flags & NOT_NULL_FLAG)
|
||||
properties[1] = MkIntegerTerm(1); //Can't be NULL
|
||||
else
|
||||
properties[1] = MkIntegerTerm(0);
|
||||
|
||||
if (fields[i].flags & PRI_KEY_FLAG)
|
||||
properties[2] = MkIntegerTerm(1); //It''s a primary key
|
||||
else
|
||||
properties[2] = MkIntegerTerm(0);
|
||||
|
||||
if (fields[i].flags & AUTO_INCREMENT_FLAG)
|
||||
properties[3] = MkIntegerTerm(1); //It's auto_incremented field
|
||||
else
|
||||
properties[3] = MkIntegerTerm(0);
|
||||
|
||||
|
||||
list = TailOfTerm(list);
|
||||
if (!Yap_unify(head, Yap_MkApplTerm(functor,4,properties))){
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
mysql_free_result(res_set);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* c_db_my_get_next_result_set: Connection * NextResSet */
|
||||
static Int
|
||||
c_db_my_get_next_result_set(void) {
|
||||
Term arg_conn = Deref(ARG1);
|
||||
Term arg_next_res_set = Deref(ARG2);
|
||||
|
||||
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
|
||||
MYSQL_RES *res_set=NULL;
|
||||
|
||||
if (mysql_next_result(conn) == 0){
|
||||
res_set = mysql_store_result(conn);
|
||||
Yap_unify(arg_next_res_set, MkIntegerTerm((Int) res_set));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_get_database(void) {
|
||||
Term arg_con = Deref(ARG1);
|
||||
Term arg_database = Deref(ARG2);
|
||||
|
||||
MYSQL *con = (MYSQL *) (IntegerOfTerm(arg_con));
|
||||
|
||||
if (!Yap_unify(arg_database,MkAtomTerm(Yap_LookupAtom(con->db))))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_my_change_database(void) {
|
||||
Term arg_con = Deref(ARG1);
|
||||
Term arg_database = Deref(ARG2);
|
||||
|
||||
MYSQL *con = (MYSQL *) (IntegerOfTerm(arg_con));
|
||||
char *database = AtomName(AtomOfTerm(arg_database));
|
||||
|
||||
if (mysql_select_db(con,database)!=0)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* MYDDAS_MYSQL */
|
||||
@@ -1,745 +0,0 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: myddas_odbc.c *
|
||||
* Last rev: 22/03/05 *
|
||||
* mods: *
|
||||
* comments: Predicates for comunicating with ODBC drivers *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#if defined MYDDAS_ODBC && defined CUT_C
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "Yap.h"
|
||||
#include "Yatom.h"
|
||||
#include "myddas.h"
|
||||
#include "cut_c.h"
|
||||
#include <sql.h>
|
||||
#include <sqlucode.h>
|
||||
|
||||
static Int null_id = 0;
|
||||
|
||||
STATIC_PROTO(Int c_db_odbc_connect,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_disconnect,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_number_of_fields,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_get_attributes_types,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_query,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_row,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_row_cut,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_get_fields_properties,(void));
|
||||
STATIC_PROTO(Int c_db_odbc_number_of_fields_in_query,(void));
|
||||
|
||||
|
||||
#define SQLALLOCHANDLE(A,B,C,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLAllocHandle(A,B,C); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLAllocHandle(ENV) %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLSETENVATTR(A,B,C,D,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLSetEnvAttr(A,B,C,D); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLSetEnvAttr %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLCONNECT(A,B,C,D,E,F,G,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLConnect(A,B,C,D,E,F,G); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLConnect %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLEXECDIRECT(A,B,C,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLExecDirect(A,B,C); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLExecDirect %s \n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLDESCRIBECOL(A,B,C,D,E,F,G,H,I,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLDescribeCol(A,B,C,D,E,F,G,H,I); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLDescribeCol %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLSETCONNECTATTR(A,B,C,D,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLSetConnectAttr(A,B,C,D); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLSetConnectAttr %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLBINDCOL(A,B,C,D,E,F,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLBindCol(A,B,C,D,E,F); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLbindCol %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLFREESTMT(A,B,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLFreeStmt(A,B); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLFreeStmt %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLNUMRESULTCOLS(A,B,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLNumResultCols(A,B); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLNumResultCols %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#define SQLCLOSECURSOR(A,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLCloseCursor(A); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLCloseCursor %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* no db_odbc_row n<>o <20> utilizada esta macro*/
|
||||
#define SQLFETCH(A,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLFetch(A); \
|
||||
if (retcode == SQL_NO_DATA) \
|
||||
break; \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLFETCH %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLGETDATA(A,B,C,D,E,F,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLGetData(A,B,C,D,E,F); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLgetdata %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLDISCONNECT(A,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLDisconnect(A); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLDisconnect %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLFREEHANDLE(A,B,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLFreeHandle(A,B); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLFreeHandle %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLPRIMARYKEYS(A,B,C,D,E,F,G,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLPrimaryKeys(A,B,C,D,E,F,G); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLPrimaryKeys %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLGETTYPEINFO(A,B,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLGetTypeInfo(A,B); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLGetTypeInfo %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SQLCOLATTRIBUTE(A,B,C,D,E,F,G,print) \
|
||||
{ \
|
||||
SQLRETURN retcode; \
|
||||
retcode = SQLColAttribute(A,B,C,D,E,F,G); \
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) \
|
||||
{ \
|
||||
printf("erro no SQLColAttribute %s\n",print); \
|
||||
return FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Verificar tipo de dados*/
|
||||
#define IS_SQL_INT(FIELD) FIELD == SQL_DECIMAL || \
|
||||
FIELD == SQL_NUMERIC || \
|
||||
FIELD == SQL_SMALLINT || \
|
||||
FIELD == SQL_INTEGER || \
|
||||
FIELD == SQL_TINYINT || \
|
||||
FIELD == SQL_BIGINT
|
||||
|
||||
#define IS_SQL_FLOAT(FIELD) FIELD == SQL_FLOAT || \
|
||||
FIELD == SQL_DOUBLE || \
|
||||
FIELD == SQL_REAL
|
||||
|
||||
|
||||
|
||||
|
||||
static Int
|
||||
c_db_odbc_connect(void) {
|
||||
Term arg_driver = Deref(ARG1);
|
||||
Term arg_user = Deref(ARG2);
|
||||
Term arg_passwd = Deref(ARG3);
|
||||
Term arg_conn = Deref(ARG4);
|
||||
|
||||
MYDDAS_UTIL_CONNECTION new = NULL;
|
||||
|
||||
char *driver = AtomName(AtomOfTerm(arg_driver));
|
||||
char *user = AtomName(AtomOfTerm(arg_user));
|
||||
char *passwd = AtomName(AtomOfTerm(arg_passwd));
|
||||
|
||||
SQLHENV henv;
|
||||
SQLHDBC hdbc;
|
||||
|
||||
/*Allocate environment handle */
|
||||
SQLALLOCHANDLE(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv, "connect");
|
||||
/* Set the ODBC version environment attribute */
|
||||
SQLSETENVATTR(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0, "connect");
|
||||
/* Allocate connection handle */
|
||||
SQLALLOCHANDLE(SQL_HANDLE_DBC, henv, &hdbc, "connect");
|
||||
/* Set login timeout to 6 seconds. */
|
||||
SQLSETCONNECTATTR(hdbc, SQL_LOGIN_TIMEOUT,(SQLPOINTER) 6, 0, "connect");
|
||||
/* Connect to data source */
|
||||
SQLCONNECT(hdbc,
|
||||
(SQLCHAR*) driver, SQL_NTS,
|
||||
(SQLCHAR*) user, SQL_NTS,
|
||||
(SQLCHAR*) passwd, SQL_NTS, "connect");
|
||||
|
||||
if (!Yap_unify(arg_conn, MkIntegerTerm((Int)(hdbc))))
|
||||
return FALSE;
|
||||
else
|
||||
{
|
||||
/* Criar um novo no na lista de ligacoes*/
|
||||
//new = add_connection(&TOP,hdbc,henv);
|
||||
new = myddas_util_add_connection(hdbc,henv);
|
||||
if (new == NULL){
|
||||
printf("Erro ao alocar memoria para lista\n");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* db_query: SQLQuery x ResultSet x Arity x BindList x Connection */
|
||||
static Int
|
||||
c_db_odbc_query(void) {
|
||||
Term arg_sql_query = Deref(ARG1);
|
||||
Term arg_result_set = Deref(ARG2);
|
||||
Term arg_arity = Deref(ARG3);
|
||||
Term arg_bind_list = Deref(ARG4);
|
||||
Term arg_conn = Deref(ARG5);
|
||||
|
||||
SQLCHAR *sql = AtomName(AtomOfTerm(arg_sql_query));
|
||||
|
||||
|
||||
SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
SQLHSTMT hstmt;
|
||||
SQLSMALLINT type;
|
||||
|
||||
/*Allocate an handle for the query*/
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt, "db_query");
|
||||
/* Executes the query*/
|
||||
SQLEXECDIRECT(hstmt,sql,SQL_NTS, "db_query");
|
||||
|
||||
Int arity;
|
||||
Int i;
|
||||
|
||||
if (IsNonVarTerm(arg_arity)){
|
||||
arity = IntegerOfTerm(arg_arity);
|
||||
|
||||
|
||||
char *bind_space=NULL;
|
||||
|
||||
//const Int functor_arity=3;
|
||||
const Short functor_arity=3;
|
||||
Functor functor = Yap_MkFunctor(Yap_LookupAtom("bind"),functor_arity);
|
||||
Term properties[functor_arity];
|
||||
|
||||
Term head,list=arg_bind_list;
|
||||
|
||||
SQLUINTEGER ColumnSizePtr;
|
||||
SQLINTEGER *data_info=NULL;
|
||||
|
||||
for (i=1;i<=arity;i++)
|
||||
{
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
SQLDESCRIBECOL(hstmt,i,NULL,0,NULL,&type,&ColumnSizePtr,NULL,NULL,"db_query");
|
||||
|
||||
/* +1 because of '\0' */
|
||||
bind_space = malloc(sizeof(char)*(ColumnSizePtr+1));
|
||||
data_info = malloc(sizeof(SQLINTEGER));
|
||||
SQLBINDCOL(hstmt,i,SQL_C_CHAR,bind_space,(ColumnSizePtr+1),data_info,"db_query");
|
||||
|
||||
properties[0] = MkIntegerTerm((Int)bind_space);
|
||||
properties[2] = MkIntegerTerm((Int)data_info);
|
||||
|
||||
if (IS_SQL_INT(type))
|
||||
properties[1]=MkAtomTerm(Yap_LookupAtom("integer"));
|
||||
else if (IS_SQL_FLOAT(type))
|
||||
properties[1]=MkAtomTerm(Yap_LookupAtom("real"));
|
||||
else
|
||||
properties[1]=MkAtomTerm(Yap_LookupAtom("string"));
|
||||
|
||||
Yap_unify(head,Yap_MkApplTerm(functor,functor_arity,properties));
|
||||
continue;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_result_set, MkIntegerTerm((Int) hstmt)))
|
||||
{
|
||||
SQLCLOSECURSOR(hstmt,"db_query");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE,"db_query");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_odbc_number_of_fields(void) {
|
||||
Term arg_relation = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term arg_fields = Deref(ARG3);
|
||||
|
||||
|
||||
char *relation = AtomName(AtomOfTerm(arg_relation));
|
||||
|
||||
SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
SQLHSTMT hstmt;
|
||||
|
||||
char sql[256];
|
||||
SQLSMALLINT number_fields;
|
||||
|
||||
sprintf(sql,"DESCRIBE %s",relation);
|
||||
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt, "db_number_of_fields");
|
||||
SQLEXECDIRECT(hstmt,sql,SQL_NTS, "db_number_of_fields");
|
||||
|
||||
/* Calcula o numero de campos*/
|
||||
number_fields=0;
|
||||
while(TRUE) {
|
||||
SQLFETCH(hstmt,"db_number_of_fields");
|
||||
number_fields++;
|
||||
}
|
||||
|
||||
SQLCLOSECURSOR(hstmt,"db_number_of_fields");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE,"db_number_of_fields");
|
||||
|
||||
if (!Yap_unify(arg_fields, MkIntegerTerm(number_fields)))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* db_get_attributes_types: RelName x Connection -> TypesList */
|
||||
static Int
|
||||
c_db_odbc_get_attributes_types(void) {
|
||||
Term arg_relation = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term arg_types_list = Deref(ARG3);
|
||||
|
||||
char *relation = AtomName(AtomOfTerm(arg_relation));
|
||||
SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
SQLHSTMT hstmt;
|
||||
|
||||
char sql[256];
|
||||
Term head, list;
|
||||
list = arg_types_list;
|
||||
|
||||
sprintf(sql,"DESCRIBE %s",relation);
|
||||
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt, "db_get_attributes_types");
|
||||
SQLEXECDIRECT(hstmt,sql,SQL_NTS, "db_get_attributes_types");
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
SQLFETCH(hstmt, "db_get_attributes_types");
|
||||
|
||||
/* Tentar fazer de uma maneira que a gente consiga calcular o tamanho que o
|
||||
nome do campo vai ocupar, assim podemos alocar memoria dinamicamente*/
|
||||
sql[0]='\0';
|
||||
SQLGETDATA(hstmt, 1, SQL_C_CHAR, sql, 256, NULL, "db_get_attributes_types");
|
||||
|
||||
head = HeadOfTerm(list);
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom(sql)));
|
||||
list = TailOfTerm(list);
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
sql[0]='\0';
|
||||
SQLGETDATA(hstmt, 2, SQL_C_CHAR, sql, 256, NULL, "db_get_attributes_types");
|
||||
|
||||
if (strncmp(sql, "smallint",8) == 0 || strncmp(sql,"int",3) == 0 ||
|
||||
strncmp(sql, "mediumint",9) == 0 || strncmp(sql, "tinyint",7) == 0 ||
|
||||
strncmp(sql, "bigint",6) == 0 || strcmp(sql, "year") == 0)
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom("integer")));
|
||||
else
|
||||
if (strcmp(sql, "float") == 0 || strncmp(sql, "double",6) == 0
|
||||
|| strcmp(sql, "real") == 0)
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom("real")));
|
||||
else
|
||||
Yap_unify(head, MkAtomTerm(Yap_LookupAtom("string")));
|
||||
}
|
||||
|
||||
SQLCLOSECURSOR(hstmt,"db_get_attributes_types");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE, "db_get_attributes_types");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* db_disconnect */
|
||||
static Int
|
||||
c_db_odbc_disconnect(void) {
|
||||
Term arg_conn = Deref(ARG1);
|
||||
|
||||
SQLHDBC conn = (SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
SQLHENV henv = myddas_util_get_odbc_enviromment(conn);
|
||||
|
||||
if ((myddas_util_search_connection(conn)) != NULL)
|
||||
{
|
||||
myddas_util_delete_connection(conn);
|
||||
/* More information about this process on
|
||||
msdn.microsoft.com*/
|
||||
SQLDISCONNECT(conn,"db_disconnect");
|
||||
SQLFREEHANDLE(SQL_HANDLE_DBC,conn,"db_disconnect");
|
||||
SQLFREEHANDLE(SQL_HANDLE_ENV,henv,"db_disconnect");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_odbc_row_cut(void) {
|
||||
|
||||
SQLHSTMT hstmt = (SQLHSTMT) IntegerOfTerm(EXTRA_CBACK_CUT_ARG(Term,1));
|
||||
|
||||
SQLCLOSECURSOR(hstmt,"db_row_cut");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE,"db_row_cut");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* db_row: ResultSet x BindList x ListOfArgs -> */
|
||||
static Int
|
||||
c_db_odbc_row(void) {
|
||||
Term arg_result_set = Deref(ARG1);
|
||||
Term arg_bind_list = Deref(ARG2);
|
||||
Term arg_list_args = Deref(ARG3);
|
||||
|
||||
SQLHSTMT hstmt = (SQLHSTMT) IntegerOfTerm(arg_result_set);
|
||||
|
||||
/* EXTRA_CBACK_ARG(ARIDADE,LOCAL_ONDE_COLOCAR_VALOR)*/
|
||||
EXTRA_CBACK_ARG(3,1)=(CELL) MkIntegerTerm((Int)hstmt);
|
||||
|
||||
Term head, list, null_atom[1];
|
||||
Term head_bind, list_bind;
|
||||
|
||||
SQLRETURN retcode = SQLFetch(hstmt);
|
||||
if (retcode == SQL_NO_DATA)
|
||||
{
|
||||
SQLCLOSECURSOR(hstmt,"db_row");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE,"db_row");
|
||||
|
||||
cut_fail();
|
||||
return FALSE;
|
||||
}
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
|
||||
{
|
||||
printf("erro no SQLFETCH number of fields\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
char *bind_value=NULL;
|
||||
Term type;
|
||||
|
||||
list = arg_list_args;
|
||||
list_bind = arg_bind_list;
|
||||
SQLINTEGER *data_info=NULL;
|
||||
|
||||
while (IsPairTerm(list_bind))
|
||||
{
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
head_bind = HeadOfTerm(list_bind);
|
||||
list_bind = TailOfTerm(list_bind);
|
||||
|
||||
bind_value = (char *)IntegerOfTerm(ArgOfTerm(1,head_bind));
|
||||
type = ArgOfTerm(2,head_bind);
|
||||
data_info = (SQLINTEGER *)IntegerOfTerm(ArgOfTerm(3,head_bind));
|
||||
|
||||
if ((*data_info) == SQL_NULL_DATA){
|
||||
null_atom[0] = MkIntegerTerm(null_id++);
|
||||
if (!Yap_unify(head, Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom("null"),1),1,null_atom)))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (!strcmp(AtomName(AtomOfTerm(type)),"integer"))
|
||||
{
|
||||
if (!Yap_unify(head, MkIntegerTerm(atoi(bind_value))))
|
||||
continue;
|
||||
}
|
||||
else if (!strcmp(AtomName(AtomOfTerm(type)),"real"))
|
||||
{
|
||||
if (!Yap_unify(head, MkFloatTerm(atof(bind_value))))
|
||||
continue;
|
||||
}
|
||||
else if (!strcmp(AtomName(AtomOfTerm(type)),"string"))
|
||||
{
|
||||
if (!Yap_unify(head, MkAtomTerm(Yap_LookupAtom(bind_value))))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Mudar esta funcao de forma a nao fazer a consulta, pois
|
||||
no predicate db_sql_selet vai fazer duas vezes a mesma consutla*/
|
||||
static Int
|
||||
c_db_odbc_number_of_fields_in_query(void) {
|
||||
Term arg_query = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term arg_fields = Deref(ARG3);
|
||||
|
||||
char *sql = AtomName(AtomOfTerm(arg_query));
|
||||
|
||||
SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
SQLHSTMT hstmt;
|
||||
SQLSMALLINT number_cols=0;
|
||||
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt,
|
||||
"db_number_of_fields_in_query");
|
||||
SQLEXECDIRECT(hstmt,sql,SQL_NTS,
|
||||
"db_number_of_fields_in_query");
|
||||
|
||||
SQLNUMRESULTCOLS(hstmt,&number_cols,
|
||||
"db_number_of_fields_in_query");
|
||||
|
||||
if (!Yap_unify(arg_fields, MkIntegerTerm(number_cols))){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
SQLCLOSECURSOR(hstmt,"db_number_of_fields_in_query");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE, "db_number_of_fields_in_query");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_odbc_get_fields_properties(void) {
|
||||
Term nome_relacao = Deref(ARG1);
|
||||
Term arg_conn = Deref(ARG2);
|
||||
Term fields_properties_list = Deref(ARG3);
|
||||
Term head, list;
|
||||
|
||||
char *relacao = AtomName(AtomOfTerm(nome_relacao));
|
||||
char sql[256];
|
||||
char name[200];
|
||||
Int i;
|
||||
|
||||
|
||||
SQLSMALLINT num_fields=0;
|
||||
SQLSMALLINT NullablePtr=0;
|
||||
SQLSMALLINT AutoIncrementPointer=0;
|
||||
SQLHSTMT hstmt,hstmt2;
|
||||
SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn));
|
||||
|
||||
|
||||
/* LIMIT 0 -> We don't need the results of the query,
|
||||
only the information about the fields of the relation*/
|
||||
sprintf (sql,"SELECT * FROM `%s` LIMIT 0",relacao);
|
||||
|
||||
/*Allocate an handle for the query*/
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt, "db_get_fields_properties");
|
||||
/* Executes the query*/
|
||||
SQLEXECDIRECT(hstmt,sql,SQL_NTS, "db_get_fields_properties");
|
||||
|
||||
Functor functor = Yap_MkFunctor(Yap_LookupAtom("property"),4);
|
||||
Term properties[4];
|
||||
|
||||
SQLNUMRESULTCOLS(hstmt,&num_fields,
|
||||
"db_get_fields_properties");
|
||||
|
||||
list = fields_properties_list;
|
||||
|
||||
SQLSMALLINT bind_prim_key;
|
||||
//por causa de as rows em odbc come<6D>am em 1 :)
|
||||
Short *null=malloc(sizeof(Short)*(1+num_fields));
|
||||
|
||||
SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt2, "db_get_fields_properties");
|
||||
/* Executes the query*/
|
||||
SQLPRIMARYKEYS(hstmt2,NULL,0,NULL,0,relacao,SQL_NTS, "db_get_fields_properties");
|
||||
/* Associates bind value for the 5 column*/
|
||||
SQLBINDCOL(hstmt2,5,SQL_C_SSHORT,&bind_prim_key,sizeof(SQLSMALLINT),NULL,
|
||||
"db_get_fields_properties");
|
||||
|
||||
while(1)
|
||||
{
|
||||
SQLFETCH(hstmt2,"db_get_fields_properties");
|
||||
null[bind_prim_key]=1;
|
||||
}
|
||||
|
||||
SQLCLOSECURSOR(hstmt2,"db_get_fields_properties");
|
||||
SQLFREESTMT(hstmt2,SQL_CLOSE,"db_get_fields_properties");
|
||||
|
||||
for (i=1;i<=num_fields;i++)
|
||||
{
|
||||
head = HeadOfTerm(list);
|
||||
name[0]='\0';
|
||||
SQLDESCRIBECOL(hstmt,i,name,200,NULL,NULL,NULL,NULL,&NullablePtr,
|
||||
"db_get_fields_properties");
|
||||
|
||||
SQLCOLATTRIBUTE(hstmt,i,SQL_DESC_AUTO_UNIQUE_VALUE,NULL,0,NULL,&AutoIncrementPointer,
|
||||
"db_get_fields_properties");
|
||||
|
||||
properties[0] = MkAtomTerm(Yap_LookupAtom(name));
|
||||
|
||||
|
||||
if (NullablePtr & SQL_NULLABLE)
|
||||
properties[1] = MkIntegerTerm(1); //Can't be NULL
|
||||
else
|
||||
properties[1] = MkIntegerTerm(0);
|
||||
|
||||
if (null[i] == 1)
|
||||
properties[2] = MkIntegerTerm(1); //It''s a primary key
|
||||
else
|
||||
properties[2] = MkIntegerTerm(0);
|
||||
|
||||
if (AutoIncrementPointer & SQL_TRUE)
|
||||
properties[3] = MkIntegerTerm(1); //It's auto_incremented field
|
||||
else
|
||||
properties[3] = MkIntegerTerm(0);
|
||||
|
||||
|
||||
list = TailOfTerm(list);
|
||||
if (!Yap_unify(head, Yap_MkApplTerm(functor,4,properties))){
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
SQLCLOSECURSOR(hstmt,"db_get_fields_properties");
|
||||
SQLFREESTMT(hstmt,SQL_CLOSE,"db_get_fields_properties");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Yap_InitMYDDAS_ODBCPreds(void)
|
||||
{
|
||||
/* db_connect: Host x User x Passwd x Database x Connection */
|
||||
Yap_InitCPred("c_db_odbc_connect", 4, c_db_odbc_connect, 0);
|
||||
|
||||
/* db_number_of_fields: Relation x Connection x NumberOfFields */
|
||||
Yap_InitCPred("c_db_odbc_number_of_fields",3, c_db_odbc_number_of_fields, 0);
|
||||
|
||||
/* db_number_of_fields_in_query: SQLQuery x Connection x NumberOfFields */
|
||||
Yap_InitCPred("c_db_odbc_number_of_fields_in_query",3, c_db_odbc_number_of_fields_in_query, 0);
|
||||
|
||||
/* db_get_attributes_types: Relation x TypesList */
|
||||
Yap_InitCPred("c_db_odbc_get_attributes_types", 3, c_db_odbc_get_attributes_types, 0);
|
||||
|
||||
/* db_query: SQLQuery x ResultSet x Connection */
|
||||
Yap_InitCPred("c_db_odbc_query", 5, c_db_odbc_query, 0);
|
||||
|
||||
/* db_disconnect: Connection */
|
||||
Yap_InitCPred("c_db_odbc_disconnect", 1,c_db_odbc_disconnect, 0);
|
||||
|
||||
/* db_get_fields_properties: PredName x Connnection x PropertiesList */
|
||||
Yap_InitCPred("c_db_odbc_get_fields_properties",3,c_db_odbc_get_fields_properties,0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Yap_InitBackMYDDAS_ODBCPreds(void)
|
||||
{
|
||||
|
||||
/* db_row: ResultSet x ListOfArgs */
|
||||
Yap_InitCPredBackCut("c_db_odbc_row", 3, sizeof(Int),
|
||||
c_db_odbc_row,
|
||||
c_db_odbc_row,
|
||||
c_db_odbc_row_cut, 0);
|
||||
|
||||
}
|
||||
|
||||
#endif /*MYDDAS_ODBC*/
|
||||
@@ -1,700 +0,0 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: myddas_shared.c *
|
||||
* Last rev: 22/03/05 *
|
||||
* mods: *
|
||||
* comments: Predicates for maintaining MYDDAS *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#if defined MYDDAS_MYSQL || defined MYDDAS_ODBC
|
||||
|
||||
#include "Yap.h"
|
||||
#include "Yatom.h"
|
||||
#include "cut_c.h"
|
||||
#include "myddas.h"
|
||||
#include <stdlib.h>
|
||||
#include "myddas_structs.h"
|
||||
#ifdef MYDDAS_STATS
|
||||
#include "myddas_statistics.h"
|
||||
#endif
|
||||
|
||||
STATIC_PROTO(Int c_db_initialize_myddas,(void));
|
||||
STATIC_PROTO(Int c_db_connection_type,(void));
|
||||
STATIC_PROTO(Int c_db_add_preds,(void));
|
||||
STATIC_PROTO(Int c_db_preds_conn_start ,(void));
|
||||
STATIC_PROTO(Int c_db_preds_conn_continue ,(void));
|
||||
STATIC_PROTO(Int c_db_connection_start ,(void));
|
||||
STATIC_PROTO(Int c_db_connection_continue ,(void));
|
||||
STATIC_PROTO(Int c_db_check_if_exists_pred,(void));
|
||||
STATIC_PROTO(Int c_db_delete_predicate,(void));
|
||||
STATIC_PROTO(Int c_db_multi_queries_number,(void));
|
||||
#ifdef MYDDAS_STATS
|
||||
STATIC_PROTO(Int c_db_stats,(void));
|
||||
STATIC_PROTO(Int c_db_stats_walltime,(void));
|
||||
STATIC_PROTO(Int c_db_stats_translate,(void));
|
||||
STATIC_PROTO(Int c_db_stats_time,(void));
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
STATIC_PROTO(Int c_db_check,(void));
|
||||
#endif
|
||||
|
||||
void Yap_InitMYDDAS_SharedPreds(void)
|
||||
{
|
||||
/* c_db_initialize_myddas */
|
||||
Yap_InitCPred("c_db_initialize_myddas",0,c_db_initialize_myddas, 0);
|
||||
|
||||
/* c_db_connection_type: Connection x Type */
|
||||
Yap_InitCPred("c_db_connection_type",2,c_db_connection_type, 0);
|
||||
|
||||
/* CORRECT THIS: db_add_preds : PredName * Arity * Connection */
|
||||
Yap_InitCPred("c_db_add_preds",4,c_db_add_preds, 0);
|
||||
|
||||
/* c_db_check_if_exists_pred : PredName * Arity * Connection */
|
||||
Yap_InitCPred("c_db_check_if_exists_pred",3,c_db_check_if_exists_pred, 0);
|
||||
|
||||
/* c_db_delete_pred : Module * PredName * Arity */
|
||||
Yap_InitCPred("c_db_delete_predicate",3,c_db_delete_predicate, 0);
|
||||
|
||||
/* c_db_delete_pred : Module * PredName * Arity */
|
||||
Yap_InitCPred("c_db_multi_queries_number",2,c_db_multi_queries_number, 0);
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
/* c_db_stats: Connection * Stats */
|
||||
Yap_InitCPred("c_db_stats",2, c_db_stats, 0);
|
||||
|
||||
/* c_db_stats_walltime */
|
||||
Yap_InitCPred("c_db_stats_walltime",1, c_db_stats_walltime, 0);
|
||||
|
||||
/* c_db_stats_translate */
|
||||
Yap_InitCPred("c_db_stats_translate",2,c_db_stats_translate, 0);
|
||||
|
||||
/* c_db_stats_time */
|
||||
Yap_InitCPred("c_db_stats_time",2,c_db_stats_time, 0);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
Yap_InitCPred("c_db_check",0, c_db_check, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Yap_InitBackMYDDAS_SharedPreds(void)
|
||||
{
|
||||
/* Gives all the predicates associated to a given connection */
|
||||
Yap_InitCPredBack("c_db_preds_conn", 4, sizeof(Int),
|
||||
c_db_preds_conn_start,
|
||||
c_db_preds_conn_continue, 0);
|
||||
/* Gives all the connections stored on the MYDDAS Structure*/
|
||||
Yap_InitCPredBack("c_db_connection", 1, sizeof(Int),
|
||||
c_db_connection_start,
|
||||
c_db_connection_continue, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* Initialize all of the MYDDAS global structures */
|
||||
static Int
|
||||
c_db_initialize_myddas(void){
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER = myddas_init_initialize_myddas();
|
||||
#ifdef MYDDAS_STATS
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER = myddas_stats_initialize_global_stats(Yap_REGS.MYDDAS_GLOBAL_POINTER);
|
||||
#endif /* MYDDAS_STATS */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Gives the type of a given connection,
|
||||
in other words, type will be mysql or odbc
|
||||
|
||||
NOTE: In order to use this predicate, the connection*/
|
||||
/* c_db_connection_type: +Connection * ?Type */
|
||||
static Int
|
||||
c_db_connection_type (void){
|
||||
Term arg_con = Deref(ARG1);
|
||||
Term arg_type = Deref(ARG2);
|
||||
|
||||
Int *con = (Int *) IntegerOfTerm(arg_con);
|
||||
Int type = myddas_util_connection_type(con);
|
||||
|
||||
if (type == 1) /* MYSQL Connection */
|
||||
Yap_unify(arg_type, MkAtomTerm(Yap_LookupAtom("mysql")));
|
||||
else if (type ==2) /* ODBC Connection */
|
||||
Yap_unify(arg_type, MkAtomTerm(Yap_LookupAtom("odbc")));
|
||||
else /* Not a valid connection*/
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* db_add_preds: PredName * Arity * Module * Connection*/
|
||||
static Int
|
||||
c_db_add_preds (void){
|
||||
Term arg_nome = Deref(ARG1);
|
||||
Term arg_aridade = Deref(ARG2);
|
||||
Term arg_module = Deref(ARG3);
|
||||
Term arg_conn = Deref(ARG4);
|
||||
|
||||
/* PredEntry *pe; */
|
||||
/* pe = RepPredProp(PredPropByFunc(FunctorOfTerm(arg_pred),arg_module)); */
|
||||
|
||||
|
||||
char *nome = AtomName(AtomOfTerm(arg_nome));
|
||||
char *module = AtomName(AtomOfTerm(arg_module));
|
||||
Int aridade = IntegerOfTerm(arg_aridade);
|
||||
Int *conn = (Int *) IntegerOfTerm(arg_conn);
|
||||
|
||||
if (myddas_util_add_predicate(nome,aridade,module,conn) == NULL)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf ("ERROR : Could not add Predicate: Line: %d File: %s\n",__LINE__,__FILE__);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static Int
|
||||
c_db_check_if_exists_pred (void){
|
||||
Term arg_nome = Deref(ARG1);
|
||||
Term arg_aridade = Deref(ARG2);
|
||||
Term arg_module = Deref(ARG3);
|
||||
|
||||
|
||||
char *nome = AtomName(AtomOfTerm(arg_nome));
|
||||
char *module = AtomName(AtomOfTerm(arg_module));
|
||||
Int aridade = IntegerOfTerm(arg_aridade);
|
||||
|
||||
if (myddas_util_search_predicate(nome,aridade,module) == NULL)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static Int
|
||||
c_db_delete_predicate(void){
|
||||
Term arg_module = Deref(ARG1);
|
||||
Term arg_name = Deref(ARG2);
|
||||
Term arg_arity = Deref(ARG3);
|
||||
|
||||
char *module = AtomName(AtomOfTerm(arg_module));
|
||||
char *name = AtomName(AtomOfTerm(arg_name));
|
||||
Int arity = IntegerOfTerm(arg_arity);
|
||||
|
||||
MYDDAS_UTIL_PREDICATE predicate =
|
||||
myddas_util_search_predicate(name,arity,module);
|
||||
if (predicate == NULL)
|
||||
return FALSE;
|
||||
|
||||
myddas_util_delete_predicate(predicate);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static Int
|
||||
c_db_multi_queries_number(void){
|
||||
Term arg_conn = Deref(ARG1);
|
||||
Term arg_number = Deref(ARG2);
|
||||
|
||||
Int *conn = (Int *) IntegerOfTerm(arg_conn);
|
||||
MYDDAS_UTIL_CONNECTION node =
|
||||
myddas_util_search_connection(conn);
|
||||
|
||||
if (node == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (IsVarTerm(arg_number)){
|
||||
Yap_unify(arg_number,MkIntegerTerm(((Int)myddas_util_get_total_multi_queries_number(node))+1));
|
||||
}
|
||||
else {
|
||||
Int number = IntegerOfTerm(arg_number);
|
||||
number--;
|
||||
myddas_util_set_total_multi_queries_number(node,number);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_connection_start(void){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION node =
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
|
||||
EXTRA_CBACK_ARG(1,1)=(CELL) MkIntegerTerm((Int)node);
|
||||
|
||||
return (c_db_connection_continue());
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_connection_continue(void){
|
||||
Term arg_conn = Deref(ARG1);
|
||||
|
||||
MYDDAS_UTIL_CONNECTION node;
|
||||
node = (MYDDAS_UTIL_CONNECTION) IntegerOfTerm(EXTRA_CBACK_ARG(1,1));
|
||||
|
||||
/* There is no connections */
|
||||
if (node == NULL)
|
||||
{
|
||||
cut_fail();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Yap_unify(arg_conn, MkIntegerTerm((Int)(node->connection)));
|
||||
EXTRA_CBACK_ARG(1,1)=(CELL) MkIntegerTerm((Int)(node->next));
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/* db_preds_conn : Connection(+) * Pred_name(-) * Pred_arity */
|
||||
static Int
|
||||
c_db_preds_conn_start (void){
|
||||
Term arg_conn = Deref(ARG1);
|
||||
|
||||
Int *conn = (Int *) IntegerOfTerm(arg_conn);
|
||||
MYDDAS_UTIL_CONNECTION node =
|
||||
myddas_util_search_connection(conn);
|
||||
|
||||
/* Caso a ligacao j<> tenha sido apagada*/
|
||||
if (node == NULL)
|
||||
{
|
||||
cut_fail();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void *pointer = myddas_util_get_list_pred(node);
|
||||
EXTRA_CBACK_ARG(4,1)=(CELL) MkIntegerTerm((Int)pointer);
|
||||
|
||||
return (c_db_preds_conn_continue());
|
||||
}
|
||||
|
||||
/* db_preds_conn : Connection(+) * Pred_name(-) * Pred_arity*/
|
||||
static Int
|
||||
c_db_preds_conn_continue (void){
|
||||
Term module = Deref(ARG2);
|
||||
Term name = Deref(ARG3);
|
||||
Term arity = Deref(ARG4);
|
||||
|
||||
void *pointer;
|
||||
pointer = (void *) IntegerOfTerm(EXTRA_CBACK_ARG(4,1));
|
||||
|
||||
if (pointer != NULL)
|
||||
{
|
||||
EXTRA_CBACK_ARG(4,1)=(CELL) MkIntegerTerm((Int)myddas_util_get_pred_next(pointer));
|
||||
|
||||
if (!Yap_unify(module, MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_module(pointer))))){
|
||||
return FALSE;
|
||||
}
|
||||
if (!Yap_unify(name,MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_name(pointer))))){
|
||||
return FALSE;
|
||||
}
|
||||
if (!Yap_unify(arity, MkIntegerTerm((Int)myddas_util_get_pred_arity(pointer)))){
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
cut_fail();
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
static Int
|
||||
c_db_check(void){
|
||||
check_int();
|
||||
return TRUE;
|
||||
}
|
||||
#endif /*DEBUG*/
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
|
||||
static Int
|
||||
c_db_stats_walltime(void){
|
||||
Term arg_time = Deref(ARG1);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (IsVarTerm(arg_time)){
|
||||
#endif
|
||||
Yap_unify(arg_time,MkIntegerTerm((Int)myddas_stats_walltime()));
|
||||
return TRUE;
|
||||
#ifdef DEBUG
|
||||
}
|
||||
else{
|
||||
printf ("ERROR: c_db_stats_walltime got a variable\n");
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_stats_translate(void){
|
||||
Term arg_start = Deref(ARG1);
|
||||
Term arg_end = Deref(ARG2);
|
||||
|
||||
MYDDAS_STATS_TIME start;
|
||||
MYDDAS_STATS_TIME end;
|
||||
|
||||
MYDDAS_STATS_TIME total_time,diff;
|
||||
|
||||
#ifdef DEBUG
|
||||
//Both args must be instanciated
|
||||
if (IsNonVarTerm(arg_start) && IsNonVarTerm(arg_end)){
|
||||
#endif
|
||||
start = (MYDDAS_STATS_TIME) IntegerOfTerm(arg_start);
|
||||
end = (MYDDAS_STATS_TIME) IntegerOfTerm(arg_end);
|
||||
|
||||
MYDDAS_STATS_GET_TRANSLATE(total_time);
|
||||
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(diff,time_copy);
|
||||
myddas_stats_subtract_time(diff,end,start);
|
||||
|
||||
diff = myddas_stats_time_copy_to_final(diff);
|
||||
myddas_stats_add_time(total_time,diff,total_time);
|
||||
MyddasULInt count;
|
||||
MYDDAS_STATS_GET_TRANSLATE_COUNT(count);
|
||||
MYDDAS_STATS_SET_TRANSLATE_COUNT(++count);
|
||||
|
||||
MYDDAS_FREE(diff,struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(start, struct myddas_stats_time_struct);
|
||||
MYDDAS_FREE(end, struct myddas_stats_time_struct);
|
||||
|
||||
return TRUE;
|
||||
#ifdef DEBUG
|
||||
}
|
||||
else{
|
||||
printf ("ERROR: c_db_stats_translate got a variable\n");
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static Int
|
||||
c_db_stats_time(void){
|
||||
Term arg_reference = Deref(ARG1);
|
||||
Term arg_time = Deref(ARG2);
|
||||
|
||||
Term final_term;
|
||||
|
||||
MYDDAS_STATS_STRUCT struc = (MYDDAS_STATS_STRUCT)IntegerOfTerm(arg_reference);
|
||||
Functor functor_count = Yap_MkFunctor(Yap_LookupAtom("count"),1);
|
||||
Term count_number[1];
|
||||
Functor unit;
|
||||
Term number[1];
|
||||
|
||||
switch(struc->type){
|
||||
|
||||
case integer:
|
||||
{
|
||||
Functor functor = Yap_MkFunctor(Yap_LookupAtom("myddas_integer"),2);
|
||||
Term integer_number[1];
|
||||
MyddasULInt integer;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("number"),1);
|
||||
integer = struc->u.integer.integer;
|
||||
number[0] = MkIntegerTerm(integer);
|
||||
integer_number[0] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
count_number[0] = MkIntegerTerm(struc->count);
|
||||
integer_number[1] = Yap_MkApplTerm(functor_count,1,count_number);
|
||||
final_term = Yap_MkApplTerm(functor,2,integer_number);
|
||||
break;
|
||||
}
|
||||
|
||||
case time_str:
|
||||
{
|
||||
MYDDAS_STATS_TIME time = struc->u.time_str.time_str;
|
||||
|
||||
Functor functor = Yap_MkFunctor(Yap_LookupAtom("myddas_time"),6);
|
||||
Term time_numbers[6];
|
||||
MyddasUInt time_number;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("hours"),1);
|
||||
time_number = MYDDAS_STATS_TIME_HOURS(time);
|
||||
number[0] = MkIntegerTerm(time_number);
|
||||
time_numbers[0] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("minutes"),1);
|
||||
time_number = MYDDAS_STATS_TIME_MINUTES(time);
|
||||
number[0] = MkIntegerTerm(time_number);
|
||||
time_numbers[1] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("seconds"),1);
|
||||
time_number = MYDDAS_STATS_TIME_SECONDS(time);
|
||||
number[0] = MkIntegerTerm(time_number);
|
||||
time_numbers[2] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("miliseconds"),1);
|
||||
time_number = MYDDAS_STATS_TIME_MILISECONDS(time);
|
||||
number[0] = MkIntegerTerm(time_number);
|
||||
time_numbers[3] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
unit = Yap_MkFunctor(Yap_LookupAtom("microseconds"),1);
|
||||
time_number = MYDDAS_STATS_TIME_MICROSECONDS(time);
|
||||
number[0] = MkIntegerTerm(time_number);
|
||||
time_numbers[4] = Yap_MkApplTerm(unit,1,number);;
|
||||
|
||||
count_number[0] = MkIntegerTerm(struc->count);
|
||||
time_numbers[5] = Yap_MkApplTerm(functor_count,1,count_number);
|
||||
final_term = Yap_MkApplTerm(functor,6,time_numbers);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
#ifdef DEBUG
|
||||
printf ("ERROR: c_db_stats_time unknow option\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!Yap_unify(arg_time,final_term )){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//Returns the stats of this module in a list
|
||||
static Int
|
||||
c_db_stats(void) {
|
||||
Term arg_conn = Deref(ARG1);
|
||||
Term arg_list = Deref(ARG2);
|
||||
|
||||
MyddasPointer *conn = (MyddasPointer *) (IntegerOfTerm(arg_conn));
|
||||
|
||||
// TODO
|
||||
if (get_myddas_top() == 0 ){ /* We want all the statistics */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MYDDAS_STATS_STRUCT str;
|
||||
MYDDAS_UTIL_CONNECTION
|
||||
node = myddas_util_search_connection(conn);
|
||||
Term head, list;
|
||||
list = arg_list;
|
||||
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_TIME time = NULL;
|
||||
#endif
|
||||
//[Index 1] -> Total Number of Rows by connection
|
||||
//Total number of Rows returned by the server
|
||||
//WARNING: only works with store_result
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
str = myddas_stats_get_stat(node->stats,5);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MyddasUInt number = 0;
|
||||
|
||||
MYDDAS_STATS_CON_GET_TOTAL_ROWS(node,number);
|
||||
printf ("Total Number of Rows returned from the Server\n");
|
||||
printf ("%lu\n\n",(unsigned long)number);
|
||||
#endif
|
||||
|
||||
//[Index 2] -> Total of Time Spent by the DB Server
|
||||
// processing all the SQL Querys
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,1);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER(node,time);
|
||||
printf ("Reference to time Spent by the Server, on all the SQL Querys\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
//[Index 3] -> Total of Time Spent by the DB Server
|
||||
// processing a the last SQL Query
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,2);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_DBSERVER(node,time);
|
||||
printf ("Reference to time Spent by the Server, on the last SQL Query\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
//[Index 4] -> Total of Time Spent by the DB Server
|
||||
// transfering all the results of the SQL Querys
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,3);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING(node,time);
|
||||
printf ("Refence to time Spent by the Server, transfering all the results SQL Query\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
//[Index 5] -> Total of Time Spent by the DB Server
|
||||
// transfering the result of the last SQL Query
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,4);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING(node,time);
|
||||
printf ("Reference to time Spent by the Server, transfering the result of the last SQL Query\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
//[Index 6] -> Total of Time Spent by the
|
||||
// db_row_function
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,1);
|
||||
|
||||
Yap_unify(head, MkIntegerTerm((MyddasInt)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_GET_DB_ROW_FUNCTION(time);
|
||||
printf ("Reference to time Spent by the db_row_function\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
//[Index 7] -> Total of Bytes Transfered by the
|
||||
// DB Server on all SQL Querys
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,6);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasPointer)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER(node,number);
|
||||
printf ("Bytes Transfered by the DB Server from all querys\n");
|
||||
printf ("%llu\n\n",(MyddasULInt)number);
|
||||
#endif
|
||||
|
||||
//[Index 8] -> Total of Bytes Transfered by the
|
||||
// DB Server on the last SQL Query
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,7);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasPointer)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_LAST_BYTES_TRANSFERING_FROM_DBSERVER(node,number);
|
||||
printf ("Bytes Transfered by the DB Server on the last query\n");
|
||||
printf ("%llu\n\n",(MyddasULInt)number);
|
||||
#endif
|
||||
//[Index 9] -> Number of querys made to the DBserver
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(node->stats,8);
|
||||
Yap_unify(head, MkIntegerTerm((MyddasPointer)str));
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE(node,number);
|
||||
printf ("Number of Querys made to the server\n");
|
||||
printf ("%llu\n\n",(MyddasULInt)number);
|
||||
#endif
|
||||
|
||||
//[Index 10] -> Total of Time Spent by the
|
||||
// translate predicate
|
||||
head = HeadOfTerm(list);
|
||||
list = TailOfTerm(list);
|
||||
|
||||
str = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,2);
|
||||
Yap_unify(head, MkIntegerTerm((Int)str));
|
||||
|
||||
#ifdef DEBUG
|
||||
MYDDAS_STATS_GET_TRANSLATE(time);
|
||||
printf ("Reference to time Spent by the translate predicate\n");
|
||||
MYDDAS_STATS_PRINT_TIME_STRUCT(time);
|
||||
printf ("\n\n");
|
||||
#endif
|
||||
|
||||
/* Memory management */
|
||||
#ifdef DEBUG
|
||||
MyddasULInt nr;
|
||||
MYDDAS_MEMORY_MALLOC_NR(nr);
|
||||
printf ("Number of times malloc was called in MYDDAS: %lu \n",nr);
|
||||
MYDDAS_MEMORY_FREE_NR(nr);
|
||||
printf ("Number of times free was called in MYDDAS : %lu \n",nr);
|
||||
|
||||
MYDDAS_MEMORY_MALLOC_SIZE(nr);
|
||||
printf ("Total memory allocated in MYDDAS: %lu \n",nr);
|
||||
MYDDAS_MEMORY_FREE_SIZE(nr);
|
||||
printf ("Total memory freed in MYDDAS : %lu \n",nr);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* MYDDAS_STATS */
|
||||
|
||||
|
||||
/* Function to delete all the temporary tables */
|
||||
/* from the mysql server */
|
||||
void Yap_MYDDAS_delete_all_myddas_structs(void)
|
||||
{
|
||||
|
||||
/* NAO ESQUECER DE FAZER ISTO TB PARA O DB_CLOSE*/
|
||||
MYDDAS_GLOBAL global =
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER;
|
||||
|
||||
/* In case that the MYDDAS module isn't loaded */
|
||||
if (global == NULL)
|
||||
return;
|
||||
|
||||
MYDDAS_UTIL_CONNECTION connections =
|
||||
global->myddas_top_connections;
|
||||
|
||||
/* Delete all connections */
|
||||
for(;connections!=NULL;connections=connections->next)
|
||||
myddas_util_delete_connection(connections->connection);
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
myddas_stats_delete_stats_list(global->myddas_statistics->stats);
|
||||
MYDDAS_FREE(global->myddas_statistics,struct myddas_global_stats);
|
||||
#endif
|
||||
|
||||
MYDDAS_FREE(global,struct myddas_global);
|
||||
|
||||
#ifdef DEBUG
|
||||
MyddasULInt nr;
|
||||
MYDDAS_MEMORY_MALLOC_NR(nr);
|
||||
printf ("Number of times malloc was called in MYDDAS: %lu \n",nr);
|
||||
MYDDAS_MEMORY_FREE_NR(nr);
|
||||
printf ("Number of times free was called in MYDDAS : %lu \n",nr);
|
||||
|
||||
MYDDAS_MEMORY_MALLOC_SIZE(nr);
|
||||
printf ("Total memory allocated in MYDDAS: %lu \n",nr);
|
||||
MYDDAS_MEMORY_FREE_SIZE(nr);
|
||||
printf ("Total memory freed in MYDDAS : %lu \n",nr);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*CUT_C && (MYDDAS_MYSQL || MYDDAS_ODBC)*/
|
||||
@@ -1,356 +0,0 @@
|
||||
#include "myddas_structs.h"
|
||||
#include "myddas_statistics.h"
|
||||
#include "Yap.h"
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#if defined MYDDAS_STATS
|
||||
|
||||
|
||||
|
||||
/* Documentation: Time Units
|
||||
------------------------------------------------------------------------
|
||||
*****| Second(s) | MiliSeconds(ms) | MicroSeconds(us) | NanoSecond(ns) |
|
||||
-----|-----------|-----------------|------------------|----------------|
|
||||
s | 1 | 0.001 | 0.000001 | 1e-9 |
|
||||
ms | 1000 | 1 | 0.001 | 0.000001 |
|
||||
us | 10000000 | 1000 | 1 | 0.001 |
|
||||
ns |1000000000 | 1000000 | 1000 | 1 |
|
||||
------------------------------------------------------------------------
|
||||
|
||||
------
|
||||
|
||||
The struct timeval structure represents an elapsed time. It is
|
||||
declared in `sys/time.h' and has the following members:
|
||||
|
||||
long int tv_sec -> This represents the number of whole seconds of
|
||||
elapsed time.
|
||||
|
||||
long int tv_usec -> This is the rest of the elapsed time (a fraction
|
||||
of a second), represented as the number of microseconds. It is
|
||||
always less than one million.
|
||||
|
||||
|
||||
------
|
||||
|
||||
The struct timespec structure represents an elapsed time. It is
|
||||
declared in `time.h' and has the following members:
|
||||
|
||||
long int tv_sec -> This represents the number of whole seconds of
|
||||
elapsed time.
|
||||
|
||||
long int tv_nsec -> This is the rest of the elapsed time (a fraction
|
||||
of a second), represented as the number of nanoseconds. It is
|
||||
always less than one billion.
|
||||
|
||||
-----
|
||||
|
||||
The gettimeofday() function shall obtain the current time,
|
||||
expressed as seconds and microseconds since the Epoch, and store
|
||||
it in the timeval structure pointed to by tp. The resolution of
|
||||
the system clock is unspecified.
|
||||
|
||||
If tzp is not a null pointer, the behavior is unspecified.
|
||||
|
||||
*/
|
||||
|
||||
static void
|
||||
myddas_stats_time_subtract (unsigned long *, unsigned long *, MYDDAS_STATS_TIME, MYDDAS_STATS_TIME);
|
||||
static void
|
||||
myddas_stats_add_seconds_time(MYDDAS_STATS_TIME,unsigned long, unsigned long);
|
||||
static void
|
||||
myddas_stats_integrity_of_time(MYDDAS_STATS_TIME);
|
||||
|
||||
/* Be shore to delete MYDDAS_STATS_TIME structure */
|
||||
MYDDAS_STATS_TIME
|
||||
myddas_stats_walltime(void) {
|
||||
|
||||
MYDDAS_STATS_TIME myddas_time = NULL;
|
||||
MYDDAS_MALLOC(myddas_time,struct myddas_stats_time_struct);
|
||||
myddas_time->type = time_copy;
|
||||
|
||||
struct timeval *time = NULL;
|
||||
MYDDAS_MALLOC(time,struct timeval);
|
||||
|
||||
gettimeofday(time,NULL);
|
||||
|
||||
myddas_time->u.time_copy.tv_sec = time->tv_sec;
|
||||
myddas_time->u.time_copy.tv_usec = time->tv_usec;
|
||||
|
||||
MYDDAS_FREE(time,struct timeval);
|
||||
|
||||
return myddas_time;
|
||||
}
|
||||
|
||||
void
|
||||
myddas_stats_add_time(MYDDAS_STATS_TIME sum, MYDDAS_STATS_TIME time1,MYDDAS_STATS_TIME time2){
|
||||
|
||||
if (sum->type == time_final){
|
||||
sum->u.time_final.microseconds =
|
||||
time1->u.time_final.microseconds +
|
||||
time2->u.time_final.microseconds;
|
||||
sum->u.time_final.miliseconds =
|
||||
time1->u.time_final.miliseconds +
|
||||
time2->u.time_final.miliseconds;
|
||||
sum->u.time_final.seconds =
|
||||
time1->u.time_final.seconds +
|
||||
time2->u.time_final.seconds;
|
||||
sum->u.time_final.minutes =
|
||||
time1->u.time_final.minutes +
|
||||
time2->u.time_final.minutes;
|
||||
sum->u.time_final.hours =
|
||||
time1->u.time_final.hours +
|
||||
time2->u.time_final.hours;
|
||||
} else {
|
||||
sum->u.time_copy.tv_sec =
|
||||
time1->u.time_copy.tv_sec +
|
||||
time2->u.time_copy.tv_sec;
|
||||
sum->u.time_copy.tv_usec =
|
||||
time1->u.time_copy.tv_usec +
|
||||
time2->u.time_copy.tv_usec;
|
||||
}
|
||||
|
||||
myddas_stats_integrity_of_time(sum);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
myddas_stats_subtract_time(MYDDAS_STATS_TIME result, MYDDAS_STATS_TIME t1,MYDDAS_STATS_TIME t2){
|
||||
|
||||
if (result->type == time_copy){
|
||||
|
||||
unsigned long sec;
|
||||
unsigned long usec;
|
||||
myddas_stats_time_subtract(&sec,&usec,t1,t2);
|
||||
|
||||
result->u.time_copy.tv_sec = sec;
|
||||
result->u.time_copy.tv_usec = usec;
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
myddas_stats_move_time(MYDDAS_STATS_TIME from,
|
||||
MYDDAS_STATS_TIME to)
|
||||
{
|
||||
if (from->type == time_copy)
|
||||
{
|
||||
to->type = time_copy;
|
||||
to->u.time_copy.tv_sec = from->u.time_copy.tv_sec;
|
||||
to->u.time_copy.tv_usec = from->u.time_copy.tv_usec;
|
||||
}
|
||||
else if (from->type == time_final)
|
||||
{
|
||||
to->u.time_final.hours = from->u.time_final.hours;
|
||||
to->u.time_final.minutes = from->u.time_final.minutes;
|
||||
to->u.time_final.seconds = from->u.time_final.seconds;
|
||||
to->u.time_final.miliseconds = from->u.time_final.miliseconds;
|
||||
to->u.time_final.microseconds = from->u.time_final.microseconds;
|
||||
}
|
||||
MYDDAS_FREE(from,struct myddas_stats_time_struct);
|
||||
}
|
||||
|
||||
MYDDAS_STATS_TIME
|
||||
myddas_stats_time_copy_to_final(MYDDAS_STATS_TIME t_copy){
|
||||
|
||||
MYDDAS_STATS_TIME t_final;
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(t_final,time_final);
|
||||
|
||||
myddas_stats_add_seconds_time(t_final,
|
||||
t_copy->u.time_copy.tv_sec,
|
||||
t_copy->u.time_copy.tv_usec);
|
||||
|
||||
MYDDAS_FREE(t_copy,struct myddas_stats_time_struct);
|
||||
return t_final;
|
||||
}
|
||||
|
||||
static void
|
||||
myddas_stats_add_seconds_time(MYDDAS_STATS_TIME myddas_time,
|
||||
unsigned long sec,
|
||||
unsigned long usec){
|
||||
|
||||
short hours = sec / 3600;
|
||||
sec %= 3600;
|
||||
short minutes = sec / 60;
|
||||
sec %= 60;
|
||||
short milisec = usec / 1000;
|
||||
usec %= 1000;
|
||||
|
||||
myddas_time->u.time_final.microseconds += usec ;
|
||||
myddas_time->u.time_final.miliseconds += milisec;
|
||||
myddas_time->u.time_final.seconds += sec ;
|
||||
myddas_time->u.time_final.minutes += minutes ;
|
||||
myddas_time->u.time_final.hours += hours;
|
||||
|
||||
myddas_stats_integrity_of_time(myddas_time);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
myddas_stats_time_subtract(unsigned long *sec,unsigned long *usec,
|
||||
MYDDAS_STATS_TIME start, MYDDAS_STATS_TIME end){
|
||||
|
||||
/* Perform the carry for the later subtraction by updating y. */
|
||||
if (start->u.time_copy.tv_usec < end->u.time_copy.tv_usec) {
|
||||
int nsec = (end->u.time_copy.tv_usec - start->u.time_copy.tv_usec) / 1000000 + 1;
|
||||
end->u.time_copy.tv_usec -= 1000000 * nsec;
|
||||
end->u.time_copy.tv_sec += nsec;
|
||||
}
|
||||
if (start->u.time_copy.tv_usec - end->u.time_copy.tv_usec > 1000000) {
|
||||
int nsec = (start->u.time_copy.tv_usec - end->u.time_copy.tv_usec) / 1000000;
|
||||
end->u.time_copy.tv_usec += 1000000 * nsec;
|
||||
end->u.time_copy.tv_sec -= nsec;
|
||||
}
|
||||
|
||||
/* Compute the time remaining to wait.
|
||||
tv_usec is certainly positive. */
|
||||
*sec = start->u.time_copy.tv_sec - end->u.time_copy.tv_sec;
|
||||
*usec = start->u.time_copy.tv_usec - end->u.time_copy.tv_usec;
|
||||
}
|
||||
|
||||
static void
|
||||
myddas_stats_integrity_of_time(MYDDAS_STATS_TIME myddas_time){
|
||||
|
||||
if (myddas_time->u.time_final.microseconds > 999)
|
||||
{
|
||||
myddas_time->u.time_final.microseconds -= 1000;
|
||||
myddas_time->u.time_final.miliseconds++;
|
||||
}
|
||||
if (myddas_time->u.time_final.miliseconds > 999)
|
||||
{
|
||||
myddas_time->u.time_final.miliseconds -= 1000;
|
||||
myddas_time->u.time_final.seconds++;
|
||||
}
|
||||
|
||||
if (myddas_time->u.time_final.seconds > 59)
|
||||
{
|
||||
myddas_time->u.time_final.seconds -= 60;
|
||||
myddas_time->u.time_final.minutes++;
|
||||
}
|
||||
|
||||
if (myddas_time->u.time_final.minutes > 59)
|
||||
{
|
||||
myddas_time->u.time_final.minutes -= 60;
|
||||
myddas_time->u.time_final.hours++;
|
||||
}
|
||||
}
|
||||
|
||||
MYDDAS_GLOBAL
|
||||
myddas_stats_initialize_global_stats(MYDDAS_GLOBAL global){
|
||||
|
||||
MYDDAS_STATS_STRUCT stats = NULL;
|
||||
|
||||
short i;
|
||||
|
||||
/* For the time statistics */
|
||||
/*
|
||||
Stats [1] - Total Time spent on the db_row function
|
||||
Stats [2] - Total Time spent on the translate/3 predicate
|
||||
*/
|
||||
|
||||
/* First */
|
||||
stats = myddas_stats_initialize_stat(stats,time_str);
|
||||
(global->myddas_statistics)->stats = stats;
|
||||
for(i=0;i<1;i++){
|
||||
myddas_stats_initialize_stat(stats,time_str);
|
||||
}
|
||||
|
||||
return global;
|
||||
}
|
||||
|
||||
MYDDAS_STATS_STRUCT
|
||||
myddas_stats_initialize_connection_stats(){
|
||||
/*
|
||||
Stats [1] - Total of Time Spent by the DB Server processing all the SQL Querys
|
||||
Stats [2] - Total of Time Spent by the DB Server processing the last SQL Query
|
||||
Stats [3] - Total of Time Spent by the DB Server transfering all the results of the SQL Querys
|
||||
Stats [4] - Total of Time Spent by the DB Server transfering the result of the last SQL Query
|
||||
|
||||
Stats [5] - Total number of Rows returned by the server
|
||||
Stats [6] - Total of Bytes Transfered by the DB Server on all SQL Querys
|
||||
Stats [7] - Total of Bytes Transfered by the DB Server on the last SQL Query
|
||||
Stats [8] - Number of querys made to the DBserver
|
||||
*/
|
||||
|
||||
short i;
|
||||
MYDDAS_STATS_STRUCT new = NULL ;
|
||||
MYDDAS_STATS_STRUCT first;
|
||||
/* For the time statistics */
|
||||
|
||||
/* First */
|
||||
new = myddas_stats_initialize_stat(new,time_str);
|
||||
first = new;
|
||||
for(i=0;i<3;i++){
|
||||
new = myddas_stats_initialize_stat(new,time_str);
|
||||
}
|
||||
|
||||
/* For number statistics*/
|
||||
for (i=0;i<4;i++){
|
||||
new = myddas_stats_initialize_stat(new,integer);
|
||||
}
|
||||
|
||||
return first;
|
||||
}
|
||||
|
||||
MYDDAS_STATS_STRUCT
|
||||
myddas_stats_initialize_stat(MYDDAS_STATS_STRUCT stat,int type){
|
||||
|
||||
MYDDAS_STATS_STRUCT temp_str = stat;
|
||||
|
||||
if (stat == NULL){
|
||||
MYDDAS_MALLOC(stat,struct myddas_stats_struct);
|
||||
temp_str = stat;
|
||||
} else {
|
||||
for (;temp_str->nxt != NULL;temp_str = temp_str->nxt);
|
||||
MYDDAS_MALLOC(temp_str->nxt,struct myddas_stats_struct);
|
||||
temp_str = temp_str->nxt;
|
||||
}
|
||||
|
||||
if (type == time_str){
|
||||
MYDDAS_STATS_INITIALIZE_TIME_STRUCT(temp_str->u.time_str.time_str,time_final);
|
||||
} else {
|
||||
temp_str->u.integer.integer = 0;
|
||||
}
|
||||
temp_str->type = type;
|
||||
temp_str->count = 0;
|
||||
temp_str->nxt = NULL;
|
||||
return temp_str;
|
||||
}
|
||||
|
||||
MYDDAS_STATS_STRUCT
|
||||
myddas_stats_get_stat(MYDDAS_STATS_STRUCT stat,int index){
|
||||
|
||||
MYDDAS_STATS_STRUCT temp = stat;
|
||||
|
||||
for (;index>1;index--){
|
||||
temp = temp->nxt;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
void
|
||||
myddas_stats_delete_stats_list(MYDDAS_STATS_STRUCT list){
|
||||
|
||||
MYDDAS_STATS_STRUCT to_delete = list;
|
||||
|
||||
for (;to_delete!=NULL;){
|
||||
list = list->nxt;
|
||||
|
||||
|
||||
if (to_delete->type == time_str){
|
||||
MYDDAS_FREE(to_delete->u.time_str.time_str,struct myddas_stats_time_struct);
|
||||
}
|
||||
|
||||
MYDDAS_FREE(to_delete,struct myddas_stats_struct);
|
||||
|
||||
to_delete = list;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* MYDDAS_STATS || MYDDAS_TOP_LEVEL */
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
#ifndef __MYDDAS_STATISTICS_H__
|
||||
#define __MYDDAS_STATISTICS_H__
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
|
||||
#define MYDDAS_STATS_TIME_HOURS(TIME) TIME->u.time_final.hours;
|
||||
#define MYDDAS_STATS_TIME_MINUTES(TIME) TIME->u.time_final.minutes;
|
||||
#define MYDDAS_STATS_TIME_SECONDS(TIME) TIME->u.time_final.seconds;
|
||||
#define MYDDAS_STATS_TIME_MILISECONDS(TIME) TIME->u.time_final.miliseconds;
|
||||
#define MYDDAS_STATS_TIME_MICROSECONDS(TIME) TIME->u.time_final.microseconds;
|
||||
|
||||
#ifdef DEBUG
|
||||
#define MYDDAS_STATS_PRINT_TIME_STRUCT(TIME) \
|
||||
if (TIME->type == time_final) { \
|
||||
printf ("%d Hours, %d Minutes, %d Seconds, %d Miliseconds, %d Microseconds", \
|
||||
TIME->u.time_final.hours, \
|
||||
TIME->u.time_final.minutes, \
|
||||
TIME->u.time_final.seconds, \
|
||||
TIME->u.time_final.miliseconds, \
|
||||
TIME->u.time_final.microseconds); \
|
||||
} else { \
|
||||
printf ("%lu Seconds, %lu Microseconds", \
|
||||
TIME->u.time_copy.tv_sec, \
|
||||
TIME->u.time_copy.tv_usec); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYDDAS_STATS_INITIALIZE_TIME_STRUCT(TIME,TYPE) \
|
||||
MYDDAS_MALLOC(TIME,struct myddas_stats_time_struct); \
|
||||
\
|
||||
if (TYPE == time_copy){ \
|
||||
TIME->type = TYPE; \
|
||||
TIME->u.time_copy.tv_sec = 0; \
|
||||
TIME->u.time_copy.tv_usec = 0; \
|
||||
} else { \
|
||||
TIME->type = TYPE; \
|
||||
TIME->u.time_final.hours = 0; \
|
||||
TIME->u.time_final.minutes = 0; \
|
||||
TIME->u.time_final.seconds = 0; \
|
||||
TIME->u.time_final.miliseconds = 0; \
|
||||
TIME->u.time_final.microseconds = 0; \
|
||||
}
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER(NODE,TIME) \
|
||||
TIME = myddas_stats_get_stat(NODE->stats,1)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,1)->count;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_TIME_DBSERVER_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,1)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_LAST_TIME_DBSERVER(NODE,TIME) \
|
||||
TIME = myddas_stats_get_stat(NODE->stats,2)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_CON_GET_LAST_TIME_DBSERVER_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,2)->count;
|
||||
#define MYDDAS_STATS_CON_SET_LAST_TIME_DBSERVER_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,2)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING(NODE,TIME) \
|
||||
TIME = myddas_stats_get_stat(NODE->stats,3)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,3)->count;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_TIME_TRANSFERING_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,3)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING(NODE,TIME) \
|
||||
TIME = myddas_stats_get_stat(NODE->stats,4)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,4)->count;
|
||||
#define MYDDAS_STATS_CON_SET_LAST_TIME_TRANSFERING_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,4)->count = COUNT;
|
||||
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_ROWS(NODE,NUMBER) \
|
||||
NUMBER = myddas_stats_get_stat(NODE->stats,5)->u.integer.integer;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_ROWS(NODE,NUMBER) \
|
||||
myddas_stats_get_stat(NODE->stats,5)->u.integer.integer = NUMBER;
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_ROWS_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,5)->count;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_ROWS_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,5)->count = COUNT;
|
||||
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER(NODE,NUMBER) \
|
||||
NUMBER = myddas_stats_get_stat(NODE->stats,6)->u.integer.integer;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER(NODE,NUMBER) \
|
||||
myddas_stats_get_stat(NODE->stats,6)->u.integer.integer = NUMBER;
|
||||
#define MYDDAS_STATS_CON_GET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,6)->count;
|
||||
#define MYDDAS_STATS_CON_SET_TOTAL_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,6)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_LAST_BYTES_TRANSFERING_FROM_DBSERVER(NODE,NUMBER) \
|
||||
NUMBER = myddas_stats_get_stat(NODE->stats,7)->u.integer.integer;
|
||||
#define MYDDAS_STATS_CON_SET_LAST_BYTES_TRANSFERING_FROM_DBSERVER(NODE,NUMBER) \
|
||||
myddas_stats_get_stat(NODE->stats,7)->u.integer.integer = NUMBER;
|
||||
#define MYDDAS_STATS_CON_GET_LAST_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,7)->count;
|
||||
#define MYDDAS_STATS_CON_SET_LAST_BYTES_TRANSFERING_FROM_DBSERVER_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,7)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE(NODE,NUMBER) \
|
||||
NUMBER = myddas_stats_get_stat(NODE->stats,8)->u.integer.integer;
|
||||
#define MYDDAS_STATS_CON_SET_NUMBER_QUERIES_MADE(NODE,NUMBER) \
|
||||
myddas_stats_get_stat(NODE->stats,8)->u.integer.integer = NUMBER;
|
||||
#define MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE_COUNT(NODE,COUNT) \
|
||||
COUNT = myddas_stats_get_stat(NODE->stats,8)->count;
|
||||
#define MYDDAS_STATS_CON_SET_NUMBER_QUERIES_MADE_COUNT(NODE,COUNT) \
|
||||
myddas_stats_get_stat(NODE->stats,8)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_GET_DB_ROW_FUNCTION(TIME) \
|
||||
TIME = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,1)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_GET_DB_ROW_FUNCTION_COUNT(COUNT) \
|
||||
COUNT = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,1)->count;
|
||||
#define MYDDAS_STATS_SET_DB_ROW_FUNCTION_COUNT(COUNT) \
|
||||
myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,1)->count = COUNT;
|
||||
|
||||
#define MYDDAS_STATS_GET_TRANSLATE(TIME) \
|
||||
TIME = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,2)->u.time_str.time_str;
|
||||
#define MYDDAS_STATS_GET_TRANSLATE_COUNT(COUNT) \
|
||||
COUNT = myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,2)->count;
|
||||
#define MYDDAS_STATS_SET_TRANSLATE_COUNT(COUNT) \
|
||||
myddas_stats_get_stat(Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_statistics->stats,2)->count = COUNT;
|
||||
|
||||
MYDDAS_STATS_TIME myddas_stats_walltime(void);
|
||||
void myddas_stats_add_time(MYDDAS_STATS_TIME, MYDDAS_STATS_TIME,MYDDAS_STATS_TIME);
|
||||
void myddas_stats_subtract_time(MYDDAS_STATS_TIME, MYDDAS_STATS_TIME,MYDDAS_STATS_TIME);
|
||||
void myddas_stats_move_time(MYDDAS_STATS_TIME,MYDDAS_STATS_TIME);
|
||||
MYDDAS_STATS_TIME myddas_stats_time_copy_to_final(MYDDAS_STATS_TIME);
|
||||
|
||||
/* Related to the statistics linked list */
|
||||
MYDDAS_STATS_STRUCT myddas_stats_initialize_stat(MYDDAS_STATS_STRUCT,int);
|
||||
MYDDAS_STATS_STRUCT myddas_stats_get_stat(MYDDAS_STATS_STRUCT,int);
|
||||
#endif /* MYDDAS_STATS */
|
||||
|
||||
#endif
|
||||
@@ -1,50 +0,0 @@
|
||||
#ifndef __MYDDAS_STATISTICS_STRUCTS_H__
|
||||
#define __MYDDAS_STATISTICS_STRUCTS_H__
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
|
||||
/* This strucuture holds some global statistics*/
|
||||
struct myddas_global_stats {
|
||||
MYDDAS_STATS_STRUCT stats;
|
||||
};
|
||||
|
||||
/* Structure to hold any kind of statistics */
|
||||
struct myddas_stats_struct{
|
||||
enum {time_str,
|
||||
integer} type;
|
||||
union {
|
||||
struct {
|
||||
MYDDAS_STATS_TIME time_str;
|
||||
} time_str;
|
||||
struct {
|
||||
MyddasULInt integer;
|
||||
} integer;
|
||||
} u;
|
||||
MyddasULInt count;
|
||||
MYDDAS_STATS_STRUCT nxt;
|
||||
};
|
||||
|
||||
/* Time structure for the MYDDAS Interface */
|
||||
struct myddas_stats_time_struct{
|
||||
enum {time_copy,
|
||||
time_final} type;
|
||||
|
||||
union {
|
||||
struct {
|
||||
unsigned long tv_sec;
|
||||
unsigned long tv_usec;
|
||||
} time_copy;
|
||||
struct {
|
||||
MyddasUSInt hours;
|
||||
MyddasUSInt minutes; //Max 59
|
||||
MyddasUSInt seconds; //Max 59
|
||||
MyddasUSInt miliseconds; //Max 999
|
||||
MyddasUSInt microseconds; //Max 999
|
||||
} time_final;
|
||||
} u;
|
||||
};
|
||||
|
||||
|
||||
#endif /* MYDDAS_STATS */
|
||||
|
||||
#endif
|
||||
@@ -1,67 +0,0 @@
|
||||
#ifndef __MYDDAS_STRUCTS_H__
|
||||
#define __MYDDAS_STRUCTS_H__
|
||||
|
||||
#include "myddas.h"
|
||||
#ifdef MYDDAS_STATS
|
||||
#include "myddas_statistics_structs.h"
|
||||
#endif
|
||||
|
||||
struct myddas_global {
|
||||
MYDDAS_UTIL_CONNECTION myddas_top_connections;
|
||||
#ifdef MYDDAS_TOP_LEVEL
|
||||
MYDDAS_UTIL_CONNECTION myddas_top_level_connection;
|
||||
#endif
|
||||
#ifdef MYDDAS_STATS
|
||||
MYDDAS_GLOBAL_STATS myddas_statistics;
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
/* Number times malloc was called */
|
||||
MyddasULInt malloc_called;
|
||||
/* Memory allocated by MYDDAS */
|
||||
MyddasULInt memory_allocated;
|
||||
|
||||
/* Number times free was called */
|
||||
MyddasULInt free_called;
|
||||
/* Memory freed by MYDDAS */
|
||||
MyddasULInt memory_freed;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct myddas_list_preds {
|
||||
char *pred_module;
|
||||
char *pred_name;
|
||||
short pred_arity;
|
||||
//void *pe;
|
||||
MYDDAS_UTIL_PREDICATE next;
|
||||
MYDDAS_UTIL_PREDICATE previous;
|
||||
};
|
||||
|
||||
struct myddas_list_connection {
|
||||
void *connection;
|
||||
|
||||
/*If variable env is NULL, then it's a
|
||||
MySQL connection, if not then it as the pointer
|
||||
to the ODBC enviromment variable */
|
||||
void *odbc_enviromment;
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
MYDDAS_STATS_STRUCT stats;
|
||||
#endif
|
||||
MYDDAS_UTIL_PREDICATE predicates;
|
||||
|
||||
/* Multi Queries Section */
|
||||
unsigned long total_number_queries;
|
||||
unsigned long actual_number_queries;
|
||||
MYDDAS_UTIL_QUERY *queries;
|
||||
|
||||
/* List Integrety */
|
||||
MYDDAS_UTIL_CONNECTION next;
|
||||
MYDDAS_UTIL_CONNECTION previous;
|
||||
};
|
||||
|
||||
struct myddas_util_query{
|
||||
char *query;
|
||||
MYDDAS_UTIL_QUERY next;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,93 +0,0 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: myddas_top_level.c *
|
||||
* Last rev: 27/01/06 *
|
||||
* mods: *
|
||||
* comments: Top Level of the MYDDAS Interface *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#if defined MYDDAS_TOP_LEVEL && defined MYDDAS_MYSQL
|
||||
|
||||
#include "Yap.h"
|
||||
#include "Yatom.h"
|
||||
#include "myddas.h"
|
||||
#include "myddas_structs.h"
|
||||
#include "myddas_statistics.h"
|
||||
#include <mysql/mysql.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined HAVE_LIBREADLINE
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
#endif
|
||||
#include <sys/times.h>
|
||||
|
||||
|
||||
STATIC_PROTO(Int c_db_tl_readline,(void));
|
||||
|
||||
|
||||
void Yap_InitMYDDAS_TopLevelPreds(void)
|
||||
{
|
||||
/* c_db_readline: +Prompt x -Line */
|
||||
Yap_InitCPred("c_db_tl_readline", 2, c_db_tl_readline, SafePredFlag|SyncPredFlag|HiddenPredFlag);
|
||||
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* User printable name of the function. */
|
||||
char cmd_char; /* msql command character */
|
||||
Int (*func)(char *str,char *); /* Function to call to do the job. */
|
||||
//bool takes_params; /* Max parameters for command */
|
||||
const char *doc; /* Documentation for this function. */
|
||||
} COMMANDS;
|
||||
|
||||
|
||||
static Int
|
||||
c_db_tl_readline(void) {
|
||||
Term arg_prompt = Deref(ARG1);
|
||||
Term arg_line = Deref(ARG2);
|
||||
|
||||
char *prompt = AtomName(AtomOfTerm(arg_prompt));
|
||||
char *line;
|
||||
|
||||
while (strlen(line = readline(prompt)) == 0) {
|
||||
free(line);
|
||||
}
|
||||
add_history(line);
|
||||
|
||||
Term line_read = MkAtomTerm(Yap_LookupAtom(line));
|
||||
free(line);
|
||||
|
||||
if (!Yap_unify(arg_line,line_read))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
myddas_top_level_print_time(MYDDAS_STATS_TIME time){
|
||||
|
||||
//TODO test for big queries, and see the output of mysql
|
||||
printf("(");
|
||||
|
||||
printf("%d",time->u.time_final.seconds);
|
||||
//MiliSeconds 2 decimal points
|
||||
printf(".%d",time->u.time_final.miliseconds/10);
|
||||
printf (" sec)");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,399 +0,0 @@
|
||||
#if defined MYDDAS_ODBC || defined MYDDAS_MYSQL
|
||||
|
||||
#include "Yap.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "cut_c.h"
|
||||
#include "myddas.h"
|
||||
#include "myddas_structs.h"
|
||||
#ifdef MYDDAS_STATS
|
||||
#include "myddas_statistics.h"
|
||||
#endif
|
||||
#ifdef MYDDAS_ODBC
|
||||
#include <sql.h>
|
||||
#endif /*MYDDAS_ODBC*/
|
||||
#ifdef MYDDAS_MYSQL
|
||||
#include <mysql/mysql.h>
|
||||
#endif /*MYDDAS_MYSQL*/
|
||||
|
||||
|
||||
|
||||
/* Search for the predicate in the given predicate list*/
|
||||
static MYDDAS_UTIL_PREDICATE
|
||||
myddas_util_find_predicate(char *, Int , char *, MYDDAS_UTIL_PREDICATE);
|
||||
/* Deletes a predicate list */
|
||||
static void
|
||||
myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE);
|
||||
|
||||
/* Prints a error message */
|
||||
static void
|
||||
myddas_util_error_message(char *,Int,char *);
|
||||
|
||||
|
||||
#ifdef MYDDAS_MYSQL
|
||||
/* Auxilary function to table_write*/
|
||||
static void
|
||||
n_print(Int , char );
|
||||
#endif
|
||||
|
||||
/* Type: MYSQL->1 ODBC->2*/
|
||||
Short
|
||||
myddas_util_connection_type(void *con){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION con_node =
|
||||
myddas_util_search_connection(con);
|
||||
|
||||
if (con_node == NULL)
|
||||
return 0;
|
||||
|
||||
if (con_node->odbc_enviromment != NULL) /* ODBC */
|
||||
return 2;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
MYDDAS_UTIL_PREDICATE
|
||||
myddas_util_search_predicate(char *pred_name, Int pred_arity,
|
||||
char *pred_module){
|
||||
MYDDAS_UTIL_PREDICATE pred=NULL;
|
||||
MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
|
||||
for (;top!=NULL;top=top->next)
|
||||
{
|
||||
if ((pred=myddas_util_find_predicate(pred_name,pred_arity,pred_module,top->predicates)))
|
||||
return pred;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* When using this function, we must guarante that this predicate
|
||||
it's unique */
|
||||
MYDDAS_UTIL_CONNECTION
|
||||
myddas_util_add_predicate(char *pred_name, Int pred_arity,
|
||||
char *pred_module, void *con){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION node_con =
|
||||
myddas_util_search_connection(con);
|
||||
|
||||
MYDDAS_UTIL_PREDICATE new =
|
||||
myddas_init_initialize_predicate(pred_name,pred_arity,pred_module,node_con->predicates);
|
||||
|
||||
if (new == NULL)
|
||||
{
|
||||
myddas_util_error_message("Could not initialize predicate node",__LINE__,__FILE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
node_con->predicates=new;
|
||||
return node_con;
|
||||
}
|
||||
|
||||
void
|
||||
myddas_util_delete_predicate(MYDDAS_UTIL_PREDICATE to_delete){
|
||||
|
||||
if (to_delete->next != NULL)
|
||||
to_delete->next->previous = to_delete->previous;
|
||||
if (to_delete->previous != NULL)
|
||||
to_delete->previous->next = to_delete->next;
|
||||
else //First predicate of the predicate list
|
||||
{
|
||||
MYDDAS_UTIL_CONNECTION con_node = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
for(;con_node != NULL; con_node = con_node->next)
|
||||
if (con_node->predicates == to_delete)
|
||||
break;
|
||||
con_node->predicates = to_delete->next;
|
||||
}
|
||||
MYDDAS_FREE(to_delete,struct myddas_list_preds);
|
||||
}
|
||||
|
||||
void
|
||||
myddas_util_delete_connection(void *conn){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION to_delete = myddas_util_search_connection(conn);
|
||||
|
||||
if (to_delete == NULL)
|
||||
return;
|
||||
else
|
||||
{
|
||||
/* Removes the predicates list */
|
||||
myddas_util_delete_predicate_list(to_delete->predicates);
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
/* Removes the stats list */
|
||||
myddas_stats_delete_stats_list(to_delete->stats);
|
||||
#endif
|
||||
/* List Integrety */
|
||||
/* Is the last element of the list */
|
||||
if ((to_delete->next) != NULL)
|
||||
to_delete->next->previous = to_delete->previous;
|
||||
|
||||
/* Is the first element of the list */
|
||||
if (to_delete == (Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections))
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections = to_delete->next;
|
||||
else
|
||||
to_delete->previous->next=to_delete->next;
|
||||
|
||||
MYDDAS_FREE(to_delete,struct myddas_list_connection);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
MYDDAS_UTIL_CONNECTION
|
||||
myddas_util_search_connection(void *conn){
|
||||
MYDDAS_UTIL_CONNECTION list = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
|
||||
#ifdef MYDDAS_STATS
|
||||
if (conn == 0) { /* We want all the statistics */
|
||||
return list;
|
||||
}
|
||||
#endif
|
||||
|
||||
for (;list!=NULL;list=list->next)
|
||||
if (list->connection == conn)
|
||||
return list;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MYDDAS_UTIL_CONNECTION
|
||||
myddas_util_add_connection(void *conn, void *enviromment){
|
||||
|
||||
MYDDAS_UTIL_CONNECTION node=NULL;
|
||||
MYDDAS_UTIL_CONNECTION temp=NULL;
|
||||
|
||||
if ((node = myddas_util_search_connection(conn)) != NULL)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
//put the new connection node on the top of the list
|
||||
temp = myddas_init_initialize_connection(conn,enviromment,Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections);
|
||||
if (temp == NULL)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
myddas_util_error_message("Could not initialize connection node",__LINE__,__FILE__);
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections = temp;
|
||||
return Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
}
|
||||
|
||||
#ifdef MYDDAS_ODBC
|
||||
/* This function searches the MYDDAS list for odbc connections
|
||||
If there isn't any, it returns NULL. This is a nice way to know
|
||||
if there is any odbc connections left on the list*/
|
||||
SQLHENV
|
||||
myddas_util_get_odbc_enviromment(SQLHDBC connection){
|
||||
MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
|
||||
for (;top != NULL;top=top->next)
|
||||
if (top->connection == ((void *)connection))
|
||||
return top->odbc_enviromment;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
UInt
|
||||
myddas_util_get_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con){
|
||||
return con->total_number_queries;
|
||||
}
|
||||
|
||||
void
|
||||
myddas_util_set_total_multi_queries_number(MYDDAS_UTIL_CONNECTION con,
|
||||
UInt number){
|
||||
con->total_number_queries = number;
|
||||
}
|
||||
|
||||
#ifdef MYDDAS_MYSQL
|
||||
/* Auxilary function to table_write*/
|
||||
static void
|
||||
n_print(Int n, char c)
|
||||
{
|
||||
for(;n>0;n--) printf("%c",c);
|
||||
}
|
||||
#endif
|
||||
|
||||
static
|
||||
void myddas_util_error_message(char *message ,Int line,char *file){
|
||||
#ifdef DEBUG
|
||||
printf ("ERROR: %s at line %d in file %s\n",message,(int)line,file);
|
||||
#else
|
||||
printf ("ERROR: %s\n",message);
|
||||
#endif
|
||||
}
|
||||
|
||||
static MYDDAS_UTIL_PREDICATE
|
||||
myddas_util_find_predicate(char *pred_name, Int pred_arity,
|
||||
char *pred_module, MYDDAS_UTIL_PREDICATE list){
|
||||
|
||||
for(;list != NULL ; list = list->next)
|
||||
if (pred_arity == list->pred_arity &&
|
||||
!strcmp(pred_name,list->pred_name) &&
|
||||
!strcmp(pred_module,list->pred_module))
|
||||
return list;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE preds_list){
|
||||
MYDDAS_UTIL_PREDICATE to_delete = NULL;
|
||||
|
||||
for (;preds_list != NULL;)
|
||||
{
|
||||
to_delete = preds_list;
|
||||
preds_list = preds_list->next;
|
||||
|
||||
MYDDAS_FREE(to_delete,struct myddas_list_preds);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef MYDDAS_MYSQL
|
||||
void
|
||||
myddas_util_table_write(MYSQL_RES *res_set){
|
||||
|
||||
MYSQL_ROW row;
|
||||
MYSQL_FIELD *fields;
|
||||
Int i,f;
|
||||
|
||||
if (mysql_num_rows(res_set) == 0)
|
||||
{
|
||||
printf ("Empty Set\n");
|
||||
return;
|
||||
}
|
||||
|
||||
f = mysql_num_fields(res_set);
|
||||
|
||||
fields = mysql_fetch_field(res_set);
|
||||
for(i=0;i<f;i++)
|
||||
{
|
||||
printf("+");
|
||||
if (strlen(fields[i].name)>fields[i].max_length) fields[i].max_length=strlen(fields[i].name);
|
||||
n_print(fields[i].max_length+2,'-');
|
||||
}
|
||||
printf("+\n");
|
||||
|
||||
for(i=0;i<f;i++)
|
||||
{
|
||||
printf("|");
|
||||
printf(" %s ",fields[i].name);
|
||||
n_print(fields[i].max_length - strlen(fields[i].name),' ');
|
||||
}
|
||||
printf("|\n");
|
||||
|
||||
for(i=0;i<f;i++)
|
||||
{
|
||||
printf("+");
|
||||
n_print(fields[i].max_length+2,'-');
|
||||
}
|
||||
printf("+\n");
|
||||
|
||||
while ((row = mysql_fetch_row(res_set)) != NULL)
|
||||
{
|
||||
for(i=0;i<f;i++)
|
||||
{
|
||||
printf("|");
|
||||
if (row[i] != NULL)
|
||||
{
|
||||
printf(" %s ",row[i]);
|
||||
n_print(fields[i].max_length - strlen(row[i]),' ');
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" NULL ");
|
||||
n_print(fields[i].max_length - 4,' ');
|
||||
}
|
||||
}
|
||||
printf("|\n");
|
||||
}
|
||||
|
||||
for(i=0;i<f;i++)
|
||||
{
|
||||
printf("+");
|
||||
n_print(fields[i].max_length+2,'-');
|
||||
}
|
||||
printf("+\n");
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
//DELETE THIS WHEN DB_STATS IS COMPLETED
|
||||
MyddasInt
|
||||
get_myddas_top(){
|
||||
if (Yap_REGS.MYDDAS_GLOBAL_POINTER == NULL)
|
||||
return 0;
|
||||
return (Int)Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
}
|
||||
|
||||
void *
|
||||
myddas_util_get_pred_next(void *pointer){
|
||||
MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
|
||||
return (void *) (temp->next);
|
||||
}
|
||||
|
||||
MyddasInt
|
||||
myddas_util_get_pred_arity(void *pointer){
|
||||
MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
|
||||
return temp->pred_arity;
|
||||
}
|
||||
|
||||
char *
|
||||
myddas_util_get_pred_name(void *pointer){
|
||||
MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
|
||||
return temp->pred_name;
|
||||
}
|
||||
|
||||
char *
|
||||
myddas_util_get_pred_module(void *pointer){
|
||||
MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer;
|
||||
return temp->pred_module;
|
||||
}
|
||||
|
||||
void *
|
||||
myddas_util_get_list_pred(MYDDAS_UTIL_CONNECTION node){
|
||||
return (void *)(node->predicates);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
void check_int(){
|
||||
Int i;
|
||||
MYDDAS_UTIL_PREDICATE pred = NULL;
|
||||
MYDDAS_UTIL_CONNECTION top = Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections;
|
||||
for (i=1 ; top!=NULL ; top=top->next)
|
||||
{
|
||||
printf ("***************\n");
|
||||
printf ("===== top =====\n");
|
||||
printf ("======= %p =====\n",top);
|
||||
printf ("CONN: = %p =====\n",top->connection);
|
||||
printf ("ENV : = %p =====\n",top->odbc_enviromment);
|
||||
printf ("PRED: = %p =====\n",top->predicates);
|
||||
printf ("======= %p =====\n",top->previous);
|
||||
printf ("======= %p =====\n",top->next);
|
||||
if (top->predicates != NULL)
|
||||
{
|
||||
printf ("\t******\n");
|
||||
printf ("\t===== PREDICADOS =====\n");
|
||||
for (pred = top->predicates ; pred != NULL ; pred = pred->next)
|
||||
{
|
||||
printf ("\t--------------\n");
|
||||
printf ("\t===== %p =====\n",pred);
|
||||
printf ("\t===== %s =====\n",pred->pred_name);
|
||||
printf ("\t===== %d =====\n",pred->pred_arity);
|
||||
printf ("\t===== %s =====\n",pred->pred_module);
|
||||
printf ("\t===== %p =====\n",pred->previous);
|
||||
printf ("\t===== %p =====\n",pred->next);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*defined MYDDAS_ODBC || defined MYDDAS_MYSQL*/
|
||||
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#ifndef MYDDAS_WKB_H_
|
||||
#define MYDDAS_WKB_H_
|
||||
|
||||
typedef char byte;
|
||||
|
||||
typedef unsigned int uint32;
|
||||
|
||||
#define WKBXDR 0
|
||||
#define WKBNDR 1
|
||||
|
||||
#define WKBMINTYPE 1
|
||||
|
||||
#define WKBPOINT 1
|
||||
#define WKBLINESTRING 2
|
||||
#define WKBPOLYGON 3
|
||||
#define WKBMULTIPOINT 4
|
||||
#define WKBMULTILINESTRING 5
|
||||
#define WKBMULTIPOLYGON 6
|
||||
#define WKBGEOMETRYCOLLECTION 7
|
||||
|
||||
#define WKBMAXTYPE 7
|
||||
|
||||
#define WKBGEOMETRY 0
|
||||
|
||||
#endif /* MYDDAS_WKB_H_ */
|
||||
@@ -1,380 +0,0 @@
|
||||
#if defined MYDDAS_MYSQL
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "Yap.h"
|
||||
#include <netinet/in.h>
|
||||
#include "myddas_wkb.h"
|
||||
#include "myddas_wkb2prolog.h"
|
||||
|
||||
static void readswap4(uint32 *buf);
|
||||
static void readswap8(double *buf);
|
||||
|
||||
static byte get_hostbyteorder(void);
|
||||
static byte get_inbyteorder(void);
|
||||
static uint32 get_wkbType(void);
|
||||
static Term get_point(char *functor);
|
||||
static Term get_linestring(char *functor);
|
||||
static Term get_polygon(char *functor);
|
||||
static Term get_geometry(uint32 type);
|
||||
|
||||
static int swaporder;
|
||||
static byte inbyteorder, hostbyteorder;
|
||||
static byte *cursor;
|
||||
|
||||
Term wkb2prolog(char *wkb) {
|
||||
uint32 type;
|
||||
|
||||
cursor = wkb;
|
||||
|
||||
/*ignore the SRID 4 bytes*/
|
||||
cursor += 4;
|
||||
|
||||
/*byteorder*/
|
||||
hostbyteorder = get_hostbyteorder();
|
||||
inbyteorder = get_inbyteorder();
|
||||
|
||||
swaporder = 0;
|
||||
if ( hostbyteorder != inbyteorder )
|
||||
swaporder = 1;
|
||||
|
||||
type = get_wkbType();
|
||||
|
||||
return get_geometry(type);
|
||||
}
|
||||
|
||||
static byte get_hostbyteorder(void){
|
||||
uint16_t host = 5;
|
||||
uint16_t net;
|
||||
|
||||
net = htons(host);
|
||||
if ( net == host )
|
||||
return(WKBXDR);
|
||||
else
|
||||
return(WKBNDR);
|
||||
}
|
||||
|
||||
static byte get_inbyteorder(void){
|
||||
byte b = cursor[0];
|
||||
|
||||
if (b != WKBNDR && b != WKBXDR) {
|
||||
fprintf(stderr, "Unknown byteorder: %d\n",b);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
cursor++;
|
||||
|
||||
return(b);
|
||||
}
|
||||
|
||||
static uint32 get_wkbType(void){
|
||||
uint32 u;
|
||||
|
||||
/* read the type */
|
||||
readswap4(&u);
|
||||
|
||||
if (u > WKBMAXTYPE || u < WKBMINTYPE) {
|
||||
fprintf(stderr, "Unknown type: %d\n",u);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
return(u);
|
||||
}
|
||||
|
||||
static void readswap4(uint32 *buf){
|
||||
((byte *) buf)[0] = cursor[0];
|
||||
((byte *) buf)[1] = cursor[1];
|
||||
((byte *) buf)[2] = cursor[2];
|
||||
((byte *) buf)[3] = cursor[3];
|
||||
|
||||
if ( swaporder ) {
|
||||
if ( inbyteorder == WKBXDR ) {
|
||||
*buf = (uint32)ntohl((u_long)*buf);
|
||||
} else {
|
||||
byte u[4];
|
||||
|
||||
u[0] = ((byte *) buf)[3];
|
||||
u[1] = ((byte *) buf)[2];
|
||||
u[2] = ((byte *) buf)[1];
|
||||
u[3] = ((byte *) buf)[0];
|
||||
((byte *) buf)[0] = u[0];
|
||||
((byte *) buf)[1] = u[1];
|
||||
((byte *) buf)[2] = u[2];
|
||||
((byte *) buf)[3] = u[3];
|
||||
}
|
||||
}
|
||||
|
||||
cursor += 4;
|
||||
}
|
||||
|
||||
static void readswap8(double *buf) {
|
||||
((byte *) buf)[0] = cursor[0];
|
||||
((byte *) buf)[1] = cursor[1];
|
||||
((byte *) buf)[2] = cursor[2];
|
||||
((byte *) buf)[3] = cursor[3];
|
||||
((byte *) buf)[4] = cursor[4];
|
||||
((byte *) buf)[5] = cursor[5];
|
||||
((byte *) buf)[6] = cursor[6];
|
||||
((byte *) buf)[7] = cursor[7];
|
||||
|
||||
if ( swaporder ) {
|
||||
if ( inbyteorder == WKBXDR ) {
|
||||
u_long u[2];
|
||||
|
||||
u[0] = ((u_long *) buf)[0];
|
||||
u[1] = ((u_long *) buf)[1];
|
||||
((u_long *) buf)[1] = ntohl(u[0]);
|
||||
((u_long *) buf)[0] = ntohl(u[1]);
|
||||
} else {
|
||||
byte u[8];
|
||||
|
||||
u[0] = ((byte *) buf)[7];
|
||||
u[1] = ((byte *) buf)[6];
|
||||
u[2] = ((byte *) buf)[5];
|
||||
u[3] = ((byte *) buf)[4];
|
||||
u[4] = ((byte *) buf)[3];
|
||||
u[5] = ((byte *) buf)[2];
|
||||
u[6] = ((byte *) buf)[1];
|
||||
u[7] = ((byte *) buf)[0];
|
||||
((byte *) buf)[0] = u[0];
|
||||
((byte *) buf)[1] = u[1];
|
||||
((byte *) buf)[2] = u[2];
|
||||
((byte *) buf)[3] = u[3];
|
||||
((byte *) buf)[4] = u[4];
|
||||
((byte *) buf)[5] = u[5];
|
||||
((byte *) buf)[6] = u[6];
|
||||
((byte *) buf)[7] = u[7];
|
||||
}
|
||||
}
|
||||
|
||||
cursor += 8;
|
||||
}
|
||||
|
||||
static Term get_point(char *func){
|
||||
Term args[2];
|
||||
Functor functor;
|
||||
double d;
|
||||
|
||||
if(func == NULL)
|
||||
/*functor "," => (_,_)*/
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom(","), 2);
|
||||
else
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom(func), 2);
|
||||
|
||||
/* read the X */
|
||||
readswap8(&d);
|
||||
args[0] = MkFloatTerm(d);
|
||||
|
||||
/* read the Y */
|
||||
readswap8(&d);
|
||||
args[1] = MkFloatTerm(d);
|
||||
|
||||
return Yap_MkApplTerm(functor, 2, args);
|
||||
}
|
||||
|
||||
static Term get_linestring(char *func){
|
||||
Term *c_list;
|
||||
Term list;
|
||||
Functor functor;
|
||||
uint32 n;
|
||||
int i;
|
||||
|
||||
/* read the number of vertices */
|
||||
readswap4(&n);
|
||||
|
||||
/* space for arguments */
|
||||
c_list = (Term *) calloc(sizeof(Term),n);
|
||||
|
||||
for ( i = 0; i < n; i++) {
|
||||
c_list[i] = get_point(NULL);
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
if(func == NULL)
|
||||
return list;
|
||||
else{
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom(func), 1);
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
}
|
||||
}
|
||||
|
||||
static Term get_polygon(char *func){
|
||||
uint32 r;
|
||||
int i;
|
||||
Functor functor;
|
||||
Term *c_list;
|
||||
Term list;
|
||||
|
||||
/* read the number of rings */
|
||||
readswap4(&r);
|
||||
|
||||
/* space for rings */
|
||||
c_list = (Term *) calloc(sizeof(Term),r);
|
||||
|
||||
for ( i = 0; i < r; i++ ) {
|
||||
c_list[i] = get_linestring(NULL);
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = r - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
if(func == NULL)
|
||||
return list;
|
||||
else{
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom("polygon"), 1);
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
}
|
||||
}
|
||||
|
||||
static Term get_geometry(uint32 type){
|
||||
switch(type) {
|
||||
case WKBPOINT:
|
||||
return get_point("point");
|
||||
case WKBLINESTRING:
|
||||
return get_linestring("linestring");
|
||||
case WKBPOLYGON:
|
||||
return get_polygon("polygon");
|
||||
case WKBMULTIPOINT:
|
||||
{
|
||||
byte b;
|
||||
uint32 n, u;
|
||||
int i;
|
||||
Functor functor;
|
||||
Term *c_list;
|
||||
Term list;
|
||||
|
||||
|
||||
/* read the number of points */
|
||||
readswap4(&n);
|
||||
|
||||
/* space for points */
|
||||
c_list = (Term *) calloc(sizeof(Term),n);
|
||||
|
||||
for ( i = 0; i < n; i++ ) {
|
||||
/* read (and ignore) the byteorder and type */
|
||||
b = get_inbyteorder();
|
||||
u = get_wkbType();
|
||||
|
||||
c_list[i] = get_point(NULL);
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom("multipoint"), 1);
|
||||
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
|
||||
}
|
||||
case WKBMULTILINESTRING:
|
||||
{
|
||||
byte b;
|
||||
uint32 n, u;
|
||||
int i;
|
||||
Functor functor;
|
||||
Term *c_list;
|
||||
Term list;
|
||||
|
||||
|
||||
/* read the number of polygons */
|
||||
readswap4(&n);
|
||||
|
||||
/* space for polygons*/
|
||||
c_list = (Term *) calloc(sizeof(Term),n);
|
||||
|
||||
for ( i = 0; i < n; i++ ) {
|
||||
/* read (and ignore) the byteorder and type */
|
||||
b = get_inbyteorder();
|
||||
u = get_wkbType();
|
||||
|
||||
c_list[i] = get_linestring(NULL);
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom("multilinestring"), 1);
|
||||
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
|
||||
}
|
||||
case WKBMULTIPOLYGON:
|
||||
{
|
||||
byte b;
|
||||
uint32 n, u;
|
||||
int i;
|
||||
Functor functor;
|
||||
Term *c_list;
|
||||
Term list;
|
||||
|
||||
|
||||
/* read the number of polygons */
|
||||
readswap4(&n);
|
||||
|
||||
/* space for polygons*/
|
||||
c_list = (Term *) calloc(sizeof(Term),n);
|
||||
|
||||
for ( i = 0; i < n; i++ ) {
|
||||
/* read (and ignore) the byteorder and type */
|
||||
b = get_inbyteorder();
|
||||
u = get_wkbType();
|
||||
|
||||
c_list[i] = get_polygon(NULL);
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom("multipolygon"), 1);
|
||||
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
|
||||
}
|
||||
case WKBGEOMETRYCOLLECTION:
|
||||
{
|
||||
byte b;
|
||||
uint32 n;
|
||||
int i;
|
||||
Functor functor;
|
||||
Term *c_list;
|
||||
Term list;
|
||||
|
||||
/* read the number of geometries */
|
||||
readswap4(&n);
|
||||
|
||||
/* space for geometries*/
|
||||
c_list = (Term *) calloc(sizeof(Term),n);
|
||||
|
||||
|
||||
for ( i = 0; i < n; i++ ) {
|
||||
b = get_inbyteorder();
|
||||
c_list[i] = get_geometry(get_wkbType());
|
||||
}
|
||||
|
||||
list = MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
list = MkPairTerm(c_list[i],list);
|
||||
}
|
||||
|
||||
functor = Yap_MkFunctor(Yap_LookupAtom("geometrycollection"), 1);
|
||||
|
||||
return Yap_MkApplTerm(functor, 1, &list);
|
||||
}
|
||||
}
|
||||
|
||||
return MkAtomTerm(Yap_LookupAtom("[]"));
|
||||
}
|
||||
|
||||
#endif /*MYDDAS_MYSQL*/
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef MYDDAS_WKB2PROLOG_H_
|
||||
# define MYDDAS_WKB2PROLOG_H_
|
||||
|
||||
Term wkb2prolog(char *wkb) ;
|
||||
|
||||
#endif /* !MYDDAS_WKB2PROLOG_H_ */
|
||||
Reference in New Issue
Block a user