04/11/2009, 08:06
|
| | Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 16 años, 3 meses Puntos: 0 | |
Respuesta: Ayuda query SQL Uso C/C++ para esto, pero la cosa es que necesito la estructura intacta en un principio.
Código:
/// Modifica el valor de una variable INTEGER
bool mapreg_setreg(int uid, int val)
{
int num = (uid & 0x00ffffff);
int i = (uid & 0xff000000) >> 24;
const char* name = get_str(num);
if( val != 0 )
{
if( idb_put(mapreg_db,uid,(void*)val) )
;
else
if( name[1] == '@' )
;
else
{
char tmp_str[32*2+1];
Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%d')", mapreg_table, tmp_str, i, val) )
Sql_ShowDebug(mmysql_handle);
}
}
else // val == 0
{
idb_remove(mapreg_db,uid);
if( name[1] == '@' )
;
else
{
if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
Sql_ShowDebug(mmysql_handle);
}
}
mapreg_dirty = true;
return true;
}
/// Modifica el valor de una variable STRING
bool mapreg_setregstr(int uid, const char* str)
{
int num = (uid & 0x00ffffff);
int i = (uid & 0xff000000) >> 24;
const char* name = get_str(num);
if( str == NULL || *str == 0 )
{
if(name[1] != '@') {
if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
Sql_ShowDebug(mmysql_handle);
}
idb_remove(mapregstr_db,uid);
}
else
{
if (idb_put(mapregstr_db,uid, aStrdup(str)))
;
else if(name[1] != '@') {
char tmp_str[32*2+1];
char tmp_str2[255*2+1];
Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
Sql_EscapeStringLen(mmysql_handle, tmp_str2, str, strnlen(str, 255));
if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%s')", mapreg_table, tmp_str, i, tmp_str2) )
Sql_ShowDebug(mmysql_handle);
}
}
mapreg_dirty = true;
return true;
}
/// Carga la variable permanente de la base de datos
static void script_load_mapreg(void)
{
/*
0 1 2
+-------------------------+
| varname | index | value |
+-------------------------+
*/
SqlStmt* stmt = SqlStmt_Malloc(mmysql_handle);
char varname[32+1];
int index;
char value[255+1];
uint32 length;
if ( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `varname`, `index`, `value` FROM `%s`", mapreg_table)
|| SQL_ERROR == SqlStmt_Execute(stmt)
) {
SqlStmt_ShowDebug(stmt);
SqlStmt_Free(stmt);
return;
}
SqlStmt_BindColumn(stmt, 0, SQLDT_STRING, &varname[0], 32, &length, NULL);
SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 2, SQLDT_STRING, &value[0], 255, NULL, NULL);
while ( SQL_SUCCESS == SqlStmt_NextRow(stmt) )
{
int s = add_str(varname);
int i = index;
if( varname[length-1] == '$' )
idb_put(mapregstr_db, (i<<24)|s, aStrdup(value));
else
idb_put(mapreg_db, (i<<24)|s, (void *)atoi(value));
}
SqlStmt_Free(stmt);
mapreg_dirty = false;
}
/// Guarda la variable permanente en la Base de Datos
static void script_save_mapreg(void)
{
DBIterator* iter;
void* data;
DBKey key;
iter = mapreg_db->iterator(mapreg_db);
for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
{
int num = (key.i & 0x00ffffff);
int i = (key.i & 0xff000000) >> 24;
const char* name = get_str(num);
if( name[1] == '@' )
continue;
if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%d' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, (int)data, name, i) )
Sql_ShowDebug(mmysql_handle);
}
iter->destroy(iter);
iter = mapregstr_db->iterator(mapregstr_db);
for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
{
int num = (key.i & 0x00ffffff);
int i = (key.i & 0xff000000) >> 24;
const char* name = get_str(num);
char tmp_str2[2*255+1];
if( name[1] == '@' )
continue;
Sql_EscapeStringLen(mmysql_handle, tmp_str2, (char*)data, safestrnlen((char*)data, 255));
if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%s' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, tmp_str2, name, i) )
Sql_ShowDebug(mmysql_handle);
}
iter->destroy(iter);
mapreg_dirty = false;
}
Aquí tienes el código que hago para hacer las consultas y demás para actualizar los valores de las variables. EDIT:
La consulta: Código PHP: SELECT `value` FROM `mapreg` WHERE `varname` = "$top1pvp";
Así tantos queries como sean necesarios pero sin que salga resource ID XD
Gracias...
Última edición por rokimoki; 04/11/2009 a las 08:48 |