From aarnal at me.gob.ve Fri Apr 1 02:04:03 2005 From: aarnal at me.gob.ve (Alexis Arnal) Date: Fri Apr 1 08:03:54 2005 Subject: [caracas-pm] Obtener IP Message-ID: <1112349843.1186.1.camel@03omisis090> my $ip=$ENV{'REMOTE_ADDR'}; -- Linux user number 378161 Caracas-Venezuela From emhn at telcel.net.ve Fri Apr 1 13:14:19 2005 From: emhn at telcel.net.ve (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Fri Apr 1 13:13:35 2005 Subject: [caracas-pm] Obtener IP In-Reply-To: <1112349843.1186.1.camel@03omisis090> References: <1112349843.1186.1.camel@03omisis090> Message-ID: <1112390059.5734.2.camel@localhost> On Fri, 2005-04-01 at 12:04 +0200, Alexis Arnal wrote: > my $ip=$ENV{'REMOTE_ADDR'}; Eso s?lo funciona: - Si el script es un CGI o corre dentro de mod_perl. - Si el Apache del cual depende tiene activado el uso de variables de ambiente standard. -- Ernesto Hern?ndez-Novich - On Linux 2.6.11 i686 - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't apt-get it, it isn't useful or doesn't exist. GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 From aarnal at me.gob.ve Fri Apr 1 07:58:18 2005 From: aarnal at me.gob.ve (Alexis Arnal) Date: Fri Apr 1 13:57:57 2005 Subject: [caracas-pm] CASO PL/PERLdido Message-ID: <1112371098.1270.13.camel@03omisis090> Saludos, Estoy estudiando la manera de implementar procedimientos almacenados en Postgres con plperl, pero encuentro que la documentaci?n es un poco escasa en el manual de Postgres. He revisado en algunos libros y apenas lo nombran mostrando siempre los dos mismos ejemplos del manual, estuve buscando en internet y tampoco encuentro gran cosa. Esto es una de las cosas que estoy inventando: 1.- Creo una funci?n que dados dos n?meros $a y $b retorne un arreglo en que se guarda el mayor hasta que ambos son iguales /********************** *funcion flechazo10 **********************/ CREATE FUNCTION perl_max (integer, integer) RETURNS text AS ' ($a,$b)=@_; $i=0; until ($a==$b) { if ($a > $b) { $array[$i]=$a; } else { $array[$i]=$b; } $i++; $a--; $b++; } return @array ' LANGUAGE plperl; ************************** Y este es el script con que llamo a la funci?n ************************** #!/usr/bin/perl -w use DBI; use Benchmark; $start = new Benchmark; $user="aarnal"; $password='1234'; $host = 'localhost'; $port= 5432; $driver="dbi:Pg:dbname=kit;host=$host;port=$port"; unless ($dbh= DBI -> connect($driver,$user,$password)) { print "\n *** No se pudo contactar el servidor ***\n"; } $preparar = $dbh -> prepare("select perl_max (?,?)"); $statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n"; $a = 500; $b = 0; @array=$statement -> execute($a,$b) or die "\nError ($DBI::err): $DBI::errstr\n"; print $array[0],"\n"; $end = new Benchmark; $elapsed = timediff ($end,$start); print "Tiempo de Ejecucion :", timestr ($elapsed),"\n"; *************************** Y este es el resultado: *************************** aarnal@03omisis090:~$ perl ejr_almacenado.pl 1 Tiempo de Ejecucion : 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) **************************** Quiero retornar un arreglo con todos los valores que guardo en @array y no encuentro la manera Gracias Si me pueden ayudar o indicar donde puedo encontrar m?s documentaci?n, ejemplos y/o mejores pr?cticas para la implementaci?n de procedimientos almacenados -- Linux user number 378161 Caracas-Venezuela From aarnal at me.gob.ve Sun Apr 3 23:50:36 2005 From: aarnal at me.gob.ve (Alexis Arnal) Date: Mon Apr 4 05:50:52 2005 Subject: [caracas-pm] Caso PERLdido Message-ID: <1112597436.1180.2.camel@03omisis090> Saludos, Estoy estudiando la manera de implementar procedimientos almacenados en Postgres con plperl, pero encuentro que la documentaci?n es un poco escasa en el manual de Postgres. He revisado en algunos libros y apenas lo nombran mostrando siempre los dos mismos ejemplos del manual, estuve buscando en internet y tampoco encuentro gran cosa. Esto es una de las cosas que estoy inventando (siguiendo los ejemplos: Creo una funci?n que dados dos n?meros $a y $b retorne un arreglo en que se guarda el mayor hasta que ambos son iguales /********************** *funcion flechazo10 **********************/ CREATE FUNCTION perl_max (integer, integer) RETURNS text AS ' ($a,$b)=@_; $i=0; until ($a==$b) { if ($a > $b) { $array[$i]=$a; } else { $array[$i]=$b; } $i++; $a--; $b++; } return @array ' LANGUAGE plperl; ************************** Y este es el script con que llamo a la funci?n ************************** #!/usr/bin/perl -w use DBI; use Benchmark; $start = new Benchmark; $user="aarnal"; $password='1234'; $host = 'localhost'; $port= 5432; $driver="dbi:Pg:dbname=kit;host=$host;port=$port"; unless ($dbh= DBI -> connect($driver,$user,$password)) { print "\n *** No se pudo contactar el servidor ***\n"; } $preparar = $dbh -> prepare("select perl_max (?,?)"); $statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n"; $a = 500; $b = 0; @array=$statement -> execute($a,$b) or die "\nError ($DBI::err): $DBI::errstr\n"; print $array[0],"\n"; $end = new Benchmark; $elapsed = timediff ($end,$start); print "Tiempo de Ejecucion :", timestr ($elapsed),"\n"; *************************** Y este es el resultado: *************************** aarnal@03omisis090:~$ perl ejr_almacenado.pl 1 Tiempo de Ejecucion : 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) **************************** Quiero retornar un arreglo con todos los valores que guardo en @array y no encuentro la manera Gracias Si me pueden ayudar o indicar donde puedo encontrar m?s documentaci?n, ejemplos y/o mejores pr?cticas para la implementaci?n de procedimientos almacenados -- Linux user number 378161 Caracas-Venezuela -- Alexis Arnal Linux user number 378161 Caracas-Venezuela From emhn at telcel.net.ve Sun Apr 10 09:02:35 2005 From: emhn at telcel.net.ve (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Sun Apr 10 09:01:05 2005 Subject: [caracas-pm] Ejercicio del mes [SOLUCION] In-Reply-To: <1111852007.16369.139.camel@localhost> References: <1111852007.16369.139.camel@localhost> Message-ID: <1113148955.13956.47.camel@localhost> On Sat, 2005-03-26 at 11:46 -0400, Ernesto Hern?ndez-Novich wrote: > El comando last permite ver el historial de conexiones de usuarios al > sistema. En particular, si uno utiliza el pseudousuario 'reboot' puede > saber las veces en que se reinici? el sistema. > > reboot system boot 2.6.11 Fri Mar 11 17:13 (14+18:29) > reboot system boot 2.6.11 Thu Mar 3 11:11 (8+06:00) > reboot system boot 2.6.11 Wed Mar 2 13:18 (9+03:53) > > La ?ltima columna representa el n?mero de d?as, horas y minutos que el > sistema estuvo encendido hasta el siguiente reboot (y para el caso del > m?s reciente, cu?nto tiempo tiene encendido). > > Escriban un programa que reciba como entrada el listado producido por el > comando 'last reboot' y produzca un breve reporte (formato libre) que > indique la cantidad de reinicios, m?ximo tiempo en servicio, m?nimo > tiempo en servicio y tiempo promedio en servicio. Mi soluci?n a continuaci?n. Algunas observaciones que hacen posible escribirlo de manera compacta (hablamos de ellas en la sesi?n de one-liners, y el ejercicio fue seleccionado adrede para aprovecharlas): 1. Como s?lo me interesa imprimir resultados calculados, aprovecho la opci?n -n, y s?lo hago print expl?cito. M?s a?n, s?lo me interesa imprimir al final, por tanto usamos un bloque END. 2. Para ahorrarme el chomp y los \n en cada print, uso el flag -l. 3. Me interesa la ?ltima columna, si uso el flag -a las columnas van _autom?ticamente_ al arreglo @F, y $F[-1] es la ?ltima. No hay que complicarse con splits, substrs, regexes, etc. 4. Normalizo las medidas a minutos usando un regex y aritm?tica. 5. Puede hacerse todo en una sola pasada porque: - S?lo me interesan l?neas que digan 'reboot'. - El n?mero de l?neas contempladas se cuenta a medida que se consideran. - Si sumo en un total todas las medidas, al final simplemente debo dividir entre el total de l?neas y tengo el promedio. - Si tengo un "m?ximo hasta ahora", lo reemplazo por el nuevo valor s?lo si el actual es mayor que el anterior. Lo mismo se puede decir de un "m?nimo hasta ahora". Para ello necesito que el m?ximo comience en cero (as? el primer valor ser? mayor) y que el m?nimo comience en un valor absurdamente alto (as? el primer valor ser? menor). Lo primero es un hecho gracias a Perl, lo segundo debo lograrlo inicializando en un bloque BEGIN. 6. Uso el excelente m?dulo Date::Manip para convertir de minutos a d?as, minutos y segundos. As?, menos de una pantalla... #!/usr/bin/perl -lan use Date::Manip qw(ParseDateDelta Delta_Format); $ENV{TZ} = '-0400'; sub m2d { my $min = shift; my ($d,$h,$m) = Delta_Format(ParseDateDelta("$min min"),0,qw(%dh %hv % md)); return "(" . (($d > 0) ? "$d+" : "") . "$h:$m)"; } BEGIN { $i = 1e100; } next unless /reboot/; $n++; $F[-1] =~ /\(((\d+)\+)?(\d+):(\d+)\)/; $v = $2*24*60 + $3*60 + $4; $x = $v unless $x > $v; $i = $v unless $i < $v; $a += $v; END { print "n: $n max: ",m2d($x)," min: ",m2d($i)," avg: ",m2d($a/$n); } -- Ernesto Hern?ndez-Novich - On Linux 2.6.11 i686 - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't apt-get it, it isn't useful or doesn't exist. GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 From aarnal at gmail.com Mon Apr 11 12:50:06 2005 From: aarnal at gmail.com (Alexis Arnal) Date: Mon Apr 11 12:50:26 2005 Subject: [caracas-pm] PERL DBI+Procedimientos Almacenados en Postgres In-Reply-To: <97aa8b805041112222ea29abc@mail.gmail.com> References: <97aa8b805041112222ea29abc@mail.gmail.com> Message-ID: <97aa8b805041112502e39c460@mail.gmail.com> Saludos, Seguimos luchando con los procedimientos almacenados en Postgres. Hemos logrado hacerlos funcionar desde dentro de Postgres pero no hallamos la manera de ejecutarlos desde una aplicaci?n desarrollada en PERL que utiliza el m?dulo DBI para acceder a la base de datos. Esto es lo que estamos probando: Tengo una tabla tdatos_personales con dos campos ci | nombre ---|---------- 1 | ALEXIS Est? es la funci?n que crea el cursor y lo abre ------------------------------------------------------------ CREATE OR REPLACE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' BEGIN OPEN $1 FOR SELECT * FROM tdatos_personales; RETURN $1; END; ' LANGUAGE plpgsql; BEGIN; -------------------------------------------------------------- Luego lo ejecutamos esto desde la consola de postgres: --------------------------------------------------------------- SELECT reffunc('funccursor'); FECTH ALL IN funccursor; COMMIT ---------------------------------------------------------------- Y funciona perfecto. El problema es cuando queremos ejecutar lo anterior desde una aplicaci?n que accede a la base de datos por medio de PERL DBI. Este es el c?digo perl: ----------------------------------------------------------------- #!/usr/bin/perl -w #SCRIPT QUE SE CONECTA AL SERVIDOR PARA LLENAR LAS TABLAS use DBI; $user="alexis"; $password='1234'; $host = '127.0.0.1'; $port= 5432; $driver="dbi:Pg:dbname=dbprueba;host=$host;port=$port"; unless ($dbh= DBI -> connect($driver,$user,$password)) { print "\n *** No se pudo contactar el servidor ***\n"; } $preparar = $dbh -> prepare("SELECT reffunc('funccursor')"); $statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n"; $statement -> execute or die "\nError ($DBI::err): $DBI::errstr\n"; $preparar = $dbh -> prepare("FETCH ALL IN funccursor"); $statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n"; $statement -> execute or die "\nError ($DBI::err): $DBI::errstr\n"; $datos = $statement -> fetchrow_array; print "datos"; ----------------------------------------------------------------- Esto arrojo un ERROR(7): No existe el cursor <> Si por favor me pueden decir que estoy haciendo mal se lo agradezco; si existe otra manera de hacerlo m?s eficiente mucho mejor, si saben de un link donde pueda encontrar ejemplos para comoparar tambien me sirve, Tambien me gustar?a saber su opini?n acerca de PL/Perl ya que tambien lo estamos evaluando, sin resultados positivos. Atte. Alexis Arnal From aarnal at gmail.com Tue Apr 12 09:39:53 2005 From: aarnal at gmail.com (Alexis Arnal) Date: Tue Apr 12 09:40:05 2005 Subject: [caracas-pm] Procedimientos Almacenados Message-ID: <97aa8b80504120939157f6e95@mail.gmail.com> Saludos, Estoy tratando de implementar procedimientos almacenados en postgres desde una aplicaci?n Perl que utiliza DBI He revisado la documentaci?n de DBI y DBD::Pg y encuentro que no est?n soportados los procedimientos almacenados, sin embargo consegu? un m?dulo de extensi?n de DBI llamado DBIx::ProcedureCall pero no logro hacerlo funcionar Si alguien sabe algo acerca de esto se lo agradezco ya que tengo casi tres semanas dandome golpes con esto. Atte. Alexis Arnal MED-Caracas From emhn at telcel.net.ve Wed Apr 13 09:36:03 2005 From: emhn at telcel.net.ve (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Wed Apr 13 09:34:25 2005 Subject: [caracas-pm] Procedimientos Almacenados In-Reply-To: <97aa8b80504120939157f6e95@mail.gmail.com> References: <97aa8b80504120939157f6e95@mail.gmail.com> Message-ID: <1113410163.7473.107.camel@localhost> On Tue, 2005-04-12 at 18:39 +0200, Alexis Arnal wrote: > Estoy tratando de implementar procedimientos almacenados en postgres > desde una aplicaci?n Perl que utiliza DBI > > He revisado la documentaci?n de DBI y DBD::Pg y encuentro que no est?n > soportados los procedimientos almacenados, Eso es falso. La documentaci?n lo que dice es que no existe ning?n m?todo _espec?fico_ para ejecutar procedimientos almacenados, y que debes determinar c?mo lo hace el manejador particular. En el caso de PostgreSQL, usualmente se invoca el procedimiento almacenado en un SELECT y eso funciona perfecto. En psql... create or replace function test(integer) returns integer as ' begin return $1 + 41; end;' language 'plpgsql'; ...que luego pruebas haciendo... select test(1); test ------ 42 (1 row) Eso te dice que para invocar el procedimiento almacenado hay que pedirle a DBI que ejecute "select test(1)", entonces, en Perl #!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect('dbi:Pg:dbname=test','emhn'); my $sql = q{ select test(?) }; my $sth = $dbh->prepare($sql); for (1..10) { $sth->execute($_); my ($val) = $sth->fetchrow_array; print "$val "; } print "\n"; $sth->finish; $dbh->disconnect; Y aparecer? "42 43 ... 51". Como ver?s se puede ejecutar el procedimiento almacenado y hasta pasarle par?metros. Si el procedimiento retorna _una_ tupla, con el fetchrow_array tienes. Si el procedimiento retorna varias tuplas la cosa cambia, digamos tengo una tabla 'foo' uno de cuyos campos es booleano y quiero hacer una funci?n que filtre seg?n el campo sea cierto o falso, y me retorne _todos_ los registros que cumplan, entonces en psql create or replace function dame ( boolean ) returns setof foo as ' declare registro foo%ROWTYPE; begin for registro in select * from foo where flag = $1 loop return next registro; end loop; return; end;' language 'plpgsql'; ...y la pruebo haciendo select * from dame ('T'); name | number | flag ------+--------+------ Foo | 1 | t Bar | 1 | t (2 rows) Obviamente, desde Perl la llamada cambiar?, y el cuerpo del programa deber?a cambiarse por algo como my $sql = q{ select * from dame(?) }; my $sth = $dbh->prepare($sql); my ($text,$number,$flag); $sth->execute('T'); $sth->bind_columns(\$text,\$number,\$flag); while ($sth->fetchrow_arrayref) { print "$text $number $flag\n", } Y aparecer?n las l?neas correspondientes a los registros. Est? forma adem?s de r?pida es ahorrativa en memoria (del lado Perl) y espeluznantemente clara porque no hay nada m?s limpio que usar las variables $text, $number y $flag dentro del ciclo y ya tendr?n los valores que me interesan. Ahora, desde el punto de vista de PostgreSQL no es lo m?s eficiente, porque funciones que retornan SETOF calculan _todo_ el query y luego van dando los resultados uno por uno. Pero esos resultados tienen que estar en alguna parte, y esa es la memoria en el servidor; si uno quiere moverse para arriba o para abajo en el conjunto de datos, o bien trabajar s?lo con algunos, se desperdicia memoria y recursos. Pero si se les ocurre copiarlos al cliente (el programa Perl) para trabajar con ellos. Ah? es donde se quiere usar cursores, que son m?s complejos de aplicar, pero mucho m?s eficientes. La misma funci?n, pero usando un cursor que encima recibe un par?metro, ser?a create or replace function damec ( boolean ) returns refcursor as ' declare resultados cursor(arg boolean) for select * from foo where flag = arg; begin open resultados($1); return resultados; end;' language 'plpgsql'; y para probarla desde psql es un poco m?s complejo (y lo que significa cada paso est? explicado en el manual de PostgreSQL) test=> begin; BEGIN test=> select damec('T'); damec ------------ resultados (1 row) test=> fetch all in resultados; name | number | flag ------+--------+------ Foo | 1 | t Bar | 1 | t (2 rows) test=> commit; COMMIT De modo que si quiero hacer uso de ?ste procedimiento en Perl, me basta my $sql = q{ select damec(?); fetch all in resultados; }; my $sth = $dbh->prepare($sql); $sth->execute('T'); my ($text,$number,$flag); $sth->bind_columns(\$text,\$number,\$flag); while ($sth->fetchrow_arrayref) { print "$text $number $flag\n", } $sth->finish; Y esto ser? no solamente r?pido, sino econ?mico en memoria en _ambos_ lados. M?s a?n, utilizando FETCH manualmente (dentro del procedure, preferiblemente) uno se puede mover hacia "arriba" y "abajo" en el conjunto de datos retornados. Y si lo que quieres es escribir un procedimiento en Perl, tirado de f?cil. La siguiente funci?n cambia la columna 'name' a l33tsp34k solamente si la columna 'flag' tiene el valor 't'. create or replace function leet ( foo ) returns text as ' my ($foo) = @_; if ($foo->{flag} eq "t") { $foo->{name} =~ tr/oae/043/; } return $foo->{name}; ' language 'plperl'; Y en psql la uso como select name,flag,leet(foo) from foo; name | flag | leet ------+------+------ Foo | t | F00 Bar | t | B4r Baz | f | Baz (3 rows) Todo ?sto sali? de revisar los manuales. No conozco ning?n tutorial espec?fico. -- Ernesto Hern?ndez-Novich - On Linux 2.6.11 i686 - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't apt-get it, it isn't useful or doesn't exist. GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 From aarnal at gmail.com Thu Apr 14 07:22:59 2005 From: aarnal at gmail.com (Alexis Arnal) Date: Thu Apr 14 07:23:14 2005 Subject: [caracas-pm] Re: l-desarrollo digest, Vol 1 #174 - 1 msg In-Reply-To: <20050414102655.23379.97485.Mailman@libertad.velug.org.ve> References: <20050414102655.23379.97485.Mailman@libertad.velug.org.ve> Message-ID: <97aa8b8050414072258841eff@mail.gmail.com> Saludos, gracias por el jal?n de oreja, por decir que PERL no soportaba llamado a procedimientos almacenados, en realidad fu? un manotazo de ahogado que lanz? el Martes en la ma?ana luego de 3 semanas de darme golpes sin resultados positivos desde el punto de vista de producci?n pero altamente productivo en aprendizaje. Si bien en la ma?ana del Martes estaba un poco desconcertado casi resignado a dejarlo para otra ocasi?n en la cual tuviera tiempo, cerca de las 6pm logramos hacer funcionar los procediemientos almacenados desde una aplicaci?n en perl utilizando el m?dulo DBIx::ProcedureCall, no respond? inmediatamente a la lista debido a que nos hallabamos desconcertados tratando de entender que fu? lo que hicimos. Este fu? el c?digo que utilizamos, aunque un poco arcaico pero era superior en desempe?o a la forma como lo estabamos haciendo. #******************** #!/usr/bin/perl -w use DBI; use Benchmark ':hireswallclock'; use DBIx::ProcedureCall qw(tjubilados1:fetch[[]]); $start = new Benchmark; $user="aarnal"; $password='1234'; $host = 'localhost'; $port= 5432; $driver="dbi:Pg:dbname=dbsirehu;host=$host;port=$port"; unless ($dbh= DBI -> connect($driver,$user,$password)) { print "\n *** No se pudo contactar el servidor ***\n"; } my $data = tjubilados1($dbh); $length = @$data; $a=${$data}[0]; $i=0; until ($i==$length){ $a=${$data}[$i]; print "${$a}[0]|${$a}[1]|${$a}[2]|${$a}[3]|${$a}[4]|${$a}[5]|${$a}[6]|${$a}[7]|${$a}[8]|${$a}[9]|${$a}[10]|${$a}[11]|${$a}[12]|${$a}[13]\n"; $i++; } $end = new Benchmark; $elapsed = timediff ($end,$start); print "Tiempo de Ejecucion :", timestr ($elapsed),"\n"; #******************************************* Quiero expresar que estoy full agradecido y contento por este logro (y los que faltan) ya que estamos innovando aqu? dentro de la organizaci?n, y siento que estamos por buen camino en el momento en que voy a cumplir mi primer a?o dentro del ?rea de las TIC como programador LAPP(Linux-Apache-PERL-Postgres). Hemos tratado de aplicar con la mayor rigurosidad posible el paradigma del MVC (Model-View-Controller), la granularidad del sistema, las metodolog?as de Ingenier?a del Software, junto con una buena dosis de Gerencia del Cambio, Motivaci?n, Gesti?n tecnol?gica, y mejora continua entre otras, que han contribuido a que se fortalezca el equipo de trabajo, aunque no ha sido f?cil, gracias a un jefe (medio loco) que confi? en nosotros. Gracias por la explicaci?n y en lo que la terminemos de digerir vamos ha hacer un tutorial completo acerca del desarrollo de sistemas utilizando el LAPP. Hacia donde vamos: 1.-Aprender ModPerl 2.-Integraci?n con LDAP 3.-......... 4.-......... > Message: 1 > From: Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?= > To: Perl Mongers Caracas - Venezuela > Cc: l-desarrollo@velug.org.ve > Date: Wed, 13 Apr 2005 12:36:03 -0400 > Subject: [l-desarrollo] Re: [caracas-pm] Procedimientos Almacenados > Reply-To: l-desarrollo@velug.org.ve > > On Tue, 2005-04-12 at 18:39 +0200, Alexis Arnal wrote: > > Estoy tratando de implementar procedimientos almacenados en postgres > > desde una aplicaci?n Perl que utiliza DBI > > > > He revisado la documentaci?n de DBI y DBD::Pg y encuentro que no est?n > > soportados los procedimientos almacenados, > > Eso es falso. La documentaci?n lo que dice es que no existe ning?n > m?todo _espec?fico_ para ejecutar procedimientos almacenados, y que > debes determinar c?mo lo hace el manejador particular. En el caso de > PostgreSQL, usualmente se invoca el procedimiento almacenado en un > SELECT y eso funciona perfecto. > > En psql... > > create or replace function test(integer) returns integer as ' > begin > return $1 + 41; > end;' language 'plpgsql'; > > ...que luego pruebas haciendo... > > select test(1); > test > ------ > 42 > (1 row) > > Eso te dice que para invocar el procedimiento almacenado hay que pedirle > a DBI que ejecute "select test(1)", entonces, en Perl > > #!/usr/bin/perl > use strict; > use warnings; > use DBI; > my $dbh = DBI->connect('dbi:Pg:dbname=test','emhn'); > my $sql = q{ select test(?) }; > my $sth = $dbh->prepare($sql); > for (1..10) { > $sth->execute($_); > my ($val) = $sth->fetchrow_array; > print "$val "; > } > print "\n"; > $sth->finish; > $dbh->disconnect; > > Y aparecer? "42 43 ... 51". Como ver?s se puede ejecutar el > procedimiento almacenado y hasta pasarle par?metros. Si el procedimiento > retorna _una_ tupla, con el fetchrow_array tienes. Si el procedimiento > retorna varias tuplas la cosa cambia, digamos tengo una tabla 'foo' uno > de cuyos campos es booleano y quiero hacer una funci?n que filtre seg?n > el campo sea cierto o falso, y me retorne _todos_ los registros que > cumplan, entonces en psql > > create or replace function dame ( boolean ) returns setof foo as ' > declare > registro foo%ROWTYPE; > begin > for registro in select * from foo where flag = $1 loop > return next registro; > end loop; > return; > end;' language 'plpgsql'; > > ...y la pruebo haciendo > > select * from dame ('T'); > name | number | flag > ------+--------+------ > Foo | 1 | t > Bar | 1 | t > (2 rows) > > Obviamente, desde Perl la llamada cambiar?, y el cuerpo del programa > deber?a cambiarse por algo como > > my $sql = q{ select * from dame(?) }; > my $sth = $dbh->prepare($sql); > my ($text,$number,$flag); > $sth->execute('T'); > $sth->bind_columns(\$text,\$number,\$flag); > while ($sth->fetchrow_arrayref) { > print "$text $number $flag\n", > } > > Y aparecer?n las l?neas correspondientes a los registros. > > Est? forma adem?s de r?pida es ahorrativa en memoria (del lado Perl) y > espeluznantemente clara porque no hay nada m?s limpio que usar las > variables $text, $number y $flag dentro del ciclo y ya tendr?n los > valores que me interesan. > > Ahora, desde el punto de vista de PostgreSQL no es lo m?s eficiente, > porque funciones que retornan SETOF calculan _todo_ el query y luego van > dando los resultados uno por uno. Pero esos resultados tienen que estar > en alguna parte, y esa es la memoria en el servidor; si uno quiere > moverse para arriba o para abajo en el conjunto de datos, o bien > trabajar s?lo con algunos, se desperdicia memoria y recursos. Pero si se > les ocurre copiarlos al cliente (el programa Perl) para trabajar con > ellos. Ah? es donde se quiere usar cursores, que son m?s complejos de > aplicar, pero mucho m?s eficientes. > > La misma funci?n, pero usando un cursor que encima recibe un par?metro, > ser?a > > create or replace function damec ( boolean ) returns refcursor as ' > declare > resultados cursor(arg boolean) for select * from foo where flag = arg; > begin > open resultados($1); > return resultados; > end;' language 'plpgsql'; > > y para probarla desde psql es un poco m?s complejo (y lo que significa > cada paso est? explicado en el manual de PostgreSQL) > > test=> begin; > BEGIN > test=> select damec('T'); > damec > ------------ > resultados > (1 row) > > test=> fetch all in resultados; > name | number | flag > ------+--------+------ > Foo | 1 | t > Bar | 1 | t > (2 rows) > > test=> commit; > COMMIT > > De modo que si quiero hacer uso de ?ste procedimiento en Perl, me basta > > my $sql = q{ > select damec(?); > fetch all in resultados; > }; > my $sth = $dbh->prepare($sql); > $sth->execute('T'); > my ($text,$number,$flag); > $sth->bind_columns(\$text,\$number,\$flag); > while ($sth->fetchrow_arrayref) { > print "$text $number $flag\n", > } > $sth->finish; > > Y esto ser? no solamente r?pido, sino econ?mico en memoria en _ambos_ > lados. M?s a?n, utilizando FETCH manualmente (dentro del procedure, > preferiblemente) uno se puede mover hacia "arriba" y "abajo" en el > conjunto de datos retornados. > > Y si lo que quieres es escribir un procedimiento en Perl, tirado de > f?cil. La siguiente funci?n cambia la columna 'name' a l33tsp34k > solamente si la columna 'flag' tiene el valor 't'. > > create or replace function leet ( foo ) returns text as ' > my ($foo) = @_; > if ($foo->{flag} eq "t") { > $foo->{name} =~ tr/oae/043/; > } > return $foo->{name}; > ' language 'plperl'; > > Y en psql la uso como > > select name,flag,leet(foo) from foo; > name | flag | leet > ------+------+------ > Foo | t | F00 > Bar | t | B4r > Baz | f | Baz > (3 rows) > > Todo ?sto sali? de revisar los manuales. No conozco ning?n tutorial > espec?fico. > -- > Ernesto Hern?ndez-Novich - On Linux 2.6.11 i686 - Unix: Live free or die! > Geek by nature, Linux by choice, Debian of course. > If you can't apt-get it, it isn't useful or doesn't exist. > GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 > Atte. Ing. Alexis Arnal MED, Caracas-Venezuela Linux user number 378161 From emhn at telcel.net.ve Thu Apr 14 10:31:45 2005 From: emhn at telcel.net.ve (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Thu Apr 14 10:30:17 2005 Subject: [caracas-pm] Temas para =?iso-8859-1?q?Reuni=F3n?= del =?iso-8859-1?q?s=E1bado?= Message-ID: <1113499905.7473.183.camel@localhost> Este s?bado 16 corresponde nuestra reuni?n mensual. ?Cu?l tema ser?a interesante convenir? Una posibilidad es continuar con la segunda parte del tutorial para novatos, que podr?a cambiarse en relaci?n al a?o pasado para hablar de referencias y estructuras de datos en lugar de expresiones regulares. Otra posibilidad es hablar de los m?dulos para Palm, donde Andr?s ya tiene alg?n camino recorrido y podr?amos extenderlo un poco m?s. ?Otras ideas? -- Ernesto Hern?ndez-Novich - On Linux 2.6.11 i686 - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't apt-get it, it isn't useful or doesn't exist. GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 From helder.marques at pranical.com Thu Apr 14 10:53:58 2005 From: helder.marques at pranical.com (Helder Marques) Date: Thu Apr 14 10:51:05 2005 Subject: [caracas-pm] Temas para =?ISO-8859-15?Q?Reuni=F3n_del_s=E1?= =?ISO-8859-15?Q?bado?= In-Reply-To: <1113499905.7473.183.camel@localhost> References: <1113499905.7473.183.camel@localhost> Message-ID: <425EAE36.5080107@pranical.com> Palm suena bien, qued? picado el mes pasado. Esta semana alguien me mostr? muy al vuelo un comando para descargas de m?dulos en cpan al estilo de apt-get...no s? si es la norma, pero en todo caso si tenemos conexi?n podemos verlo? podemos ver el desarrollo modular de aplicaciones y las llamadas a librer?as? A?n no s? c?mo usar librer?as nativas .h desde Perl, aunque supongo que para hacer uso de rutinas a bajo nivel en caso de rendering de 3D ya debe existir algo. Bueno, esas son mis sugerencias novatas. Saludos. Ernesto Hern?ndez-Novich wrote: >Este s?bado 16 corresponde nuestra reuni?n mensual. ?Cu?l tema ser?a >interesante convenir? > >Una posibilidad es continuar con la segunda parte del tutorial para >novatos, que podr?a cambiarse en relaci?n al a?o pasado para hablar de >referencias y estructuras de datos en lugar de expresiones regulares. > >Otra posibilidad es hablar de los m?dulos para Palm, donde Andr?s ya >tiene alg?n camino recorrido y podr?amos extenderlo un poco m?s. > >?Otras ideas? > > -- Helder Marques Consultor J2EE / EAD&I Pranical Technologies www.pranical.com Ofc: +58.212.284.1725 +58.212.285.2159 *** USO DEL CORREO ELECTRONICO DE PRANICAL TECHNOLOGIES *** Esta nota puede contener informacion de interes solo para Pranical Technologies o sus negocios. Solo esta permitida su copia, distribucion o uso a personas autorizadas. Si recibio esta nota por error, por favor destruyala y notifique al remitente o a soporte@pranical.com. *** PRANICAL TECHNOLOGIES? INTERNET E-MAIL USE *** This message may contain information solely of the interest of Pranical Technologies or its businesses. Copying, distribution, disclosure or any use of the information contained in this transmission is permitted only to authorized parties. If you have received this e-mail by error, please destroy it and notify soporte@pranical.com or the sender by reply email. From jrey at linuxsis.net Fri Apr 15 03:14:59 2005 From: jrey at linuxsis.net (Jose Rey) Date: Fri Apr 15 03:15:19 2005 Subject: [caracas-pm] Temas para =?ISO-8859-1?Q?Reuni=F3n_del_s=E1?= =?ISO-8859-1?Q?bado?= In-Reply-To: <425EAE36.5080107@pranical.com> References: <1113499905.7473.183.camel@localhost> <425EAE36.5080107@pranical.com> Message-ID: <425F9423.9010805@linuxsis.net> Helder Marques wrote: > Palm suena bien, qued? picado el mes pasado. Esta semana alguien me > mostr? muy al vuelo un comando para descargas de m?dulos en cpan al > estilo de apt-get...no s? si es la norma, pero en todo caso si tenemos > conexi?n podemos verlo? podemos ver el desarrollo modular de > aplicaciones y las llamadas a librer?as? Increible ten?a lo mismo en mente, pero no se si dar? tiempo, creo que deber?amos ver el tutorial y los m?dulos de Palm que ya parecen estar listos, incluso se podr?a hablar del m?dulo CPAN para la instalaci?n autom?tica de m?dulos. Pero no nos quedar?a tiempo para una charla sobre como empaquetar un m?dulo en Perl, pues de hacerlo habr?a que hacerlo bien, es decir, explicar la estructura, hablar sobre Make::Maker, Test::Simple y Test::More para las pruebas de regresi?n y finalmente la publicaci?n en el CPAN, creo que Ernesto, Luis y/o yo podr?amos preparar algo as? pero para la reuni?n de Mayo. > A?n no s? c?mo usar librer?as nativas .h desde Perl, aunque supongo > que para hacer uso de rutinas a bajo nivel en caso de rendering de 3D > ya debe existir algo. Esto se podr?a anexar al grupo de charlas sobre empaquetamiento y publicaci?n de librerias, pero desde ya les participo que XS no es exactamente f?cil ;-) > Bueno, esas son mis sugerencias novatas. Ni tan novatas :-) Saludos Jose Luis Rey From lem at cantv.net Fri Apr 15 07:14:27 2005 From: lem at cantv.net (=?ISO-8859-1?Q?Luis_Mu=F1oz?=) Date: Fri Apr 15 07:14:33 2005 Subject: =?ISO-8859-1?Q?Re:_[caracas-pm]_Temas_para_Reuni=F3n_del_s=E1bad?= =?ISO-8859-1?Q?o?= In-Reply-To: <425F9423.9010805@linuxsis.net> References: <1113499905.7473.183.camel@localhost> <425EAE36.5080107@pranical.com> <425F9423.9010805@linuxsis.net> Message-ID: On Apr 15, 2005, at 6:14 AM, Jose Rey wrote: >> A?n no s? c?mo usar librer?as nativas .h desde Perl, aunque supongo >> que para hacer uso de rutinas a bajo nivel en caso de rendering de 3D >> ya debe existir algo. > > > Esto se podr?a anexar al grupo de charlas sobre empaquetamiento y > publicaci?n de librerias, pero desde ya les participo que XS no es > exactamente f?cil ;-) Hace algunos a?os desarroll? algo para esto como parte de mi tesis de grado. Tengo un paquete de m?dulos que manejan Pov-Ray (generan escenas) pero es c?digo relativamente viejo (perl 5.6) y que debe ser re-modularizado. Podr?an combinarse las cosas, si encuentro el tiempo para preparar algo. Saludos. -lem From lem at cantv.net Fri Apr 15 07:18:49 2005 From: lem at cantv.net (=?ISO-8859-1?Q?Luis_Mu=F1oz?=) Date: Fri Apr 15 07:18:51 2005 Subject: =?ISO-8859-1?Q?Re:_[caracas-pm]_Temas_para_Reuni=F3n_del_s=E1bad?= =?ISO-8859-1?Q?o?= In-Reply-To: References: <1113499905.7473.183.camel@localhost> <425EAE36.5080107@pranical.com> <425F9423.9010805@linuxsis.net> Message-ID: <172f0f0341254860f3441921736fa180@cantv.net> On Apr 15, 2005, at 10:14 AM, Luis Mu?oz wrote: > > On Apr 15, 2005, at 6:14 AM, Jose Rey wrote: >>> A?n no s? c?mo usar librer?as nativas .h desde Perl, aunque supongo >>> que para hacer uso de rutinas a bajo nivel en caso de rendering de >>> 3D ya debe existir algo. >> >> >> Esto se podr?a anexar al grupo de charlas sobre empaquetamiento y >> publicaci?n de librerias, pero desde ya les participo que XS no es >> exactamente f?cil ;-) > > Hace algunos a?os desarroll? algo para esto como parte de mi tesis de > grado. Tengo un paquete de m?dulos que manejan Pov-Ray (generan > escenas) pero es c?digo relativamente viejo (perl 5.6) y que debe ser > re-modularizado. Podr?an combinarse las cosas, si encuentro el tiempo > para preparar algo. BTW, voy a tratar de poner en l?nea algunas pel?culas hechas con esto, para que vean mejor a qu? me refiero. -lem From zeus at mipropio.com Mon Apr 18 07:43:57 2005 From: zeus at mipropio.com (Tony Rodriguez) Date: Mon Apr 18 07:44:14 2005 Subject: [caracas-pm] Acerca de la =?iso-8859-1?q?reuni=F3n_del_pasado_s=E1bado=2E?= Message-ID: <200504181043.58489.zeus@mipropio.com> Salu2 a todos. Lamentablemente no pude asistir a la reuni?n del pasado s?bado. Me gustar?a saber si llegaron a tratar algo con respecto a las palm y de ser afirmativo si alguien podr?a dar algunos datos por aqu? de lo que se hizo para luego yo averiguar. Gracias. Tony. From helder.marques at pranical.com Mon Apr 18 08:31:55 2005 From: helder.marques at pranical.com (Helder Marques) Date: Mon Apr 18 08:28:55 2005 Subject: [caracas-pm] Acerca de la =?ISO-8859-1?Q?reuni=F3n_del_p?= =?ISO-8859-1?Q?asado_s=E1bado=2E?= In-Reply-To: <200504181043.58489.zeus@mipropio.com> References: <200504181043.58489.zeus@mipropio.com> Message-ID: <4263D2EB.9020407@pranical.com> Hi! Vimos los m?dulos de Palm::PDB (Palm::Raw, Palm::Address, Palm::Databook, Palm::Mail, Palm::Memo, Palm::Todo). Estuvo genial, en particular todo se centr? en Palm::Memo para el manejo del archivo Memo.pdb. Por cierto, para sanar las heridas de la batalla campal sobre las expresiones regulares de los archivos 8.3, encontr? esto: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm Saludos. Tony Rodriguez wrote: >Salu2 a todos. > >Lamentablemente no pude asistir a la reuni?n del pasado s?bado. Me gustar?a >saber si llegaron a tratar algo con respecto a las palm y de ser afirmativo >si alguien podr?a dar algunos datos por aqu? de lo que se hizo para luego yo >averiguar. > >Gracias. > >Tony. >_______________________________________________ >caracas-pm mailing list >caracas-pm@pm.org >http://mail.pm.org/mailman/listinfo/caracas-pm > > -- Helder Marques Consultor J2EE / EAD&I Pranical Technologies www.pranical.com Ofc: +58.212.284.1725 +58.212.285.2159 *** USO DEL CORREO ELECTRONICO DE PRANICAL TECHNOLOGIES *** Esta nota puede contener informacion de interes solo para Pranical Technologies o sus negocios. Solo esta permitida su copia, distribucion o uso a personas autorizadas. Si recibio esta nota por error, por favor destruyala y notifique al remitente o a soporte@pranical.com. *** PRANICAL TECHNOLOGIES? INTERNET E-MAIL USE *** This message may contain information solely of the interest of Pranical Technologies or its businesses. Copying, distribution, disclosure or any use of the information contained in this transmission is permitted only to authorized parties. If you have received this e-mail by error, please destroy it and notify soporte@pranical.com or the sender by reply email. From lem at cantv.net Mon Apr 18 09:11:43 2005 From: lem at cantv.net (=?ISO-8859-1?Q?Luis_Mu=F1oz?=) Date: Mon Apr 18 09:11:44 2005 Subject: [caracas-pm] Animaciones In-Reply-To: <172f0f0341254860f3441921736fa180@cantv.net> References: <1113499905.7473.183.camel@localhost> <425EAE36.5080107@pranical.com> <425F9423.9010805@linuxsis.net> <172f0f0341254860f3441921736fa180@cantv.net> Message-ID: Hola Muchachones/as En http://mipagina.cantv.net/lem/animation encontrar?n algunas pruebas que hice hace ya bastante tiempo (m?s de dos a?os largos) usando Pov-Ray y algunos m?dulos en Perl que en alg?n momento empacar? para distribuirlos. El encoder que us? en su momento no es el m?s apropiado y tal vez algunos de Uds. tengan problemas para mostrar el video. Usen VideoLAN Client para verlo en ese caso. Para esto, toda la etapa de layout y rendering corre fuera de Perl. Perl se usa s?lo como lenguaje de descripci?n de variables en la escena (velocidades, posiciones, etc). Saludos. -lem