2012-03-23 15:45:38 +00:00
/* wMUD - Yet another MUD codebase by W00d5t0ck
* Copyright ( C ) 2012 - Gergely POLONKAI
*
* db . c : database handling routines
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2012-03-26 14:55:36 +00:00
2012-03-22 09:49:19 +00:00
# include <glib.h>
2013-01-06 20:41:29 +00:00
# include <libgda/libgda.h>
# include <sql-parser/gda-sql-parser.h>
2012-03-21 14:59:39 +00:00
2012-03-27 20:00:01 +00:00
# include "world.h"
2012-03-22 17:34:39 +00:00
# include "main.h"
2012-03-21 14:59:39 +00:00
# include "db.h"
2012-03-22 17:34:39 +00:00
# include "players.h"
2012-03-26 14:55:36 +00:00
# include "configuration.h"
2012-03-31 09:19:57 +00:00
# include "menu.h"
2013-01-05 03:47:04 +00:00
# include "wmudplayer.h"
2012-03-21 14:59:39 +00:00
2012-03-24 22:52:36 +00:00
/**
* SECTION : db
* @ short_description : Database handling
* @ title : Database handling routines
*
2012-03-29 17:12:09 +00:00
* This module handles all the database requests . It currently uses an SQLite3
* backend , but due to its nature , it could be easily rewritten to use a
* different ( e . g MySQL or PostgreSQL ) database .
2012-03-24 22:52:36 +00:00
*/
2013-01-06 20:41:29 +00:00
static GdaConnection * dbh = NULL ;
static GdaSqlParser * parser = NULL ;
2012-03-21 14:59:39 +00:00
2012-03-30 15:43:45 +00:00
GQuark
wmud_db_error_quark ( )
{
return g_quark_from_static_string ( " wmud-db-error " ) ;
}
2012-03-24 19:34:36 +00:00
/**
* wmud_db_init :
2012-03-24 22:52:36 +00:00
* @ err : a GError to put error messages in it
2012-03-24 19:34:36 +00:00
*
* Initializes the wMUD database system . Checks and opens database files .
*/
2012-03-21 14:59:39 +00:00
gboolean
2012-03-22 09:49:19 +00:00
wmud_db_init ( GError * * err )
2012-03-21 14:59:39 +00:00
{
2013-01-06 20:41:29 +00:00
GError * local_err = NULL ;
gda_init ( ) ;
2012-03-22 17:34:39 +00:00
2013-01-06 20:41:29 +00:00
/* TODO: error checking! */
dbh = gda_connection_open_from_string ( " sqlite " , active_config - > database_dsn , NULL , 0 , & local_err ) ;
2012-03-22 17:34:39 +00:00
2013-01-06 20:41:29 +00:00
if ( dbh = = NULL ) {
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_CANTOPEN , " Can not open databsae (%s): %s " , active_config - > database_dsn , local_err - > message ) ;
2012-03-22 17:34:39 +00:00
return FALSE ;
}
2013-01-06 20:41:29 +00:00
parser = gda_sql_parser_new ( ) ;
2012-03-22 17:34:39 +00:00
return TRUE ;
}
2012-03-24 19:34:36 +00:00
/**
2012-03-27 19:34:04 +00:00
* wmud_db_load_players :
2012-03-24 22:52:36 +00:00
* @ err : a GError to put error messages in it
2012-03-24 19:34:36 +00:00
*
* Loads all player records from the database
*/
2012-03-22 17:34:39 +00:00
gboolean
2012-03-27 19:34:04 +00:00
wmud_db_load_players ( GError * * err )
2012-03-22 17:34:39 +00:00
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res ;
GdaDataModelIter * iter ;
2012-03-22 17:34:39 +00:00
2013-01-06 20:41:29 +00:00
if ( dbh = = NULL ) {
2012-03-22 17:34:39 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, login, password, email FROM players " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-22 17:34:39 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
WmudPlayer * player ;
player = wmud_player_new ( ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
wmud_player_set_id ( player , g_value_get_int ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
wmud_player_set_player_name ( player , g_value_get_string ( val ) ) ;
2012-03-22 17:34:39 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 2 ) ;
wmud_player_set_cpassword ( player , g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 3 ) ;
wmud_player_set_email ( player , g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded player _%s_ " , wmud_player_get_player_name ( player ) ) ;
players = g_slist_prepend ( players , player ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-22 17:34:39 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-22 17:34:39 +00:00
2012-03-22 09:49:19 +00:00
return FALSE ;
2012-03-21 14:59:39 +00:00
}
2012-03-24 19:34:36 +00:00
/**
* wmud_db_save_player :
* @ player : the player record to save
2012-03-24 22:52:36 +00:00
* @ err : a GError to put error messages in it
2012-03-24 19:34:36 +00:00
*
* Saves a player record to the database backend .
*
* Return value : % TRUE on success . Upon failure , % FALSE is returned , and err is
* set accordingly .
*/
2012-03-22 17:34:39 +00:00
gboolean
2013-01-05 03:47:04 +00:00
wmud_db_save_player ( WmudPlayer * player , GError * * err )
2012-03-22 17:34:39 +00:00
{
2013-01-06 20:41:29 +00:00
/*
2012-03-22 17:34:39 +00:00
sqlite3_stmt * sth = NULL ;
int sqlite_code ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-22 17:34:39 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-02 01:04:53 +00:00
if ( ( sqlite_code = sqlite3_prepare_v2 ( dbh , " INSERT INTO players (id, login, password, email) VALUES (NULL, ?, NULL, ?) " , - 1 , & sth , NULL ) ) ! = SQLITE_OK ) {
2012-03-29 17:11:43 +00:00
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_BADQUERY , " Bad query in wmud_db_save_player(): %s " , sqlite3_errmsg ( dbh ) ) ;
2012-03-22 17:34:39 +00:00
return FALSE ;
}
2013-01-05 03:47:04 +00:00
if ( ( sqlite_code = sqlite3_bind_text ( sth , 1 , wmud_player_get_player_name ( player ) , - 1 , SQLITE_STATIC ) ) ! = SQLITE_OK ) {
2012-03-29 17:11:43 +00:00
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_BADQUERY , " Bad parameter in wmud_db_save_player(): %s " , sqlite3_errmsg ( dbh ) ) ;
2012-03-22 17:34:39 +00:00
return FALSE ;
}
2013-01-05 03:47:04 +00:00
if ( ( sqlite_code = sqlite3_bind_text ( sth , 2 , wmud_player_get_email ( player ) , - 1 , SQLITE_STATIC ) ) ! = SQLITE_OK ) {
2012-03-29 17:11:43 +00:00
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_BADQUERY , " Bad parameter in wmud_db_save_player(): %s " , sqlite3_errmsg ( dbh ) ) ;
2012-03-22 17:34:39 +00:00
return FALSE ;
}
2013-01-02 01:04:53 +00:00
if ( ( sqlite_code = sqlite3_step ( sth ) ) ! = SQLITE_DONE ) {
2012-03-29 17:11:43 +00:00
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_BADQUERY , " Statement cannot be executed in wmud_db_save_player(): %s " , sqlite3_errmsg ( dbh ) ) ;
2012-03-22 17:34:39 +00:00
return FALSE ;
}
g_clear_error ( err ) ;
return TRUE ;
2013-01-06 20:41:29 +00:00
*/
return FALSE ;
2012-03-22 17:34:39 +00:00
}
2012-03-26 15:33:58 +00:00
gboolean
wmud_db_load_planes ( GSList * * planes , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-27 20:00:01 +00:00
2012-03-29 16:11:33 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading planes " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-27 20:00:01 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, name FROM planes " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-27 20:00:01 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudPlane * plane ;
plane = g_new0 ( wmudPlane , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
plane - > id = g_value_get_int ( val ) ;
2012-03-27 20:00:01 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
plane - > name = g_strdup ( g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded plane _%s_ " , plane - > name ) ;
* planes = g_slist_prepend ( * planes , plane ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-27 20:00:01 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-27 20:00:01 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
gboolean
wmud_db_load_planets ( GSList * * planets , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-29 16:11:33 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading planets " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-29 16:11:33 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, name FROM planets " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudPlanet * planet ;
planet = g_new0 ( wmudPlanet , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
planet - > id = g_value_get_int ( val ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
planet - > name = g_strdup ( g_value_get_string ( val ) ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded planet _%s_ " , planet - > name ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
* planets = g_slist_prepend ( * planets , planet ) ;
2013-01-02 01:04:53 +00:00
2013-01-06 20:41:29 +00:00
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-29 16:11:33 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
gboolean
wmud_db_load_directions ( GSList * * directions , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-27 20:00:01 +00:00
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-27 20:00:01 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, short_name, name FROM directions " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-27 20:00:01 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudDirection * dir ;
dir = g_new0 ( wmudDirection , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
dir - > id = g_value_get_int ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
dir - > short_name = g_strdup ( g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 2 ) ;
dir - > name = g_strdup ( g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded direction _%s_ " , dir - > name ) ;
2012-03-27 20:00:01 +00:00
2013-01-06 20:41:29 +00:00
* directions = g_slist_prepend ( * directions , dir ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-27 20:00:01 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-27 20:00:01 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
gboolean
wmud_db_load_areas ( GSList * * areas , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-29 16:11:33 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading areas " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-29 16:11:33 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, name FROM areas " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudArea * area ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
area = g_new0 ( wmudArea , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
area - > id = g_value_get_int ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
area - > name = g_strdup ( g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded area _%s_ " , area - > name ) ;
* areas = g_slist_prepend ( * areas , area ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-29 16:11:33 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
gboolean
wmud_db_load_rooms ( GSList * * rooms , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-29 16:11:33 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading rooms " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-29 16:11:33 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, area, name, distant_description, close_description FROM rooms " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudRoom * room ;
room = g_new0 ( wmudRoom , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
room - > id = g_value_get_int ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
room - > area_id = g_value_get_int ( val ) ;
2012-03-29 16:11:33 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 2 ) ;
room - > name = g_strdup ( g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 3 ) ;
room - > distant_description = g_strdup ( g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 4 ) ;
room - > close_description = g_strdup ( g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded room %d/_%s_ " , room - > area_id , room - > name ) ;
* rooms = g_slist_prepend ( * rooms , room ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 16:11:33 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-29 16:11:33 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
gboolean
wmud_db_load_exits ( GSList * * exits , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-29 17:12:45 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading rooms " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-29 17:12:45 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT room_id, direction, other_side FROM room_exits " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 17:12:45 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudExit * room_exit ;
room_exit = g_new0 ( wmudExit , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
room_exit - > source_room_id = g_value_get_int ( val ) ;
2012-03-29 17:12:45 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
room_exit - > direction_id = g_value_get_int ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 2 ) ;
room_exit - > destination_room_id = g_value_get_int ( val ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded exit %d =%d=> %d " , room_exit - > source_room_id , room_exit - > direction_id , room_exit - > destination_room_id ) ;
* exits = g_slist_prepend ( * exits , room_exit ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-29 17:12:45 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-29 17:12:45 +00:00
return TRUE ;
2012-03-26 15:33:58 +00:00
}
2012-03-30 17:53:47 +00:00
gboolean
wmud_db_load_planet_planes ( GSList * * planet_planes , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-30 17:53:47 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading rooms " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-30 17:53:47 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT planet_id, plane_id FROM planet_planes " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-30 17:53:47 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudPlanetPlaneAssoc * planet_plane ;
planet_plane = g_new0 ( wmudPlanetPlaneAssoc , 1 ) ;
2012-03-30 17:53:47 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
planet_plane - > planet_id = g_value_get_int ( val ) ;
2013-01-02 01:04:53 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
planet_plane - > plane_id = g_value_get_int ( val ) ;
2012-03-30 17:53:47 +00:00
2013-01-06 20:41:29 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded planet-plane association %d <> %d " , planet_plane - > planet_id , planet_plane - > plane_id ) ;
2012-03-30 17:53:47 +00:00
2013-01-06 20:41:29 +00:00
* planet_planes = g_slist_prepend ( * planet_planes , planet_plane ) ;
2013-01-02 01:04:53 +00:00
2013-01-06 20:41:29 +00:00
gda_data_model_iter_move_next ( iter ) ;
2012-03-30 17:53:47 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-30 17:53:47 +00:00
return TRUE ;
}
2012-03-31 09:19:57 +00:00
gboolean
wmud_db_load_menu ( GSList * * menu_items , GError * * err )
{
2013-01-06 20:41:29 +00:00
GdaStatement * sth = NULL ;
GdaDataModel * res = NULL ;
GdaDataModelIter * iter ;
2012-03-31 09:19:57 +00:00
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loading menu items " ) ;
2013-01-02 01:04:53 +00:00
if ( dbh = = NULL ) {
2012-03-31 09:19:57 +00:00
if ( err )
g_set_error ( err , WMUD_DB_ERROR , WMUD_DB_ERROR_NOINIT , " Database backend not initialized " ) ;
return FALSE ;
}
2013-01-06 20:41:29 +00:00
sth = gda_sql_parser_parse_string ( parser , " SELECT id, menuchar, need_active_char, placement, display_text, fnctn FROM menu ORDER BY placement " , NULL , NULL ) ;
res = gda_connection_statement_execute_select ( dbh , sth , NULL , NULL ) ;
iter = gda_data_model_create_iter ( res ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-31 09:19:57 +00:00
2013-01-06 20:41:29 +00:00
while ( gda_data_model_iter_is_valid ( iter ) ) {
const GValue * val ;
wmudMenu * menu_item ;
menu_item = g_new0 ( wmudMenu , 1 ) ;
val = gda_data_model_iter_get_value_at ( iter , 0 ) ;
menu_item - > id = g_value_get_int ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 1 ) ;
menu_item - > menuchar = * ( g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 2 ) ;
menu_item - > need_active_char = g_value_get_boolean ( val ) ;
val = gda_data_model_iter_get_value_at ( iter , 3 ) ;
menu_item - > placement = g_value_get_int ( val ) ;
2012-03-31 09:19:57 +00:00
2013-01-06 20:41:29 +00:00
val = gda_data_model_iter_get_value_at ( iter , 4 ) ;
menu_item - > text = g_strdup ( g_value_get_string ( val ) ) ;
val = gda_data_model_iter_get_value_at ( iter , 5 ) ;
menu_item - > func = g_strdup ( g_value_get_string ( val ) ) ;
g_log ( G_LOG_DOMAIN , G_LOG_LEVEL_DEBUG , " Loaded menu item %d: %s(%c) " , menu_item - > id , menu_item - > text , menu_item - > menuchar ) ;
* menu_items = g_slist_prepend ( * menu_items , menu_item ) ;
gda_data_model_iter_move_next ( iter ) ;
2012-03-31 09:19:57 +00:00
}
2013-01-06 20:41:29 +00:00
g_object_unref ( iter ) ;
g_object_unref ( sth ) ;
2012-03-31 09:19:57 +00:00
return TRUE ;
}
2013-01-06 20:41:29 +00:00