diff --git a/Makefile.am b/Makefile.am --- a/Makefile.am +++ b/Makefile.am @@ -60,7 +60,7 @@ distrend_SOURCES = $(SERVER_SOURCES) \ src/server/user_mgr.c \ src/server/user_mgr.h \ src/server/listen.h \ - src/server/listen.c \ + src/server/listen.c \ src/server/mysql.h \ src/server/mysql.c distrend_LDADD = libdistrencommon.la diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -164,8 +164,12 @@ int main(int argc, char *argv[]) } /** MySQL Connection */ - MYSQL *conn; - *conn = mysqlConnect(); + struct distrend_mysql_con *conn; + if(mysqlConnect(&conn)) + { + fprintf(stderr, "%s:%d: mysqlConnect() failed\n", __FILE__, __LINE__); + return 1; + } /** pre-loaded jobs for testing */ prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480); @@ -206,8 +210,6 @@ int main(int argc, char *argv[]) clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works. } - // Check the connection to the database - mysqlPing(conn); } /* while(!general_info.config->die) */ distrend_unlisten(general_info.config->listens, clients); @@ -217,7 +219,7 @@ int main(int argc, char *argv[]) /** free() paths */ free(general_info.files.geninfo); - mysql_close(conn); + mysqlDisconnect(conn); return 0; } diff --git a/src/server/mysql.c b/src/server/mysql.c --- a/src/server/mysql.c +++ b/src/server/mysql.c @@ -30,40 +30,94 @@ #include #include -MYSQL mysqlConnect(){ - MYSQL *conn; +/** + local types + */ + +#define SEVENTY_FIVE 75 + +struct distrend_mysql_con +{ + MYSQL *mysqlconn; + short pointlesscheck; +}; + +struct distrend_mysql_result +{ + MYSQL_RES *result; +}; + +/** + funcs + */ + +int mysqlConnect(struct distrend_mysql_con **conn) +{ + MYSQL *mysqlconn; char *server = "zserver1"; char *user = "distren"; char *password = "secretpassword"; char *database = "distren"; - conn = mysql_init(NULL); - mysql_options(conn, MYSQL_OPT_RECONNECT,"true"); + mysqlconn = mysql_init(NULL); + mysql_options(mysqlconn, MYSQL_OPT_RECONNECT,"true"); - if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) - fprintf(stderr, "%s\n", mysql_error(conn)); + if(!mysql_real_connect(mysqlconn, server, user, password, database, 0, NULL, 0)) + { + fprintf(stderr, "%s\n", mysql_error(mysqlconn)); + return 1; + } - return *conn; + *conn = malloc(sizeof(struct distrend_mysql_con)); + (*conn)->mysqlconn = mysqlconn; + (*conn)->pointlesscheck = SEVENTY_FIVE; + + return 0; } -MYSQL_RES mysqlQuery(MYSQL *conn, char *query){ - if (mysql_query(conn, query)) - fprintf(stderr, "%s\n", mysql_error(conn)); - - MYSQL_RES *result; - result = mysql_use_result(conn); - return *result; -} +int mysqlDisconnect(distrend_mysql_con_t conn) +{ + /** + check if this handle is valid + */ + if(conn->pointlesscheck != SEVENTY_FIVE) + fprintf(stderr, "warning, I was passed a bad struct distrend_mysql_con...\n"); -// Check if connection is alive, reconnect if broken. -int mysqlPing(MYSQL *conn){ - if(mysql_ping(conn)){ - fprintf(stderr, "MySQL Connection broken, attempting reconnection..."); - return 1; - } - else - return 0; // Connection is still alive + /** + invalidate handle :-D + */ + conn->pointlesscheck ++; + + mysql_close(conn->mysqlconn); + free(conn); + + return 0; } +distrend_mysql_result_t mysqlQuery(distrend_mysql_con_t conn, char *query) +{ + MYSQL_RES *result; + distrend_mysql_result_t distrenresult; + + /** + pointless sanity check + */ + if(conn->pointlesscheck != SEVENTY_FIVE) + fprintf(stderr, "warning, I was passed a bad struct distrend_mysql_con...\n"); + + /** make sure that connection is still alive + */ + if(mysql_ping(conn->mysqlconn)) + fprintf(stderr, "MySQL Connection _was_ broken or may be broken, I'm not sure exactly what this return value means\n"); + + if (mysql_query(conn->mysqlconn, query)) + fprintf(stderr, "%s\n", mysql_error(conn->mysqlconn)); + + result = mysql_use_result(conn->mysqlconn); + + distrenresult = malloc(sizeof(struct distrend_mysql_result)); + return distrenresult; +} + diff --git a/src/server/mysql.h b/src/server/mysql.h --- a/src/server/mysql.h +++ b/src/server/mysql.h @@ -22,10 +22,31 @@ #ifndef MYSQL_H_ #define MYSQL_H_ -#include +struct distrend_mysql_con; +struct distrend_mysql_result; + +typedef struct distrend_mysql_con *distrend_mysql_con_t; +typedef struct distrend_mysql_restul *distrend_mysql_result_t; + +/** + initiates a MySQL connection + @param conn, pointer will be set to the struct + @return 0 on success + */ +int mysqlConnect(distrend_mysql_con_t *conn); -MYSQL mysqlConnect(); -MYSQL_RES mysqlQuery(MYSQL *conn, char *query); -int mysqlPing(MYSQL *conn); +/** + cleans and disconnects MySQL connection + @param conn connection to clean + @return 0 onh success +*/ +int mysqlDiscconnect(distrend_mysql_con_t conn); + +/** + performs mysql query. + errors will be logged to the user by this function. + @return pointer to query handle on success, NULL on failure + */ +distrend_mysql_result_t mysqlQuery(struct distrend_mysql_con *conn, char *query); #endif /* MYSQL_H_ */