Thread: C Function Problem for bytea output

C Function Problem for bytea output

From
vishal saberwal
Date:
hi all,

I am trying to read a file from the File System.
The function compiles fine, the function is created fine in postgres but the output is NULL/BLANK.
The file does exists and has chmod 777 permission.

PG_FUNCTION_INFO_V1(file_export);

Datum file_export(PG_FUNCTION_ARGS)
{
    char *FilePath = PG_GETARG_CSTRING(0);
    int32 FileLength = PG_GETARG_INT32(1);
    FILE *fptr;
    bytea *imdata;
    char *rp;

    imdata = (bytea *) palloc(FileLength+VARHDRSZ);
    VARATT_SIZEP(imdata) = FileLength+VARHDRSZ;
    rp = VARDATA(imdata);
    if ((fptr = fopen(FilePath, "r")) == NULL)
            PG_RETURN_NULL();
    while (!feof(fptr))
    {
        fgets(rp,1024,fptr);
        rp+=1024;
    }
    fclose(fptr);
   
    PG_RETURN_BYTEA_P(imdata);
}

select * from file_export('/ResourceFS/Alarm_Arm.gif',1219);
 file_export
-------------
 
(1 row)

I believe its something in the function but i can't spot the error.

thanks,
vish

Re: C Function Problem for bytea output

From
Tom Lane
Date:
vishal saberwal <vishalsaberwal@gmail.com> writes:
> I believe its something in the function but i can't spot the error.

Well, that sure looks like a NULL result; have you considered the
possibility that the fopen is failing?

BTW, that code will happily clobber memory that doesn't
belong to it if the passed FileLength is wrong.

            regards, tom lane

Re: C Function Problem for bytea output

From
vishal saberwal
Date:
thanks tom,

yes it was fopen problem ... the problem was solved when i did chown postgres ...
i should have seen that ...

thanks,
vish

On 12/28/05, Tom Lane <tgl@sss.pgh.pa.us> wrote:
vishal saberwal <vishalsaberwal@gmail.com> writes:
> I believe its something in the function but i can't spot the error.

Well, that sure looks like a NULL result; have you considered the
possibility that the fopen is failing?

BTW, that code will happily clobber memory that doesn't
belong to it if the passed FileLength is wrong.

                        regards, tom lane