// --------------------------------------------------------------------------------------------
// archivo  : xsmysql.h
// objetivo : header de funciones para mysql
// --------------------------------------------------------------------------------------------

#ifndef __xsMySql_H__
#define __xsMySql_H__

// Incluyo la librería Easy
#include "xsEasyC.h"

// Se Incluyen librerías de c
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include <stdbool.h>
#include "mysql/mysql.h"

// Define las constantes
#define FUERA_SINCRONIA   CR_COMMANDS_OUT_OF_SYNC
#define SERVIDOR_ERROR    CR_SERVER_GONE_ERROR
#define SERVIDOR_PERDIDO  CR_SERVER_LOST
#define ERROR_DESCONOCIDO CR_UNKNOWN_ERROR


// Objetivo : Obtener el mas reciente autoincrement generado por un Insert
// Retorna  : El AutoIncremento generado en el mas reciente Insert
my_ulonglong mysqlAutoIncremento(MYSQL* conexion);


// Objetivo : Cambiar el conjunto de caracteres por default
// Retorna  : VERDAD/FALSO
Logico mysqlCambiarCaracteres(MYSQL* conexion, Constante Caracter* caracteres);

// Objetivo : Cambiar el usuario y la Bd con la que se accedió al Servidor
// Retorna  : VERDAD/FALSO
Logico mysqlCambiarUsuario(MYSQL *conexion,
                           Constante Caracter* usuario, 
						   Constante Caracter* password, 
						   Constante Caracter* basedatos);


// Objetivo : Contar cuantas columnas hay en el Registro de la mas reciente consulta
// Retorna  : El No. de Columnas 
SinSigno Entero mysqlColumnasEnRegistro(MYSQL* conexion);


// Objetivo: Conectar al Servidor de MySql
// Retorna : Un Conexión Inicializada; NULO en caso de Error
MYSQL* mysqlConectar(MYSQL *conexion, 
                     Constante Caracter* host, 			// Host
					 Constante Caracter* usuario,       // Usuario
					 Constante Caracter* password,      // Password
					 Constante Caracter* baseDatos);    // Base de Datos

// Objetivo : Retorna el Conjunto de Caracteres activo para la conexión
// Retorna  : Una cadena con el nombre del Conjunto de caracteres
Constante Caracter* mysqlConjuntoCaracteres(MYSQL* conexion);
					 
// Objetivo: Cerrar una conección abierta previamente con mysqlConectar
// Retorna : Nada
Vacio mysqlDesconectar(MYSQL* conexion);    // Conexion

// Objetivo: Ejecutar una Sentencia Sql
// Retorna : 0 si hubo exito; Un valor distinto de 0 si hubo error
Entero mysqlEjecutarSql(MYSQL* conexion, Constante Caracter* query);
					 

// Objetivo: Obtener el Error generado
// Retorna : La Cadena con el mensaje de error; vacia si no hay error					 
Constante Caracter* mysqlError(MYSQL* conexion);

// Objetivo: Obtener el Numero de Error Generado
// Retorna : El Número de Error; 0 si no hay error
SinSigno Entero mysqlErrorNumero(MYSQL* conexion);

// Objetivo: Obtener Información del Host al que se ha conectado
// Retorna : Cadena con la informacion
Constante Caracter* mysqlHostInformacion(MYSQL* conexion);

// Objetivo: Prepara una Conexión para MySql
// Retorna : Un Conexión Inicializada
MYSQL* mysqlInicializar(MYSQL *conexion);


// Objetivo: Leer Información de una Columna de los Resultados
// Retorna : Información sobre una Columna
MYSQL_FIELD* mysqlLeerColumna(MYSQL_RES *resultados);


// Objetivo: Leer un registro de un conjunto de resultados
// Retorna : Un Registro MYSQL_ROW
MYSQL_ROW mysqlLeerRegistro(MYSQL_RES *resultados);


// Objetivo: Liberar la Memoria de los Resultados obtenidos
// Retorna : Nada
Vacio mysqlLiberarResultados(MYSQL_RES* resultados);


// Objetivo: Obtener las Columnas de una Consulta
// Retorna : Un arreglo con las columnas de la consulta
MYSQL_FIELD* mysqlObtenerColumnas(MYSQL_RES* resultados);


// Objetivo: Obtener los resultados de la ejecución de un Query
// Retorna : Los resultados o un valor de NULO en caso de Error
MYSQL_RES* mysqlObtenerResultados(MYSQL* conexion);


// Objetivo: Posicionarse en una columna específica de resultados obtenidos
// Retorna : nada
Vacio mysqlPosicionarColumna(MYSQL_RES* resultados, my_ulonglong columna);


// Objetivo: Posicionarse en un registro específico de resultados obtenidos
// Retorna : nada
Vacio mysqlPosicionarRegistro(MYSQL_RES* resultados, my_ulonglong registro);

// Objetivo: Obtener referencia a los resultados de la ejecución de un Query
// Retorna : La referencia a los resultados o un valor de NULO en caso de Error
MYSQL_RES* mysqlReferenciarResultados(MYSQL* conexion);

// Objetivo: Retorna el numero de Registros afectados por una Sentencia Sql
// Retorna : El Numero de Registros Afectados
my_ulonglong mysqlRegistrosAfectados(MYSQL* conexion);

// Objetivo: Retorna el numero de Registros obtenidos por mysqlObtenerResultados
// Retorna : El Numero de Registros obtenidos
my_ulonglong mysqlRegistrosObtenidos(MYSQL_RES* resultados);

// Objetivo: Obtener Información del Servidor al que se ha conectado
// Retorna : Cadena con la informacion
Constante Caracter* mysqlServidorInformacion();

// Objetivo: Obtener los resulados de la mas reciente Sentencia ejecutada
// Retorna : Cadena con la sentencia
Constante Caracter* mysqlSqlEjecutada(MYSQL* conexion);

// Objetivo: Cancelar una transacción iniciada
// Retorna : VERDAD / FALSO
Logico mysqlTransaccionCancelar(MYSQL* conexion);

// Objetivo: Cancelar una transacción iniciada
// Retorna : VERDAD / FALSO
Logico mysqlTransaccionConfirmar(MYSQL* conexion);

// Objetivo: Cancelar una transacción iniciada
// Retorna : VERDAD / FALSO
Logico mysqlTransaccionIniciar(MYSQL* conexion);

// Objetivo: Obtener la Versión del Cliente de MySql
// Retorna : Cadena con la versión
Constante Caracter* mysqlVersion();


// fin de la Definición del Archivo
#endif