void SqliteDatabaseConnector::openDatabase()
{
#if defined(HAVE_SQLITE3_H)
    int result = sqlite3_open(db_name.c_str(), &db);
    if (result != SQLITE_OK) {
	std::string error = sqlite3_errmsg(db);
	logger << ERROR << "Unable to open database: " << db_name << " : " << endl;
	throw SqliteDatabaseConnectorException(error);
    }
#elif defined(HAVE_SQLITE_H)
    char* errormsg = 0;
    db = sqlite_open(db_name.c_str(), 0, &errormsg);
    if (db == 0) {
	std::string error;
	if (errormsg != 0) {
	    error = errormsg;
	}
#ifdef HAVE_STDLIB_H
        free(errormsg);
#endif
	logger << ERROR << "Unable to open database: " << db_name << " : " << endl;
	throw SqliteDatabaseConnectorException(error);
    }
#endif


}
NgramTable SqliteDatabaseConnector::executeSql(const std::string query) const
{
    NgramTable answer;
    
    char* sqlite_error_msg = 0;

    logger << DEBUG << "executing query: " << query << endl;
#if defined(HAVE_SQLITE3_H)
    int result = sqlite3_exec(
#elif defined(HAVE_SQLITE_H)
    int result = sqlite_exec(
#endif
	db,
	query.c_str(),
	callback,
	&answer,
	&sqlite_error_msg
    );

    if (result != SQLITE_OK) {
	std::string error;
	if (sqlite_error_msg != 0) {
	    error = sqlite_error_msg;
	}
#if defined(HAVE_SQLITE3_H)
        sqlite3_free(sqlite_error_msg);
#elif defined(HAVE_SQLITE_H)
# ifdef HAVE_STDLIB_H
        free(sqlite_error_msg);
# endif
#endif
	logger << ERROR << "Error executing SQL: '" 
	       << query << "' on database: '" << get_database_filename()
	       << "' : " << error << endl;
	throw SqliteDatabaseConnectorException(PRESAGE_SQLITE_EXECUTE_SQL_ERROR, error);
    }

    return answer;
}
void SqliteDatabaseConnector::openDatabase()
{
#if defined(HAVE_SQLITE3_H)
    int rc;

    if (get_read_write_mode())
    {
	// attempt to open read-write, no create
	rc = sqlite3_open_v2(get_database_filename().c_str(),
			     &db,
			     SQLITE_OPEN_READWRITE,
			     NULL);

	if (rc != SQLITE_OK) {
	    // attempt to open read-write, create
	    rc = sqlite3_open_v2(get_database_filename().c_str(),
				 &db,
				 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
				 NULL);

	    logger << WARN << "Created new language model database: " << get_database_filename() << endl;
	}

	if (rc == SQLITE_OK) {
	    // create n-gram tables up to specified cardinality if they
	    // don't yet exist
	    for (size_t cardinality = 1;
		 cardinality <= get_cardinality ();
		 cardinality++)
	    {
		createNgramTable(cardinality);
	    }
	}
    }
    else
    {
	// open read-only, no create
	rc = sqlite3_open_v2(get_database_filename().c_str(),
			     &db,
			     SQLITE_OPEN_READONLY,
			     NULL);
    }

    // throw exception if database cannot be opened/created
    if (rc != SQLITE_OK) {
	std::string error = sqlite3_errmsg(db);
	logger << ERROR << "Unable to create/open database: " << get_database_filename() << endl;
	throw SqliteDatabaseConnectorException(PRESAGE_SQLITE_OPEN_DATABASE_ERROR, error);
    }


#elif defined(HAVE_SQLITE_H)
    char* errormsg = 0;
    db = sqlite_open(get_database_filename().c_str(), 0, &errormsg);
    if (db == 0) {
	std::string error;
	if (errormsg != 0) {
	    error = errormsg;
	}
#ifdef HAVE_STDLIB_H
        free(errormsg);
#endif
	logger << ERROR << "Unable to open database: " << get_database_filename() << " : " << endl;
	throw SqliteDatabaseConnectorException(error);
    }
#endif

}