#include "util.h"


#include <glib.h>
#include <glib/gprintf.h>
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <string.h>

int
sql_execute(char *db_name, char *sql, int (*cb_func)(void*,int,char**,char**))
{
	sqlite3 *db;
	char *errmsg = 0;
	int rc;
	int result = 0;
	
	printf("*** %s(): \n",__PRETTY_FUNCTION__);


	rc = sqlite3_open(db_name, &db);
	if( rc ){
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		result = -1;
	}
	else
	{
		rc = sqlite3_exec(db, sql, cb_func, 0, &errmsg);
	}
	
	if( rc!=SQLITE_OK ){
		fprintf(stderr, "SQL error: %s\n", errmsg);
		sqlite3_free(errmsg);
		result = 1;
	}
  
	sqlite3_close(db);
	return result;
}

static size_t
mycurl_write_to_mem_cb(void *ptr, size_t rsize, size_t nmemb, void *data)
{
	size_t size; 
	mem_struct_t *mem; 
	
	size = rsize * nmemb;
	mem = (mem_struct_t *)data;
	
	mem->memory = (char *) g_realloc(mem->memory, mem->size + size + 1);
	
	if (mem->memory)
	{
		memcpy(&(mem->memory[mem->size]), ptr, size);
		mem->size += size;
		mem->memory[mem->size] = 0;
	}
	
	return size;
}



postreply_t*
mycurl__do_http_post (char *url, GSList *post_data_list, char *useragent)
{
	GSList *list;
	postreply_t *postreply;

		
	CURL *curl_handle;
	
	struct curl_httppost *formdata = NULL;
	struct curl_httppost *lastptr  = NULL;
		
	mem_struct_t chunk;
	long int status_code;


	
	chunk.memory = NULL;
	chunk.size   = 0;	
	
	curl_global_init(CURL_GLOBAL_ALL);


	
	for(list = post_data_list; list != NULL; list = list->next)
	{
		postdata_item_t *postdata_item;
		
		postdata_item = list->data;
		
		curl_formadd(&formdata,
		       &lastptr,
		       CURLFORM_COPYNAME,	postdata_item->name,
		       CURLFORM_COPYCONTENTS,	postdata_item->value,
		       CURLFORM_END);
	}
	
	
	
	curl_handle = curl_easy_init();
	
	curl_easy_setopt(curl_handle, CURLOPT_URL, url);
	curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
	curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, mycurl_write_to_mem_cb);
	curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
	curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, useragent);

	curl_easy_perform(curl_handle);
	curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &status_code);
	
	curl_easy_cleanup(curl_handle);
	
	

	
	
	postreply = g_new0(postreply_t, 1);
	postreply->status_code = status_code;
	if(chunk.memory)
		postreply->size = strlen(chunk.memory);
	else
		postreply->size = 0;
	postreply->data = g_strdup(chunk.memory);
	
	
	if(chunk.memory)
		g_free(chunk.memory);
	
	curl_global_cleanup();
	
	
	return postreply;
}


postreply_t*
mycurl__do_http_get (char *url, char *useragent)
{
	postreply_t *postreply;

		
	CURL *curl_handle;

		
	mem_struct_t chunk;
	long int status_code;


	
	chunk.memory = NULL;
	chunk.size   = 0;	
	
	
	curl_global_init(CURL_GLOBAL_ALL);
	curl_handle = curl_easy_init();
 
	curl_easy_setopt(curl_handle, CURLOPT_URL, url);
	curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, mycurl_write_to_mem_cb);
	curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
	
	curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 120);
	curl_easy_setopt(curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1000); 
	curl_easy_setopt(curl_handle, CURLOPT_LOW_SPEED_TIME, 40);    
 
	if(!useragent)
		curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
 


	curl_easy_perform(curl_handle);
	curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &status_code);
	
	curl_easy_cleanup(curl_handle);
	
	

	
	
	postreply = g_new0(postreply_t, 1);
	postreply->status_code = status_code;
	if(chunk.memory)
		postreply->size = strlen(chunk.memory);
	else
		postreply->size = 0;
	postreply->data = g_strdup(chunk.memory);
	
	
	if(chunk.memory)
		g_free(chunk.memory);
	
	curl_global_cleanup();
	
	
	return postreply;
}
