Обсуждение: ERROR: invalid datatype 'FILE'

Поиск
Список
Период
Сортировка

ERROR: invalid datatype 'FILE'

От
Amish
Дата:
Hi

I am trying to migrate informix Esql/C application to PostgeSQL using ecpg.
I have a structure in the code, where one of the element data type is
non-primitive. When i try to complile the code it throws following error
message.

ERROR: invalid datatype 'FILE'

Program Code

#include <stdlib.h>
#include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;
struct  rid_ds
{
        double de_re_rid;
        double de_re_xrid;
        FILE   *fp;
} dbinfo_t;
dbinfo_t dbval;
EXEC SQL END DECLARE SECTION;

main()
{

                printf("Test Program :\n");

}


Below is the command i use to compile the code.

ecpg -c prog1.pgc

prog1.pgc:9: ERROR: invalid datatype 'FILE'

The same code compiles using esqlc without any problem. Is there any way to
fix about error

ECPG version:

ecpg (PostgreSQL 8.2.13) 4.2.1

RHEL 5 update 3

--
View this message in context:
http://postgresql.1045698.n5.nabble.com/ERROR-invalid-datatype-FILE-tp3365733p3365733.html
Sent from the PostgreSQL - novice mailing list archive at Nabble.com.

Re: ERROR: invalid datatype 'FILE'

От
Andrej
Дата:
On 1 February 2011 20:03, Amish <amish.pandya@in.com> wrote:

> ERROR: invalid datatype 'FILE'
>
> Program Code
>
> #include <stdlib.h>
> #include <stdio.h>
>
> EXEC SQL BEGIN DECLARE SECTION;
> struct  rid_ds
> {
>        double de_re_rid;
>        double de_re_xrid;
>        FILE   *fp;
> } dbinfo_t;
> dbinfo_t dbval;
> EXEC SQL END DECLARE SECTION;
>
> main()
> {
>
>                printf("Test Program :\n");
>
> }
>
>
> Below is the command i use to compile the code.
>
> ecpg -c prog1.pgc
>
> prog1.pgc:9: ERROR: invalid datatype 'FILE'
>
> The same code compiles using esqlc without any problem. Is there any way to
> fix about error
>
> ECPG version:
>
> ecpg (PostgreSQL 8.2.13) 4.2.1
>
> RHEL 5 update 3

I have no idea what esqlc is, but I'll hazard a guess that it by
default includes
something that actually defines FILE.  FILE isn't defined in stdio.h
or stdlib.h,
for that matter, so I'm not really surprised that it won't compile.



Cheers,
Andrej

Re: ERROR: invalid datatype 'FILE'

От
Mladen Gogala
Дата:
Andrej wrote:
>
>
> I have no idea what esqlc is, but I'll hazard a guess that it by
> default includes
> something that actually defines FILE.  FILE isn't defined in stdio.h
> or stdlib.h,
> for that matter, so I'm not really surprised that it won't compile.
>

Actually, it is defined in stdio.h:

cat ttt.c

#include <stdio.h>
main() {
    FILE *fp=fopen("/tmp/aaa","w+");
    fprintf(fp,"Hello World!\n");
}
[mgogala@medo tmp]$ gcc ttt.c -o ttt
[mgogala@medo tmp]$

No complaints. It even executes. This program, of course, is bug free.

--
Mladen Gogala
Sr. Oracle DBA
1500 Broadway
New York, NY 10036
(212) 329-5251
www.vmsinfo.com


Re: ERROR: invalid datatype 'FILE'

От
Michael Wood
Дата:
On 2 February 2011 08:13, Mladen Gogala <mladen.gogala@vmsinfo.com> wrote:
> Andrej wrote:
>>
>>
>> I have no idea what esqlc is, but I'll hazard a guess that it by
>> default includes
>> something that actually defines FILE.  FILE isn't defined in stdio.h
>> or stdlib.h,
>> for that matter, so I'm not really surprised that it won't compile.
>>
>
> Actually, it is defined in stdio.h:
>
> cat ttt.c
>
> #include <stdio.h>
> main() {
>   FILE *fp=fopen("/tmp/aaa","w+");
>   fprintf(fp,"Hello World!\n");
> }
> [mgogala@medo tmp]$ gcc ttt.c -o ttt
> [mgogala@medo tmp]$
>
> No complaints. It even executes. This program, of course, is bug free.

I'll have to object to the "bug free" comment :)

You don't check if the fopen() call succeeded.

Also, if this code is run as root (e.g. from a cron job) then a local
user could convince it to overwrite any arbitrary file just by
creating a symlink in /tmp pointing to the file to overwrite (assuming
/tmp/aaa doesn't exist before the malicious user creates the symlink,
of course.)

--
Michael Wood <esiotrot@gmail.com>

Re: ERROR: invalid datatype 'FILE'

От
Amish
Дата:
Thanks for the reply

ESQL/C is informix utility. ESQL/C is an SQL application programming
interface (API) that enables developers to embed Structured Query Language
(SQL) statements directly into a C program. This is quite similer to ECPG.

The problem i am facing is bit different. When i remove "FILE *fp" from
declare section (ie. BEGIN DECLARE and END DECLARE) and put outside of
declare section the program compiles successfully.

e.g
#include <stdlib.h>
#include <stdio.h>


EXEC SQL BEGIN DECLARE SECTION;
struct  rid_ds
{
        double de_re_rid;
        double de_re_xrid;
} dbinfo_t;
dbinfo_t dbval;
EXEC SQL END DECLARE SECTION;

FILE   *fp;


main()
{

                printf("Test Program :\n");

}



--
View this message in context:
http://postgresql.1045698.n5.nabble.com/ERROR-invalid-datatype-FILE-tp3365733p3367328.html
Sent from the PostgreSQL - novice mailing list archive at Nabble.com.

Re: ERROR: invalid datatype 'FILE'

От
Mladen Gogala
Дата:
Michael Wood wrote:
> I'll have to object to the "bug free" comment :)
>
> You don't check if the fopen() call succeeded.
>
> Also, if this code is run as root (e.g. from a cron job) then a local
> user could convince it to overwrite any arbitrary file just by
> creating a symlink in /tmp pointing to the file to overwrite (assuming
> /tmp/aaa doesn't exist before the malicious user creates the symlink,
> of course.)
>
>
You are correct, I admit my programming sins. With two bugs in two lines
of code, I am as good as Microsoft or Oracle. I'll have to start making
contributions to the Postgres community.

--
Mladen Gogala
Sr. Oracle DBA
1500 Broadway
New York, NY 10036
(212) 329-5251
www.vmsinfo.com


Re: ERROR: invalid datatype 'FILE'

От
Michael Wood
Дата:
On 2 February 2011 15:38, Mladen Gogala <mladen.gogala@vmsinfo.com> wrote:
> Michael Wood wrote:
>>
>> I'll have to object to the "bug free" comment :)
>>
>> You don't check if the fopen() call succeeded.
>>
>> Also, if this code is run as root (e.g. from a cron job) then a local
>> user could convince it to overwrite any arbitrary file just by
>> creating a symlink in /tmp pointing to the file to overwrite (assuming
>> /tmp/aaa doesn't exist before the malicious user creates the symlink,
>> of course.)
>
> You are correct, I admit my programming sins. With two bugs in two lines of
> code, I am as good as Microsoft or Oracle. I'll have to start making
> contributions to the Postgres community.

:)

I thought afterwards that perhaps you meant we got any included bugs for free.

--
Michael Wood <esiotrot@gmail.com>

Re: ERROR: invalid datatype 'FILE'

От
Jasen Betts
Дата:
On 2011-02-01, Amish <amish.pandya@in.com> wrote:
>
> Hi

> EXEC SQL BEGIN DECLARE SECTION;
> struct  rid_ds
> {
>         double de_re_rid;
>         double de_re_xrid;
>         FILE   *fp;
> } dbinfo_t;
> dbinfo_t dbval;
> EXEC SQL END DECLARE SECTION;

> ERROR: invalid datatype 'FILE'

it looks to me like ecpg doesn't know how to convert FILE*
into an SQL value.

I'd say try it without the "EXEC SQL BEGIN DECLARE SECTION;"
but from inspection it appears not to be valid C either.

> The same code compiles using esqlc without any problem. Is there any way to
> fix about error

start by reading the the esqlc manual to figure out how the rules
of C change inside "EXEC SQL BEGIN DECLARE SECTION;".

file:///usr/share/doc/postgresql-doc-8.4/html/ecpg-preproc.html

suggests that "EXEC SQL INCLUDE stdio.h" might help
but that's not going to fix the broken C code two lines after the
error it's finding.


--
⚂⚃ 100% natural