[Modulo] MySQL Threads 1.2
#1
MySQL Threads 1.2

Descripción:
MySQL Threads es una modificación del modulo MySQL de amxmodx.
En esta modificación de removió todo el soporte para sqlite y prepare query, quedando solo lo relacionado a threadquery. Se mejoraron muchas cosas para sacarle el máximo rendimiento a las threadquery.

Mejoras:
- Cantidad de threads en cada frame y tiempo de espera configurable (lo hace mucho mas rápido).
- Soporta conexión permanente creada con mysql_connect (da mejor rendimiento).
- Si el servidor MySQL cierra la conexión permanente el modulo trata de reconectarse (con preparequery fallaba).
- Menor cantidad de parámetros para las natives (mas simple).
- mysql_escape_string mejorado.


Natives:
Código PHP:
native mysql_performance(collect_time=100th_think_time=100threads_per_frame=1);
native mysql_query(Handle:cn_handler, const handler[], const query[], const data[]=""dataSize=0);
native Handle:mysql_makehost(const host[], const user[], const pass[], const db[], timeout=0);
native mysql_free(Handle:_handle);
native Handle:mysql_connect(Handle:host_handler, &errcodeerror[], maxlength);
native mysql_more_results();
native mysql_isnull(column);
native mysql_read_result(column, {Float,_}:...);
native mysql_read_result2(const column[], {Float,_}:...);
native mysql_next_row();
native mysql_affected_rows();
native mysql_num_results();
native mysql_num_columns();
native mysql_fieldnumtoname(numname[], maxlength);
native mysql_fieldnametonum(const name[]);
native mysql_get_insert_id();
native mysql_get_query(buffer[], maxlength);
native mysql_rewind();
native mysql_next_result_set();
native mysql_escape_string(buffer[], buflen, const string[]);
native mysql_escape_string2(buffer[], buflen, const fmt[], any:...); 

mysql_performance:
Código:
[Configura la performance del ThreadsQuery]
-collect_time:
   Tiempo en milisegundos en el que se recolectan los datos listos
   min: 30ms
   max: 300ms
-th_think_time:
   Tiempo en milisegundos para el próximo frame del Thread
   min: 30ms
   max: 300ms
-threads_per_frame:
   Cantidad de Threads simultáneamente
   min: 1
   max: 20

Prueba de rendimiento:
(Configuración default de amxmodx)
test_mysql: 90 consultas en 9.60 segundos
test_mysql2: 90 consultas en 8.90 segundos

Después de test_mysql3:
test_mysql: 90 consultas en 0.80 segundos
test_mysql2: 90 consultas en 0.65 segundos
Código PHP:
#include <amxmodx>
#include <mysqlt>

#define PLUGIN "MySQL Threads Test"
#define VERSION "1.0"
#define AUTHOR "Destro"

new const sql_host[] = "localhost"
new const sql_user[] = "servidores"
new const sql_pass[] = "servidoressql"
new const sql_db[] = "servidores"

new const query[3][] = {
    
"SELECT * FROM `cuentas_30` WHERE(`nick` LIKE 'Destro')",
    
"SELECT * FROM `cuentas_30` WHERE(`nick` LIKE 'ZAMU')",
    
"SELECT * FROM `cuentas_30` WHERE(`nick` LIKE 'sofi')"
}

new 
Handle:g_Host
new Handle:g_Connection

new g_count

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
g_Host mysql_makehost(sql_hostsql_usersql_passsql_db)
    
    new 
error[32], errnum
    g_Connection 
mysql_connect(g_Hosterrnumerror31)
    if(
errnum)
    {
        
log_to_file("mysqlt.log""ERROR1: [%d]- [%s]"errnumerror)
    }
    
    
mysql_query(g_Host"query_handler"query[0])
    
    
register_srvcmd("test_mysql""test")
    
register_srvcmd("test_mysql2""test2")
    
register_srvcmd("test_mysql3""test3")
}

public 
test()
{
    
g_count=0
    
for(new i90i++)
    {
        
mysql_query(g_Host"query_handler"query[1])
    }
    
}

public 
test2()
{
    
g_count=0
    
for(new i90i++)
    {
        
mysql_query(g_Connection"query_handler"query[2])
    }
    
}

public 
test3()
{
    static 
active
    active 
= !active
    
    
if(active)
    {
        
server_print("mysql_config_thread speed")
        
mysql_performance(50506)
    }
    else {
        
server_print("mysql_config_thread default")
        
mysql_performance(1001001)
    }
}

public 
query_handler(failstateerror[], errnumdata[], sizeFloat:queuetime)
{
    if(
failstate != TQUERY_SUCCESS)
    {
        
log_to_file("mysqlt.log""ERROR2: [%d]- [%s]"errnumerror)
        return
    }
    
    
g_count++
    
    new 
name[32], ammopacklevelfields[3]
    
    
fields[0] = mysql_fieldnametonum("nick")
    
fields[1] = mysql_fieldnametonum("ap")
    
fields[2] = mysql_fieldnametonum("level")
    
    
mysql_read_result(fields[0], name31)
    
    
ammopack mysql_read_result(fields[1])
    
level mysql_read_result(fields[2])
    
    
server_print("#%d -- Nick: [%s] ap:[%d] lvl:[%d] - Time:[%.2f]"g_countnameammopacklevelqueuetime)


Change log:
Código:
1.0: Publicacion
1.0b: Fix bug
1.1:
+native mysql_read_result2
+versión linux
1.2:
Fix bug
Check connection (mysql_ping)

Preguntas frecuentes:
¿ Porque no tiene soporte para sqlite ?
sqlite esta localhost y no es necesario threadquery.
¿ Porque no tiene soporte para preparequery ?
la idea de este modulo es soporte full MySQL, los servidores MySQL suelen ser remotos y preparequery queda obsoleto.

Source code:

.rar   mysqlt_source.rar (Tamaño: 69.86 KB / Descargas: 332)
Personalmente hubiera re-codeado casi todo,pero como no me llevo muy bien programando para linux no quería cagar el soporte de linux.

Modulo Win:

.rar   mysqlt_amxx.rar (Tamaño: 575.78 KB / Descargas: 622)

Modulo Linux:

.rar   mysqlt_amxx_i386.rar (Tamaño: 750.08 KB / Descargas: 583)

Include:

.inc   mysqlt.inc (Tamaño: 6.17 KB / Descargas: 1,248)
Responder
#2
Nice
No recomendado usar prepare con el modulo original?
Responder
#3
(29/09/2014, 09:14 AM)[Anti] escribió: Nice
No recomendado usar prepare con el modulo original?

Son 2 cosas distintas, pero que llegan al mismo fin. Busca
Responder
#4
Perfectoo, es justo lo que buscaba hace mucho tiempo.

Creo que sería fantástico si ayudases a Arkshine en mejorar el módulo "oficial" de mysql y sqlite con todas estas mejoras a través de GitHub.
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#5
No entiendo mucho de mysql, ya que hace poco empeze a aprender de este tema pero este modulo sirve unicamente para aprovechar al maximo TODO lo que es mysql (sqlite NO) ?

Es para que me quede claro....


Por lo que vi y entendi: EXCELENTE MODULO, sos un genio, segui asi !!!
Responder
#6
(29/09/2014, 12:48 PM)LuKks escribió: No entiendo mucho de mysql, ya que hace poco empeze a aprender de este tema pero este modulo sirve unicamente para aprovechar al maximo TODO lo que es mysql (sqlite NO) ?

Es para que me quede claro....

(29/09/2014, 04:57 AM)Destro escribió: En esta modificación de removió todo el soporte para sqlite y prepare query, quedando solo lo relacionado a threadquery.
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#7
Update 1.0b

Documente un poco el include,pero la verdad 0 ganas para andar explicando las funciones que son casi lo mismo que sqlx,
Responder
#8
No sirve para nada, reprobado.
Responder
#9
Pero raja de acá, anda a tu área. Juez.amxx


Tenes 24horas para compilar el .so
Responder
#10
(29/09/2014, 03:40 PM)Destro escribió: Pero raja de acá, anda a tu área. Juez.amxx


Tenes 24horas para compilar el .so

Roflmao

Deja el link de la libreria que me hablaste jeje
Responder
#11
http://dev.mysql.com/downloads/connector/c/

Esa es la librería
Responder
#12
muy bueno el modulo y la idea.

te conviene que no tenga errores (:iconopuñowsp: )
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#13
Mini update

Olvide de liberar una variable al terminar la consulta, no afectaba en nada,al menos que hagas 100000 consultas por hora y esa variable pase a ocupar varios MB.
Responder
#14
Destro, no se si lo viste pero si te interesa lo podes subir acá.
Responder
#15
Update 1.1
+native mysql_read_result2
+versión linux

Update 1.2
Fix bug
Check connection (mysql_ping)
Responder
#16
Tengo un problema, no me devuelve los resultados cuando hago multiples consultas en una sola.

Código:
input: UPDATE `test` SET Enabled=0 WHERE ExpireDate <= CURRENT_DATE;UPDATE `test` SET Suspended=0, SuspendedReason='', SuspendedExpire='' WHERE Suspended = 1 AND SuspendedExpire <= CURRENT_DATE;SELECT * FROM `test` WHERE `ServerTag` = 's1' OR `ServerTag` = '';
output: UPDATE `test` SET Enabled=0 WHERE ExpireDate <= CURRENT_DATE;UPDATE `test` SET Suspended=0, SuspendedReason='', SuspendedExpire='' WHERE Suspended = 1 AND SuspendedExpire <= CURRENT_DATE;SELECT * FROM `test` WHERE `ServerTag` = 's1' OR `ServerTag` = '';

Results: 0

Cuando lo corro la consulta en el phpmyadmin me devuelve 1 resultado.

PD: Se puede optimizar la consulta?
Responder
#17
el modulo no tiene soporte para múltiples consultas en un mismo query
puede que mas adelante le agregue soporte, pero ahora no tengo un internet decente para descargar todo lo que necesito para compilar el modulo.
Responder
#18
El bug que arreglaron aca https://github.com/alliedmodders/amxmodx...36d4a7743b no afecta a este modulo?
Responder
#19
creo que es un bug de cuando lo actualizaron para amxx 1.8.3, cuando tenga mas tiempo reviso bien.
Responder
#20
Destro, está en condiciones de ser usado fuera de pruebas (?, pregunto por lo que dijo #Goonzah :S
Responder
#21
En que casos se debe usar que usar el Handle "g_Connection" y en cuales "g_Host"?
Para que sirve cada uno de esos Handles?

Edit: MySQLt; g_host y g_connection
Responder
#22
Una consulta con este modulo se podria setear datos en una base de datos o es solo para consultas, porque yo intente hacerlo y me tiraba este error
L 07/15/2016 - 20:07:15: [MySQL-Th] No result set in this query!

Código PHP:
//code..
formatex(data2charsmax(data2), "INSERT INTO table (columna) VALUES ('%d')"Status)
mysql_query(g_Connection"query_handler"data2
Responder
#23
Ese error es porque en query_handler debes estar tratando de obtener resultados.
Responder
#24
Código PHP:
public query_handler(failstateerror[], errnumdata[], sizeFloat:queuetime)
{
    if(
failstate != TQUERY_SUCCESS)
    {
        
log_to_file("mysqlt.log""ERROR2: [%d]- [%s]"errnumerror)
        return
    }
    
    new 
statusdayfields[3]
    
    
fields[1] = mysql_fieldnametonum("vencimiento_status")
    
fields[2] = mysql_fieldnametonum("vencimiento_day")
    
    
status mysql_read_result(fields[1])
    
day mysql_read_result(fields[2])    

    
Checked status
    Crash 
day

    console_print
(0"[MYSQL THREAD QUERY] DATOS DE LA CONSULTA: %d | %d"statusday)

Tengo la misma que vos hiciste en el ejemplo, modifique un par de cosas.
Tendria que sacar todo menos el chequeo de si hay error no?
Responder
#25
obviamente que no podes usar el mismo handler para una consulta totalmente diferente
Código PHP:
public query_handler2(failstateerror[], errnumdata[], sizeFloat:queuetime)
{
    if(
failstate != TQUERY_SUCCESS)
    {
        
log_to_file("mysqlt.log""ERROR2: [%d]- [%s]"errnumerror)
        return
    }

Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)