#include "cmdline.h"
#include "printdata.h"
#include <mysql++.h>
#include <ssqls.h>
#include <fstream>
using namespace std;
// Breaks a given text line of tab-separated fields up into a list of
// strings.

sql_create_18(Tasks,
	1, 10, // The meaning of these values is covered in the user manual
	mysqlpp::sql_int, TaskId,
	mysqlpp::sql_int, UserId,
	mysqlpp::sql_int, TaskTypeId,
	mysqlpp::sql_int, TaskStatusId,
	mysqlpp::sql_char, TaskInputParameter,
	mysqlpp::sql_char, TaskInputFolder,
	mysqlpp::sql_char, TaskOutputFolder,
	mysqlpp::sql_char, TaskMainFile,
	mysqlpp::sql_bool, SpotInstance,
	mysqlpp::sql_int, EC2InstanceTypeId,
    mysqlpp::sql_date, LastCheckTime,
    mysqlpp::sql_char, EC2SnapshotId,
    mysqlpp::sql_char, TaskDesc,
    mysqlpp::sql_char, TaskComment,
    mysqlpp::sql_date, CreatedOn,
    mysqlpp::sql_int, CreatedBy,
    mysqlpp::sql_date, ModifiedOn,
    mysqlpp::sql_int, ModifiedBy)

sql_create_6(Users,
	1, 6,
    mysqlpp::sql_int, UserId,
    mysqlpp::sql_char, UserName,
    mysqlpp::sql_date, LastActivityDate,
    mysqlpp::sql_int, Credits,
    mysqlpp::sql_tinyblob, password,
    mysqlpp::sql_char, email
    )

sql_create_2(TaskStatus,
    1, 2,
    mysqlpp::sql_int, StatusId,
    mysqlpp::sql_char, StatusName)

sql_create_2(TaskTypes,
    1, 2,
    mysqlpp::sql_int, TypeId,
    mysqlpp::sql_char, TypeName)


static string version_str(int packed)
{struct TaskStatus
    {
        int StatusId;
        string StatusName;
    };

    struct TaskTypes
    {
        int TypeId;
        string TypeName;
    };
    char buf[9];
    snprintf(buf, sizeof(buf), "%d.%d.%d",
             (packed & 0xFF0000) >> 16,
             (packed & 0x00FF00) >> 8,
             (packed & 0x0000FF));
    return buf;
}

void populate_table(mysqlpp::Connection& con)
{
    mysqlpp::Query query = con.query();
    Tasks task;
    task.UserId  =1;
    task.TaskTypeId = 1;
    task.TaskStatusId = 1;
    task.TaskInputParameter ="filename:1:5";
    task.TaskInputFolder = "taskInputfolder";
    task.TaskOutputFolder = "taskoutputfolder";
    task.TaskMainFile = "taskMainfile";
    task.SpotInstance = false;


    Users user;
    user.UserName = "nick huang";
    user.LastActivityDate = mysqlpp::sql_date("2011-02-28");
    user.Credits = 1000;
    user.password = mysqlpp::sql_tinyblob("2393020201\032");
    user.email = "nickhuang99@hotmail.com";

    query.insert(task);
    query.execute();
    query.insert(user);
    query.execute();
}



int main(int argc, char *argv[])
{

    if (mysqlpp::get_library_version() != MYSQLPP_HEADER_VERSION)
    {
        cerr << "Version mismatch: library is v" <<
        version_str(mysqlpp::get_library_version()) <<
        ", headers are v" <<
        version_str(MYSQLPP_HEADER_VERSION) <<
        ".  Are you running this" << endl <<
        "with exrun?  See README.examples." << endl;
        return 1;
    }

    // Connect to database server
    const char *server = 0, *user = 0, *pass = "", *db = "RenderingMax";
// Get database access parameters from command line
    if (parse_command_line(argc, argv, &db, &server, &user, &pass))
    {
        cout << "Connecting to '" <<
            (user ? user : "USERNAME") << "'@'" <<
            (server ? server : "localhost") << "', with" <<
            (pass[0] ? "" : "out") << " password..." << endl;
    }
    else
    {
        return 1;		// command line parsing failed
    }


    try
    {
        mysqlpp::Connection con(db, server, user, pass);
        populate_table(con);
        print_table(con, "Tasks");
        print_table(con, "Users");

    }
    catch (const mysqlpp::BadQuery& er)
    {
// Handle any query errors
        cerr << "Query error: " << er.what() << endl;
        return -1;
    }
    catch (const mysqlpp::BadConversion& er)
    {
// Handle bad conversions
        cerr << "Conversion error: " << er.what() << endl <<
        "\tretrieved data size: " << er.retrieved <<
        ", actual size: " << er.actual_size << endl;
        return -1;
    }
    catch (const mysqlpp::BadFieldName& er)
    {
// Handle bad conversions
        cerr << "BadFieldName error: " << er.what() << endl;
        return -1;
    }
    catch (const mysqlpp::Exception& er)
    {
// Catch-all for any other MySQL++ exceptions
        cerr << "Error: " << er.what() << endl;
        return -1;
    }
    return 0;
}
