Toon posts:

[Perl] Databases & queries

Pagina: 1
Acties:

Verwijderd

Topicstarter
Gegroet,

Ik ben momenteel een Perl script aan het schrijven om squid access logs te porten naar een database en om ze vervolgens gebruiksvriendelijk uit de database te halen door middel van een text based interface.

Het eerste programma, SQLDaemon.perl opent een pipe en wacht op input. Zodra er input is verwerkt hij die tot een array en slaat ze vervolgens op in een PostgreSQL database.
Het programma werkt, het wacht op input en slaat ze op in de database. MAAR hij doet dit niet altijd. sommige records worden verwerkt en sommige niet.een reden hiervoor weet ik niet. alle hulp is welkom
Je kan de volledige file hier vinden:http://users.telenet.be/Wundagore/squid/sqldaemon.perl

Het tweede programma SQLAdmin leest uit de database en voert de queries uit die het meest gebruikt gaan worden.
Dit is de database opbouw: CREATE TABLE squid (
date date,
time time,
network_address cidr,
http_status varchar(50),
request_method varchar(20),
url varchar(200),
mime_type varchar(50),
PRIMARY KEY (date,time,network_address));

de queries die mij problemen geven zijn selects waarbij ik een WHERE clausule heb op network_address. ik krijg daar geen resultaten mee om een rare reden.
Een andere query is op basis van http status codes en hier krijg ik geen output van, buiten dat het programma wel de column headings afdrukt.
Het programma vind je hier: http://users.telenet.be/Wundagore/squid/SQLAdmin.perl
alvast bedankt!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Krijg je een foutmelding op je insert, of worden de inserts gewoon niet uitgevoerd?

When life gives you lemons, start a battery factory


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:42
Verwijderd schreef op vrijdag 30 mei 2008 @ 12:14:
Het programma werkt, het wacht op input en slaat ze op in de database. MAAR hij doet dit niet altijd. sommige records worden verwerkt en sommige niet.
[..]
de queries die mij problemen geven zijn selects waarbij ik een WHERE clausule heb op network_address. ik krijg daar geen resultaten mee om een rare reden.
Aangezien je geen INSERT queries hebt met een WHERE clause, is mij niet duidelijk of de relevante data nu wel of niet goed opgeslagen wordt. Ga dat eens uitzoeken? Verder heeft dit topic ook een hoog niet-posten-maar-debuggen gehalte, naar mijn mening.

[ Voor 6% gewijzigd door Soultaker op 30-05-2008 12:23 ]


Verwijderd

Topicstarter
Wel ik krijg geen foutmelding op de insert ma ik denk eerder dat dit komt door het programma, ik heb geen foutopvanging voor de inserts. dat moet ik gaan onderzoeken hoe ik dat kan implementeren.
Ik ben nog maar 3 dagen met Perl bezig :-)
De inserts worden soms 3x na elkaar uitgevoerd en de 4de keer word dan niet gevonden in de database.

@ Soultaken: de WHERE clausules gelden op de SELECT queries van SQLAdmin.perl. ik heb al de volledige select string afgedrukt en als ik die in de SQL terminal ingeef, werkt het wel.
de print van de select string is identiek op het feit na dat .. WHERE network_address = '192.168.187.254 geen afsluitende ' afprint. maar dat doet het programma ook bij de voorgaande select queries en die werken wel.

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 18-11 09:33

Kettrick

Rantmeister!

Kan je dit in het geheel niet beter oplossen met psql en \copy ?

verder moet je in de postgres logs wel kunnen zien wat er mis gaat.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:42
Verwijderd schreef op vrijdag 30 mei 2008 @ 12:43:
de print van de select string is identiek op het feit na dat .. WHERE network_address = '192.168.187.254 geen afsluitende ' afprint. maar dat doet het programma ook bij de voorgaande select queries en die werken wel.
Ah, dat is een goed punt. Als je een string inleest met $choice2 = <STDIN>; dan lees je een regel inclusief regeleinde. Je hebt dan bijvoorbeeld "1.2.3.4\n" ingelezen, maar in de database staat natuurlijk "1.2.3.4" en dat komt niet overeen. Doe eens chomp $choice2; na het inlezen om het regeleinde te verwijderen.

Verwijderd

Topicstarter
Soultaker schreef op vrijdag 30 mei 2008 @ 13:06:
[...]

Ah, dat is een goed punt. Als je een string inleest met $choice2 = <STDIN>; dan lees je een regel inclusief regeleinde. Je hebt dan bijvoorbeeld "1.2.3.4\n" ingelezen, maar in de database staat natuurlijk "1.2.3.4" en dat komt niet overeen. Doe eens chomp $choice2; na het inlezen om het regeleinde te verwijderen.
Wel dat lost het probleem voor SQLAdmin op :-) Enorm bedankt!

Ik heb de code voor SQLDaemon nog wat bekeken en de logs van postgres. daar had ik niet aangedacht. in ieder geval blijkbaar heeft de request method die squid aflevert een hoop white spaces die soms te groot zijn voor het veld dat ik heb gereserveerd. momenteel draait het goed.
Vanavond gaat er een stress test volgen om te kijken hoeveel het aankan. heel fel bedankt voor de hulp!
Pagina: 1