Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Problème package mysqltcl DAV34
#1
Bonjour,

j'ai un problème avec l'exemple TCL du package de DAV34, voici le code :


tcl
# -> Login
set sql(login) "root"
# -> Mot de passe
set sql(pass) "pass"
# -> Nom de la base de donnée
set sql(db) "root"
# -> L'host a l'aquelle ce connecté
set sql(host) "localhost"
# -> Localisation de fichier mysql.sock
set sql(sock) "/tmp/mysql.sock"
 
 
###########
# PAQUETAGE #
###########
 
catch {package require mysqltcl}
 
#######
# CODE #
#######
 
#########
# CONNECT #
#########
proc service:connect {} {
set ::mysqlink [mysqlconnect -host $::sql(host) -user $::sql(login) -password $::sql(pass) -sock $::sql(sock)]
mysqluse $::mysqlink $::sql(db)
}
 
 
###########
# DECONNECT #
###########
 
proc service:deconnect {} {
mysqlclose $::mysqlink; unset -nocomplain ::mysqlink
}
 
########
# ISAUTH #
########
 
proc isauth {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and statut = 'On'"]
 
service:deconnect
}
 
##########
# ISSUSPEND #
##########
 
proc issuspend {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and suspend = 'On'"]
 
service:deconnect
}
 
############
# ISVALIDUSER #
############
 
proc isvaliduser {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select pseudo from access where pseudo = '$arg'"]
 
service:deconnect
}
 
################
# ISVALIDPASSWORD #
################
 
proc isvalidpassword {mot1 mot2} {
service:connect
 
return [mysqlsel $::mysqlink "select pseudo, pass from access where pseudo = '$mot1' and pass = '$mot2'"]
 
service:deconnect
}
 
########
# AUTH #
########
 
proc auth {arg} {
service:connect
 
mysqlsel $::mysqlink "UPDATE `access` SET `statut` = 'On' WHERE pseudo = '$arg'"
 
service:deconnect
}
 
#######
# AUTH #
#######
 
bind msg - auth msg:auth
proc msg:auth {nick host hand arg} {
set mot1 [lindex $arg 0]
set mot2 [lindex $arg 1]
if { $mot1 == "" || $mot2 == "" } { puthelp "NOTICE $nick :Commande auth : /msg $::botnick auth <pseudo> <pass>"; return 0 }
if { ![isvaliduser $mot1] } { puthelp "NOTICE $nick :$mot1 user inconnue !"; return 0 }
if { [isvalidpassword $mot1 $mot2] } {
if { [issuspend $mot1] } { puthelp "NOTICE $nick :Accés suspendu"; return 0 }
if { [isauth $mot1] } { puthelp "NOTICE $nick :Vous êtes déjà identifier !"; return 0 }
puthelp "NOTICE $nick :Félicitation, vous êtes identifier"
auth $mot1
} else {
puthelp "NOTICE $nick :Erreur, mot de passe incorrect."; return 0
}
}


En fait, ça fonctionne très bien sauf que ça me lance plusieurs processus dans phpmyadmin et au bout d'un certains temps "mysqlconnect/db server: Too many connections" normalement il ne devrait y avoir aucun process mysql qui doit rester ...

j'ai essayé plusieurs modifications et je n'ai pas réussis.

je vous remercie d'avance.

Cordialement.
#2
Tu as peut-être d'autres choses qui font appel à MySQL (comme un site web) ou plusieurs instances du TCL de lancées...
Le script en lui-même n'est pas en cause, il referme bien les connexions.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#3
Merci de ta réponse, mais j'ai juste un serveur IRC qui tourne avec le bot là sur mon dédié de développement.

Néanmoins à chaque fois que je fais une commande sur phpmyadmin je peux voir :

Id User Host db Command Time State Info
10 crash localhost robot Sleep 114 NULL


j'ai essayé de reboot la machine et j'ai toujours le même problème, et je pense pas avoir plusieurs instances du TCl de lancées ...

Je ne sais pas comment faire pour régler ce problème, je te serais très reconnaissant si tu as une bonne piste.

Merci.
#4
Il est aussi possible que le tcl fasse des connexions trop rapides, et/ou que les autres connexions se ferment mal.
Le fait que la connexion soit en "sleep" indique qu'elle est mal fermée (abandonnée par mysql).
Il faudrait aussi connaitre les autorisations de l'utilisateur "robot" sur ton mysql, cela peut aussi venir de là.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#5
Hum l'utilisateur est "crash" et non "robot", et les privilèges de l'user crash est en localhost ALL PRIVILEGES ... je pense pas que ça puisse avoir un impact car passé un temps j'utilisais un tcl de stats avec des timers et je n'avais pas ce genre de problème avec.
#6
je n'ai toujours pas trouvé de solution, merci quand même de ton aide.
#7
Bonsoir.
Je te donne un exemple.

tcl
proc issuspend {arg} {
service:connect
set reponse [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and suspend = 'On'"]
service:deconnect
return $reponse
}



Crdlt BeussAy
#8
Parfait beussAy :D ça corrige tous mes problèmes je te remercie 1000 fois :)
#9
Le fait de ne pas avoir de return laisse la connexion ouverte (le recordset est toujours actif) ?
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#10
J ai pas compris ce que tu voulais dire.
#11
Ah non, au temps pour moi, j'avais pas suivi ta correction, j'ai rien dit.

@crash: effectivement, si tu fais un return avant d'appeler le service:deconnect, il n'est jamais appelé. return fait sortir de le procédure.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
Oui qq corrections au niveau du tuto de dav seraient les bienvenues. Ce tuto est il sur eggdrop.fr, j ai pas regarde ?
Comme le mysqlsel sur un update c est possible?Pour ma part j utilise mysqlexec.

Crdlt BeussAy
#13
Oui il est ici le tuto http://www.eggdrop.fr/Paquage:mySQLTCL

En vous remerciant encore, je me disais bien que ça venait du TCL en lui même.
#14
J'ai modifié les sources du tutorial pour qu'elles soient justes.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#15
Enfin connecté du pc, j'en profite pour attirer ton attention sur cette proc :

tcl
bind dcc - afficher dcc:afficher
proc dcc:afficher {hand idx arg} {
	service:connect
	mysqlsel $::mysqlink "SELECT * FROM `access` ORDER BY id"
	if {[mysqlresult $::mysqlink rows] ne 0} {
		while {[set row [mysqlnext $::mysqlink]] != ""} {
                  putlog "id : [lindex $row 0]"
                  putlog "pseudo : [lindex $row 1]"
                  putlog "pass : [lindex $row 2]"
                  putlog "grade : [lindex $row 3]"
                  putlog "suspend : [lindex $row 4]"
                  putlog "statut : [lindex $row 5]"
	        }
        }
    service:deconnect
}


Je pense que le plus simple est directement de mettre ça sous forme de liste.
1 : ouverture
2 : récupération des données
3 : fermeture

Ensuite on peut tranquillement travailler sur notre liste.
Exemple :


tcl
bind dcc - afficher dcc:afficher
proc dcc:afficher {hand idx arg} {
# Recupération des informations sous forme de liste
service:connect
set res [mysqlsel $::mysqlink "SELECT * FROM `access` ORDER BY id" -list]
service:deconnect
    if { [string length $res] ne 0 } {
        foreach row $res {
            putlog "id : [lindex $row 0]"
            putlog "pseudo : [lindex $row 1]"
            putlog "pass : [lindex $row 2]"
            putlog "grade : [lindex $row 3]"
            putlog "suspend : [lindex $row 4]"
            putlog "statut : [lindex $row 5]"
        }
    }
}


Je pense que c'est un point important à connaitre lorsque l'on code un gros projet ayant pas mal de requêtes de ce style.


Crdlt


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Demande] Mysqltcl, Explication. aliasangelius 2 3,472 13/07/2014, 16:28
Last Post: aliasangelius
  MysqlTCL Herode 6 4,816 01/02/2011, 09:56
Last Post: CrazyCat
  can't find package htmlparse alanfollow 5 5,000 11/01/2011, 13:51
Last Post: CrazyCat
  Windrop + mysqltcl + sql.free.fr Oggy 1 3,742 22/06/2007, 20:10
Last Post: CrazyCat

Forum Jump:


Users browsing this thread: 1 Guest(s)