MSSQL, ODBC, Perl és az UTF-8

Rég nem nyúltam komolyabban Perl scripthez, de most ismét eljött az ideje, hogy egy rendcsinálás és mentés/archiválás optimalizálás okán komolyabb eszközt vegyek elő.

Ami adott CentOS7 meg egy szééép MS-SQL szerver, természetesen Windows-on. A feladat fájok (naná, hogy ékezetes nevekkel...) pakolgatása a Linuxon, és ennek lekövetése az adatbázisban (útvonal+fájlnév egy mezőbe beírva, mert anno így lett kitalálva...)

Az UTF-8/Unicode szép és jó dolog, igaz, Perl-ben talán nem annyira egyszerű, de azért egyelőre úgy néz ki, sikerült megoldani.

Első körben persze az ODBC-t kéne kireszelni - a Microsoft-os msodbcsql csomag ugyan fent van, de nagyon nem akarja az igazságot (mint kiderült tényleg nem működik DBD::ODBC vele), úgyhogy egy próbát megér alapon előszedem a freetds-t.
A freetds legutolsó stabil verziója freetds-patched.tar.gz néven tölthető le, ezt jól átcsomagoltam freetds-1.00.86.tar.bz2 névre, és huss, az rpmbuild -ta freetds-1.00.86.tar.bz2 gyorsan össze is rakta a szükséges csomagokat, amik mentek a központi repóba, onnan meg telepítésre.
odbc.ini-be server, database meg port a minimum, beírom, nagyjából megy a script, "csak" az ékezetek...

Varázsszavak első körben, bár ebben eddig semi új nincs, maximum némi homlokcsapkodás, hogy hogy is maradhatott ki a binmode... :-)

use utf8;
binmode(STDOUT, ":utf8");

A kiírás rendben, de nézzünk egy picit bonyolultabb kérést, mondjuk "select ezt, azt from valami where emez like '%árvíztűrő%'"

Ahogy az a dokisban is írva vagyon, a prepare ezt nem szereti - alapból nem szól, de eredményt sem ad. A megoldás fél mondattal ott van a dokumentációban: odbc_execdirect kikapcsolandó. Ennek a módja meg ennyi:

DBI->connect('dbi:ODBC:MSSQL', $user, $password, {odbc_execdirect=>0});

Innentől már csak a logikát meg az adatok matatását kell belehegeszteni, az meg szerintem menni fog :-)

Update:

Ha valaki nem tudná (ahogy eddig én sem, pedig ott van a FreeTDS FAQ-ban...), egy kapcsolatban egyszerre csak egy query lehet aktív, tehát ha olyat szeretnék, hogy egy select-ben visszakapott összes sorra csináljon valamit a program, és az eredményt írja vissza, ahhoz kettő darab kapcsolatot kell felépíteni a DB felé.
Most, hogy van $dbh1=DBI->connect(...) és $dbh2=DBI->connect(...), elkezdett működni a dolog.

Hozzászólások

> Azért Perl-ben is lehet szépen kódolni, meg lehet szép dolgokat csinálni

En meg nem lattam olyan programot perlben, amit ne lehetett volna atirni egysorosra:))

---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

Évekkel ezelőtt írtam egy webes előtétet, szűkített funkcionalitással egy másik webes motyóhoz, és az egyik félkész modult megtaláltam a régi lomjaim között. Olvasható, mi több, érthető volt, hogy mit és miért csináltam benne anno. Igen, olvasható és értelmezhető - nem utolsó sorban azért, mert normálisan tördlet/formázott a kód, és illendő mértékben (vagy picit bővebben) kommenteztem.

A "gyorsan kell valamit csinálni" scriptek meg vagy ilyenek, vagy sem, de ott is van azért néháyn kapaszkodó (név, paraméterezések, konstansok értékei, elnevezések), amik kapaszkodóul szolgálnak, hogy mi a búbánat lehet az a sorminta :-)