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