Erreur lecture fichier.db
#1
Bonjour,
Mon robot marche avec vhost dans une fichier.db sous le nom de "hosts.db" hors si je fait trop de fois une meme commande (exemple: !eggdrop) le robot plante avec l'erreur suivante:
[01:54] Erreur tcl : can not find channel named "couldn't open "scripts/clams/sources/hosts.db": file table overflow"

A l'interieur du fichier.db les vhosts sont ligne par ligne sous la forme "vhost lvl" (Exemple pour la ligne1 : test.eggdrop.fr 1)

Malheuresement je ne comprend pas cette erreur si quelqu'un a deja eu cette erreure et peut m'expliquer cela serais bien gentil.
Répondre
#2
A vue de nez, tu ouvres des handles sur des fichiers (avec open) que tu ne refermes jamais (avec close).

Ceci dit, sans voir ton code, on peut supposer un peu tout et n'importe quoi, y compris l'éventualité que tu aies foutu dedans la ligne suivante :
TCL
putlog {[01:54] Erreur tcl : can not find channel named "couldn't open "scripts/clams/sources/hosts.db": file table overflow"}


Répondre Avertir
#3
Oui, excusez moi de l'erreur voici ci-dessou le code tcl qui appel les vhosts dans le fichier hosts.db
TCL
proc verify:host {pseudo} {
	catch {open [clams:install_directory]sources/hosts.db r} channel
	while {![eof $channel]} { 
		gets $channel hosts
		set ident [lindex $hosts 0]
		set host [lindex $hosts 1]
		set lvl [lindex $hosts 2]
		set ok_host 0
		set ok_ident 0
		if {$host eq $::chost($pseudo)} { 
			if {$ident eq $::ident($pseudo) || $ident eq "any"} {
				return $lvl
			}
		}
	}
	catch {close $channel}
	return 0
}


Répondre
#4
C'est bien ce que je disais donc, tu ne fermes pas les fichiers que tu ouvres au moyen de "close" et au bout d'un moment tu dépasses le nombre maximum de handles ouverts.
Répondre Avertir
#5
Je doit dire que la je suis dans le flou
Répondre
#6
la ligne return $lvl met fin à ta procédure en retournant le contenu de la variable $lvl; par conséquent, quand cela se produit, la ligne catch {close $channel} n'est pas exécutée et le handle reste ouvert.

Après un certain nombre d'utilisations de ta commande, les handles restés ouverts se sont cumulés jusqu'à atteindre la limite maximum autorisée par ton eggdrop et tu obtiens cette erreur.

La solution est de remplacer
TCL
if {$ident eq $::ident($pseudo) || $ident eq "any"} {
     return $lvl
}


par
TCL
if {$ident eq $::ident($pseudo) || $ident eq "any"} {
     close $channel
     return $lvl
}


Et au passage, pourquoi utiliser catch lors de l'ouverture et de la fermeture ?
Il existe une panoplie de commandes pour vérifier l'existence d'un fichier ou non, le droit de le lire/écrire ou non, etc...
Plutôt qu'utiliser catch pour que les erreurs ne soient pas gênantes, gère-les.

Jette un oeil aux commandes suivantes :
file exists
file readable
file writable
Répondre Avertir
#7
Ouki je vais voir demain matin les commandes que tu m'a cité , merci beaucoup.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté