Data types and structures
C types are used to write C-Extensions.
The following C types are used to write C-Extensions.
Type name | Description |
---|---|
bigint |
signed integer with a size of 8 bytes |
int4 |
signed integer with a size of 4 bytes |
uint4 |
unsigned integer with a size of 4 bytes |
int2 |
signed integer with a size of 2 bytes |
uint2 |
unsigned integer with a size of 2 bytes |
int1 |
signed integer with a size of 1 byte |
uint1 |
unsigned integer with a size of 1 byte |
mint |
signed machine-dependent C int |
muint |
unsigned machine-dependent C int |
mlong |
signed machine-dependent C long |
mulong |
unsigned machine-dependent C long |
dec_t |
DECIMAL data
type structure |
dtime_t |
DATETIME data
type structure |
intrvl_t |
INTERVAL data
type structure |
ifx_loc_t |
TEXT / BYTE locator
structure |
Basic data types
Basic data types such as bigint
, int4
and int2
are provided to define variables that must hold BIGINT
(bigint
), SMALLINT
(int2
),
INTEGER
(int4
)
and DATE
(int4
)
values. Standard char
array can be used
to hold CHAR
and VARCHAR
data.
DATE
No specific typedef exists for the DATE
type;
you can use the int4
type to
store a DATE
value.
DECIMAL/MONEY
The dec_t
structure
is provided to hold DECIMAL
and
MONEY
values.
The internals of dec_t
structure
can be ignored during C-Extension programming, because
decimal API functions are provided to manipulate any aspects of a
decimal.
DATETIME
The dtime_t
structure
holds a DATETIME
value.
Before manipulating
a dtime_t
, you must initialize its qualifier
qt_qual
, by using the TU_DTENCODE
macro:
dtime_t dt;
dt.dt_qual = TU_DTENCODE(TU_YEAR, TU_SECOND);
dtcvasc( "2004-02-12 12:34:56", &dt );
INTERVAL
The intrvl_t
structure
holds an INTERVAL
value.
Before manipulating an intrvl_t
, you must initialize its qualifier
in_qual
, by using the TU_IENCODE
macro:
intrvl_t in;
in.in_qual = TU_IENCODE(5, TU_YEAR, TU_MONTH);
incvasc( "65234-02", &in );
TEXT/BYTE Locator
The ifx_loc_t
structure is used to declare host variables for a
TEXT
/BYTE
values (simple large objects). Because the potential
size of the data can be quite large, this is a locator structure that contains information about the
size and location of the TEXT
/BYTE
data, rather than containing
the actual data.
Field name | Data type | Description |
---|---|---|
loc_indicator |
int4 |
Null indicator; a value of -1 indicates
a null TEXT /BYTE value.
Your program can set the field to
indicate the insertion of a null value.
Database client libraries set the value for selects and
fetches. |
loc_type |
int4 |
data type - SQLTEXT (for TEXT
values) or SQLBYTES (for BYTE
values). |
loc_size |
int4 |
Size of the TEXT /BYTE value
in bytes; your program sets the size
of the large object for insertions.
Database client libraries set the size for selects and
fetches. |
loc_loctype |
int2 |
Location - LOCMEMORY (in
memory) or LOCFNAME (in
a named file). Set loc_loctype after
you declare the locator variable and
before this declared variable receives the large object
value. |
loc_buffer |
char * |
If loc_loctype is LOCMEMORY ,
this is the location of the TEXT /BYTE
value; your program must allocate space
for the buffer and store its address
here. |
loc_bufsize |
int4 |
If loc_loctype is LOCMEMORY , this
is the size of the buffer loc_buffer; If you set loc_bufsize to -1, database client
libraries will allocate the memory buffer for selects and fetches. Otherwise, it is assumed that
your program will handle memory allocation and de-allocation. |
loc_fname |
char * |
If loc_loc_type is LOCFNAME , this
is the address of the path name string that contains the file. |
Example
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include "f2c/fglExt.h"
int lob_size(int);
UsrFunction usrFunctions[]={
{ "lob_size", lob_size, 1, 1 },
{ NULL, NULL, 0, 0 }
};
int lob_size(int pc)
{
ifx_loc_t *pb1;
double ratio;
char *source = NULL;
char *psource = NULL;
int size;
if (pc != 1) exit(1);
poplocator(&pb1);
if (pb1->loc_loctype == LOCMEMORY) {
psource = pb1->loc_buffer;
size = pb1->loc_size;
} else if (pb1->loc_loctype == LOCFNAME) {
int fd;
struct stat st;
fd = open(pb1->loc_fname, O_RDONLY);
fstat(fd, &st);
size = st.st_size;
psource = source = (char *) malloc(size);
read(fd, source, size);
close(fd);
}
pushint(size);
return 1;
}
Genero program (main.4gl):
IMPORT libext1
MAIN
DEFINE t TEXT
LOCATE t IN MEMORY
LET t = "aaaaaaaaaaaaaa"
DISPLAY lob_size(t)
END MAIN
$ gcc -fPIC -c ext1.c -I $FGLDIR/include
$ gcc --shared -o libext1.so ext1.o -L$FGLDIR/lib -lfgl
$ fglcomp main.4gl
$ fglrun main.42m
14