Entscheidung auf Grund der Länge des DB Eintrags

pixel

Neuer User
Mitglied seit
25 Jan 2006
Beiträge
105
Punkte für Reaktionen
0
Punkte
16
Hallo zusammen,

in der DB habe ich folgenden Key/Value

CF/123456 : 345678

Bisher frage ich lediglich an ob ein Eintrag CF/123456 vorhanden ist:
Code:
exten => _X.,n,GotoIf($[foo${DB(CF/123456)} != foo]?100:20)
Ich würde jedoch gerne prüfen ob der Wert für CF/123456 drei Stellen hat oder eben mehr. Hierzu benötige ich aber eine Methode die mir die Länge (Anzahl Stellen) einer Variable zurück gibt, gibt es so eine bzw. läßt es sich ander lösen.

Viele Grüße
pixel
 
Bedingung mit numerischem Vergleich

Hallo zusammen,

ich möchte im Dialplan innerhalb einer GotoIf einen ganz einfachen Vergleich zweier Zahlen. Ich habe aber selbst im Kurs keine Hinweis darauf gefunden was mich etwas stutzig macht und evtl. darauf hindeutet das es mit GotoIf überhaupt nicht geht.

In der AsteriskDB habe ich für die aktuelle EXTEN einen Eintrag:
Code:
${DB(CF/${EXTEN})}
Der derzeitige Eintrag hat eine Länge von 11 Stellen. Die kann ich mir im Dialplan auch mittels:
Code:
exten => _X.,n,NoOp(Länge des Eintrags: ${LEN(${DB(CF/${EXTEN})})})
Was am CLI zu:
Code:
Executing [XXXXXX@capi-in:10] NoOp("CAPI/ISDN1#02/XXXXXX-11", "Länge des Eintrags: 11") in new stack
Nun möchte ich in einer GotoIf-Anweisung prüfen ob die Anzahl der Stellen kleiner oder gleich 3 ist. Dies habe ich mit:
Code:
exten => _X.,n,GotoIf(${LEN(${DB(CF/${EXTEN})})} <=3?:100)
Es wird jedoch nicht zur Prioität 100 gesprungen sondern der direkt folgende Befehl ausgeführt was ja bedeutet das meine Bedinung falsch formuliert sein muß. Wo habe ich einen Fehler gemacht?

Viele Grüße
pixel
 
Evtl. liegt es am <=. Probier es doch anders rum, indem Du >4 sagst und die Sprungmarken vertauschst
 
Probiers mal mit:

Code:
exten => _X.,n,GotoIf,$[COLOR="Red"][[/COLOR]LEN(${DB(CF/${EXTEN})})[COLOR="Red"]][/COLOR] <= "3"?:100)

Wo habe ich einen Fehler gemacht?
Vermutlich zu wenig (oder die falsche) Doku gelesen...

Übrigens hättest Du diese Frage ruhig in Deinen Fragethread von gestern schreiben können, anstatt noch einen Grundsatzfragen-Thread zu eröffnen.
 
betateilchen schrieb:
Probiers mal mit:

Code:
exten => _X.,n,GotoIf,$[COLOR="Red"][[/COLOR]LEN(${DB(CF/${EXTEN})})[COLOR="Red"]][/COLOR] <= "3"?:100)

Ja das Beispiel hatt ich auf:
http://www.voip-info.org/wiki/view/Asterisk+Expressions
dann auch noch gefunden. Mit dem < oder <= hatte es aber trotzdem nicht funktioniert obwohl die Operanten laut Doku eigentlich richtig sind. Seltsamerweise hat es dann mit dem > und umgegehrten Sprungzielen funktioniert.

betateilchen schrieb:
Vermutlich zu wenig (oder die falsche) Doku gelesen...
Zu wenig wohl nicht die falschen vielleicht.
 
Wahrscheinlich musst Du die Anführungszeichen um die 3 weglassen damit es wirklich numerisch korrekt ist, so wird der Ausdruck als Text gewertet, nicht als Zahl.
 
Das mit den Anführungszeichen ist schon ok so. Aber das Problem dürfte wirklich das fehlende erste Sprungziel für die "TRUE" Bedingung sein. Deshalb funktioniert es dann mit der Umkehrung, da man das Ziel für die "FALSE" Bedingung auf jeden Fall weglassen darf. Ich konnte das vorhin nur nicht in der Praxis testen, da ich von hier aus keinen Zugriff auf meine Server außerhalb des hiesigen Netzwerkes habe.
 
AstDB, im Subtree nach Value suchen

Hallo zusammen,

ich habe in der AstDB folgenden Subtree:
Code:
TEST/12345:  100
TEST/23456:  101
TEST/34567:  102
Nun suche ich nach einer Möglichkeit eine Suche zu formulieren die in TEST/.. nachschaut ob z.B. der Value 101 vorhanden ist. Geht das?

In der Doku gibt es lediglich:
* DBdel: Delete a key from the database
* DBdeltree: Delete a family or keytree from the database
* DBget: Retrieve a value from the database
* DBput: Store a value in the database

Aber mit DBget scheint das nicht zu funktionieren da dieser ja immer family/key erwartet und ich habe keine Möglichkeit gefunden mit Platzhaltern zu arbeiten.

Viele Grüße
pixel
 
Du musst die Leerzeichen weglassen.
Auf Anführungszeichen kannst Du in diesem Fall auch verzichten.
Asterisk neigt dazu "alphanumerisch" zu vergleichen mit dem Effekt das es unter Umständen geht, aber eben anders als man denkt.
 
Das mit den Leerzeichen sollte in aktuellen Asterisk-Versionen kein Problem sein.
 
Aber mit DBget scheint das nicht zu funktionieren da dieser ja immer family/key erwartet und ich habe keine Möglichkeit gefunden mit Platzhaltern zu arbeiten.

Dafür ist die Asterisk-Datenbank nicht ausgelegt. Wenn Du solche komplexen Suchen realisieren willst, solltest Du das ganze mit einer MySQL Anbindung machen, da kannst Du dann Selects generieren, bis der Server zusammenbricht.

Grundsätzlich beziehen sich solche Fragen übrigens auf den Rufnummernplan - sie gehören deshalb auch nicht in die Rubrik "Asterisk Allgemein" :motz:


Deine ganzen Datenbankorgienthreads, die ja inhaltlich alle zusammengehören, habe ich nun einfach mal zusammengefaßt und in die richtige Rubrik gestellt.
 
Soweit ich weiß ist ja auch die Anbindung an PostgreSQL möglich. Kennt jemand hierzu brauchbare Dokus?
 
Schau mal in die README Dateien in den Asterisk-Sourcen, da sollte was dazu drinstehen. Grundsätzlich dürfte das nicht viel anders sein als bei MySQL
 
Kostenlos!

Statistik des Forums

Themen
248,471
Beiträge
2,292,168
Mitglieder
377,913
Neuestes Mitglied
BroFish