Newsgroup: it.comp.software.database
Titolo: scrivere su file con [postgres] (e tante scuse per Leonardo)

prima di tutto chiedo scusa per aver spedito a Leonardo (via email) una 
function che non funziona...
visto l'evidente baco di overflow della precedente, ho riscritto la 
funzione (tra l'altro in versione V1) write_file(text,text).
per comodità di altri miei sviluppi, ho convertito lo stream binario in 
char* string, in modo da potergli aggiungere lo '\0' in fondo ed effettuare 
così varie operazioni '<string.h>'.
ovviamente questo richiede un'allocazione supplementare di memoria pari 
alla size degli argomenti meno (4-1)*nargs...
il funzionamento è così:
select write_file('testo da scrivere\nnel file','path completo del file');
se ha avuto successo la creazione del file, ritorna il testo, altrimenti il 
nome del file
(strano modo di interpetare l'errore, eh?)
...sperando che vi possa essere utile...
DISCLAIMER: affari vostri se per qualche motivo l'utilizzo della funzione 
causasse danni ai vostri pc o ai vostri db. io vi posto il codice senza 
aver effettuato debug...
se ne trovate correggeteli, oppure:
punkarruso{at]genie[punto}it
//////////////////
// write_file.c
//
// release 1.0.V1
//
// 13/06/2002;
// Ludovico Caldara
//
#include <string.h>
#include <stdio.h>
#include <pgsql/server/postgres.h>
#include <pgsql/server/fmgr.h>
/* x compilare sotto linux:
cc -fpic -c write_file.c
cc -shared -o write_file.so write_file.o
*/
/* x function:
drop function write_file(text,text);
CREATE FUNCTION write_file(text,text) RETURNS text
     AS '/var/lib/pgsql/write_file.so' LANGUAGE 'c'
     WITH (isStrict);
*/
PG_FUNCTION_INFO_V1(write_file);
Datum write_file(PG_FUNCTION_ARGS)
{
FILE *fp;
char* newfilename;
char* newdata;
//acquisizione argomenti
text *filename = PG_GETARG_TEXT_P(1);
text *data = PG_GETARG_TEXT_P(0);
//a discrezione usare palloc (postgres) al posto di malloc (os)
newfilename=(char *) malloc(VARSIZE(filename)-VARHDRSZ+1);
newdata=(char *) malloc(VARSIZE(data)-VARHDRSZ+1);
memcpy(newfilename,VARDATA(filename),VARSIZE(filename)-VARHDRSZ);
memcpy(newdata,VARDATA(data),VARSIZE(data)-VARHDRSZ);
newfilename[VARSIZE(filename)-VARHDRSZ]='\0';
newdata[VARSIZE(data)-VARHDRSZ]='\0';
if(!(fp=fopen(newfilename,"w")))
  PG_RETURN_TEXT_P(filename);
fprintf(fp,"%s",newdata);
fclose(fp);
PG_RETURN_TEXT_P(data);
}
ciao!
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/philosophy/shouldbefree.html

 funzione (tra l'altro in versione V1) write_file(text,text).
ci aggiungo anche append_file(text,text).
valgono tutti i discorsi del precedente.
#include <string.h>
#include <stdio.h>
#include <pgsql/server/postgres.h>
#include <pgsql/server/fmgr.h>
PG_FUNCTION_INFO_V1(append_file);
Datum append_file(PG_FUNCTION_ARGS)
{
FILE *fp;
char* newfilename;
char* newdata;
//acquisizione argomenti
text *filename = PG_GETARG_TEXT_P(1);
text *data = PG_GETARG_TEXT_P(0);
//a discrezione usare palloc (postgres) al posto di malloc (os)
newfilename=(char *) malloc(VARSIZE(filename)-VARHDRSZ+1);
newdata=(char *) malloc(VARSIZE(data)-VARHDRSZ+1);
memcpy(newfilename,VARDATA(filename),VARSIZE(filename)-VARHDRSZ);
memcpy(newdata,VARDATA(data),VARSIZE(data)-VARHDRSZ);
newfilename[VARSIZE(filename)-VARHDRSZ]='\0';
newdata[VARSIZE(data)-VARHDRSZ]='\0';
if(!(fp=fopen(newfilename,"a")))
  PG_RETURN_TEXT_P(filename);
fprintf(fp,"%s",newdata);
fclose(fp);
PG_RETURN_TEXT_P(data);
}
queste due sp sono parecchio utili per effettuare (ad esempio) refresh 
automatici di pagine html.
basta creare funzioni che creano l'output html su file e metterlo come 
trigger. in questo modo, anziché generare la pagina run-time leggendo ogni 
volta su db, si minimizzano i tempi di caricamento delle pagine, 
soprattutto se sono grosse e poco movimentate.
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.nist.gov/dads/

> il sapiente punkarruso dice:
ooops, non era voluto...
è la mia prerisposta di default!!
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/philosophy/why-free.it.html