Bekijk Volledige Versie : Re: [perl] hoe directe uitvoer i.p.v. tijdelijke bestand?
Richard van den Berg <richhanz@gmail.com>:
> Onderstaand stukje perl script doet z'n werk naar behoren, alleen zint
> het me niet dat er een tijdelijk bestand nodig is. Dit is echter de
> enige manier waarop ik het werkende heb gekregen, lo_export wil naar een
> bestand schrijven, uit DBD::Pg(3pm): "Exports a large object into a Unix
> file."
Dat is de r*k met de large object interface van PostgreSQL, die werkt nou
eenmaal zo. Als het database-schema niet vastligt zou ik je aanraden om de
LO interface te dumpen, plaatjes (daar gaat het hier toch om?) kan je met
moderne PostgreSQL-versies direct in de database opslaan.
De enige andere oplossing die ik kan bedenken is als je een eigen extensie
schrijft (in C zal dat dan worden), dan kan je de lo_read() functie in de
PostgreSQL API waarschijnlijk gebruiken.
--
robert
Richard van den Berg
08/06/05, 00:05
On 07 Jun 2005 17:59:16 GMT robert
({n.i.w.s}@allyourbass.org.invalid) wrote:
> Richard van den Berg <richhanz@gmail.com>:
> > Onderstaand stukje perl script doet z'n werk naar behoren, alleen zint
> > het me niet dat er een tijdelijk bestand nodig is. Dit is echter de
> > enige manier waarop ik het werkende heb gekregen, lo_export wil naar een
> > bestand schrijven, uit DBD::Pg(3pm): "Exports a large object into a Unix
> > file."
> Dat is de r*k met de large object interface van PostgreSQL, die werkt nou
> eenmaal zo. Als het database-schema niet vastligt zou ik je aanraden om de
> LO interface te dumpen, plaatjes (daar gaat het hier toch om?) kan je met
> moderne PostgreSQL-versies direct in de database opslaan.
Mmm, iets om rekening mee te houden bij een upgrade die steeds meer
begint te dringen. Tot die tijd is php met pg_loreadall dus de snelste
oplossing, die er blijkbaar speciaal voor gemaakt is.
> De enige andere oplossing die ik kan bedenken is als je een eigen extensie
> schrijft (in C zal dat dan worden), dan kan je de lo_read() functie in de
> PostgreSQL API waarschijnlijk gebruiken.
Of php nadoen:
while ((nbytes = lo_read((PGconn *)pgsql->conn, pgsql->lofd, buf,
PGSQL_LO_READ_BUF_SIZE))>0) { php_body_write(buf, nbytes TSRMLS_CC);
tbytes += nbytes;}
die 8 kb blokken blijft lezen tot het einde.
Thanks!
--
Richard
Richard van den Berg
08/06/05, 11:05
On Tue, 7 Jun 2005 21:03:37 GMT Richard van den Berg
(richhanz@gmail.com) wrote:
> On 07 Jun 2005 17:59:16 GMT robert
> ({n.i.w.s}@allyourbass.org.invalid) wrote:
> > De enige andere oplossing die ik kan bedenken is als je een eigen extensie
> > schrijft (in C zal dat dan worden), dan kan je de lo_read() functie in de
> > PostgreSQL API waarschijnlijk gebruiken.
> Of php nadoen:
> while ((nbytes = lo_read((PGconn *)pgsql->conn, pgsql->lofd, buf,
> PGSQL_LO_READ_BUF_SIZE))>0) { php_body_write(buf, nbytes TSRMLS_CC);
> tbytes += nbytes;}
> die 8 kb blokken blijft lezen tot het einde.
In perl wil dat niet werken, blob_read wel, alleen: Supported by this
driver as proposed by DBI. Implemented by DBI but not documented, so
this method might change. Uitkijken bij een upgrade...
Afijn, moraal van het verhaal is dat apache de vertragende factor is,
perl (met speedy) en php zijn ongeveer net zo snel. Foto's uit de
database naar een bestand schrijven gaat 4 x zo snel rechtstreeks met
perl als de combinatie wget - apache - php.
--
Richard