This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/MYDDAS/myddas_test_predicates.c

392 lines
11 KiB
C
Raw Normal View History

#if (defined MYDDAS_MYSQL || defined MYDDAS_ODBC) && defined CUT_C
#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_util.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
static int null_id = 0;
STATIC_PROTO(int c_db_my_query_no_result,(void));
STATIC_PROTO(int c_db_my_query_result,(void));
STATIC_PROTO(int c_db_my_row,(void));
STATIC_PROTO(int c_db_my_row_cut,(void));
STATIC_PROTO(int c_db_my_row_unify,(void));
static int
c_db_my_query_no_result(void) {
Term arg_sql_query = Deref(ARG1);
Term arg_conn = Deref(ARG2);
char *sql = AtomName(AtomOfTerm(arg_sql_query));
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
int length=strlen(sql);
if (mysql_real_query(conn, sql, length) != 0){
printf("Erro na query!\n");
return FALSE;
}
/* With an INSERT statement,
mysql_(use or store)_result() returns
a NULL pointer, so it isn't necessary to
use mysql_(use or store)_result*/
return TRUE;
}
/* Only use this function, with querys that return result sets*/
/* db_query: SQLQuery x ResultSet x Connection */
static int
c_db_my_query_result(void) {
Term arg_sql_query = Deref(ARG1);
Term arg_result_set = Deref(ARG2);
Term arg_conn = Deref(ARG3);
Term arg_mode = Deref(ARG4);
char *sql = AtomName(AtomOfTerm(arg_sql_query));
char *mode = AtomName(AtomOfTerm(arg_mode));
MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn));
MYSQL_RES *res_set;
int length=strlen(sql);
/* executar a query SQL */
if (mysql_real_query(conn, sql, length) != 0)
{
printf("Erro na query!\n");
return FALSE;
}
/* guardar os tuplos do lado do cliente */
if (strcmp(mode,"store_result")!=0) //Verdadeiro
{
res_set = mysql_use_result(conn);
}
else
{
res_set = mysql_store_result(conn);
int count = mysql_num_rows(res_set);
if (count == 0){
mysql_free_result(res_set);
return FALSE;
}
#ifdef MYDDAS_STATS
MYDDAS_UTIL_CONNECTION node =
myddas_util_search_connection(conn);
/* This only works if we use mysql_store_result */
int numberRows = mysql_num_rows(res_set);
numberRows = numberRows + myddas_util_get_conn_total_rows(node);
myddas_util_set_conn_total_rows(node,numberRows);
#endif
}
Bind(VarOfTerm(arg_result_set), MkIntegerTerm((int) 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) {
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 sero feitas as converses 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)))
Bind(VarOfTerm(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])))){
Bind(VarOfTerm(head), MkIntegerTerm(atoi(row[i])));
continue;
}
else if (IS_SQL_FLOAT(field->type))
{
//if (!Yap_unify(head, MkFloatTerm(atof(row[i]))))
Bind(VarOfTerm(head), MkFloatTerm(atof(row[i])));
continue;
}
else
{
//if (!Yap_unify(head, MkAtomTerm(Yap_LookupAtom(row[i]))))
Bind(VarOfTerm(head), MkAtomTerm(Yap_LookupAtom(row[i])));
continue;
}
}
}
return TRUE;
}
else
{
mysql_free_result(res_set);
cut_fail();
return FALSE;
}
}
}
/* db_row: ResultSet x Arity_ListOfArgs x ListOfArgs -> */
static int
c_db_my_row_unify(void) {
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 sero feitas as converses 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)))
//Bind(VarOfTerm(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]))))
//Bind(VarOfTerm(head), MkIntegerTerm(atoi(row[i])));
continue;
}
else if (IS_SQL_FLOAT(field->type))
{
if (!Yap_unify(head, MkFloatTerm(atof(row[i]))))
//Bind(VarOfTerm(head), MkFloatTerm(atof(row[i])));
continue;
}
else
{
if (!Yap_unify(head, MkAtomTerm(Yap_LookupAtom(row[i]))))
//Bind(VarOfTerm(head), MkAtomTerm(Yap_LookupAtom(row[i])));
continue;
}
}
}
return TRUE;
}
else
{
mysql_free_result(res_set);
cut_fail();
return FALSE;
}
}
}
/* static int */
/* c_db_my_row_term_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 ListOfArgs -> *\/ */
/* static int */
/* c_db_my_row_term(void) { */
/* Term arg_result_set = Deref(ARG1); */
/* Term arg_functor_name = Deref(ARG2); */
/* Term arg_term = 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; */
/* char *functor_name = AtomName(AtomOfTerm(arg_functor_name)); */
/* Term null_atom[1]; */
/* int i, arity; */
/* arity = mysql_num_fields(res_set); */
/* Functor functor = Yap_MkFunctor(Yap_LookupAtom(functor_name),arity); */
/* Term properties[arity]; */
/* while(TRUE) */
/* { */
/* if ((row = mysql_fetch_row(res_set)) != NULL) */
/* { */
/* mysql_field_seek(res_set,0); */
/* 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); */
/* if (row[i] == NULL) */
/* { */
/* null_atom[0] = MkIntegerTerm(null_id++); */
/* properties[i]= Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom("null"),1),1,null_atom); */
/* } */
/* else */
/* { */
/* if (IS_SQL_INT(field->type)) */
/* { */
/* properties[i]= MkIntegerTerm(atoi(row[i])); */
/* } */
/* else if (IS_SQL_FLOAT(field->type)) */
/* { */
/* properties[i]= MkFloatTerm(atof(row[i])); */
/* } */
/* /\* This if is for case if we have a data type */
/* like int(11)*\/ */
/* else if (strchr(row[i],'(') && strchr(row[i],')')) */
/* { */
/* char *type = strtok(row[i],"("); */
/* char *num = strtok(NULL,")"); */
/* Term size[1]; */
/* size[0] = MkIntegerTerm(atoi(num)); */
/* properties[i]= Yap_MkApplTerm(Yap_MkFunctor(Yap_LookupAtom(type),1),1,size); */
/* //printf ("-->%s %s %s\n",row[i],type,num); */
/* } */
/* else */
/* { */
/* properties[i]= MkAtomTerm(Yap_LookupAtom(row[i])); */
/* } */
/* } */
/* } */
/* if (!Yap_unify(arg_term, Yap_MkApplTerm(functor,arity,properties))){ */
/* mysql_free_result(res_set); */
/* cut_fail(); */
/* return FALSE; */
/* } */
/* return TRUE; */
/* } */
/* else */
/* { */
/* mysql_free_result(res_set); */
/* cut_fail(); */
/* return FALSE; */
/* } */
/* } */
/* } */
void Yap_InitMYDDAS_testPreds(void)
{
/* db_query: SQLQuery x ResultSet x Connection */
Yap_InitCPred("c_db_my_query_result", 4, c_db_my_query_result, 0);
/* db_query: SQLQuery x ResultSet x Connection */
Yap_InitCPred("c_db_my_query_no_result", 2, c_db_my_query_no_result, 0);
}
void Yap_InitBackMYDDAS_testPreds(void)
{
/* db_row: ResultSet x Arity x ListOfArgs */
Yap_InitCPredBackCut("c_db_my_row_bind", 3, sizeof(int),
c_db_my_row,
c_db_my_row,
c_db_my_row_cut, 0);
/* db_row: ResultSet x Arity x ListOfArgs */
Yap_InitCPredBackCut("c_db_my_row_unify", 3, sizeof(int),
c_db_my_row_unify,
c_db_my_row_unify,
c_db_my_row_cut, 0);
/* /\* db_row_term: ResultSet x NameFunctor x Term *\/ */
/* Yap_InitCPredBackCut("c_db_my_row_term", 3, sizeof(int), */
/* c_db_my_row_term, */
/* c_db_my_row_term, */
/* c_db_my_row_term_cut, 0); */
}
#endif /*MYDDAS_MYSQL && CUT_C*/