From 79ed5a17b8d5274b80409df80a9c886085b12a26 Mon Sep 17 00:00:00 2001 From: Jinhong Date: Wed, 11 Apr 2018 15:56:30 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=93=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1.0.0/AIX-00FB437F4C00/include/tracing.h | 425 - .../1.0.0/Linux-x86_64/include/tracing.h | 425 - .../AIX-00FB437F4C00/include/microhttpd.h | 3456 --- .../0.9.55/Linux-x86_64/include/microhttpd.h | 3456 --- .../2.1.5/AIX-00FB437F4C00/include/msgpack.h | 24 - msgpackc/2.1.5/Linux-x86_64/include/msgpack.h | 24 - .../4.4.0/AIX-00FB437F4C00/include/ocilib.h | 19176 ---------------- ocilib/4.4.0/Linux-x86_64/include/ocilib.h | 19176 ---------------- .../include/qlibc/containers/qgrow.h | 99 - .../include/qlibc/containers/qhasharr.h | 174 - .../include/qlibc/containers/qhashtbl.h | 135 - .../include/qlibc/containers/qlist.h | 161 - .../include/qlibc/containers/qlisttbl.h | 180 - .../include/qlibc/containers/qqueue.h | 116 - .../include/qlibc/containers/qstack.h | 116 - .../include/qlibc/containers/qtreetbl.h | 182 - .../include/qlibc/containers/qvector.h | 160 - .../include/qlibc/extensions/qaconf.h | 229 - .../include/qlibc/extensions/qconfig.h | 57 - .../include/qlibc/extensions/qdatabase.h | 140 - .../include/qlibc/extensions/qhttpclient.h | 127 - .../include/qlibc/extensions/qlog.h | 91 - .../include/qlibc/extensions/qtokenbucket.h | 140 - .../AIX-00FB437F4C00/include/qlibc/ipc/qsem.h | 56 - .../AIX-00FB437F4C00/include/qlibc/ipc/qshm.h | 52 - .../AIX-00FB437F4C00/include/qlibc/qlibc.h | 65 - .../AIX-00FB437F4C00/include/qlibc/qlibcext.h | 45 - .../include/qlibc/utilities/qcount.h | 54 - .../include/qlibc/utilities/qencode.h | 59 - .../include/qlibc/utilities/qfile.h | 69 - .../include/qlibc/utilities/qhash.h | 61 - .../include/qlibc/utilities/qio.h | 60 - .../include/qlibc/utilities/qsocket.h | 56 - .../include/qlibc/utilities/qstring.h | 78 - .../include/qlibc/utilities/qsystem.h | 49 - .../include/qlibc/utilities/qtime.h | 67 - qlibc/0.0.0/AIX-00FB437F4C00/libqlibc.a.1 | Bin 1449054 -> 0 bytes qlibc/0.0.0/AIX-00FB437F4C00/libqlibcext.a.1 | Bin 781274 -> 0 bytes .../include/qlibc/containers/qgrow.h | 99 - .../include/qlibc/containers/qhasharr.h | 174 - .../include/qlibc/containers/qhashtbl.h | 135 - .../include/qlibc/containers/qlist.h | 161 - .../include/qlibc/containers/qlisttbl.h | 180 - .../include/qlibc/containers/qqueue.h | 116 - .../include/qlibc/containers/qstack.h | 116 - .../include/qlibc/containers/qtreetbl.h | 182 - .../include/qlibc/containers/qvector.h | 160 - .../include/qlibc/extensions/qaconf.h | 229 - .../include/qlibc/extensions/qconfig.h | 57 - .../include/qlibc/extensions/qdatabase.h | 140 - .../include/qlibc/extensions/qhttpclient.h | 127 - .../include/qlibc/extensions/qlog.h | 91 - .../include/qlibc/extensions/qtokenbucket.h | 140 - .../Linux-x86_64/include/qlibc/ipc/qsem.h | 56 - .../Linux-x86_64/include/qlibc/ipc/qshm.h | 52 - .../0.0.0/Linux-x86_64/include/qlibc/qlibc.h | 65 - .../Linux-x86_64/include/qlibc/qlibcext.h | 45 - .../include/qlibc/utilities/qcount.h | 54 - .../include/qlibc/utilities/qencode.h | 59 - .../include/qlibc/utilities/qfile.h | 69 - .../include/qlibc/utilities/qhash.h | 61 - .../include/qlibc/utilities/qio.h | 60 - .../include/qlibc/utilities/qsocket.h | 56 - .../include/qlibc/utilities/qstring.h | 78 - .../include/qlibc/utilities/qsystem.h | 49 - .../include/qlibc/utilities/qtime.h | 67 - qlibc/0.0.0/Linux-x86_64/libqlibc.so.1 | Bin 379705 -> 0 bytes qlibc/0.0.0/Linux-x86_64/libqlibcext.so.1 | Bin 123120 -> 0 bytes 68 files changed, 51918 deletions(-) delete mode 100755 ark_tracing/1.0.0/AIX-00FB437F4C00/include/tracing.h delete mode 100755 ark_tracing/1.0.0/Linux-x86_64/include/tracing.h delete mode 100755 microhttpd/0.9.55/AIX-00FB437F4C00/include/microhttpd.h delete mode 100755 microhttpd/0.9.55/Linux-x86_64/include/microhttpd.h delete mode 100755 msgpackc/2.1.5/AIX-00FB437F4C00/include/msgpack.h delete mode 100755 msgpackc/2.1.5/Linux-x86_64/include/msgpack.h delete mode 100755 ocilib/4.4.0/AIX-00FB437F4C00/include/ocilib.h delete mode 100755 ocilib/4.4.0/Linux-x86_64/include/ocilib.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qgrow.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhasharr.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhashtbl.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlist.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlisttbl.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qqueue.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qstack.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qtreetbl.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qvector.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qaconf.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qconfig.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qdatabase.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qhttpclient.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qlog.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qtokenbucket.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qsem.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qshm.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibc.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibcext.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qcount.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qencode.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qfile.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qhash.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qio.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsocket.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qstring.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsystem.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qtime.h delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/libqlibc.a.1 delete mode 100755 qlibc/0.0.0/AIX-00FB437F4C00/libqlibcext.a.1 delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qgrow.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qhasharr.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qhashtbl.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qlist.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qlisttbl.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qqueue.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qstack.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qtreetbl.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/containers/qvector.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qaconf.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qconfig.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qdatabase.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qhttpclient.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qlog.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/extensions/qtokenbucket.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/ipc/qsem.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/ipc/qshm.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/qlibc.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/qlibcext.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qcount.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qencode.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qfile.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qhash.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qio.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qsocket.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qstring.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qsystem.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/include/qlibc/utilities/qtime.h delete mode 100755 qlibc/0.0.0/Linux-x86_64/libqlibc.so.1 delete mode 100755 qlibc/0.0.0/Linux-x86_64/libqlibcext.so.1 diff --git a/ark_tracing/1.0.0/AIX-00FB437F4C00/include/tracing.h b/ark_tracing/1.0.0/AIX-00FB437F4C00/include/tracing.h deleted file mode 100755 index fc76931..0000000 --- a/ark_tracing/1.0.0/AIX-00FB437F4C00/include/tracing.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * tracing.h - * - * Created on: 2017. 11. 20. - * Author: zeroshoo - */ - -/** - * Ark CDC Tracing File Contoller. - * - * This is a arkcdc tracing file contller library - * - * @file tracing.h - */ - -#ifndef INCLUDE_TRACING_H_ -#define INCLUDE_TRACING_H_ - -#include - -#include - -#include -#include - -#include "arkinternal.h" - -#ifdef __linux__ -#include -#endif - -#define LEN_PATHSIZE 256 -#define LEN_ALIAS 32 -#define LEN_VERSION 16 -#define LEN_TIMESTAMP 24 -#define LEN_DSN 64 - -#define LEN_OSNAME 16 -#define LEN_HOSTNAME 16 -#define LEN_KERNEL_RELEASE 32 -#define LEN_KERNEL_VERSION 40 -#define LEN_ARCHITECTURE 32 - -#define LEN_DBNAME 16 -#define LEN_INSTANCE_NAME 16 -#define LEN_DBBANNER 384 -#define LEN_DBVERSION 64 - -#define LEN_ROWID 24 -#define LEN_TRANSACTION_ID 20 - -#define LEN_SCHEMA 30 -#define LEN_OBJECT 128 - -#define LEN_MAX_REGULAR 4000 - -#define ARKCDC_NULL 0xFF00FF00 - -#define TEST_TRACING_FILE "test.trc" - -#define DBTYPE_ORACLE 0x08 -#define DBTYPE_MSSQL 0x35 -#define DBTYPE_MYSQL 0x37 -#define DBTYPE_CUBRID 0x46 -#define DBTYPE_TIBERO 0x71 -#define DBTYPE_ALTIBASE 0x41 -#define DBTYPE_POSTGRESQL 0x90 -#define DBTYPE_UNKNOWN 0xFF - -#define DBTYPE_STRING_ORACLE "ORACLE" -#define DBTYPE_STRING_MSSQL "SQLServer" -#define DBTYPE_STRING_MYSQL "Mysql" -#define DBTYPE_STRING_CUBRID "Cubrid" -#define DBTYPE_STRING_TIBERO "Tibero" -#define DBTYPE_STRING_ALTIBASE "Altibase" -#define DBTYPE_STRING_POSTGRESQL "Postgresql" -#define DBTYPE_STRING_UNKNOWN "Unknown" - -#define COL_BEFORE 0x01 -#define COL_AFTER 0x02 - -#define COL_TYPE_UNKNOWN 0x00 - -#define COL_TYPE_NUMERIC 0x01 - -#define COL_TYPE_STRING 0x11 - -#define COL_TYPE_DATE 0x21 -#define COL_TYPE_TIMESTAMP 0x22 -#define COL_TYPE_TIMESTAMP_TZ 0x23 -#define COL_TYPE_TIMESTAMP_TZR 0x24 -#define COL_TYPE_TIMESTAMP_LTZ 0x25 -#define COL_TYPE_INTERVAL_YM 0x30 -#define COL_TYPE_INTERVAL_DS 0x31 - -#define COL_TYPE_ROWID 0x60 - -#define COL_TYPE_LARGE 0x80 - -#define RECORD_TYPE_DML 0x01 -#define RECORD_TYPE_DDL 0x02 - -#define RECORD_TYPE_DML_UNKNOWN 0x00 -#define RECORD_TYPE_DML_DELETE 0x01 -#define RECORD_TYPE_DML_INSERT 0x02 -#define RECORD_TYPE_DML_UPDATE 0x03 -#define RECORD_TYPE_DML_UPDATE_PK 0x07 - -#define RECORD_TYPE_DDL_UNKNOWN 0x00 -#define RECORD_TYPE_DDL_CREATE_TABLE 0x01 -#define RECORD_TYPE_DDL_ALTER_TABLE 0x02 -#define RECORD_TYPE_DDL_DROP_TABLE 0x03 -#define RECORD_TYPE_DDL_RENAME_TABLE 0x04 -#define RECORD_TYPE_DDL_TRUNCATE_TABLE 0x05 - -#define TRACING_READONLY 0x01 -#define TRACING_READWRTIE 0x03 - -#define MODESTR_READWRTIE "r+b" -#define MODESTR_WRTIE "w+b" -#define MODESTR_READONLY "rb" - -#define TRACING_UMASK 0644 - -#define TRACING_VERSOION "1.0.0.3" - -#define TRACING_FILEFORMAT "%s/%s_%06d.trc" - -typedef struct acscn -{ - uint32_t high; - uint32_t wrap; - uint32_t base; -} ACDSN; - -///File Structure 정의 -// Tracing Meta info -// 512 bytes -typedef struct _st_tracing_meta -{ - uint16_t version; /* !< tracing version */ - uint8_t pad1[2]; - uint8_t pad2[4]; - uint32_t cksum; - char alias[LEN_ALIAS]; - uint8_t pad3[16]; - char filename[LEN_PATHSIZE]; - uint8_t pad4[196]; -} tracing_meta; - -//Extract details -// 512 bytes -typedef struct _st_tracing_extract -{ - char alias[LEN_ALIAS]; - uint8_t pad1[16]; - char version[LEN_VERSION]; - uint8_t pad2[16]; - char begin_timestamp[LEN_TIMESTAMP]; - ACDSN begin_commit_dsn; - uint8_t pad3[4]; - uint8_t pad4[16]; - char end_timestamp[LEN_TIMESTAMP]; - ACDSN end_commit_dsn; - uint8_t pad5[4]; - uint8_t pad6[16]; - uint8_t pad7[64]; - uint8_t pad8[256]; -} tracing_extract; - -//Operating System details -// 512 bytes -typedef struct _st_tracing_os -{ - uint8_t type; - uint8_t pad1[3]; - uint8_t pad2[12]; - char osname[LEN_OSNAME]; // uname - char hostname[LEN_HOSTNAME]; // hostname, uname -n - char kernel_release[LEN_KERNEL_RELEASE]; // uname -r - char kernel_version[LEN_KERNEL_VERSION]; // uname -v - uint8_t pad3[8]; - char architecture[LEN_ARCHITECTURE]; // uname -p - uint8_t pad4[96]; - uint8_t pad5[256]; -} tracing_os; - -// Soure Database details -// 512 bytes -typedef struct _st_tracing_database -{ - uint8_t type; // DBTYPE_ORACLE - uint8_t pad1[3]; - uint8_t version_flag; - uint8_t pad2[3]; - char db_name[LEN_DBNAME]; // SELECT NAME FROM V$DATABASE - char instance_name[LEN_INSTANCE_NAME]; // SELECT INSTANCE_NAME FROM V$INSTANCE - uint8_t pad3[8]; - char version[LEN_DBVERSION]; // SELECT VERSION FROM V$INSTANCE - uint8_t pad4[8]; - char banner[LEN_DBBANNER]; // SELECT BANNER FROM V$VERSION - uint8_t pad5[8]; -} tracing_database; - -//FILE HEADER -typedef struct _st_tracing_file_header -{ - tracing_meta meta; - tracing_extract extract; - tracing_os os; - tracing_database db; -} tracing_file_header; - -//Row Header -typedef struct _st_tracing_record_header -{ - uint8_t command; // DML, DDL - uint8_t type; // 0x01 DELETE, 0x02 INSERT, 0x03 UPDATE, 0x07 UPDATE including PK - int data_length; - char timestamp[LEN_TIMESTAMP]; - int sequence; // RBA - int block; // RBA - int offset; // RBA - short tx_index; - uint8_t tx_continue; - short col_count; - char schema[LEN_SCHEMA]; - char object[LEN_OBJECT]; -} tracing_record_header; - -//data record -typedef struct _st_tracing_record_data -{ - short colno; - uint8_t flag; // 0x01 BEFORE, 0x02 AFTER - short type; // 0x01 NUMERIC, 0x02 STRING, 0x03 DATE, 0x05 LOB - uint8_t is_null; - uint32_t length; - char str[LEN_MAX_REGULAR]; -} tracing_record_data; - -//file body Transaction Record -typedef struct _st_tracing_record_transaction -{ - char rowid[LEN_ROWID]; - ACDSN commit_dsn; - char tx_id[LEN_TRANSACTION_ID]; -} tracing_record_transaction; - -typedef struct _st_tracing_record -{ - tracing_record_header header; - tracing_record_data *data; - tracing_record_transaction transaction; -} tracing_record; - -typedef struct _st_tracing_record_bracket -{ - int index; - uint8_t flag; - uint8_t unused; - uint16_t length; - uint32_t tba; -} tracing_record_bracket; - -#define BRACKET_OPENING 40 -#define BRACKET_CLOSING 41 - -typedef struct _st_tracing_record_buffer -{ - tracing_record_bracket opener; - char *data; - tracing_record_bracket closer; -} tracing_record_buffer; - -typedef struct _st_tracing_status -{ - int seqno; - uint32_t tba; -} tracing_status; - -static ACDSN FFPADDING = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - -int dsncmp(ACDSN *l, ACDSN *r); -uint64_t getHumanToBytes(char *human); -char *get_database_type_to_string(uint8_t _type, char *_stringbuf); -char * trcstrerror(int errnum); - -int get_last_tracing_seq(const char *path, const char *alias); - -int check_tracing(const char *path); -bool checksum_header(const tracing_file_header *_header); -int check_header(const char *path); - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct actracer_t actracer_t; -typedef struct actloader_t actloader_t; - -#define ACTRC_OPT_THREADSAFE 0x01 -#define ACTRC_OPT_FLUSH 0x02 - -/* public functions */ -extern actracer_t *actracer(const char *_alias, const char *_dirpath, - const long int _rotateoffset, const int _rotateinterval, const int _options); - -extern actloader_t *actloader(const char *_alias, const char *_dirpath, const int _options); - -//extern int *_TrcErrno( void ); -//#define trcerrno (*_TrcErrno()) - -#ifndef trcerrno -extern int trcerrno; -#endif - -#define TEACCESS 1001 /* Trace file Permission denied */ -#define TENOTSFILE 1002 /* Trace status open fail */ -#define TEWRONGRBA 1003 /* Wrong trace file block address */ -#define TENOENT 1004 /* No such trace file or directory */ -#define TENOTRCFILE 1005 /* No such trace file or directory */ -#define TEPERM 1006 /* Trace operation not permitted */ -#define TEWRONGHEAD 1007 /* Wrong trace file header block */ -#define TENOCURRENT 1008 /* Trace file is not current file */ - -//#define TENOMEM 12 /* MEMORY ALLOCATE FAIL */ - - - -/** - * actracer_t structure object structure - */ -struct actracer_t { - /* encapsulated member functions */ - bool (*save_header) (actracer_t *self, tracing_file_header * _header); - bool (*load_header) (actracer_t *self, tracing_file_header *_header); - void (*set_os) (actracer_t *self, tracing_os * os); - void (*set_db) (actracer_t *self, tracing_database *db); - void (*set_extract) (actracer_t *self, ACDSN *commit_dsn, char *timestamp); - bool (*append_record) (actracer_t *self, tracing_record * _rec); - - bool (*force_close) (actracer_t *trc, ACDSN *commit_dsn, char *timestamp); - -// bool (*ts_clear) (actracer_t *trc); - - bool (*tflush) (actracer_t *trc); - void (*tfree) (actracer_t *trc); - - /* private variables - do not access directly */ - void *mutex; /*!< activated if compiled with --enable-threadsafe */ - - char alias[LEN_ALIAS]; /*!< alias */ - - tracing_file_header header; - - char tracedir[PATH_MAX]; /*!< trace file directory path */ - - char fileprefix[PATH_MAX]; /*!< file naming prefix */ - char filepath[PATH_MAX]; /*!< generated system path of tracing file */ - FILE *fp; /*!< file pointer of tracing file path */ - - int rotateinterval; /*!< traing file will be rotate in this interval seconds */ - int nextrotate; /*!< next rotate universal time, seconds */ - - uint64_t rotateoffset; /*!< traing file will be rotate in this size */ - bool trcflush; /*!< flag for immediate flushing */ - - uint32_t index; - - tracing_status ts; -// char statuspath[PATH_MAX]; /*!< generated system path of tracing status file */ -// FILE *tsfp; /*!< file pointer of tracing status file */ -// int tsfd; /*!< file pointer of tracing status file */ - - // FILE *outfp; /*!< stream pointer for duplication */ - // bool outflush; /*!< flag for immediate flushing for duplicated stream */ -}; - -/** - * actloader_t structure object structure - */ -struct actloader_t { - /* encapsulated member functions */ - bool (*load_header) (actloader_t *self, tracing_file_header * _header); - long int (*get_next_record) (actloader_t *self, tracing_record * _rec); - long int (*get_next_record_with_buffer) (actloader_t *self, tracing_record * _rec, tracing_record_buffer *_buffer); -// long int (*set_scn) (actloader_t *self, ACDSN *_dsn); - - long int (*search_file_scn) (actloader_t *tl, ACDSN *_dsn); - - long int (*seek_position) (actloader_t *tl, long int _position); - long int (*seek_record) (actloader_t *tl, long int _rec_num); - long int (*seek_scn) (actloader_t *tl, ACDSN *_dsn); - -// bool (*ts_clear) (actloader_t *trc); - - void (*tfree) (actloader_t *trc); - - bool is_current; - - /* private variables - do not access directly */ - void *mutex; /*!< activated if compiled with --enable-threadsafe */ - - char alias[LEN_ALIAS]; /*!< alias */ - - tracing_file_header header; - - char tracedir[PATH_MAX]; /*!< trace file directory path */ - - char filepath[PATH_MAX]; /*!< generated system path of tracing file */ - FILE *fp; /*!< file pointer of tracing file path */ - - uint32_t index; - - tracing_status ts; -// char statuspath[PATH_MAX]; /*!< generated system path of tracing status file */ -// FILE *tsfp; /*!< file pointer of tracing status file */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* INCLUDE_TRACING_H_ */ diff --git a/ark_tracing/1.0.0/Linux-x86_64/include/tracing.h b/ark_tracing/1.0.0/Linux-x86_64/include/tracing.h deleted file mode 100755 index fc76931..0000000 --- a/ark_tracing/1.0.0/Linux-x86_64/include/tracing.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * tracing.h - * - * Created on: 2017. 11. 20. - * Author: zeroshoo - */ - -/** - * Ark CDC Tracing File Contoller. - * - * This is a arkcdc tracing file contller library - * - * @file tracing.h - */ - -#ifndef INCLUDE_TRACING_H_ -#define INCLUDE_TRACING_H_ - -#include - -#include - -#include -#include - -#include "arkinternal.h" - -#ifdef __linux__ -#include -#endif - -#define LEN_PATHSIZE 256 -#define LEN_ALIAS 32 -#define LEN_VERSION 16 -#define LEN_TIMESTAMP 24 -#define LEN_DSN 64 - -#define LEN_OSNAME 16 -#define LEN_HOSTNAME 16 -#define LEN_KERNEL_RELEASE 32 -#define LEN_KERNEL_VERSION 40 -#define LEN_ARCHITECTURE 32 - -#define LEN_DBNAME 16 -#define LEN_INSTANCE_NAME 16 -#define LEN_DBBANNER 384 -#define LEN_DBVERSION 64 - -#define LEN_ROWID 24 -#define LEN_TRANSACTION_ID 20 - -#define LEN_SCHEMA 30 -#define LEN_OBJECT 128 - -#define LEN_MAX_REGULAR 4000 - -#define ARKCDC_NULL 0xFF00FF00 - -#define TEST_TRACING_FILE "test.trc" - -#define DBTYPE_ORACLE 0x08 -#define DBTYPE_MSSQL 0x35 -#define DBTYPE_MYSQL 0x37 -#define DBTYPE_CUBRID 0x46 -#define DBTYPE_TIBERO 0x71 -#define DBTYPE_ALTIBASE 0x41 -#define DBTYPE_POSTGRESQL 0x90 -#define DBTYPE_UNKNOWN 0xFF - -#define DBTYPE_STRING_ORACLE "ORACLE" -#define DBTYPE_STRING_MSSQL "SQLServer" -#define DBTYPE_STRING_MYSQL "Mysql" -#define DBTYPE_STRING_CUBRID "Cubrid" -#define DBTYPE_STRING_TIBERO "Tibero" -#define DBTYPE_STRING_ALTIBASE "Altibase" -#define DBTYPE_STRING_POSTGRESQL "Postgresql" -#define DBTYPE_STRING_UNKNOWN "Unknown" - -#define COL_BEFORE 0x01 -#define COL_AFTER 0x02 - -#define COL_TYPE_UNKNOWN 0x00 - -#define COL_TYPE_NUMERIC 0x01 - -#define COL_TYPE_STRING 0x11 - -#define COL_TYPE_DATE 0x21 -#define COL_TYPE_TIMESTAMP 0x22 -#define COL_TYPE_TIMESTAMP_TZ 0x23 -#define COL_TYPE_TIMESTAMP_TZR 0x24 -#define COL_TYPE_TIMESTAMP_LTZ 0x25 -#define COL_TYPE_INTERVAL_YM 0x30 -#define COL_TYPE_INTERVAL_DS 0x31 - -#define COL_TYPE_ROWID 0x60 - -#define COL_TYPE_LARGE 0x80 - -#define RECORD_TYPE_DML 0x01 -#define RECORD_TYPE_DDL 0x02 - -#define RECORD_TYPE_DML_UNKNOWN 0x00 -#define RECORD_TYPE_DML_DELETE 0x01 -#define RECORD_TYPE_DML_INSERT 0x02 -#define RECORD_TYPE_DML_UPDATE 0x03 -#define RECORD_TYPE_DML_UPDATE_PK 0x07 - -#define RECORD_TYPE_DDL_UNKNOWN 0x00 -#define RECORD_TYPE_DDL_CREATE_TABLE 0x01 -#define RECORD_TYPE_DDL_ALTER_TABLE 0x02 -#define RECORD_TYPE_DDL_DROP_TABLE 0x03 -#define RECORD_TYPE_DDL_RENAME_TABLE 0x04 -#define RECORD_TYPE_DDL_TRUNCATE_TABLE 0x05 - -#define TRACING_READONLY 0x01 -#define TRACING_READWRTIE 0x03 - -#define MODESTR_READWRTIE "r+b" -#define MODESTR_WRTIE "w+b" -#define MODESTR_READONLY "rb" - -#define TRACING_UMASK 0644 - -#define TRACING_VERSOION "1.0.0.3" - -#define TRACING_FILEFORMAT "%s/%s_%06d.trc" - -typedef struct acscn -{ - uint32_t high; - uint32_t wrap; - uint32_t base; -} ACDSN; - -///File Structure 정의 -// Tracing Meta info -// 512 bytes -typedef struct _st_tracing_meta -{ - uint16_t version; /* !< tracing version */ - uint8_t pad1[2]; - uint8_t pad2[4]; - uint32_t cksum; - char alias[LEN_ALIAS]; - uint8_t pad3[16]; - char filename[LEN_PATHSIZE]; - uint8_t pad4[196]; -} tracing_meta; - -//Extract details -// 512 bytes -typedef struct _st_tracing_extract -{ - char alias[LEN_ALIAS]; - uint8_t pad1[16]; - char version[LEN_VERSION]; - uint8_t pad2[16]; - char begin_timestamp[LEN_TIMESTAMP]; - ACDSN begin_commit_dsn; - uint8_t pad3[4]; - uint8_t pad4[16]; - char end_timestamp[LEN_TIMESTAMP]; - ACDSN end_commit_dsn; - uint8_t pad5[4]; - uint8_t pad6[16]; - uint8_t pad7[64]; - uint8_t pad8[256]; -} tracing_extract; - -//Operating System details -// 512 bytes -typedef struct _st_tracing_os -{ - uint8_t type; - uint8_t pad1[3]; - uint8_t pad2[12]; - char osname[LEN_OSNAME]; // uname - char hostname[LEN_HOSTNAME]; // hostname, uname -n - char kernel_release[LEN_KERNEL_RELEASE]; // uname -r - char kernel_version[LEN_KERNEL_VERSION]; // uname -v - uint8_t pad3[8]; - char architecture[LEN_ARCHITECTURE]; // uname -p - uint8_t pad4[96]; - uint8_t pad5[256]; -} tracing_os; - -// Soure Database details -// 512 bytes -typedef struct _st_tracing_database -{ - uint8_t type; // DBTYPE_ORACLE - uint8_t pad1[3]; - uint8_t version_flag; - uint8_t pad2[3]; - char db_name[LEN_DBNAME]; // SELECT NAME FROM V$DATABASE - char instance_name[LEN_INSTANCE_NAME]; // SELECT INSTANCE_NAME FROM V$INSTANCE - uint8_t pad3[8]; - char version[LEN_DBVERSION]; // SELECT VERSION FROM V$INSTANCE - uint8_t pad4[8]; - char banner[LEN_DBBANNER]; // SELECT BANNER FROM V$VERSION - uint8_t pad5[8]; -} tracing_database; - -//FILE HEADER -typedef struct _st_tracing_file_header -{ - tracing_meta meta; - tracing_extract extract; - tracing_os os; - tracing_database db; -} tracing_file_header; - -//Row Header -typedef struct _st_tracing_record_header -{ - uint8_t command; // DML, DDL - uint8_t type; // 0x01 DELETE, 0x02 INSERT, 0x03 UPDATE, 0x07 UPDATE including PK - int data_length; - char timestamp[LEN_TIMESTAMP]; - int sequence; // RBA - int block; // RBA - int offset; // RBA - short tx_index; - uint8_t tx_continue; - short col_count; - char schema[LEN_SCHEMA]; - char object[LEN_OBJECT]; -} tracing_record_header; - -//data record -typedef struct _st_tracing_record_data -{ - short colno; - uint8_t flag; // 0x01 BEFORE, 0x02 AFTER - short type; // 0x01 NUMERIC, 0x02 STRING, 0x03 DATE, 0x05 LOB - uint8_t is_null; - uint32_t length; - char str[LEN_MAX_REGULAR]; -} tracing_record_data; - -//file body Transaction Record -typedef struct _st_tracing_record_transaction -{ - char rowid[LEN_ROWID]; - ACDSN commit_dsn; - char tx_id[LEN_TRANSACTION_ID]; -} tracing_record_transaction; - -typedef struct _st_tracing_record -{ - tracing_record_header header; - tracing_record_data *data; - tracing_record_transaction transaction; -} tracing_record; - -typedef struct _st_tracing_record_bracket -{ - int index; - uint8_t flag; - uint8_t unused; - uint16_t length; - uint32_t tba; -} tracing_record_bracket; - -#define BRACKET_OPENING 40 -#define BRACKET_CLOSING 41 - -typedef struct _st_tracing_record_buffer -{ - tracing_record_bracket opener; - char *data; - tracing_record_bracket closer; -} tracing_record_buffer; - -typedef struct _st_tracing_status -{ - int seqno; - uint32_t tba; -} tracing_status; - -static ACDSN FFPADDING = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - -int dsncmp(ACDSN *l, ACDSN *r); -uint64_t getHumanToBytes(char *human); -char *get_database_type_to_string(uint8_t _type, char *_stringbuf); -char * trcstrerror(int errnum); - -int get_last_tracing_seq(const char *path, const char *alias); - -int check_tracing(const char *path); -bool checksum_header(const tracing_file_header *_header); -int check_header(const char *path); - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct actracer_t actracer_t; -typedef struct actloader_t actloader_t; - -#define ACTRC_OPT_THREADSAFE 0x01 -#define ACTRC_OPT_FLUSH 0x02 - -/* public functions */ -extern actracer_t *actracer(const char *_alias, const char *_dirpath, - const long int _rotateoffset, const int _rotateinterval, const int _options); - -extern actloader_t *actloader(const char *_alias, const char *_dirpath, const int _options); - -//extern int *_TrcErrno( void ); -//#define trcerrno (*_TrcErrno()) - -#ifndef trcerrno -extern int trcerrno; -#endif - -#define TEACCESS 1001 /* Trace file Permission denied */ -#define TENOTSFILE 1002 /* Trace status open fail */ -#define TEWRONGRBA 1003 /* Wrong trace file block address */ -#define TENOENT 1004 /* No such trace file or directory */ -#define TENOTRCFILE 1005 /* No such trace file or directory */ -#define TEPERM 1006 /* Trace operation not permitted */ -#define TEWRONGHEAD 1007 /* Wrong trace file header block */ -#define TENOCURRENT 1008 /* Trace file is not current file */ - -//#define TENOMEM 12 /* MEMORY ALLOCATE FAIL */ - - - -/** - * actracer_t structure object structure - */ -struct actracer_t { - /* encapsulated member functions */ - bool (*save_header) (actracer_t *self, tracing_file_header * _header); - bool (*load_header) (actracer_t *self, tracing_file_header *_header); - void (*set_os) (actracer_t *self, tracing_os * os); - void (*set_db) (actracer_t *self, tracing_database *db); - void (*set_extract) (actracer_t *self, ACDSN *commit_dsn, char *timestamp); - bool (*append_record) (actracer_t *self, tracing_record * _rec); - - bool (*force_close) (actracer_t *trc, ACDSN *commit_dsn, char *timestamp); - -// bool (*ts_clear) (actracer_t *trc); - - bool (*tflush) (actracer_t *trc); - void (*tfree) (actracer_t *trc); - - /* private variables - do not access directly */ - void *mutex; /*!< activated if compiled with --enable-threadsafe */ - - char alias[LEN_ALIAS]; /*!< alias */ - - tracing_file_header header; - - char tracedir[PATH_MAX]; /*!< trace file directory path */ - - char fileprefix[PATH_MAX]; /*!< file naming prefix */ - char filepath[PATH_MAX]; /*!< generated system path of tracing file */ - FILE *fp; /*!< file pointer of tracing file path */ - - int rotateinterval; /*!< traing file will be rotate in this interval seconds */ - int nextrotate; /*!< next rotate universal time, seconds */ - - uint64_t rotateoffset; /*!< traing file will be rotate in this size */ - bool trcflush; /*!< flag for immediate flushing */ - - uint32_t index; - - tracing_status ts; -// char statuspath[PATH_MAX]; /*!< generated system path of tracing status file */ -// FILE *tsfp; /*!< file pointer of tracing status file */ -// int tsfd; /*!< file pointer of tracing status file */ - - // FILE *outfp; /*!< stream pointer for duplication */ - // bool outflush; /*!< flag for immediate flushing for duplicated stream */ -}; - -/** - * actloader_t structure object structure - */ -struct actloader_t { - /* encapsulated member functions */ - bool (*load_header) (actloader_t *self, tracing_file_header * _header); - long int (*get_next_record) (actloader_t *self, tracing_record * _rec); - long int (*get_next_record_with_buffer) (actloader_t *self, tracing_record * _rec, tracing_record_buffer *_buffer); -// long int (*set_scn) (actloader_t *self, ACDSN *_dsn); - - long int (*search_file_scn) (actloader_t *tl, ACDSN *_dsn); - - long int (*seek_position) (actloader_t *tl, long int _position); - long int (*seek_record) (actloader_t *tl, long int _rec_num); - long int (*seek_scn) (actloader_t *tl, ACDSN *_dsn); - -// bool (*ts_clear) (actloader_t *trc); - - void (*tfree) (actloader_t *trc); - - bool is_current; - - /* private variables - do not access directly */ - void *mutex; /*!< activated if compiled with --enable-threadsafe */ - - char alias[LEN_ALIAS]; /*!< alias */ - - tracing_file_header header; - - char tracedir[PATH_MAX]; /*!< trace file directory path */ - - char filepath[PATH_MAX]; /*!< generated system path of tracing file */ - FILE *fp; /*!< file pointer of tracing file path */ - - uint32_t index; - - tracing_status ts; -// char statuspath[PATH_MAX]; /*!< generated system path of tracing status file */ -// FILE *tsfp; /*!< file pointer of tracing status file */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* INCLUDE_TRACING_H_ */ diff --git a/microhttpd/0.9.55/AIX-00FB437F4C00/include/microhttpd.h b/microhttpd/0.9.55/AIX-00FB437F4C00/include/microhttpd.h deleted file mode 100755 index 40a723d..0000000 --- a/microhttpd/0.9.55/AIX-00FB437F4C00/include/microhttpd.h +++ /dev/null @@ -1,3456 +0,0 @@ -/* - This file is part of libmicrohttpd - Copyright (C) 2006-2017 Christian Grothoff (and other contributing authors) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/** - * @file microhttpd.h - * @brief public interface to libmicrohttpd - * @author Christian Grothoff - * @author Karlson2k (Evgeny Grin) - * @author Chris GauthierDickey - * - * All symbols defined in this header start with MHD. MHD is a small - * HTTP daemon library. As such, it does not have any API for logging - * errors (you can only enable or disable logging to stderr). Also, - * it may not support all of the HTTP features directly, where - * applicable, portions of HTTP may have to be handled by clients of - * the library. - * - * The library is supposed to handle everything that it must handle - * (because the API would not allow clients to do this), such as basic - * connection management; however, detailed interpretations of headers - * -- such as range requests -- and HTTP methods are left to clients. - * The library does understand HEAD and will only send the headers of - * the response and not the body, even if the client supplied a body. - * The library also understands headers that control connection - * management (specifically, "Connection: close" and "Expect: 100 - * continue" are understood and handled automatically). - * - * MHD understands POST data and is able to decode certain formats - * (at the moment only "application/x-www-form-urlencoded" and - * "mulitpart/formdata"). Unsupported encodings and large POST - * submissions may require the application to manually process - * the stream, which is provided to the main application (and thus can be - * processed, just not conveniently by MHD). - * - * The header file defines various constants used by the HTTP protocol. - * This does not mean that MHD actually interprets all of these - * values. The provided constants are exported as a convenience - * for users of the library. MHD does not verify that transmitted - * HTTP headers are part of the standard specification; users of the - * library are free to define their own extensions of the HTTP - * standard and use those with MHD. - * - * All functions are guaranteed to be completely reentrant and - * thread-safe (with the exception of #MHD_set_connection_value, - * which must only be used in a particular context). - * - * - * @defgroup event event-loop control - * MHD API to start and stop the HTTP server and manage the event loop. - * @defgroup response generation of responses - * MHD API used to generate responses. - * @defgroup request handling of requests - * MHD API used to access information about requests. - * @defgroup authentication HTTP authentication - * MHD API related to basic and digest HTTP authentication. - * @defgroup logging logging - * MHD API to mange logging and error handling - * @defgroup specialized misc. specialized functions - * This group includes functions that do not fit into any particular - * category and that are rarely used. - */ - -#ifndef MHD_MICROHTTPD_H -#define MHD_MICROHTTPD_H - -#ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - -/* While we generally would like users to use a configure-driven - build process which detects which headers are present and - hence works on any platform, we use "standard" includes here - to build out-of-the-box for beginning users on common systems. - - If generic headers don't work on your platform, include headers - which define 'va_list', 'size_t', 'ssize_t', 'intptr_t', - 'uint16_t', 'uint32_t', 'uint64_t', 'off_t', 'struct sockaddr', - 'socklen_t', 'fd_set' and "#define MHD_PLATFORM_H" before - including "microhttpd.h". Then the following "standard" - includes won't be used (which might be a good idea, especially - on platforms where they do not exist). - */ -#ifndef MHD_PLATFORM_H -#include -#include -#include -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#if defined(_MSC_FULL_VER) && !defined (_SSIZE_T_DEFINED) -#define _SSIZE_T_DEFINED -typedef intptr_t ssize_t; -#endif /* !_SSIZE_T_DEFINED */ -#else -#include -#include -#include -#endif -#endif - -#if defined(__CYGWIN__) && !defined(_SYS_TYPES_FD_SET) -/* Do not define __USE_W32_SOCKETS under Cygwin! */ -#error Cygwin with winsock fd_set is not supported -#endif - -/** - * Current version of the library. - * 0x01093001 = 1.9.30-1. - */ -#define MHD_VERSION 0x00095500 - -/** - * MHD-internal return code for "YES". - */ -#define MHD_YES 1 - -/** - * MHD-internal return code for "NO". - */ -#define MHD_NO 0 - -/** - * MHD digest auth internal code for an invalid nonce. - */ -#define MHD_INVALID_NONCE -1 - -/** - * Constant used to indicate unknown size (use when - * creating a response). - */ -#ifdef UINT64_MAX -#define MHD_SIZE_UNKNOWN UINT64_MAX -#else -#define MHD_SIZE_UNKNOWN ((uint64_t) -1LL) -#endif - -#ifdef SIZE_MAX -#define MHD_CONTENT_READER_END_OF_STREAM SIZE_MAX -#define MHD_CONTENT_READER_END_WITH_ERROR (SIZE_MAX - 1) -#else -#define MHD_CONTENT_READER_END_OF_STREAM ((size_t) -1LL) -#define MHD_CONTENT_READER_END_WITH_ERROR (((size_t) -1LL) - 1) -#endif - -#ifndef _MHD_EXTERN -#if defined(_WIN32) && defined(MHD_W32LIB) -#define _MHD_EXTERN extern -#elif defined (_WIN32) && defined(MHD_W32DLL) -/* Define MHD_W32DLL when using MHD as W32 .DLL to speed up linker a little */ -#define _MHD_EXTERN __declspec(dllimport) -#else -#define _MHD_EXTERN extern -#endif -#endif - -#ifndef MHD_SOCKET_DEFINED -/** - * MHD_socket is type for socket FDs - */ -#if !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) -#define MHD_POSIX_SOCKETS 1 -typedef int MHD_socket; -#define MHD_INVALID_SOCKET (-1) -#else /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ -#define MHD_WINSOCK_SOCKETS 1 -#include -typedef SOCKET MHD_socket; -#define MHD_INVALID_SOCKET (INVALID_SOCKET) -#endif /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ -#define MHD_SOCKET_DEFINED 1 -#endif /* MHD_SOCKET_DEFINED */ - -/** - * Define MHD_NO_DEPRECATION before including "microhttpd.h" to disable deprecation messages - */ -#ifdef MHD_NO_DEPRECATION -#define _MHD_DEPR_MACRO(msg) -#define _MHD_NO_DEPR_IN_MACRO 1 -#define _MHD_DEPR_IN_MACRO(msg) -#define _MHD_NO_DEPR_FUNC 1 -#define _MHD_DEPR_FUNC(msg) -#endif /* MHD_NO_DEPRECATION */ - -#ifndef _MHD_DEPR_MACRO -#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1500 -/* VS 2008 or later */ -/* Stringify macros */ -#define _MHD_INSTRMACRO(a) #a -#define _MHD_STRMACRO(a) _MHD_INSTRMACRO(a) -/* deprecation message */ -#define _MHD_DEPR_MACRO(msg) __pragma(message(__FILE__ "(" _MHD_STRMACRO(__LINE__)"): warning: " msg)) -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#elif defined(__clang__) || defined (__GNUC_PATCHLEVEL__) -/* clang or GCC since 3.0 */ -#define _MHD_GCC_PRAG(x) _Pragma (#x) -#if __clang_major__+0 >= 5 || \ - (!defined(__apple_build_version__) && (__clang_major__+0 > 3 || (__clang_major__+0 == 3 && __clang_minor__ >= 3))) || \ - __GNUC__+0 > 4 || (__GNUC__+0 == 4 && __GNUC_MINOR__+0 >= 8) -/* clang >= 3.3 (or XCode's clang >= 5.0) or - GCC >= 4.8 */ -#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(GCC warning msg) -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#else /* older clang or GCC */ -/* clang < 3.3, XCode's clang < 5.0, 3.0 <= GCC < 4.8 */ -#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(message msg) -#if (__clang_major__+0 > 2 || (__clang_major__+0 == 2 && __clang_minor__ >= 9)) /* FIXME: clang >= 2.9, earlier versions not tested */ -/* clang handles inline pragmas better than GCC */ -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#endif /* clang >= 2.9 */ -#endif /* older clang or GCC */ -/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */ -#endif /* clang || GCC >= 3.0 */ -#endif /* !_MHD_DEPR_MACRO */ - -#ifndef _MHD_DEPR_MACRO -#define _MHD_DEPR_MACRO(msg) -#endif /* !_MHD_DEPR_MACRO */ - -#ifndef _MHD_DEPR_IN_MACRO -#define _MHD_NO_DEPR_IN_MACRO 1 -#define _MHD_DEPR_IN_MACRO(msg) -#endif /* !_MHD_DEPR_IN_MACRO */ - -#ifndef _MHD_DEPR_FUNC -#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1400 -/* VS 2005 or later */ -#define _MHD_DEPR_FUNC(msg) __declspec(deprecated(msg)) -#elif defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1310 -/* VS .NET 2003 deprecation do not support custom messages */ -#define _MHD_DEPR_FUNC(msg) __declspec(deprecated) -#elif (__GNUC__+0 >= 5) || (defined (__clang__) && \ - (__clang_major__+0 > 2 || (__clang_major__+0 == 2 && __clang_minor__ >= 9))) /* FIXME: earlier versions not tested */ -/* GCC >= 5.0 or clang >= 2.9 */ -#define _MHD_DEPR_FUNC(msg) __attribute__((deprecated(msg))) -#elif defined (__clang__) || __GNUC__+0 > 3 || (__GNUC__+0 == 3 && __GNUC_MINOR__+0 >= 1) -/* 3.1 <= GCC < 5.0 or clang < 2.9 */ -/* old GCC-style deprecation do not support custom messages */ -#define _MHD_DEPR_FUNC(msg) __attribute__((__deprecated__)) -/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */ -#endif /* clang < 2.9 || GCC >= 3.1 */ -#endif /* !_MHD_DEPR_FUNC */ - -#ifndef _MHD_DEPR_FUNC -#define _MHD_NO_DEPR_FUNC 1 -#define _MHD_DEPR_FUNC(msg) -#endif /* !_MHD_DEPR_FUNC */ - -/** - * Not all architectures and `printf()`'s support the `long long` type. - * This gives the ability to replace `long long` with just a `long`, - * standard `int` or a `short`. - */ -#ifndef MHD_LONG_LONG -/** - * @deprecated use #MHD_UNSIGNED_LONG_LONG instead! - */ -#define MHD_LONG_LONG long long -#define MHD_UNSIGNED_LONG_LONG unsigned long long -#else /* MHD_LONG_LONG */ -_MHD_DEPR_MACRO("Macro MHD_LONG_LONG is deprecated, use MHD_UNSIGNED_LONG_LONG") -#endif -/** - * Format string for printing a variable of type #MHD_LONG_LONG. - * You should only redefine this if you also define #MHD_LONG_LONG. - */ -#ifndef MHD_LONG_LONG_PRINTF -/** - * @deprecated use #MHD_UNSIGNED_LONG_LONG_PRINTF instead! - */ -#define MHD_LONG_LONG_PRINTF "ll" -#define MHD_UNSIGNED_LONG_LONG_PRINTF "%llu" -#else /* MHD_LONG_LONG_PRINTF */ -_MHD_DEPR_MACRO("Macro MHD_LONG_LONG_PRINTF is deprecated, use MHD_UNSIGNED_LONG_LONG_PRINTF") -#endif - - -/** - * @defgroup httpcode HTTP response codes. - * These are the status codes defined for HTTP responses. - * @{ - */ -/* See http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml */ - -#define MHD_HTTP_CONTINUE 100 -#define MHD_HTTP_SWITCHING_PROTOCOLS 101 -#define MHD_HTTP_PROCESSING 102 - -#define MHD_HTTP_OK 200 -#define MHD_HTTP_CREATED 201 -#define MHD_HTTP_ACCEPTED 202 -#define MHD_HTTP_NON_AUTHORITATIVE_INFORMATION 203 -#define MHD_HTTP_NO_CONTENT 204 -#define MHD_HTTP_RESET_CONTENT 205 -#define MHD_HTTP_PARTIAL_CONTENT 206 -#define MHD_HTTP_MULTI_STATUS 207 -#define MHD_HTTP_ALREADY_REPORTED 208 - -#define MHD_HTTP_IM_USED 226 - -#define MHD_HTTP_MULTIPLE_CHOICES 300 -#define MHD_HTTP_MOVED_PERMANENTLY 301 -#define MHD_HTTP_FOUND 302 -#define MHD_HTTP_SEE_OTHER 303 -#define MHD_HTTP_NOT_MODIFIED 304 -#define MHD_HTTP_USE_PROXY 305 -#define MHD_HTTP_SWITCH_PROXY 306 -#define MHD_HTTP_TEMPORARY_REDIRECT 307 -#define MHD_HTTP_PERMANENT_REDIRECT 308 - -#define MHD_HTTP_BAD_REQUEST 400 -#define MHD_HTTP_UNAUTHORIZED 401 -#define MHD_HTTP_PAYMENT_REQUIRED 402 -#define MHD_HTTP_FORBIDDEN 403 -#define MHD_HTTP_NOT_FOUND 404 -#define MHD_HTTP_METHOD_NOT_ALLOWED 405 -#define MHD_HTTP_NOT_ACCEPTABLE 406 -/** @deprecated */ -#define MHD_HTTP_METHOD_NOT_ACCEPTABLE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_METHOD_NOT_ACCEPTABLE is deprecated, use MHD_HTTP_NOT_ACCEPTABLE") 406 -#define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407 -#define MHD_HTTP_REQUEST_TIMEOUT 408 -#define MHD_HTTP_CONFLICT 409 -#define MHD_HTTP_GONE 410 -#define MHD_HTTP_LENGTH_REQUIRED 411 -#define MHD_HTTP_PRECONDITION_FAILED 412 -#define MHD_HTTP_PAYLOAD_TOO_LARGE 413 -/** @deprecated */ -#define MHD_HTTP_REQUEST_ENTITY_TOO_LARGE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUEST_ENTITY_TOO_LARGE is deprecated, use MHD_HTTP_PAYLOAD_TOO_LARGE") 413 -#define MHD_HTTP_URI_TOO_LONG 414 -/** @deprecated */ -#define MHD_HTTP_REQUEST_URI_TOO_LONG \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUEST_URI_TOO_LONG is deprecated, use MHD_HTTP_URI_TOO_LONG") 414 -#define MHD_HTTP_UNSUPPORTED_MEDIA_TYPE 415 -#define MHD_HTTP_RANGE_NOT_SATISFIABLE 416 -/** @deprecated */ -#define MHD_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE is deprecated, use MHD_HTTP_RANGE_NOT_SATISFIABLE") 416 -#define MHD_HTTP_EXPECTATION_FAILED 417 - -#define MHD_HTTP_MISDIRECTED_REQUEST 421 -#define MHD_HTTP_UNPROCESSABLE_ENTITY 422 -#define MHD_HTTP_LOCKED 423 -#define MHD_HTTP_FAILED_DEPENDENCY 424 -#define MHD_HTTP_UNORDERED_COLLECTION 425 -#define MHD_HTTP_UPGRADE_REQUIRED 426 - -#define MHD_HTTP_PRECONDITION_REQUIRED 428 -#define MHD_HTTP_TOO_MANY_REQUESTS 429 -#define MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 431 - -#define MHD_HTTP_NO_RESPONSE 444 - -#define MHD_HTTP_RETRY_WITH 449 -#define MHD_HTTP_BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS 450 -#define MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451 - -#define MHD_HTTP_INTERNAL_SERVER_ERROR 500 -#define MHD_HTTP_NOT_IMPLEMENTED 501 -#define MHD_HTTP_BAD_GATEWAY 502 -#define MHD_HTTP_SERVICE_UNAVAILABLE 503 -#define MHD_HTTP_GATEWAY_TIMEOUT 504 -#define MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED 505 -#define MHD_HTTP_VARIANT_ALSO_NEGOTIATES 506 -#define MHD_HTTP_INSUFFICIENT_STORAGE 507 -#define MHD_HTTP_LOOP_DETECTED 508 -#define MHD_HTTP_BANDWIDTH_LIMIT_EXCEEDED 509 -#define MHD_HTTP_NOT_EXTENDED 510 -#define MHD_HTTP_NETWORK_AUTHENTICATION_REQUIRED 511 - -/** @} */ /* end of group httpcode */ - -/** - * Returns the string reason phrase for a response code. - * - * If we don't have a string for a status code, we give the first - * message in that status code class. - */ -_MHD_EXTERN const char * -MHD_get_reason_phrase_for (unsigned int code); - - -/** - * Flag to be or-ed with MHD_HTTP status code for - * SHOUTcast. This will cause the response to begin - * with the SHOUTcast "ICY" line instad of "HTTP". - * @ingroup specialized - */ -#define MHD_ICY_FLAG ((uint32_t)(((uint32_t)1) << 31)) - -/** - * @defgroup headers HTTP headers - * These are the standard headers found in HTTP requests and responses. - * See: http://www.iana.org/assignments/message-headers/message-headers.xml - * Registry Version 2017-01-27 - * @{ - */ - -/* Main HTTP headers. */ -/* Standard. RFC7231, Section 5.3.2 */ -#define MHD_HTTP_HEADER_ACCEPT "Accept" -/* Standard. RFC7231, Section 5.3.3 */ -#define MHD_HTTP_HEADER_ACCEPT_CHARSET "Accept-Charset" -/* Standard. RFC7231, Section 5.3.4; RFC7694, Section 3 */ -#define MHD_HTTP_HEADER_ACCEPT_ENCODING "Accept-Encoding" -/* Standard. RFC7231, Section 5.3.5 */ -#define MHD_HTTP_HEADER_ACCEPT_LANGUAGE "Accept-Language" -/* Standard. RFC7233, Section 2.3 */ -#define MHD_HTTP_HEADER_ACCEPT_RANGES "Accept-Ranges" -/* Standard. RFC7234, Section 5.1 */ -#define MHD_HTTP_HEADER_AGE "Age" -/* Standard. RFC7231, Section 7.4.1 */ -#define MHD_HTTP_HEADER_ALLOW "Allow" -/* Standard. RFC7235, Section 4.2 */ -#define MHD_HTTP_HEADER_AUTHORIZATION "Authorization" -/* Standard. RFC7234, Section 5.2 */ -#define MHD_HTTP_HEADER_CACHE_CONTROL "Cache-Control" -/* Reserved. RFC7230, Section 8.1 */ -#define MHD_HTTP_HEADER_CLOSE "Close" -/* Standard. RFC7230, Section 6.1 */ -#define MHD_HTTP_HEADER_CONNECTION "Connection" -/* Standard. RFC7231, Section 3.1.2.2 */ -#define MHD_HTTP_HEADER_CONTENT_ENCODING "Content-Encoding" -/* Standard. RFC7231, Section 3.1.3.2 */ -#define MHD_HTTP_HEADER_CONTENT_LANGUAGE "Content-Language" -/* Standard. RFC7230, Section 3.3.2 */ -#define MHD_HTTP_HEADER_CONTENT_LENGTH "Content-Length" -/* Standard. RFC7231, Section 3.1.4.2 */ -#define MHD_HTTP_HEADER_CONTENT_LOCATION "Content-Location" -/* Standard. RFC7233, Section 4.2 */ -#define MHD_HTTP_HEADER_CONTENT_RANGE "Content-Range" -/* Standard. RFC7231, Section 3.1.1.5 */ -#define MHD_HTTP_HEADER_CONTENT_TYPE "Content-Type" -/* Standard. RFC7231, Section 7.1.1.2 */ -#define MHD_HTTP_HEADER_DATE "Date" -/* Standard. RFC7232, Section 2.3 */ -#define MHD_HTTP_HEADER_ETAG "ETag" -/* Standard. RFC7231, Section 5.1.1 */ -#define MHD_HTTP_HEADER_EXPECT "Expect" -/* Standard. RFC7234, Section 5.3 */ -#define MHD_HTTP_HEADER_EXPIRES "Expires" -/* Standard. RFC7231, Section 5.5.1 */ -#define MHD_HTTP_HEADER_FROM "From" -/* Standard. RFC7230, Section 5.4 */ -#define MHD_HTTP_HEADER_HOST "Host" -/* Standard. RFC7232, Section 3.1 */ -#define MHD_HTTP_HEADER_IF_MATCH "If-Match" -/* Standard. RFC7232, Section 3.3 */ -#define MHD_HTTP_HEADER_IF_MODIFIED_SINCE "If-Modified-Since" -/* Standard. RFC7232, Section 3.2 */ -#define MHD_HTTP_HEADER_IF_NONE_MATCH "If-None-Match" -/* Standard. RFC7233, Section 3.2 */ -#define MHD_HTTP_HEADER_IF_RANGE "If-Range" -/* Standard. RFC7232, Section 3.4 */ -#define MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since" -/* Standard. RFC7232, Section 2.2 */ -#define MHD_HTTP_HEADER_LAST_MODIFIED "Last-Modified" -/* Standard. RFC7231, Section 7.1.2 */ -#define MHD_HTTP_HEADER_LOCATION "Location" -/* Standard. RFC7231, Section 5.1.2 */ -#define MHD_HTTP_HEADER_MAX_FORWARDS "Max-Forwards" -/* Standard. RFC7231, Appendix A.1 */ -#define MHD_HTTP_HEADER_MIME_VERSION "MIME-Version" -/* Standard. RFC7234, Section 5.4 */ -#define MHD_HTTP_HEADER_PRAGMA "Pragma" -/* Standard. RFC7235, Section 4.3 */ -#define MHD_HTTP_HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" -/* Standard. RFC7235, Section 4.4 */ -#define MHD_HTTP_HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" -/* Standard. RFC7233, Section 3.1 */ -#define MHD_HTTP_HEADER_RANGE "Range" -/* Standard. RFC7231, Section 5.5.2 */ -#define MHD_HTTP_HEADER_REFERER "Referer" -/* Standard. RFC7231, Section 7.1.3 */ -#define MHD_HTTP_HEADER_RETRY_AFTER "Retry-After" -/* Standard. RFC7231, Section 7.4.2 */ -#define MHD_HTTP_HEADER_SERVER "Server" -/* Standard. RFC7230, Section 4.3 */ -#define MHD_HTTP_HEADER_TE "TE" -/* Standard. RFC7230, Section 4.4 */ -#define MHD_HTTP_HEADER_TRAILER "Trailer" -/* Standard. RFC7230, Section 3.3.1 */ -#define MHD_HTTP_HEADER_TRANSFER_ENCODING "Transfer-Encoding" -/* Standard. RFC7230, Section 6.7 */ -#define MHD_HTTP_HEADER_UPGRADE "Upgrade" -/* Standard. RFC7231, Section 5.5.3 */ -#define MHD_HTTP_HEADER_USER_AGENT "User-Agent" -/* Standard. RFC7231, Section 7.1.4 */ -#define MHD_HTTP_HEADER_VARY "Vary" -/* Standard. RFC7230, Section 5.7.1 */ -#define MHD_HTTP_HEADER_VIA "Via" -/* Standard. RFC7235, Section 4.1 */ -#define MHD_HTTP_HEADER_WWW_AUTHENTICATE "WWW-Authenticate" -/* Standard. RFC7234, Section 5.5 */ -#define MHD_HTTP_HEADER_WARNING "Warning" - -/* Additional HTTP headers. */ -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_A_IM "A-IM" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ACCEPT_ADDITIONS "Accept-Additions" -/* Informational. RFC7089 */ -#define MHD_HTTP_HEADER_ACCEPT_DATETIME "Accept-Datetime" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ACCEPT_FEATURES "Accept-Features" -/* No category. RFC5789 */ -#define MHD_HTTP_HEADER_ACCEPT_PATCH "Accept-Patch" -/* Standard. RFC7639, Section 2 */ -#define MHD_HTTP_HEADER_ALPN "ALPN" -/* Standard. RFC7838 */ -#define MHD_HTTP_HEADER_ALT_SVC "Alt-Svc" -/* Standard. RFC7838 */ -#define MHD_HTTP_HEADER_ALT_USED "Alt-Used" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ALTERNATES "Alternates" -/* No category. RFC4437 */ -#define MHD_HTTP_HEADER_APPLY_TO_REDIRECT_REF "Apply-To-Redirect-Ref" -/* Experimental. RFC8053, Section 4 */ -#define MHD_HTTP_HEADER_AUTHENTICATION_CONTROL "Authentication-Control" -/* Standard. RFC7615, Section 3 */ -#define MHD_HTTP_HEADER_AUTHENTICATION_INFO "Authentication-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_EXT "C-Ext" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_MAN "C-Man" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_OPT "C-Opt" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_PEP "C-PEP" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_PEP_INFO "C-PEP-Info" -/* Standard. RFC7809, Section 7.1 */ -#define MHD_HTTP_HEADER_CALDAV_TIMEZONES "CalDAV-Timezones" -/* Obsoleted. RFC2068; RFC2616 */ -#define MHD_HTTP_HEADER_CONTENT_BASE "Content-Base" -/* Standard. RFC6266 */ -#define MHD_HTTP_HEADER_CONTENT_DISPOSITION "Content-Disposition" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_ID "Content-ID" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_MD5 "Content-MD5" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_SCRIPT_TYPE "Content-Script-Type" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_STYLE_TYPE "Content-Style-Type" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_VERSION "Content-Version" -/* Standard. RFC6265 */ -#define MHD_HTTP_HEADER_COOKIE "Cookie" -/* Obsoleted. RFC2965; RFC6265 */ -#define MHD_HTTP_HEADER_COOKIE2 "Cookie2" -/* Standard. RFC5323 */ -#define MHD_HTTP_HEADER_DASL "DASL" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DAV "DAV" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DEFAULT_STYLE "Default-Style" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DELTA_BASE "Delta-Base" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DEPTH "Depth" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DERIVED_FROM "Derived-From" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DESTINATION "Destination" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DIFFERENTIAL_ID "Differential-ID" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DIGEST "Digest" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_EXT "Ext" -/* Standard. RFC7239 */ -#define MHD_HTTP_HEADER_FORWARDED "Forwarded" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_GETPROFILE "GetProfile" -/* Experimental. RFC7486, Section 6.1.1 */ -#define MHD_HTTP_HEADER_HOBAREG "Hobareg" -/* Standard. RFC7540, Section 3.2.1 */ -#define MHD_HTTP_HEADER_HTTP2_SETTINGS "HTTP2-Settings" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_IM "IM" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_IF "If" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_IF_SCHEDULE_TAG_MATCH "If-Schedule-Tag-Match" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_KEEP_ALIVE "Keep-Alive" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_LABEL "Label" -/* No category. RFC5988 */ -#define MHD_HTTP_HEADER_LINK "Link" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_LOCK_TOKEN "Lock-Token" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_MAN "Man" -/* Informational. RFC7089 */ -#define MHD_HTTP_HEADER_MEMENTO_DATETIME "Memento-Datetime" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_METER "Meter" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_NEGOTIATE "Negotiate" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_OPT "Opt" -/* Experimental. RFC8053, Section 3 */ -#define MHD_HTTP_HEADER_OPTIONAL_WWW_AUTHENTICATE "Optional-WWW-Authenticate" -/* Standard. RFC4229 */ -#define MHD_HTTP_HEADER_ORDERING_TYPE "Ordering-Type" -/* Standard. RFC6454 */ -#define MHD_HTTP_HEADER_ORIGIN "Origin" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_OVERWRITE "Overwrite" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_P3P "P3P" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PEP "PEP" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PICS_LABEL "PICS-Label" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PEP_INFO "Pep-Info" -/* Standard. RFC4229 */ -#define MHD_HTTP_HEADER_POSITION "Position" -/* Standard. RFC7240 */ -#define MHD_HTTP_HEADER_PREFER "Prefer" -/* Standard. RFC7240 */ -#define MHD_HTTP_HEADER_PREFERENCE_APPLIED "Preference-Applied" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROFILEOBJECT "ProfileObject" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL "Protocol" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_INFO "Protocol-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_QUERY "Protocol-Query" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_REQUEST "Protocol-Request" -/* Standard. RFC7615, Section 4 */ -#define MHD_HTTP_HEADER_PROXY_AUTHENTICATION_INFO "Proxy-Authentication-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROXY_FEATURES "Proxy-Features" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROXY_INSTRUCTION "Proxy-Instruction" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PUBLIC "Public" -/* Standard. RFC7469 */ -#define MHD_HTTP_HEADER_PUBLIC_KEY_PINS "Public-Key-Pins" -/* Standard. RFC7469 */ -#define MHD_HTTP_HEADER_PUBLIC_KEY_PINS_REPORT_ONLY "Public-Key-Pins-Report-Only" -/* No category. RFC4437 */ -#define MHD_HTTP_HEADER_REDIRECT_REF "Redirect-Ref" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SAFE "Safe" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_SCHEDULE_REPLY "Schedule-Reply" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_SCHEDULE_TAG "Schedule-Tag" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_ACCEPT "Sec-WebSocket-Accept" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_EXTENSIONS "Sec-WebSocket-Extensions" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_KEY "Sec-WebSocket-Key" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_PROTOCOL "Sec-WebSocket-Protocol" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_VERSION "Sec-WebSocket-Version" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SECURITY_SCHEME "Security-Scheme" -/* Standard. RFC6265 */ -#define MHD_HTTP_HEADER_SET_COOKIE "Set-Cookie" -/* Obsoleted. RFC2965; RFC6265 */ -#define MHD_HTTP_HEADER_SET_COOKIE2 "Set-Cookie2" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SETPROFILE "SetProfile" -/* Standard. RFC5023 */ -#define MHD_HTTP_HEADER_SLUG "SLUG" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SOAPACTION "SoapAction" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_STATUS_URI "Status-URI" -/* Standard. RFC6797 */ -#define MHD_HTTP_HEADER_STRICT_TRANSPORT_SECURITY "Strict-Transport-Security" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SURROGATE_CAPABILITY "Surrogate-Capability" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SURROGATE_CONTROL "Surrogate-Control" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_TCN "TCN" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_TIMEOUT "Timeout" -/* Standard. RFC8030, Section 5.4 */ -#define MHD_HTTP_HEADER_TOPIC "Topic" -/* Standard. RFC8030, Section 5.2 */ -#define MHD_HTTP_HEADER_TTL "TTL" -/* Standard. RFC8030, Section 5.3 */ -#define MHD_HTTP_HEADER_URGENCY "Urgency" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_URI "URI" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_VARIANT_VARY "Variant-Vary" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_WANT_DIGEST "Want-Digest" -/* Informational. RFC7034 */ -#define MHD_HTTP_HEADER_X_FRAME_OPTIONS "X-Frame-Options" - -/* Some provisional headers. */ -#define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN "Access-Control-Allow-Origin" -/** @} */ /* end of group headers */ - -/** - * @defgroup versions HTTP versions - * These strings should be used to match against the first line of the - * HTTP header. - * @{ - */ -#define MHD_HTTP_VERSION_1_0 "HTTP/1.0" -#define MHD_HTTP_VERSION_1_1 "HTTP/1.1" - -/** @} */ /* end of group versions */ - -/** - * @defgroup methods HTTP methods - * HTTP methods (as strings). - * See: http://www.iana.org/assignments/http-methods/http-methods.xml - * Registry Version 2015-05-19 - * @{ - */ -/* Main HTTP methods. */ -/* Not safe. Not idempotent. RFC7231, Section 4.3.6. */ -#define MHD_HTTP_METHOD_CONNECT "CONNECT" -/* Not safe. Idempotent. RFC7231, Section 4.3.5. */ -#define MHD_HTTP_METHOD_DELETE "DELETE" -/* Safe. Idempotent. RFC7231, Section 4.3.1. */ -#define MHD_HTTP_METHOD_GET "GET" -/* Safe. Idempotent. RFC7231, Section 4.3.2. */ -#define MHD_HTTP_METHOD_HEAD "HEAD" -/* Safe. Idempotent. RFC7231, Section 4.3.7. */ -#define MHD_HTTP_METHOD_OPTIONS "OPTIONS" -/* Not safe. Not idempotent. RFC7231, Section 4.3.3. */ -#define MHD_HTTP_METHOD_POST "POST" -/* Not safe. Idempotent. RFC7231, Section 4.3.4. */ -#define MHD_HTTP_METHOD_PUT "PUT" -/* Safe. Idempotent. RFC7231, Section 4.3.8. */ -#define MHD_HTTP_METHOD_TRACE "TRACE" - -/* Additional HTTP methods. */ -/* Not safe. Idempotent. RFC3744, Section 8.1. */ -#define MHD_HTTP_METHOD_ACL "ACL" -/* Not safe. Idempotent. RFC3253, Section 12.6. */ -#define MHD_HTTP_METHOD_BASELINE_CONTROL "BASELINE-CONTROL" -/* Not safe. Idempotent. RFC5842, Section 4. */ -#define MHD_HTTP_METHOD_BIND "BIND" -/* Not safe. Idempotent. RFC3253, Section 4.4, Section 9.4. */ -#define MHD_HTTP_METHOD_CHECKIN "CHECKIN" -/* Not safe. Idempotent. RFC3253, Section 4.3, Section 8.8. */ -#define MHD_HTTP_METHOD_CHECKOUT "CHECKOUT" -/* Not safe. Idempotent. RFC4918, Section 9.8. */ -#define MHD_HTTP_METHOD_COPY "COPY" -/* Not safe. Idempotent. RFC3253, Section 8.2. */ -#define MHD_HTTP_METHOD_LABEL "LABEL" -/* Not safe. Idempotent. RFC2068, Section 19.6.1.2. */ -#define MHD_HTTP_METHOD_LINK "LINK" -/* Not safe. Not idempotent. RFC4918, Section 9.10. */ -#define MHD_HTTP_METHOD_LOCK "LOCK" -/* Not safe. Idempotent. RFC3253, Section 11.2. */ -#define MHD_HTTP_METHOD_MERGE "MERGE" -/* Not safe. Idempotent. RFC3253, Section 13.5. */ -#define MHD_HTTP_METHOD_MKACTIVITY "MKACTIVITY" -/* Not safe. Idempotent. RFC4791, Section 5.3.1. */ -#define MHD_HTTP_METHOD_MKCALENDAR "MKCALENDAR" -/* Not safe. Idempotent. RFC4918, Section 9.3. */ -#define MHD_HTTP_METHOD_MKCOL "MKCOL" -/* Not safe. Idempotent. RFC4437, Section 6. */ -#define MHD_HTTP_METHOD_MKREDIRECTREF "MKREDIRECTREF" -/* Not safe. Idempotent. RFC3253, Section 6.3. */ -#define MHD_HTTP_METHOD_MKWORKSPACE "MKWORKSPACE" -/* Not safe. Idempotent. RFC4918, Section 9.9. */ -#define MHD_HTTP_METHOD_MOVE "MOVE" -/* Not safe. Idempotent. RFC3648, Section 7. */ -#define MHD_HTTP_METHOD_ORDERPATCH "ORDERPATCH" -/* Not safe. Not idempotent. RFC5789, Section 2. */ -#define MHD_HTTP_METHOD_PATCH "PATCH" -/* Safe. Idempotent. RFC7540, Section 3.5. */ -#define MHD_HTTP_METHOD_PRI "PRI" -/* Safe. Idempotent. RFC4918, Section 9.1. */ -#define MHD_HTTP_METHOD_PROPFIND "PROPFIND" -/* Not safe. Idempotent. RFC4918, Section 9.2. */ -#define MHD_HTTP_METHOD_PROPPATCH "PROPPATCH" -/* Not safe. Idempotent. RFC5842, Section 6. */ -#define MHD_HTTP_METHOD_REBIND "REBIND" -/* Safe. Idempotent. RFC3253, Section 3.6. */ -#define MHD_HTTP_METHOD_REPORT "REPORT" -/* Safe. Idempotent. RFC5323, Section 2. */ -#define MHD_HTTP_METHOD_SEARCH "SEARCH" -/* Not safe. Idempotent. RFC5842, Section 5. */ -#define MHD_HTTP_METHOD_UNBIND "UNBIND" -/* Not safe. Idempotent. RFC3253, Section 4.5. */ -#define MHD_HTTP_METHOD_UNCHECKOUT "UNCHECKOUT" -/* Not safe. Idempotent. RFC2068, Section 19.6.1.3. */ -#define MHD_HTTP_METHOD_UNLINK "UNLINK" -/* Not safe. Idempotent. RFC4918, Section 9.11. */ -#define MHD_HTTP_METHOD_UNLOCK "UNLOCK" -/* Not safe. Idempotent. RFC3253, Section 7.1. */ -#define MHD_HTTP_METHOD_UPDATE "UPDATE" -/* Not safe. Idempotent. RFC4437, Section 7. */ -#define MHD_HTTP_METHOD_UPDATEREDIRECTREF "UPDATEREDIRECTREF" -/* Not safe. Idempotent. RFC3253, Section 3.5. */ -#define MHD_HTTP_METHOD_VERSION_CONTROL "VERSION-CONTROL" - -/** @} */ /* end of group methods */ - -/** - * @defgroup postenc HTTP POST encodings - * See also: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 - * @{ - */ -#define MHD_HTTP_POST_ENCODING_FORM_URLENCODED "application/x-www-form-urlencoded" -#define MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA "multipart/form-data" - -/** @} */ /* end of group postenc */ - - -/** - * @brief Handle for the daemon (listening on a socket for HTTP traffic). - * @ingroup event - */ -struct MHD_Daemon; - -/** - * @brief Handle for a connection / HTTP request. - * - * With HTTP/1.1, multiple requests can be run over the same - * connection. However, MHD will only show one request per TCP - * connection to the client at any given time. - * @ingroup request - */ -struct MHD_Connection; - -/** - * @brief Handle for a response. - * @ingroup response - */ -struct MHD_Response; - -/** - * @brief Handle for POST processing. - * @ingroup response - */ -struct MHD_PostProcessor; - - -/** - * @brief Flags for the `struct MHD_Daemon`. - * - * Note that MHD will run automatically in background thread(s) only - * if #MHD_USE_INTERNAL_POLLING_THREAD is used. Otherwise caller (application) - * must use #MHD_run() or #MHD_run_from_select() to have MHD processed - * network connections and data. - * - * Starting the daemon may also fail if a particular option is not - * implemented or not supported on the target platform (i.e. no - * support for TLS, epoll or IPv6). - */ -enum MHD_FLAG -{ - /** - * No options selected. - */ - MHD_NO_FLAG = 0, - - /** - * Print errors messages to custom error logger or to `stderr` if - * custom error logger is not set. - * @sa ::MHD_OPTION_EXTERNAL_LOGGER - */ - MHD_USE_ERROR_LOG = 1, - - /** - * Run in debug mode. If this flag is used, the library should - * print error messages and warnings to `stderr`. - */ - MHD_USE_DEBUG = 1, - - /** - * Run in HTTPS mode. The modern protocol is called TLS. - */ - MHD_USE_TLS = 2, - - /** @deprecated */ - MHD_USE_SSL = 2, -#if 0 - /* let's do this later once versions that define MHD_USE_TLS a more widely deployed. */ -#define MHD_USE_SSL \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SSL is deprecated, use MHD_USE_TLS") \ - MHD_USE_TLS -#endif - - /** - * Run using one thread per connection. - * Must be used only with #MHD_USE_INTERNAL_POLLING_THREAD. - */ - MHD_USE_THREAD_PER_CONNECTION = 4, - - /** - * Run using an internal thread (or thread pool) for sockets sending - * and receiving and data processing. Without this flag MHD will not - * run automatically in background thread(s). - * If this flag is set, #MHD_run() and #MHD_run_from_select() couldn't - * be used. - * This flag is set explicitly by #MHD_USE_POLL_INTERNAL_THREAD and - * by #MHD_USE_EPOLL_INTERNAL_THREAD. - */ - MHD_USE_INTERNAL_POLLING_THREAD = 8, - - /** @deprecated */ - MHD_USE_SELECT_INTERNALLY = 8, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_SELECT_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SELECT_INTERNALLY is deprecated, use MHD_USE_INTERNAL_POLLING_THREAD instead") \ - MHD_USE_INTERNAL_POLLING_THREAD -#endif /* 0 */ - - /** - * Run using the IPv6 protocol (otherwise, MHD will just support - * IPv4). If you want MHD to support IPv4 and IPv6 using a single - * socket, pass #MHD_USE_DUAL_STACK, otherwise, if you only pass - * this option, MHD will try to bind to IPv6-only (resulting in - * no IPv4 support). - */ - MHD_USE_IPv6 = 16, - - /** - * Be pedantic about the protocol (as opposed to as tolerant as - * possible). Specifically, at the moment, this flag causes MHD to - * reject HTTP 1.1 connections without a "Host" header. This is - * required by the standard, but of course in violation of the "be - * as liberal as possible in what you accept" norm. It is - * recommended to turn this ON if you are testing clients against - * MHD, and OFF in production. - */ - MHD_USE_PEDANTIC_CHECKS = 32, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_PEDANTIC_CHECKS \ - _MHD_DEPR_IN_MACRO("Flag MHD_USE_PEDANTIC_CHECKS is deprecated, use option MHD_OPTION_STRICT_FOR_CLIENT instead") \ - 32 -#endif /* 0 */ - - /** - * Use `poll()` instead of `select()`. This allows sockets with `fd >= - * FD_SETSIZE`. This option is not compatible with using an - * 'external' polling mode (as there is no API to get the file - * descriptors for the external poll() from MHD) and must also not - * be used in combination with #MHD_USE_EPOLL. - * @sa ::MHD_FEATURE_POLL, #MHD_USE_POLL_INTERNAL_THREAD - */ - MHD_USE_POLL = 64, - - /** - * Run using an internal thread (or thread pool) doing `poll()`. - * @sa ::MHD_FEATURE_POLL, #MHD_USE_POLL, #MHD_USE_INTERNAL_POLLING_THREAD - */ - MHD_USE_POLL_INTERNAL_THREAD = MHD_USE_POLL | MHD_USE_INTERNAL_POLLING_THREAD, - - /** @deprecated */ - MHD_USE_POLL_INTERNALLY = MHD_USE_POLL | MHD_USE_INTERNAL_POLLING_THREAD, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_POLL_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_POLL_INTERNALLY is deprecated, use MHD_USE_POLL_INTERNAL_THREAD instead") \ - MHD_USE_POLL_INTERNAL_THREAD -#endif /* 0 */ - - /** - * Suppress (automatically) adding the 'Date:' header to HTTP responses. - * This option should ONLY be used on systems that do not have a clock - * and that DO provide other mechanisms for cache control. See also - * RFC 2616, section 14.18 (exception 3). - */ - MHD_USE_SUPPRESS_DATE_NO_CLOCK = 128, - - /** @deprecated */ - MHD_SUPPRESS_DATE_NO_CLOCK = 128, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_SUPPRESS_DATE_NO_CLOCK \ - _MHD_DEPR_IN_MACRO("Value MHD_SUPPRESS_DATE_NO_CLOCK is deprecated, use MHD_USE_SUPPRESS_DATE_NO_CLOCK instead") \ - MHD_USE_SUPPRESS_DATE_NO_CLOCK -#endif /* 0 */ - - /** - * Run without a listen socket. This option only makes sense if - * #MHD_add_connection is to be used exclusively to connect HTTP - * clients to the HTTP server. This option is incompatible with - * using a thread pool; if it is used, #MHD_OPTION_THREAD_POOL_SIZE - * is ignored. - */ - MHD_USE_NO_LISTEN_SOCKET = 256, - - /** - * Use `epoll()` instead of `select()` or `poll()` for the event loop. - * This option is only available on some systems; using the option on - * systems without epoll will cause #MHD_start_daemon to fail. Using - * this option is not supported with #MHD_USE_THREAD_PER_CONNECTION. - * @sa ::MHD_FEATURE_EPOLL - */ - MHD_USE_EPOLL = 512, - - /** @deprecated */ - MHD_USE_EPOLL_LINUX_ONLY = 512, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_LINUX_ONLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_LINUX_ONLY is deprecated, use MHD_USE_EPOLL") \ - MHD_USE_EPOLL -#endif /* 0 */ - - /** - * Run using an internal thread (or thread pool) doing `epoll()`. - * This option is only available on certain platforms; using the option on - * platform without `epoll` support will cause #MHD_start_daemon to fail. - * @sa ::MHD_FEATURE_EPOLL, #MHD_USE_EPOLL, #MHD_USE_INTERNAL_POLLING_THREAD - */ - MHD_USE_EPOLL_INTERNAL_THREAD = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, - - /** @deprecated */ - MHD_USE_EPOLL_INTERNALLY = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, - /** @deprecated */ - MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_INTERNALLY is deprecated, use MHD_USE_EPOLL_INTERNAL_THREAD") \ - MHD_USE_EPOLL_INTERNAL_THREAD - /** @deprecated */ -#define MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY is deprecated, use MHD_USE_EPOLL_INTERNAL_THREAD") \ - MHD_USE_EPOLL_INTERNAL_THREAD -#endif /* 0 */ - - /** - * Use inter-thread communication channel. - * #MHD_USE_ITC can be used with #MHD_USE_INTERNAL_POLLING_THREAD - * and is ignored with any "external" mode. - * It's required for use of #MHD_quiesce_daemon - * or #MHD_add_connection. - * This option is enforced by #MHD_ALLOW_SUSPEND_RESUME or - * #MHD_USE_NO_LISTEN_SOCKET. - * #MHD_USE_ITC is always used automatically on platforms - * where select()/poll()/other ignore shutdown of listen - * socket. - */ - MHD_USE_ITC = 1024, - - /** @deprecated */ - MHD_USE_PIPE_FOR_SHUTDOWN = 1024, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_PIPE_FOR_SHUTDOWN \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_PIPE_FOR_SHUTDOWN is deprecated, use MHD_USE_ITC") \ - MHD_USE_ITC -#endif /* 0 */ - - /** - * Use a single socket for IPv4 and IPv6. - */ - MHD_USE_DUAL_STACK = MHD_USE_IPv6 | 2048, - - /** - * Enable `turbo`. Disables certain calls to `shutdown()`, - * enables aggressive non-blocking optimistic reads and - * other potentially unsafe optimizations. - * Most effects only happen with #MHD_USE_EPOLL. - */ - MHD_USE_TURBO = 4096, - - /** @deprecated */ - MHD_USE_EPOLL_TURBO = 4096, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_TURBO \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_TURBO is deprecated, use MHD_USE_TURBO") \ - MHD_USE_TURBO -#endif /* 0 */ - - /** - * Enable suspend/resume functions, which also implies setting up - * ITC to signal resume. - */ - MHD_ALLOW_SUSPEND_RESUME = 8192 | MHD_USE_ITC, - - /** @deprecated */ - MHD_USE_SUSPEND_RESUME = 8192 | MHD_USE_ITC, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_SUSPEND_RESUME \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SUSPEND_RESUME is deprecated, use MHD_ALLOW_SUSPEND_RESUME instead") \ - MHD_ALLOW_SUSPEND_RESUME -#endif /* 0 */ - - /** - * Enable TCP_FASTOPEN option. This option is only available on Linux with a - * kernel >= 3.6. On other systems, using this option cases #MHD_start_daemon - * to fail. - */ - MHD_USE_TCP_FASTOPEN = 16384, - - /** - * You need to set this option if you want to use HTTP "Upgrade". - * "Upgrade" may require usage of additional internal resources, - * which we do not want to use unless necessary. - */ - MHD_ALLOW_UPGRADE = 32768, - - /** - * Automatically use best available polling function. - * Choice of polling function is also depend on other daemon options. - * If #MHD_USE_INTERNAL_POLLING_THREAD is specified then epoll, poll() or - * select() will be used (listed in decreasing preference order, first - * function available on system will be used). - * If #MHD_USE_THREAD_PER_CONNECTION is specified then poll() or select() - * will be used. - * If those flags are not specified then epoll or select() will be - * used (as the only suitable for MHD_get_fdset()) - */ - MHD_USE_AUTO = 65536, - - /** - * Run using an internal thread (or thread pool) with best available on - * system polling function. - * This is combination of #MHD_USE_AUTO and #MHD_USE_INTERNAL_POLLING_THREAD - * flags. - */ - MHD_USE_AUTO_INTERNAL_THREAD = MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD - -}; - - -/** - * Type of a callback function used for logging by MHD. - * - * @param cls closure - * @param fm format string (`printf()`-style) - * @param ap arguments to @a fm - * @ingroup logging - */ -typedef void -(*MHD_LogCallback)(void *cls, - const char *fm, - va_list ap); - - -/** - * @brief MHD options. - * - * Passed in the varargs portion of #MHD_start_daemon. - */ -enum MHD_OPTION -{ - - /** - * No more options / last option. This is used - * to terminate the VARARGs list. - */ - MHD_OPTION_END = 0, - - /** - * Maximum memory size per connection (followed by a `size_t`). - * Default is 32 kb (#MHD_POOL_SIZE_DEFAULT). - * Values above 128k are unlikely to result in much benefit, as half - * of the memory will be typically used for IO, and TCP buffers are - * unlikely to support window sizes above 64k on most systems. - */ - MHD_OPTION_CONNECTION_MEMORY_LIMIT = 1, - - /** - * Maximum number of concurrent connections to - * accept (followed by an `unsigned int`). - */ - MHD_OPTION_CONNECTION_LIMIT = 2, - - /** - * After how many seconds of inactivity should a - * connection automatically be timed out? (followed - * by an `unsigned int`; use zero for no timeout). - */ - MHD_OPTION_CONNECTION_TIMEOUT = 3, - - /** - * Register a function that should be called whenever a request has - * been completed (this can be used for application-specific clean - * up). Requests that have never been presented to the application - * (via #MHD_AccessHandlerCallback) will not result in - * notifications. - * - * This option should be followed by TWO pointers. First a pointer - * to a function of type #MHD_RequestCompletedCallback and second a - * pointer to a closure to pass to the request completed callback. - * The second pointer maybe NULL. - */ - MHD_OPTION_NOTIFY_COMPLETED = 4, - - /** - * Limit on the number of (concurrent) connections made to the - * server from the same IP address. Can be used to prevent one - * IP from taking over all of the allowed connections. If the - * same IP tries to establish more than the specified number of - * connections, they will be immediately rejected. The option - * should be followed by an `unsigned int`. The default is - * zero, which means no limit on the number of connections - * from the same IP address. - */ - MHD_OPTION_PER_IP_CONNECTION_LIMIT = 5, - - /** - * Bind daemon to the supplied `struct sockaddr`. This option should - * be followed by a `struct sockaddr *`. If #MHD_USE_IPv6 is - * specified, the `struct sockaddr*` should point to a `struct - * sockaddr_in6`, otherwise to a `struct sockaddr_in`. - */ - MHD_OPTION_SOCK_ADDR = 6, - - /** - * Specify a function that should be called before parsing the URI from - * the client. The specified callback function can be used for processing - * the URI (including the options) before it is parsed. The URI after - * parsing will no longer contain the options, which maybe inconvenient for - * logging. This option should be followed by two arguments, the first - * one must be of the form - * - * void * my_logger(void *cls, const char *uri, struct MHD_Connection *con) - * - * where the return value will be passed as - * (`* con_cls`) in calls to the #MHD_AccessHandlerCallback - * when this request is processed later; returning a - * value of NULL has no special significance (however, - * note that if you return non-NULL, you can no longer - * rely on the first call to the access handler having - * `NULL == *con_cls` on entry;) - * "cls" will be set to the second argument following - * #MHD_OPTION_URI_LOG_CALLBACK. Finally, uri will - * be the 0-terminated URI of the request. - * - * Note that during the time of this call, most of the connection's - * state is not initialized (as we have not yet parsed the headers). - * However, information about the connecting client (IP, socket) - * is available. - * - * The specified function is called only once per request, therefore some - * programmers may use it to instantiate their own request objects, freeing - * them in the notifier #MHD_OPTION_NOTIFY_COMPLETED. - */ - MHD_OPTION_URI_LOG_CALLBACK = 7, - - /** - * Memory pointer for the private key (key.pem) to be used by the - * HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_CERT. - */ - MHD_OPTION_HTTPS_MEM_KEY = 8, - - /** - * Memory pointer for the certificate (cert.pem) to be used by the - * HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_KEY. - */ - MHD_OPTION_HTTPS_MEM_CERT = 9, - - /** - * Daemon credentials type. - * Followed by an argument of type - * `gnutls_credentials_type_t`. - */ - MHD_OPTION_HTTPS_CRED_TYPE = 10, - - /** - * Memory pointer to a `const char *` specifying the - * cipher algorithm (default: "NORMAL"). - */ - MHD_OPTION_HTTPS_PRIORITIES = 11, - - /** - * Pass a listen socket for MHD to use (systemd-style). If this - * option is used, MHD will not open its own listen socket(s). The - * argument passed must be of type `MHD_socket` and refer to an - * existing socket that has been bound to a port and is listening. - */ - MHD_OPTION_LISTEN_SOCKET = 12, - - /** - * Use the given function for logging error messages. This option - * must be followed by two arguments; the first must be a pointer to - * a function of type #MHD_LogCallback and the second a pointer - * `void *` which will be passed as the first argument to the log - * callback. - * - * Note that MHD will not generate any log messages - * if it was compiled without the "--enable-messages" - * flag being set. - */ - MHD_OPTION_EXTERNAL_LOGGER = 13, - - /** - * Number (`unsigned int`) of threads in thread pool. Enable - * thread pooling by setting this value to to something - * greater than 1. Currently, thread model must be - * #MHD_USE_INTERNAL_POLLING_THREAD if thread pooling is enabled - * (#MHD_start_daemon returns NULL for an unsupported thread - * model). - */ - MHD_OPTION_THREAD_POOL_SIZE = 14, - - /** - * Additional options given in an array of `struct MHD_OptionItem`. - * The array must be terminated with an entry `{MHD_OPTION_END, 0, NULL}`. - * An example for code using #MHD_OPTION_ARRAY is: - * - * struct MHD_OptionItem ops[] = { - * { MHD_OPTION_CONNECTION_LIMIT, 100, NULL }, - * { MHD_OPTION_CONNECTION_TIMEOUT, 10, NULL }, - * { MHD_OPTION_END, 0, NULL } - * }; - * d = MHD_start_daemon (0, 8080, NULL, NULL, dh, NULL, - * MHD_OPTION_ARRAY, ops, - * MHD_OPTION_END); - * - * For options that expect a single pointer argument, the - * second member of the `struct MHD_OptionItem` is ignored. - * For options that expect two pointer arguments, the first - * argument must be cast to `intptr_t`. - */ - MHD_OPTION_ARRAY = 15, - - /** - * Specify a function that should be called for unescaping escape - * sequences in URIs and URI arguments. Note that this function - * will NOT be used by the `struct MHD_PostProcessor`. If this - * option is not specified, the default method will be used which - * decodes escape sequences of the form "%HH". This option should - * be followed by two arguments, the first one must be of the form - * - * size_t my_unescaper(void *cls, - * struct MHD_Connection *c, - * char *s) - * - * where the return value must be "strlen(s)" and "s" should be - * updated. Note that the unescape function must not lengthen "s" - * (the result must be shorter than the input and still be - * 0-terminated). "cls" will be set to the second argument - * following #MHD_OPTION_UNESCAPE_CALLBACK. - */ - MHD_OPTION_UNESCAPE_CALLBACK = 16, - - /** - * Memory pointer for the random values to be used by the Digest - * Auth module. This option should be followed by two arguments. - * First an integer of type `size_t` which specifies the size - * of the buffer pointed to by the second argument in bytes. - * Note that the application must ensure that the buffer of the - * second argument remains allocated and unmodified while the - * deamon is running. - */ - MHD_OPTION_DIGEST_AUTH_RANDOM = 17, - - /** - * Size of the internal array holding the map of the nonce and - * the nonce counter. This option should be followed by an `unsigend int` - * argument. - */ - MHD_OPTION_NONCE_NC_SIZE = 18, - - /** - * Desired size of the stack for threads created by MHD. Followed - * by an argument of type `size_t`. Use 0 for system default. - */ - MHD_OPTION_THREAD_STACK_SIZE = 19, - - /** - * Memory pointer for the certificate (ca.pem) to be used by the - * HTTPS daemon for client authentification. - * This option should be followed by a `const char *` argument. - */ - MHD_OPTION_HTTPS_MEM_TRUST = 20, - - /** - * Increment to use for growing the read buffer (followed by a - * `size_t`). Must fit within #MHD_OPTION_CONNECTION_MEMORY_LIMIT. - */ - MHD_OPTION_CONNECTION_MEMORY_INCREMENT = 21, - - /** - * Use a callback to determine which X.509 certificate should be - * used for a given HTTPS connection. This option should be - * followed by a argument of type `gnutls_certificate_retrieve_function2 *`. - * This option provides an - * alternative to #MHD_OPTION_HTTPS_MEM_KEY, - * #MHD_OPTION_HTTPS_MEM_CERT. You must use this version if - * multiple domains are to be hosted at the same IP address using - * TLS's Server Name Indication (SNI) extension. In this case, - * the callback is expected to select the correct certificate - * based on the SNI information provided. The callback is expected - * to access the SNI data using `gnutls_server_name_get()`. - * Using this option requires GnuTLS 3.0 or higher. - */ - MHD_OPTION_HTTPS_CERT_CALLBACK = 22, - - /** - * When using #MHD_USE_TCP_FASTOPEN, this option changes the default TCP - * fastopen queue length of 50. Note that having a larger queue size can - * cause resource exhaustion attack as the TCP stack has to now allocate - * resources for the SYN packet along with its DATA. This option should be - * followed by an `unsigned int` argument. - */ - MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE = 23, - - /** - * Memory pointer for the Diffie-Hellman parameters (dh.pem) to be used by the - * HTTPS daemon for key exchange. - * This option must be followed by a `const char *` argument. - */ - MHD_OPTION_HTTPS_MEM_DHPARAMS = 24, - - /** - * If present and set to true, allow reusing address:port socket - * (by using SO_REUSEPORT on most platform, or platform-specific ways). - * If present and set to false, disallow reusing address:port socket - * (does nothing on most plaform, but uses SO_EXCLUSIVEADDRUSE on Windows). - * This option must be followed by a `unsigned int` argument. - */ - MHD_OPTION_LISTENING_ADDRESS_REUSE = 25, - - /** - * Memory pointer for a password that decrypts the private key (key.pem) - * to be used by the HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_KEY. - * @sa ::MHD_FEATURE_HTTPS_KEY_PASSWORD - */ - MHD_OPTION_HTTPS_KEY_PASSWORD = 26, - - /** - * Register a function that should be called whenever a connection is - * started or closed. - * - * This option should be followed by TWO pointers. First a pointer - * to a function of type #MHD_NotifyConnectionCallback and second a - * pointer to a closure to pass to the request completed callback. - * The second pointer maybe NULL. - */ - MHD_OPTION_NOTIFY_CONNECTION = 27, - - /** - * Allow to change maximum length of the queue of pending connections on - * listen socket. If not present than default platform-specific SOMAXCONN - * value is used. This option should be followed by an `unsigned int` - * argument. - */ - MHD_OPTION_LISTEN_BACKLOG_SIZE = 28, - - /** - * If set to 1 - be strict about the protocol (as opposed to as - * tolerant as possible). Specifically, at the moment, this flag - * causes MHD to reject HTTP 1.1 connections without a "Host" header. - * This is required by the standard, but of course in violation of - * the "be as liberal as possible in what you accept" norm. It is - * recommended to set this to 1 if you are testing clients against - * MHD, and 0 in production. - * if set to -1 - be opposite to strict and be permissive about the - * protocol, allowing slight deviations that are technically not - * allowed by the RFC. Specifically, at the moment, this flag - * causes MHD to allow spaces in header field names. This is - * disallowed by the standard. - * It is not recommended to set it to -1 on publicly available - * servers as it may potentially lower level of protection. - * This option should be followed by an `int` argument. - */ - MHD_OPTION_STRICT_FOR_CLIENT = 29 -}; - - -/** - * Entry in an #MHD_OPTION_ARRAY. - */ -struct MHD_OptionItem -{ - /** - * Which option is being given. Use #MHD_OPTION_END - * to terminate the array. - */ - enum MHD_OPTION option; - - /** - * Option value (for integer arguments, and for options requiring - * two pointer arguments); should be 0 for options that take no - * arguments or only a single pointer argument. - */ - intptr_t value; - - /** - * Pointer option value (use NULL for options taking no arguments - * or only an integer option). - */ - void *ptr_value; - -}; - - -/** - * The `enum MHD_ValueKind` specifies the source of - * the key-value pairs in the HTTP protocol. - */ -enum MHD_ValueKind -{ - - /** - * Response header - * @deprecated - */ - MHD_RESPONSE_HEADER_KIND = 0, -#define MHD_RESPONSE_HEADER_KIND \ - _MHD_DEPR_IN_MACRO("Value MHD_RESPONSE_HEADER_KIND is deprecated and not used") \ - MHD_RESPONSE_HEADER_KIND - - /** - * HTTP header (request/response). - */ - MHD_HEADER_KIND = 1, - - /** - * Cookies. Note that the original HTTP header containing - * the cookie(s) will still be available and intact. - */ - MHD_COOKIE_KIND = 2, - - /** - * POST data. This is available only if a content encoding - * supported by MHD is used (currently only URL encoding), - * and only if the posted content fits within the available - * memory pool. Note that in that case, the upload data - * given to the #MHD_AccessHandlerCallback will be - * empty (since it has already been processed). - */ - MHD_POSTDATA_KIND = 4, - - /** - * GET (URI) arguments. - */ - MHD_GET_ARGUMENT_KIND = 8, - - /** - * HTTP footer (only for HTTP 1.1 chunked encodings). - */ - MHD_FOOTER_KIND = 16 -}; - - -/** - * The `enum MHD_RequestTerminationCode` specifies reasons - * why a request has been terminated (or completed). - * @ingroup request - */ -enum MHD_RequestTerminationCode -{ - - /** - * We finished sending the response. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_COMPLETED_OK = 0, - - /** - * Error handling the connection (resources - * exhausted, other side closed connection, - * application error accepting request, etc.) - * @ingroup request - */ - MHD_REQUEST_TERMINATED_WITH_ERROR = 1, - - /** - * No activity on the connection for the number - * of seconds specified using - * #MHD_OPTION_CONNECTION_TIMEOUT. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_TIMEOUT_REACHED = 2, - - /** - * We had to close the session since MHD was being - * shut down. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN = 3, - - /** - * We tried to read additional data, but the other side closed the - * connection. This error is similar to - * #MHD_REQUEST_TERMINATED_WITH_ERROR, but specific to the case where - * the connection died because the other side did not send expected - * data. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_READ_ERROR = 4, - - /** - * The client terminated the connection by closing the socket - * for writing (TCP half-closed); MHD aborted sending the - * response according to RFC 2616, section 8.1.4. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_CLIENT_ABORT = 5 - -}; - - -/** - * The `enum MHD_ConnectionNotificationCode` specifies types - * of connection notifications. - * @ingroup request - */ -enum MHD_ConnectionNotificationCode -{ - - /** - * A new connection has been started. - * @ingroup request - */ - MHD_CONNECTION_NOTIFY_STARTED = 0, - - /** - * A connection is closed. - * @ingroup request - */ - MHD_CONNECTION_NOTIFY_CLOSED = 1 - -}; - - -/** - * Information about a connection. - */ -union MHD_ConnectionInfo -{ - - /** - * Cipher algorithm used, of type "enum gnutls_cipher_algorithm". - */ - int /* enum gnutls_cipher_algorithm */ cipher_algorithm; - - /** - * Protocol used, of type "enum gnutls_protocol". - */ - int /* enum gnutls_protocol */ protocol; - - /** - * The suspended status of a connection. - */ - int /* MHD_YES or MHD_NO */ suspended; - - /** - * Amount of second that connection could spend in idle state - * before automatically disconnected. - * Zero for no timeout (unlimited idle time). - */ - unsigned int connection_timeout; - - /** - * Connect socket - */ - MHD_socket connect_fd; - - /** - * Size of the client's HTTP header. - */ - size_t header_size; - - /** - * GNUtls session handle, of type "gnutls_session_t". - */ - void * /* gnutls_session_t */ tls_session; - - /** - * GNUtls client certificate handle, of type "gnutls_x509_crt_t". - */ - void * /* gnutls_x509_crt_t */ client_cert; - - /** - * Address information for the client. - */ - struct sockaddr *client_addr; - - /** - * Which daemon manages this connection (useful in case there are many - * daemons running). - */ - struct MHD_Daemon *daemon; - - /** - * Socket-specific client context. Points to the same address as - * the "socket_context" of the #MHD_NotifyConnectionCallback. - */ - void *socket_context; -}; - - -/** - * Values of this enum are used to specify what - * information about a connection is desired. - * @ingroup request - */ -enum MHD_ConnectionInfoType -{ - /** - * What cipher algorithm is being used. - * Takes no extra arguments. - * @ingroup request - */ - MHD_CONNECTION_INFO_CIPHER_ALGO, - - /** - * - * Takes no extra arguments. - * @ingroup request - */ - MHD_CONNECTION_INFO_PROTOCOL, - - /** - * Obtain IP address of the client. Takes no extra arguments. - * Returns essentially a `struct sockaddr **` (since the API returns - * a `union MHD_ConnectionInfo *` and that union contains a `struct - * sockaddr *`). - * @ingroup request - */ - MHD_CONNECTION_INFO_CLIENT_ADDRESS, - - /** - * Get the gnuTLS session handle. - * @ingroup request - */ - MHD_CONNECTION_INFO_GNUTLS_SESSION, - - /** - * Get the gnuTLS client certificate handle. Dysfunctional (never - * implemented, deprecated). Use #MHD_CONNECTION_INFO_GNUTLS_SESSION - * to get the `gnutls_session_t` and then call - * gnutls_certificate_get_peers(). - */ - MHD_CONNECTION_INFO_GNUTLS_CLIENT_CERT, - - /** - * Get the `struct MHD_Daemon *` responsible for managing this connection. - * @ingroup request - */ - MHD_CONNECTION_INFO_DAEMON, - - /** - * Request the file descriptor for the connection socket. - * No extra arguments should be passed. - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_FD, - - /** - * Returns the client-specific pointer to a `void *` that was (possibly) - * set during a #MHD_NotifyConnectionCallback when the socket was - * first accepted. Note that this is NOT the same as the "con_cls" - * argument of the #MHD_AccessHandlerCallback. The "con_cls" is - * fresh for each HTTP request, while the "socket_context" is fresh - * for each socket. - */ - MHD_CONNECTION_INFO_SOCKET_CONTEXT, - - /** - * Check whether the connection is suspended. - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_SUSPENDED, - - /** - * Get connection timeout - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_TIMEOUT, - - /** - * Return length of the client's HTTP request header. - * @ingroup request - */ - MHD_CONNECTION_INFO_REQUEST_HEADER_SIZE -}; - - -/** - * Values of this enum are used to specify what - * information about a deamon is desired. - */ -enum MHD_DaemonInfoType -{ - /** - * No longer supported (will return NULL). - */ - MHD_DAEMON_INFO_KEY_SIZE, - - /** - * No longer supported (will return NULL). - */ - MHD_DAEMON_INFO_MAC_KEY_SIZE, - - /** - * Request the file descriptor for the listening socket. - * No extra arguments should be passed. - */ - MHD_DAEMON_INFO_LISTEN_FD, - - /** - * Request the file descriptor for the external epoll. - * No extra arguments should be passed. - */ - MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY, - MHD_DAEMON_INFO_EPOLL_FD = MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY, - - /** - * Request the number of current connections handled by the daemon. - * No extra arguments should be passed. - * Note: when using MHD in external polling mode, this type of request - * could be used only when #MHD_run()/#MHD_run_from_select is not - * working in other thread at the same time. - */ - MHD_DAEMON_INFO_CURRENT_CONNECTIONS, - - /** - * Request the daemon flags. - * No extra arguments should be passed. - * Note: flags may differ from original 'flags' specified for - * daemon, especially if #MHD_USE_AUTO was set. - */ - MHD_DAEMON_INFO_FLAGS -}; - - -/** - * Callback for serious error condition. The default action is to print - * an error message and `abort()`. - * - * @param cls user specified value - * @param file where the error occured - * @param line where the error occured - * @param reason error detail, may be NULL - * @ingroup logging - */ -typedef void -(*MHD_PanicCallback) (void *cls, - const char *file, - unsigned int line, - const char *reason); - -/** - * Allow or deny a client to connect. - * - * @param cls closure - * @param addr address information from the client - * @param addrlen length of @a addr - * @return #MHD_YES if connection is allowed, #MHD_NO if not - */ -typedef int -(*MHD_AcceptPolicyCallback) (void *cls, - const struct sockaddr *addr, - socklen_t addrlen); - - -/** - * A client has requested the given url using the given method - * (#MHD_HTTP_METHOD_GET, #MHD_HTTP_METHOD_PUT, - * #MHD_HTTP_METHOD_DELETE, #MHD_HTTP_METHOD_POST, etc). The callback - * must call MHD callbacks to provide content to give back to the - * client and return an HTTP status code (i.e. #MHD_HTTP_OK, - * #MHD_HTTP_NOT_FOUND, etc.). - * - * @param cls argument given together with the function - * pointer when the handler was registered with MHD - * @param url the requested url - * @param method the HTTP method used (#MHD_HTTP_METHOD_GET, - * #MHD_HTTP_METHOD_PUT, etc.) - * @param version the HTTP version string (i.e. - * #MHD_HTTP_VERSION_1_1) - * @param upload_data the data being uploaded (excluding HEADERS, - * for a POST that fits into memory and that is encoded - * with a supported encoding, the POST data will NOT be - * given in upload_data and is instead available as - * part of #MHD_get_connection_values; very large POST - * data *will* be made available incrementally in - * @a upload_data) - * @param upload_data_size set initially to the size of the - * @a upload_data provided; the method must update this - * value to the number of bytes NOT processed; - * @param con_cls pointer that the callback can set to some - * address and that will be preserved by MHD for future - * calls for this request; since the access handler may - * be called many times (i.e., for a PUT/POST operation - * with plenty of upload data) this allows the application - * to easily associate some request-specific state. - * If necessary, this state can be cleaned up in the - * global #MHD_RequestCompletedCallback (which - * can be set with the #MHD_OPTION_NOTIFY_COMPLETED). - * Initially, `*con_cls` will be NULL. - * @return #MHD_YES if the connection was handled successfully, - * #MHD_NO if the socket must be closed due to a serios - * error while handling the request - */ -typedef int -(*MHD_AccessHandlerCallback) (void *cls, - struct MHD_Connection *connection, - const char *url, - const char *method, - const char *version, - const char *upload_data, - size_t *upload_data_size, - void **con_cls); - - -/** - * Signature of the callback used by MHD to notify the - * application about completed requests. - * - * @param cls client-defined closure - * @param connection connection handle - * @param con_cls value as set by the last call to - * the #MHD_AccessHandlerCallback - * @param toe reason for request termination - * @see #MHD_OPTION_NOTIFY_COMPLETED - * @ingroup request - */ -typedef void -(*MHD_RequestCompletedCallback) (void *cls, - struct MHD_Connection *connection, - void **con_cls, - enum MHD_RequestTerminationCode toe); - -/** - * Signature of the callback used by MHD to notify the - * application about started/stopped connections - * - * @param cls client-defined closure - * @param connection connection handle - * @param socket_context socket-specific pointer where the - * client can associate some state specific - * to the TCP connection; note that this is - * different from the "con_cls" which is per - * HTTP request. The client can initialize - * during #MHD_CONNECTION_NOTIFY_STARTED and - * cleanup during #MHD_CONNECTION_NOTIFY_CLOSED - * and access in the meantime using - * #MHD_CONNECTION_INFO_SOCKET_CONTEXT. - * @param toe reason for connection notification - * @see #MHD_OPTION_NOTIFY_CONNECTION - * @ingroup request - */ -typedef void -(*MHD_NotifyConnectionCallback) (void *cls, - struct MHD_Connection *connection, - void **socket_context, - enum MHD_ConnectionNotificationCode toe); - - -/** - * Iterator over key-value pairs. This iterator - * can be used to iterate over all of the cookies, - * headers, or POST-data fields of a request, and - * also to iterate over the headers that have been - * added to a response. - * - * @param cls closure - * @param kind kind of the header we are looking at - * @param key key for the value, can be an empty string - * @param value corresponding value, can be NULL - * @return #MHD_YES to continue iterating, - * #MHD_NO to abort the iteration - * @ingroup request - */ -typedef int -(*MHD_KeyValueIterator) (void *cls, - enum MHD_ValueKind kind, - const char *key, - const char *value); - - -/** - * Callback used by libmicrohttpd in order to obtain content. The - * callback is to copy at most @a max bytes of content into @a buf. The - * total number of bytes that has been placed into @a buf should be - * returned. - * - * Note that returning zero will cause libmicrohttpd to try again. - * Thus, returning zero should only be used in conjunction - * with MHD_suspend_connection() to avoid busy waiting. - * - * @param cls extra argument to the callback - * @param pos position in the datastream to access; - * note that if a `struct MHD_Response` object is re-used, - * it is possible for the same content reader to - * be queried multiple times for the same data; - * however, if a `struct MHD_Response` is not re-used, - * libmicrohttpd guarantees that "pos" will be - * the sum of all non-negative return values - * obtained from the content reader so far. - * @param buf where to copy the data - * @param max maximum number of bytes to copy to @a buf (size of @a buf) - * @return number of bytes written to @a buf; - * 0 is legal unless we are running in internal select mode (since - * this would cause busy-waiting); 0 in external select mode - * will cause this function to be called again once the external - * select calls MHD again; - * #MHD_CONTENT_READER_END_OF_STREAM (-1) for the regular - * end of transmission (with chunked encoding, MHD will then - * terminate the chunk and send any HTTP footers that might be - * present; without chunked encoding and given an unknown - * response size, MHD will simply close the connection; note - * that while returning #MHD_CONTENT_READER_END_OF_STREAM is not technically - * legal if a response size was specified, MHD accepts this - * and treats it just as #MHD_CONTENT_READER_END_WITH_ERROR; - * #MHD_CONTENT_READER_END_WITH_ERROR (-2) to indicate a server - * error generating the response; this will cause MHD to simply - * close the connection immediately. If a response size was - * given or if chunked encoding is in use, this will indicate - * an error to the client. Note, however, that if the client - * does not know a response size and chunked encoding is not in - * use, then clients will not be able to tell the difference between - * #MHD_CONTENT_READER_END_WITH_ERROR and #MHD_CONTENT_READER_END_OF_STREAM. - * This is not a limitation of MHD but rather of the HTTP protocol. - */ -typedef ssize_t -(*MHD_ContentReaderCallback) (void *cls, - uint64_t pos, - char *buf, - size_t max); - - -/** - * This method is called by libmicrohttpd if we - * are done with a content reader. It should - * be used to free resources associated with the - * content reader. - * - * @param cls closure - * @ingroup response - */ -typedef void -(*MHD_ContentReaderFreeCallback) (void *cls); - - -/** - * Iterator over key-value pairs where the value - * maybe made available in increments and/or may - * not be zero-terminated. Used for processing - * POST data. - * - * @param cls user-specified closure - * @param kind type of the value, always #MHD_POSTDATA_KIND when called from MHD - * @param key 0-terminated key for the value - * @param filename name of the uploaded file, NULL if not known - * @param content_type mime-type of the data, NULL if not known - * @param transfer_encoding encoding of the data, NULL if not known - * @param data pointer to @a size bytes of data at the - * specified offset - * @param off offset of data in the overall value - * @param size number of bytes in @a data available - * @return #MHD_YES to continue iterating, - * #MHD_NO to abort the iteration - */ -typedef int -(*MHD_PostDataIterator) (void *cls, - enum MHD_ValueKind kind, - const char *key, - const char *filename, - const char *content_type, - const char *transfer_encoding, - const char *data, - uint64_t off, - size_t size); - -/* **************** Daemon handling functions ***************** */ - -/** - * Start a webserver on the given port. - * - * @param flags combination of `enum MHD_FLAG` values - * @param port port to bind to (in host byte order) - * @param apc callback to call to check which clients - * will be allowed to connect; you can pass NULL - * in which case connections from any IP will be - * accepted - * @param apc_cls extra argument to apc - * @param dh handler called for all requests (repeatedly) - * @param dh_cls extra argument to @a dh - * @param ap list of options (type-value pairs, - * terminated with #MHD_OPTION_END). - * @return NULL on error, handle to daemon on success - * @ingroup event - */ -_MHD_EXTERN struct MHD_Daemon * -MHD_start_daemon_va (unsigned int flags, - uint16_t port, - MHD_AcceptPolicyCallback apc, void *apc_cls, - MHD_AccessHandlerCallback dh, void *dh_cls, - va_list ap); - - -/** - * Start a webserver on the given port. Variadic version of - * #MHD_start_daemon_va. - * - * @param flags combination of `enum MHD_FLAG` values - * @param port port to bind to - * @param apc callback to call to check which clients - * will be allowed to connect; you can pass NULL - * in which case connections from any IP will be - * accepted - * @param apc_cls extra argument to apc - * @param dh handler called for all requests (repeatedly) - * @param dh_cls extra argument to @a dh - * @return NULL on error, handle to daemon on success - * @ingroup event - */ -_MHD_EXTERN struct MHD_Daemon * -MHD_start_daemon (unsigned int flags, - uint16_t port, - MHD_AcceptPolicyCallback apc, void *apc_cls, - MHD_AccessHandlerCallback dh, void *dh_cls, - ...); - - -/** - * Stop accepting connections from the listening socket. Allows - * clients to continue processing, but stops accepting new - * connections. Note that the caller is responsible for closing the - * returned socket; however, if MHD is run using threads (anything but - * external select mode), it must not be closed until AFTER - * #MHD_stop_daemon has been called (as it is theoretically possible - * that an existing thread is still using it). - * - * Note that some thread modes require the caller to have passed - * #MHD_USE_ITC when using this API. If this daemon is - * in one of those modes and this option was not given to - * #MHD_start_daemon, this function will return #MHD_INVALID_SOCKET. - * - * @param daemon daemon to stop accepting new connections for - * @return old listen socket on success, #MHD_INVALID_SOCKET if - * the daemon was already not listening anymore - * @ingroup specialized - */ -_MHD_EXTERN MHD_socket -MHD_quiesce_daemon (struct MHD_Daemon *daemon); - - -/** - * Shutdown an HTTP daemon. - * - * @param daemon daemon to stop - * @ingroup event - */ -_MHD_EXTERN void -MHD_stop_daemon (struct MHD_Daemon *daemon); - - -/** - * Add another client connection to the set of connections managed by - * MHD. This API is usually not needed (since MHD will accept inbound - * connections on the server socket). Use this API in special cases, - * for example if your HTTP server is behind NAT and needs to connect - * out to the HTTP client, or if you are building a proxy. - * - * If you use this API in conjunction with a internal select or a - * thread pool, you must set the option - * #MHD_USE_ITC to ensure that the freshly added - * connection is immediately processed by MHD. - * - * The given client socket will be managed (and closed!) by MHD after - * this call and must no longer be used directly by the application - * afterwards. - * - * Per-IP connection limits are ignored when using this API. - * - * @param daemon daemon that manages the connection - * @param client_socket socket to manage (MHD will expect - * to receive an HTTP request from this socket next). - * @param addr IP address of the client - * @param addrlen number of bytes in @a addr - * @return #MHD_YES on success, #MHD_NO if this daemon could - * not handle the connection (i.e. `malloc()` failed, etc). - * The socket will be closed in any case; `errno` is - * set to indicate further details about the error. - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_add_connection (struct MHD_Daemon *daemon, - MHD_socket client_socket, - const struct sockaddr *addr, - socklen_t addrlen); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. FD_SETSIZE is assumed - * to be platform's default. - * - * This function should only be called in when MHD is configured to - * use external select with @code{select()} or with @code{epoll()}. - * In the latter case, it will only add the single @code{epoll()} file - * descriptor used by MHD to the sets. - * - * This function must be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_fdset (struct MHD_Daemon *daemon, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *except_fd_set, - MHD_socket *max_fd); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. - * - * Passing custom FD_SETSIZE as @a fd_setsize allow usage of - * larger/smaller than platform's default fd_sets. - * - * This function should only be called in when MHD is configured to - * use external select with @code{select()} or with @code{epoll()}. - * In the latter case, it will only add the single @code{epoll()} file - * descriptor used by MHD to the sets. - * - * This function must be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @param fd_setsize value of FD_SETSIZE - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_fdset2 (struct MHD_Daemon *daemon, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *except_fd_set, - MHD_socket *max_fd, - unsigned int fd_setsize); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. Size of fd_set is - * determined by current value of FD_SETSIZE. - * - * This function could be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -#define MHD_get_fdset(daemon,read_fd_set,write_fd_set,except_fd_set,max_fd) \ - MHD_get_fdset2((daemon),(read_fd_set),(write_fd_set),(except_fd_set),(max_fd),FD_SETSIZE) - - -/** - * Obtain timeout value for `select()` for this daemon (only needed if - * connection timeout is used). The returned value is how many milliseconds - * `select()` or `poll()` should at most block, not the timeout value set for - * connections. This function MUST NOT be called if MHD is running with - * #MHD_USE_THREAD_PER_CONNECTION. - * - * @param daemon daemon to query for timeout - * @param timeout set to the timeout (in milliseconds) - * @return #MHD_YES on success, #MHD_NO if timeouts are - * not used (or no connections exist that would - * necessiate the use of a timeout right now). - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_timeout (struct MHD_Daemon *daemon, - MHD_UNSIGNED_LONG_LONG *timeout); - - -/** - * Run webserver operations (without blocking unless in client - * callbacks). This method should be called by clients in combination - * with #MHD_get_fdset if the client-controlled select method is used. - * - * This function is a convenience method, which is useful if the - * fd_sets from #MHD_get_fdset were not directly passed to `select()`; - * with this function, MHD will internally do the appropriate `select()` - * call itself again. While it is always safe to call #MHD_run (if - * #MHD_USE_INTERNAL_POLLING_THREAD is not set), you should call - * #MHD_run_from_select if performance is important (as it saves an - * expensive call to `select()`). - * - * @param daemon daemon to run - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call. - * @ingroup event - */ -_MHD_EXTERN int -MHD_run (struct MHD_Daemon *daemon); - - -/** - * Run webserver operations. This method should be called by clients - * in combination with #MHD_get_fdset if the client-controlled select - * method is used. - * - * You can use this function instead of #MHD_run if you called - * `select()` on the result from #MHD_get_fdset. File descriptors in - * the sets that are not controlled by MHD will be ignored. Calling - * this function instead of #MHD_run is more efficient as MHD will - * not have to call `select()` again to determine which operations are - * ready. - * - * This function cannot be used with daemon started with - * #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to run select loop for - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @return #MHD_NO on serious errors, #MHD_YES on success - * @ingroup event - */ -_MHD_EXTERN int -MHD_run_from_select (struct MHD_Daemon *daemon, - const fd_set *read_fd_set, - const fd_set *write_fd_set, - const fd_set *except_fd_set); - - - - -/* **************** Connection handling functions ***************** */ - -/** - * Get all of the headers from the request. - * - * @param connection connection to get values from - * @param kind types of values to iterate over, can be a bitmask - * @param iterator callback to call on each header; - * maybe NULL (then just count headers) - * @param iterator_cls extra argument to @a iterator - * @return number of entries iterated over - * @ingroup request - */ -_MHD_EXTERN int -MHD_get_connection_values (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - MHD_KeyValueIterator iterator, - void *iterator_cls); - - -/** - * This function can be used to add an entry to the HTTP headers of a - * connection (so that the #MHD_get_connection_values function will - * return them -- and the `struct MHD_PostProcessor` will also see - * them). This maybe required in certain situations (see Mantis - * #1399) where (broken) HTTP implementations fail to supply values - - * needed by the post processor (or other parts of the application). - * - * This function MUST only be called from within the - * #MHD_AccessHandlerCallback (otherwise, access maybe improperly - * synchronized). Furthermore, the client must guarantee that the key - * and value arguments are 0-terminated strings that are NOT freed - * until the connection is closed. (The easiest way to do this is by - * passing only arguments to permanently allocated strings.). - * - * @param connection the connection for which a - * value should be set - * @param kind kind of the value - * @param key key for the value - * @param value the value itself - * @return #MHD_NO if the operation could not be - * performed due to insufficient memory; - * #MHD_YES on success - * @ingroup request - */ -_MHD_EXTERN int -MHD_set_connection_value (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - const char *key, - const char *value); - - -/** - * Sets the global error handler to a different implementation. @a cb - * will only be called in the case of typically fatal, serious - * internal consistency issues. These issues should only arise in the - * case of serious memory corruption or similar problems with the - * architecture. While @a cb is allowed to return and MHD will then - * try to continue, this is never safe. - * - * The default implementation that is used if no panic function is set - * simply prints an error message and calls `abort()`. Alternative - * implementations might call `exit()` or other similar functions. - * - * @param cb new error handler - * @param cls passed to @a cb - * @ingroup logging - */ -_MHD_EXTERN void -MHD_set_panic_func (MHD_PanicCallback cb, void *cls); - - -/** - * Process escape sequences ('%HH') Updates val in place; the - * result should be UTF-8 encoded and cannot be larger than the input. - * The result must also still be 0-terminated. - * - * @param val value to unescape (modified in the process) - * @return length of the resulting val (`strlen(val)` may be - * shorter afterwards due to elimination of escape sequences) - */ -_MHD_EXTERN size_t -MHD_http_unescape (char *val); - - -/** - * Get a particular header value. If multiple - * values match the kind, return any one of them. - * - * @param connection connection to get values from - * @param kind what kind of value are we looking for - * @param key the header to look for, NULL to lookup 'trailing' value without a key - * @return NULL if no such item was found - * @ingroup request - */ -_MHD_EXTERN const char * -MHD_lookup_connection_value (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - const char *key); - - -/** - * Queue a response to be transmitted to the client (as soon as - * possible but after #MHD_AccessHandlerCallback returns). - * - * @param connection the connection identifying the client - * @param status_code HTTP status code (i.e. #MHD_HTTP_OK) - * @param response response to transmit - * @return #MHD_NO on error (i.e. reply already sent), - * #MHD_YES on success or if message has been queued - * @ingroup response - */ -_MHD_EXTERN int -MHD_queue_response (struct MHD_Connection *connection, - unsigned int status_code, - struct MHD_Response *response); - - -/** - * Suspend handling of network data for a given connection. This can - * be used to dequeue a connection from MHD's event loop for a while. - * - * If you use this API in conjunction with a internal select or a - * thread pool, you must set the option #MHD_USE_ITC to - * ensure that a resumed connection is immediately processed by MHD. - * - * Suspended connections continue to count against the total number of - * connections allowed (per daemon, as well as per IP, if such limits - * are set). Suspended connections will NOT time out; timeouts will - * restart when the connection handling is resumed. While a - * connection is suspended, MHD will not detect disconnects by the - * client. - * - * The only safe time to suspend a connection is from the - * #MHD_AccessHandlerCallback. - * - * Finally, it is an API violation to call #MHD_stop_daemon while - * having suspended connections (this will at least create memory and - * socket leaks or lead to undefined behavior). You must explicitly - * resume all connections before stopping the daemon. - * - * @param connection the connection to suspend - */ -_MHD_EXTERN void -MHD_suspend_connection (struct MHD_Connection *connection); - - -/** - * Resume handling of network data for suspended connection. It is - * safe to resume a suspended connection at any time. Calling this - * function on a connection that was not previously suspended will - * result in undefined behavior. - * - * If you are using this function in ``external'' select mode, you must - * make sure to run #MHD_run() afterwards (before again calling - * #MHD_get_fdset(), as otherwise the change may not be reflected in - * the set returned by #MHD_get_fdset() and you may end up with a - * connection that is stuck until the next network activity. - * - * @param connection the connection to resume - */ -_MHD_EXTERN void -MHD_resume_connection (struct MHD_Connection *connection); - - -/* **************** Response manipulation functions ***************** */ - - -/** - * Flags for special handling of responses. - */ -enum MHD_ResponseFlags -{ - /** - * Default: no special flags. - */ - MHD_RF_NONE = 0, - - /** - * Only respond in conservative HTTP 1.0-mode. In particular, - * do not (automatically) sent "Connection" headers and always - * close the connection after generating the response. - */ - MHD_RF_HTTP_VERSION_1_0_ONLY = 1 - -}; - - -/** - * MHD options (for future extensions). - */ -enum MHD_ResponseOptions -{ - /** - * End of the list of options. - */ - MHD_RO_END = 0 -}; - - -/** - * Set special flags and options for a response. - * - * @param response the response to modify - * @param flags to set for the response - * @param ... #MHD_RO_END terminated list of options - * @return #MHD_YES on success, #MHD_NO on error - */ -_MHD_EXTERN int -MHD_set_response_options (struct MHD_Response *response, - enum MHD_ResponseFlags flags, - ...); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response, #MHD_SIZE_UNKNOWN for unknown - * @param block_size preferred block size for querying crc (advisory only, - * MHD may still call @a crc using smaller chunks); this - * is essentially the buffer size used for IO, clients - * should pick a value that is appropriate for IO and - * memory performance requirements - * @param crc callback to use to obtain response data - * @param crc_cls extra argument to @a crc - * @param crfc callback to call to free @a crc_cls resources - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_callback (uint64_t size, - size_t block_size, - MHD_ContentReaderCallback crc, void *crc_cls, - MHD_ContentReaderFreeCallback crfc); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the @a data portion of the response - * @param data the data itself - * @param must_free libmicrohttpd should free data when done - * @param must_copy libmicrohttpd must make a copy of @a data - * right away, the data maybe released anytime after - * this call returns - * @return NULL on error (i.e. invalid arguments, out of memory) - * @deprecated use #MHD_create_response_from_buffer instead - * @ingroup response - */ -_MHD_DEPR_FUNC("MHD_create_response_from_data() is deprecated, use MHD_create_response_from_buffer()") \ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_data (size_t size, - void *data, - int must_free, - int must_copy); - - -/** - * Specification for how MHD should treat the memory buffer - * given for the response. - * @ingroup response - */ -enum MHD_ResponseMemoryMode -{ - - /** - * Buffer is a persistent (static/global) buffer that won't change - * for at least the lifetime of the response, MHD should just use - * it, not free it, not copy it, just keep an alias to it. - * @ingroup response - */ - MHD_RESPMEM_PERSISTENT, - - /** - * Buffer is heap-allocated with `malloc()` (or equivalent) and - * should be freed by MHD after processing the response has - * concluded (response reference counter reaches zero). - * @ingroup response - */ - MHD_RESPMEM_MUST_FREE, - - /** - * Buffer is in transient memory, but not on the heap (for example, - * on the stack or non-`malloc()` allocated) and only valid during the - * call to #MHD_create_response_from_buffer. MHD must make its - * own private copy of the data for processing. - * @ingroup response - */ - MHD_RESPMEM_MUST_COPY - -}; - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param buffer size bytes containing the response's data portion - * @param mode flags for buffer management - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_buffer (size_t size, - void *buffer, - enum MHD_ResponseMemoryMode mode); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd (size_t size, - int fd); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response; - * sizes larger than 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd64 (uint64_t size, - int fd); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @param offset offset to start reading from in the file; - * Be careful! `off_t` may have been compiled to be a - * 64-bit variable for MHD, in which case your application - * also has to be compiled using the same options! Read - * the MHD manual for more details. - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_DEPR_FUNC("Function MHD_create_response_from_fd_at_offset() is deprecated, use MHD_create_response_from_fd_at_offset64()") \ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd_at_offset (size_t size, - int fd, - off_t offset); - -#if !defined(_MHD_NO_DEPR_IN_MACRO) || defined(_MHD_NO_DEPR_FUNC) -/* Substitute MHD_create_response_from_fd_at_offset64() instead of MHD_create_response_from_fd_at_offset() - to minimize potential problems with different off_t sizes */ -#define MHD_create_response_from_fd_at_offset(size,fd,offset) \ - _MHD_DEPR_IN_MACRO("Usage of MHD_create_response_from_fd_at_offset() is deprecated, use MHD_create_response_from_fd_at_offset64()") \ - MHD_create_response_from_fd_at_offset64((size),(fd),(offset)) -#endif /* !_MHD_NO_DEPR_IN_MACRO || _MHD_NO_DEPR_FUNC */ - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response; - * sizes larger than 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @param offset offset to start reading from in the file; - * reading file beyond 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd_at_offset64 (uint64_t size, - int fd, - uint64_t offset); - - -/** - * Enumeration for actions MHD should perform on the underlying socket - * of the upgrade. This API is not finalized, and in particular - * the final set of actions is yet to be decided. This is just an - * idea for what we might want. - */ -enum MHD_UpgradeAction -{ - - /** - * Close the socket, the application is done with it. - * - * Takes no extra arguments. - */ - MHD_UPGRADE_ACTION_CLOSE = 0 - -}; - - -/** - * Handle given to the application to manage special - * actions relating to MHD responses that "upgrade" - * the HTTP protocol (i.e. to WebSockets). - */ -struct MHD_UpgradeResponseHandle; - - -/** - * This connection-specific callback is provided by MHD to - * applications (unusual) during the #MHD_UpgradeHandler. - * It allows applications to perform 'special' actions on - * the underlying socket from the upgrade. - * - * @param urh the handle identifying the connection to perform - * the upgrade @a action on. - * @param action which action should be performed - * @param ... arguments to the action (depends on the action) - * @return #MHD_NO on error, #MHD_YES on success - */ -_MHD_EXTERN int -MHD_upgrade_action (struct MHD_UpgradeResponseHandle *urh, - enum MHD_UpgradeAction action, - ...); - - -/** - * Function called after a protocol "upgrade" response was sent - * successfully and the socket should now be controlled by some - * protocol other than HTTP. - * - * Any data already received on the socket will be made available in - * @e extra_in. This can happen if the application sent extra data - * before MHD send the upgrade response. The application should - * treat data from @a extra_in as if it had read it from the socket. - * - * Note that the application must not close() @a sock directly, - * but instead use #MHD_upgrade_action() for special operations - * on @a sock. - * - * Data forwarding to "upgraded" @a sock will be started as soon - * as this function return. - * - * Except when in 'thread-per-connection' mode, implementations - * of this function should never block (as it will still be called - * from within the main event loop). - * - * @param cls closure, whatever was given to #MHD_create_response_for_upgrade(). - * @param connection original HTTP connection handle, - * giving the function a last chance - * to inspect the original HTTP request - * @param con_cls last value left in `con_cls` of the `MHD_AccessHandlerCallback` - * @param extra_in if we happened to have read bytes after the - * HTTP header already (because the client sent - * more than the HTTP header of the request before - * we sent the upgrade response), - * these are the extra bytes already read from @a sock - * by MHD. The application should treat these as if - * it had read them from @a sock. - * @param extra_in_size number of bytes in @a extra_in - * @param sock socket to use for bi-directional communication - * with the client. For HTTPS, this may not be a socket - * that is directly connected to the client and thus certain - * operations (TCP-specific setsockopt(), getsockopt(), etc.) - * may not work as expected (as the socket could be from a - * socketpair() or a TCP-loopback). The application is expected - * to perform read()/recv() and write()/send() calls on the socket. - * The application may also call shutdown(), but must not call - * close() directly. - * @param urh argument for #MHD_upgrade_action()s on this @a connection. - * Applications must eventually use this callback to (indirectly) - * perform the close() action on the @a sock. - */ -typedef void -(*MHD_UpgradeHandler)(void *cls, - struct MHD_Connection *connection, - void *con_cls, - const char *extra_in, - size_t extra_in_size, - MHD_socket sock, - struct MHD_UpgradeResponseHandle *urh); - - -/** - * Create a response object that can be used for 101 UPGRADE - * responses, for example to implement WebSockets. After sending the - * response, control over the data stream is given to the callback (which - * can then, for example, start some bi-directional communication). - * If the response is queued for multiple connections, the callback - * will be called for each connection. The callback - * will ONLY be called after the response header was successfully passed - * to the OS; if there are communication errors before, the usual MHD - * connection error handling code will be performed. - * - * Setting the correct HTTP code (i.e. MHD_HTTP_SWITCHING_PROTOCOLS) - * and setting correct HTTP headers for the upgrade must be done - * manually (this way, it is possible to implement most existing - * WebSocket versions using this API; in fact, this API might be useful - * for any protocol switch, not just WebSockets). Note that - * draft-ietf-hybi-thewebsocketprotocol-00 cannot be implemented this - * way as the header "HTTP/1.1 101 WebSocket Protocol Handshake" - * cannot be generated; instead, MHD will always produce "HTTP/1.1 101 - * Switching Protocols" (if the response code 101 is used). - * - * As usual, the response object can be extended with header - * information and then be used any number of times (as long as the - * header information is not connection-specific). - * - * @param upgrade_handler function to call with the "upgraded" socket - * @param upgrade_handler_cls closure for @a upgrade_handler - * @return NULL on error (i.e. invalid arguments, out of memory) - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_for_upgrade (MHD_UpgradeHandler upgrade_handler, - void *upgrade_handler_cls); - - -/** - * Destroy a response object and associated resources. Note that - * libmicrohttpd may keep some of the resources around if the response - * is still in the queue for some clients, so the memory may not - * necessarily be freed immediatley. - * - * @param response response to destroy - * @ingroup response - */ -_MHD_EXTERN void -MHD_destroy_response (struct MHD_Response *response); - - -/** - * Add a header line to the response. - * - * @param response response to add a header to - * @param header the header to add - * @param content value to add - * @return #MHD_NO on error (i.e. invalid header or content format), - * or out of memory - * @ingroup response - */ -_MHD_EXTERN int -MHD_add_response_header (struct MHD_Response *response, - const char *header, - const char *content); - - -/** - * Add a footer line to the response. - * - * @param response response to remove a header from - * @param footer the footer to delete - * @param content value to delete - * @return #MHD_NO on error (i.e. invalid footer or content format). - * @ingroup response - */ -_MHD_EXTERN int -MHD_add_response_footer (struct MHD_Response *response, - const char *footer, - const char *content); - - -/** - * Delete a header (or footer) line from the response. - * - * @param response response to remove a header from - * @param header the header to delete - * @param content value to delete - * @return #MHD_NO on error (no such header known) - * @ingroup response - */ -_MHD_EXTERN int -MHD_del_response_header (struct MHD_Response *response, - const char *header, - const char *content); - - -/** - * Get all of the headers (and footers) added to a response. - * - * @param response response to query - * @param iterator callback to call on each header; - * maybe NULL (then just count headers) - * @param iterator_cls extra argument to @a iterator - * @return number of entries iterated over - * @ingroup response - */ -_MHD_EXTERN int -MHD_get_response_headers (struct MHD_Response *response, - MHD_KeyValueIterator iterator, void *iterator_cls); - - -/** - * Get a particular header (or footer) from the response. - * - * @param response response to query - * @param key which header to get - * @return NULL if header does not exist - * @ingroup response - */ -_MHD_EXTERN const char * -MHD_get_response_header (struct MHD_Response *response, - const char *key); - - -/* ********************** PostProcessor functions ********************** */ - -/** - * Create a `struct MHD_PostProcessor`. - * - * A `struct MHD_PostProcessor` can be used to (incrementally) parse - * the data portion of a POST request. Note that some buggy browsers - * fail to set the encoding type. If you want to support those, you - * may have to call #MHD_set_connection_value with the proper encoding - * type before creating a post processor (if no supported encoding - * type is set, this function will fail). - * - * @param connection the connection on which the POST is - * happening (used to determine the POST format) - * @param buffer_size maximum number of bytes to use for - * internal buffering (used only for the parsing, - * specifically the parsing of the keys). A - * tiny value (256-1024) should be sufficient. - * Do NOT use a value smaller than 256. For good - * performance, use 32 or 64k (i.e. 65536). - * @param iter iterator to be called with the parsed data, - * Must NOT be NULL. - * @param iter_cls first argument to @a iter - * @return NULL on error (out of memory, unsupported encoding), - * otherwise a PP handle - * @ingroup request - */ -_MHD_EXTERN struct MHD_PostProcessor * -MHD_create_post_processor (struct MHD_Connection *connection, - size_t buffer_size, - MHD_PostDataIterator iter, void *iter_cls); - - -/** - * Parse and process POST data. Call this function when POST data is - * available (usually during an #MHD_AccessHandlerCallback) with the - * "upload_data" and "upload_data_size". Whenever possible, this will - * then cause calls to the #MHD_PostDataIterator. - * - * @param pp the post processor - * @param post_data @a post_data_len bytes of POST data - * @param post_data_len length of @a post_data - * @return #MHD_YES on success, #MHD_NO on error - * (out-of-memory, iterator aborted, parse error) - * @ingroup request - */ -_MHD_EXTERN int -MHD_post_process (struct MHD_PostProcessor *pp, - const char *post_data, size_t post_data_len); - - -/** - * Release PostProcessor resources. - * - * @param pp the PostProcessor to destroy - * @return #MHD_YES if processing completed nicely, - * #MHD_NO if there were spurious characters / formatting - * problems; it is common to ignore the return - * value of this function - * @ingroup request - */ -_MHD_EXTERN int -MHD_destroy_post_processor (struct MHD_PostProcessor *pp); - - -/* ********************* Digest Authentication functions *************** */ - - -/** - * Constant to indicate that the nonce of the provided - * authentication code was wrong. - * @ingroup authentication - */ -#define MHD_INVALID_NONCE -1 - - -/** - * Get the username from the authorization header sent by the client - * - * @param connection The MHD connection structure - * @return NULL if no username could be found, a pointer - * to the username if found - * @ingroup authentication - */ -_MHD_EXTERN char * -MHD_digest_auth_get_username (struct MHD_Connection *connection); - - -/** - * Authenticates the authorization header sent by the client - * - * @param connection The MHD connection structure - * @param realm The realm presented to the client - * @param username The username needs to be authenticated - * @param password The password used in the authentication - * @param nonce_timeout The amount of time for a nonce to be - * invalid in seconds - * @return #MHD_YES if authenticated, #MHD_NO if not, - * #MHD_INVALID_NONCE if nonce is invalid - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_digest_auth_check (struct MHD_Connection *connection, - const char *realm, - const char *username, - const char *password, - unsigned int nonce_timeout); - - -/** - * Queues a response to request authentication from the client - * - * @param connection The MHD connection structure - * @param realm The realm presented to the client - * @param opaque string to user for opaque value - * @param response reply to send; should contain the "access denied" - * body; note that this function will set the "WWW Authenticate" - * header and that the caller should not do this - * @param signal_stale #MHD_YES if the nonce is invalid to add - * 'stale=true' to the authentication header - * @return #MHD_YES on success, #MHD_NO otherwise - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_queue_auth_fail_response (struct MHD_Connection *connection, - const char *realm, - const char *opaque, - struct MHD_Response *response, - int signal_stale); - - -/** - * Get the username and password from the basic authorization header sent by the client - * - * @param connection The MHD connection structure - * @param password a pointer for the password - * @return NULL if no username could be found, a pointer - * to the username if found - * @ingroup authentication - */ -_MHD_EXTERN char * -MHD_basic_auth_get_username_password (struct MHD_Connection *connection, - char** password); - - -/** - * Queues a response to request basic authentication from the client - * The given response object is expected to include the payload for - * the response; the "WWW-Authenticate" header will be added and the - * response queued with the 'UNAUTHORIZED' status code. - * - * @param connection The MHD connection structure - * @param realm the realm presented to the client - * @param response response object to modify and queue - * @return #MHD_YES on success, #MHD_NO otherwise - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_queue_basic_auth_fail_response (struct MHD_Connection *connection, - const char *realm, - struct MHD_Response *response); - -/* ********************** generic query functions ********************** */ - - -/** - * Obtain information about the given connection. - * - * @param connection what connection to get information about - * @param info_type what information is desired? - * @param ... depends on @a info_type - * @return NULL if this information is not available - * (or if the @a info_type is unknown) - * @ingroup specialized - */ -_MHD_EXTERN const union MHD_ConnectionInfo * -MHD_get_connection_info (struct MHD_Connection *connection, - enum MHD_ConnectionInfoType info_type, - ...); - - -/** - * MHD connection options. Given to #MHD_set_connection_option to - * set custom options for a particular connection. - */ -enum MHD_CONNECTION_OPTION -{ - - /** - * Set a custom timeout for the given connection. Specified - * as the number of seconds, given as an `unsigned int`. Use - * zero for no timeout. - * If timeout was set to zero (or unset) before, setup of new value by - * MHD_set_connection_option() will reset timeout timer. - */ - MHD_CONNECTION_OPTION_TIMEOUT - -}; - - -/** - * Set a custom option for the given connection, overriding defaults. - * - * @param connection connection to modify - * @param option option to set - * @param ... arguments to the option, depending on the option type - * @return #MHD_YES on success, #MHD_NO if setting the option failed - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_set_connection_option (struct MHD_Connection *connection, - enum MHD_CONNECTION_OPTION option, - ...); - - -/** - * Information about an MHD daemon. - */ -union MHD_DaemonInfo -{ - /** - * Size of the key, no longer supported. - * @deprecated - */ - size_t key_size; - - /** - * Size of the mac key, no longer supported. - * @deprecated - */ - size_t mac_key_size; - - /** - * Socket, returned for #MHD_DAEMON_INFO_LISTEN_FD. - */ - MHD_socket listen_fd; - - /** - * epoll FD, returned for #MHD_DAEMON_INFO_EPOLL_FD. - */ - int epoll_fd; - - /** - * Number of active connections, for #MHD_DAEMON_INFO_CURRENT_CONNECTIONS. - */ - unsigned int num_connections; - - /** - * Combination of #MHD_FLAG values, for #MHD_DAEMON_INFO_FLAGS. - * This value is actually a bitfield. - * Note: flags may differ from original 'flags' specified for - * daemon, especially if #MHD_USE_AUTO was set. - */ - enum MHD_FLAG flags; -}; - - -/** - * Obtain information about the given daemon - * (not fully implemented!). - * - * @param daemon what daemon to get information about - * @param info_type what information is desired? - * @param ... depends on @a info_type - * @return NULL if this information is not available - * (or if the @a info_type is unknown) - * @ingroup specialized - */ -_MHD_EXTERN const union MHD_DaemonInfo * -MHD_get_daemon_info (struct MHD_Daemon *daemon, - enum MHD_DaemonInfoType info_type, - ...); - - -/** - * Obtain the version of this library - * - * @return static version string, e.g. "0.9.9" - * @ingroup specialized - */ -_MHD_EXTERN const char* -MHD_get_version (void); - - -/** - * Types of information about MHD features, - * used by #MHD_is_feature_supported(). - */ -enum MHD_FEATURE -{ - /** - * Get whether messages are supported. If supported then in debug - * mode messages can be printed to stderr or to external logger. - */ - MHD_FEATURE_MESSAGES = 1, - - /** - * Get whether HTTPS is supported. If supported then flag - * #MHD_USE_TLS and options #MHD_OPTION_HTTPS_MEM_KEY, - * #MHD_OPTION_HTTPS_MEM_CERT, #MHD_OPTION_HTTPS_MEM_TRUST, - * #MHD_OPTION_HTTPS_MEM_DHPARAMS, #MHD_OPTION_HTTPS_CRED_TYPE, - * #MHD_OPTION_HTTPS_PRIORITIES can be used. - */ - MHD_FEATURE_TLS = 2, - MHD_FEATURE_SSL = 2, - - /** - * Get whether option #MHD_OPTION_HTTPS_CERT_CALLBACK is - * supported. - */ - MHD_FEATURE_HTTPS_CERT_CALLBACK = 3, - - /** - * Get whether IPv6 is supported. If supported then flag - * #MHD_USE_IPv6 can be used. - */ - MHD_FEATURE_IPv6 = 4, - - /** - * Get whether IPv6 without IPv4 is supported. If not supported - * then IPv4 is always enabled in IPv6 sockets and - * flag #MHD_USE_DUAL_STACK if always used when #MHD_USE_IPv6 is - * specified. - */ - MHD_FEATURE_IPv6_ONLY = 5, - - /** - * Get whether `poll()` is supported. If supported then flag - * #MHD_USE_POLL can be used. - */ - MHD_FEATURE_POLL = 6, - - /** - * Get whether `epoll()` is supported. If supported then Flags - * #MHD_USE_EPOLL and - * #MHD_USE_EPOLL_INTERNAL_THREAD can be used. - */ - MHD_FEATURE_EPOLL = 7, - - /** - * Get whether shutdown on listen socket to signal other - * threads is supported. If not supported flag - * #MHD_USE_ITC is automatically forced. - */ - MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET = 8, - - /** - * Get whether socketpair is used internally instead of pipe to - * signal other threads. - */ - MHD_FEATURE_SOCKETPAIR = 9, - - /** - * Get whether TCP Fast Open is supported. If supported then - * flag #MHD_USE_TCP_FASTOPEN and option - * #MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE can be used. - */ - MHD_FEATURE_TCP_FASTOPEN = 10, - - /** - * Get whether HTTP Basic authorization is supported. If supported - * then functions #MHD_basic_auth_get_username_password and - * #MHD_queue_basic_auth_fail_response can be used. - */ - MHD_FEATURE_BASIC_AUTH = 11, - - /** - * Get whether HTTP Digest authorization is supported. If - * supported then options #MHD_OPTION_DIGEST_AUTH_RANDOM, - * #MHD_OPTION_NONCE_NC_SIZE and - * #MHD_digest_auth_check() can be used. - */ - MHD_FEATURE_DIGEST_AUTH = 12, - - /** - * Get whether postprocessor is supported. If supported then - * functions #MHD_create_post_processor(), #MHD_post_process() and - * #MHD_destroy_post_processor() can - * be used. - */ - MHD_FEATURE_POSTPROCESSOR = 13, - - /** - * Get whether password encrypted private key for HTTPS daemon is - * supported. If supported then option - * ::MHD_OPTION_HTTPS_KEY_PASSWORD can be used. - */ - MHD_FEATURE_HTTPS_KEY_PASSWORD = 14, - - /** - * Get whether reading files beyond 2 GiB boundary is supported. - * If supported then #MHD_create_response_from_fd(), - * #MHD_create_response_from_fd64 #MHD_create_response_from_fd_at_offset() - * and #MHD_create_response_from_fd_at_offset64() can be used with sizes and - * offsets larger than 2 GiB. If not supported value of size+offset is - * limited to 2 GiB. - */ - MHD_FEATURE_LARGE_FILE = 15, - - /** - * Get whether MHD set names on generated threads. - */ - MHD_FEATURE_THREAD_NAMES = 16, - MHD_THREAD_NAMES = 16, - - /** - * Get whether HTTP "Upgrade" is supported. - * If supported then #MHD_ALLOW_UPGRADE, #MHD_upgrade_action() and - * #MHD_create_response_for_upgrade() can be used. - */ - MHD_FEATURE_UPGRADE = 17, - - /** - * Get whether it's safe to use same FD for multiple calls of - * #MHD_create_response_from_fd() and whether it's safe to use single - * response generated by #MHD_create_response_from_fd() with multiple - * connections at same time. - * If #MHD_is_feature_supported() return #MHD_NO for this feature then - * usage of responses with same file FD in multiple parallel threads may - * results in incorrect data sent to remote client. - * It's always safe to use same file FD in multiple responses if MHD - * is run in any single thread mode. - */ - MHD_FEATURE_RESPONSES_SHARED_FD = 18 -}; - - -/** - * Get information about supported MHD features. - * Indicate that MHD was compiled with or without support for - * particular feature. Some features require additional support - * by kernel. Kernel support is not checked by this function. - * - * @param feature type of requested information - * @return #MHD_YES if feature is supported by MHD, #MHD_NO if - * feature is not supported or feature is unknown. - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_is_feature_supported (enum MHD_FEATURE feature); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/microhttpd/0.9.55/Linux-x86_64/include/microhttpd.h b/microhttpd/0.9.55/Linux-x86_64/include/microhttpd.h deleted file mode 100755 index 40a723d..0000000 --- a/microhttpd/0.9.55/Linux-x86_64/include/microhttpd.h +++ /dev/null @@ -1,3456 +0,0 @@ -/* - This file is part of libmicrohttpd - Copyright (C) 2006-2017 Christian Grothoff (and other contributing authors) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/** - * @file microhttpd.h - * @brief public interface to libmicrohttpd - * @author Christian Grothoff - * @author Karlson2k (Evgeny Grin) - * @author Chris GauthierDickey - * - * All symbols defined in this header start with MHD. MHD is a small - * HTTP daemon library. As such, it does not have any API for logging - * errors (you can only enable or disable logging to stderr). Also, - * it may not support all of the HTTP features directly, where - * applicable, portions of HTTP may have to be handled by clients of - * the library. - * - * The library is supposed to handle everything that it must handle - * (because the API would not allow clients to do this), such as basic - * connection management; however, detailed interpretations of headers - * -- such as range requests -- and HTTP methods are left to clients. - * The library does understand HEAD and will only send the headers of - * the response and not the body, even if the client supplied a body. - * The library also understands headers that control connection - * management (specifically, "Connection: close" and "Expect: 100 - * continue" are understood and handled automatically). - * - * MHD understands POST data and is able to decode certain formats - * (at the moment only "application/x-www-form-urlencoded" and - * "mulitpart/formdata"). Unsupported encodings and large POST - * submissions may require the application to manually process - * the stream, which is provided to the main application (and thus can be - * processed, just not conveniently by MHD). - * - * The header file defines various constants used by the HTTP protocol. - * This does not mean that MHD actually interprets all of these - * values. The provided constants are exported as a convenience - * for users of the library. MHD does not verify that transmitted - * HTTP headers are part of the standard specification; users of the - * library are free to define their own extensions of the HTTP - * standard and use those with MHD. - * - * All functions are guaranteed to be completely reentrant and - * thread-safe (with the exception of #MHD_set_connection_value, - * which must only be used in a particular context). - * - * - * @defgroup event event-loop control - * MHD API to start and stop the HTTP server and manage the event loop. - * @defgroup response generation of responses - * MHD API used to generate responses. - * @defgroup request handling of requests - * MHD API used to access information about requests. - * @defgroup authentication HTTP authentication - * MHD API related to basic and digest HTTP authentication. - * @defgroup logging logging - * MHD API to mange logging and error handling - * @defgroup specialized misc. specialized functions - * This group includes functions that do not fit into any particular - * category and that are rarely used. - */ - -#ifndef MHD_MICROHTTPD_H -#define MHD_MICROHTTPD_H - -#ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - -/* While we generally would like users to use a configure-driven - build process which detects which headers are present and - hence works on any platform, we use "standard" includes here - to build out-of-the-box for beginning users on common systems. - - If generic headers don't work on your platform, include headers - which define 'va_list', 'size_t', 'ssize_t', 'intptr_t', - 'uint16_t', 'uint32_t', 'uint64_t', 'off_t', 'struct sockaddr', - 'socklen_t', 'fd_set' and "#define MHD_PLATFORM_H" before - including "microhttpd.h". Then the following "standard" - includes won't be used (which might be a good idea, especially - on platforms where they do not exist). - */ -#ifndef MHD_PLATFORM_H -#include -#include -#include -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#if defined(_MSC_FULL_VER) && !defined (_SSIZE_T_DEFINED) -#define _SSIZE_T_DEFINED -typedef intptr_t ssize_t; -#endif /* !_SSIZE_T_DEFINED */ -#else -#include -#include -#include -#endif -#endif - -#if defined(__CYGWIN__) && !defined(_SYS_TYPES_FD_SET) -/* Do not define __USE_W32_SOCKETS under Cygwin! */ -#error Cygwin with winsock fd_set is not supported -#endif - -/** - * Current version of the library. - * 0x01093001 = 1.9.30-1. - */ -#define MHD_VERSION 0x00095500 - -/** - * MHD-internal return code for "YES". - */ -#define MHD_YES 1 - -/** - * MHD-internal return code for "NO". - */ -#define MHD_NO 0 - -/** - * MHD digest auth internal code for an invalid nonce. - */ -#define MHD_INVALID_NONCE -1 - -/** - * Constant used to indicate unknown size (use when - * creating a response). - */ -#ifdef UINT64_MAX -#define MHD_SIZE_UNKNOWN UINT64_MAX -#else -#define MHD_SIZE_UNKNOWN ((uint64_t) -1LL) -#endif - -#ifdef SIZE_MAX -#define MHD_CONTENT_READER_END_OF_STREAM SIZE_MAX -#define MHD_CONTENT_READER_END_WITH_ERROR (SIZE_MAX - 1) -#else -#define MHD_CONTENT_READER_END_OF_STREAM ((size_t) -1LL) -#define MHD_CONTENT_READER_END_WITH_ERROR (((size_t) -1LL) - 1) -#endif - -#ifndef _MHD_EXTERN -#if defined(_WIN32) && defined(MHD_W32LIB) -#define _MHD_EXTERN extern -#elif defined (_WIN32) && defined(MHD_W32DLL) -/* Define MHD_W32DLL when using MHD as W32 .DLL to speed up linker a little */ -#define _MHD_EXTERN __declspec(dllimport) -#else -#define _MHD_EXTERN extern -#endif -#endif - -#ifndef MHD_SOCKET_DEFINED -/** - * MHD_socket is type for socket FDs - */ -#if !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) -#define MHD_POSIX_SOCKETS 1 -typedef int MHD_socket; -#define MHD_INVALID_SOCKET (-1) -#else /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ -#define MHD_WINSOCK_SOCKETS 1 -#include -typedef SOCKET MHD_socket; -#define MHD_INVALID_SOCKET (INVALID_SOCKET) -#endif /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ -#define MHD_SOCKET_DEFINED 1 -#endif /* MHD_SOCKET_DEFINED */ - -/** - * Define MHD_NO_DEPRECATION before including "microhttpd.h" to disable deprecation messages - */ -#ifdef MHD_NO_DEPRECATION -#define _MHD_DEPR_MACRO(msg) -#define _MHD_NO_DEPR_IN_MACRO 1 -#define _MHD_DEPR_IN_MACRO(msg) -#define _MHD_NO_DEPR_FUNC 1 -#define _MHD_DEPR_FUNC(msg) -#endif /* MHD_NO_DEPRECATION */ - -#ifndef _MHD_DEPR_MACRO -#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1500 -/* VS 2008 or later */ -/* Stringify macros */ -#define _MHD_INSTRMACRO(a) #a -#define _MHD_STRMACRO(a) _MHD_INSTRMACRO(a) -/* deprecation message */ -#define _MHD_DEPR_MACRO(msg) __pragma(message(__FILE__ "(" _MHD_STRMACRO(__LINE__)"): warning: " msg)) -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#elif defined(__clang__) || defined (__GNUC_PATCHLEVEL__) -/* clang or GCC since 3.0 */ -#define _MHD_GCC_PRAG(x) _Pragma (#x) -#if __clang_major__+0 >= 5 || \ - (!defined(__apple_build_version__) && (__clang_major__+0 > 3 || (__clang_major__+0 == 3 && __clang_minor__ >= 3))) || \ - __GNUC__+0 > 4 || (__GNUC__+0 == 4 && __GNUC_MINOR__+0 >= 8) -/* clang >= 3.3 (or XCode's clang >= 5.0) or - GCC >= 4.8 */ -#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(GCC warning msg) -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#else /* older clang or GCC */ -/* clang < 3.3, XCode's clang < 5.0, 3.0 <= GCC < 4.8 */ -#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(message msg) -#if (__clang_major__+0 > 2 || (__clang_major__+0 == 2 && __clang_minor__ >= 9)) /* FIXME: clang >= 2.9, earlier versions not tested */ -/* clang handles inline pragmas better than GCC */ -#define _MHD_DEPR_IN_MACRO(msg) _MHD_DEPR_MACRO(msg) -#endif /* clang >= 2.9 */ -#endif /* older clang or GCC */ -/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */ -#endif /* clang || GCC >= 3.0 */ -#endif /* !_MHD_DEPR_MACRO */ - -#ifndef _MHD_DEPR_MACRO -#define _MHD_DEPR_MACRO(msg) -#endif /* !_MHD_DEPR_MACRO */ - -#ifndef _MHD_DEPR_IN_MACRO -#define _MHD_NO_DEPR_IN_MACRO 1 -#define _MHD_DEPR_IN_MACRO(msg) -#endif /* !_MHD_DEPR_IN_MACRO */ - -#ifndef _MHD_DEPR_FUNC -#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1400 -/* VS 2005 or later */ -#define _MHD_DEPR_FUNC(msg) __declspec(deprecated(msg)) -#elif defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1310 -/* VS .NET 2003 deprecation do not support custom messages */ -#define _MHD_DEPR_FUNC(msg) __declspec(deprecated) -#elif (__GNUC__+0 >= 5) || (defined (__clang__) && \ - (__clang_major__+0 > 2 || (__clang_major__+0 == 2 && __clang_minor__ >= 9))) /* FIXME: earlier versions not tested */ -/* GCC >= 5.0 or clang >= 2.9 */ -#define _MHD_DEPR_FUNC(msg) __attribute__((deprecated(msg))) -#elif defined (__clang__) || __GNUC__+0 > 3 || (__GNUC__+0 == 3 && __GNUC_MINOR__+0 >= 1) -/* 3.1 <= GCC < 5.0 or clang < 2.9 */ -/* old GCC-style deprecation do not support custom messages */ -#define _MHD_DEPR_FUNC(msg) __attribute__((__deprecated__)) -/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */ -#endif /* clang < 2.9 || GCC >= 3.1 */ -#endif /* !_MHD_DEPR_FUNC */ - -#ifndef _MHD_DEPR_FUNC -#define _MHD_NO_DEPR_FUNC 1 -#define _MHD_DEPR_FUNC(msg) -#endif /* !_MHD_DEPR_FUNC */ - -/** - * Not all architectures and `printf()`'s support the `long long` type. - * This gives the ability to replace `long long` with just a `long`, - * standard `int` or a `short`. - */ -#ifndef MHD_LONG_LONG -/** - * @deprecated use #MHD_UNSIGNED_LONG_LONG instead! - */ -#define MHD_LONG_LONG long long -#define MHD_UNSIGNED_LONG_LONG unsigned long long -#else /* MHD_LONG_LONG */ -_MHD_DEPR_MACRO("Macro MHD_LONG_LONG is deprecated, use MHD_UNSIGNED_LONG_LONG") -#endif -/** - * Format string for printing a variable of type #MHD_LONG_LONG. - * You should only redefine this if you also define #MHD_LONG_LONG. - */ -#ifndef MHD_LONG_LONG_PRINTF -/** - * @deprecated use #MHD_UNSIGNED_LONG_LONG_PRINTF instead! - */ -#define MHD_LONG_LONG_PRINTF "ll" -#define MHD_UNSIGNED_LONG_LONG_PRINTF "%llu" -#else /* MHD_LONG_LONG_PRINTF */ -_MHD_DEPR_MACRO("Macro MHD_LONG_LONG_PRINTF is deprecated, use MHD_UNSIGNED_LONG_LONG_PRINTF") -#endif - - -/** - * @defgroup httpcode HTTP response codes. - * These are the status codes defined for HTTP responses. - * @{ - */ -/* See http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml */ - -#define MHD_HTTP_CONTINUE 100 -#define MHD_HTTP_SWITCHING_PROTOCOLS 101 -#define MHD_HTTP_PROCESSING 102 - -#define MHD_HTTP_OK 200 -#define MHD_HTTP_CREATED 201 -#define MHD_HTTP_ACCEPTED 202 -#define MHD_HTTP_NON_AUTHORITATIVE_INFORMATION 203 -#define MHD_HTTP_NO_CONTENT 204 -#define MHD_HTTP_RESET_CONTENT 205 -#define MHD_HTTP_PARTIAL_CONTENT 206 -#define MHD_HTTP_MULTI_STATUS 207 -#define MHD_HTTP_ALREADY_REPORTED 208 - -#define MHD_HTTP_IM_USED 226 - -#define MHD_HTTP_MULTIPLE_CHOICES 300 -#define MHD_HTTP_MOVED_PERMANENTLY 301 -#define MHD_HTTP_FOUND 302 -#define MHD_HTTP_SEE_OTHER 303 -#define MHD_HTTP_NOT_MODIFIED 304 -#define MHD_HTTP_USE_PROXY 305 -#define MHD_HTTP_SWITCH_PROXY 306 -#define MHD_HTTP_TEMPORARY_REDIRECT 307 -#define MHD_HTTP_PERMANENT_REDIRECT 308 - -#define MHD_HTTP_BAD_REQUEST 400 -#define MHD_HTTP_UNAUTHORIZED 401 -#define MHD_HTTP_PAYMENT_REQUIRED 402 -#define MHD_HTTP_FORBIDDEN 403 -#define MHD_HTTP_NOT_FOUND 404 -#define MHD_HTTP_METHOD_NOT_ALLOWED 405 -#define MHD_HTTP_NOT_ACCEPTABLE 406 -/** @deprecated */ -#define MHD_HTTP_METHOD_NOT_ACCEPTABLE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_METHOD_NOT_ACCEPTABLE is deprecated, use MHD_HTTP_NOT_ACCEPTABLE") 406 -#define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407 -#define MHD_HTTP_REQUEST_TIMEOUT 408 -#define MHD_HTTP_CONFLICT 409 -#define MHD_HTTP_GONE 410 -#define MHD_HTTP_LENGTH_REQUIRED 411 -#define MHD_HTTP_PRECONDITION_FAILED 412 -#define MHD_HTTP_PAYLOAD_TOO_LARGE 413 -/** @deprecated */ -#define MHD_HTTP_REQUEST_ENTITY_TOO_LARGE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUEST_ENTITY_TOO_LARGE is deprecated, use MHD_HTTP_PAYLOAD_TOO_LARGE") 413 -#define MHD_HTTP_URI_TOO_LONG 414 -/** @deprecated */ -#define MHD_HTTP_REQUEST_URI_TOO_LONG \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUEST_URI_TOO_LONG is deprecated, use MHD_HTTP_URI_TOO_LONG") 414 -#define MHD_HTTP_UNSUPPORTED_MEDIA_TYPE 415 -#define MHD_HTTP_RANGE_NOT_SATISFIABLE 416 -/** @deprecated */ -#define MHD_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE \ - _MHD_DEPR_IN_MACRO("Value MHD_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE is deprecated, use MHD_HTTP_RANGE_NOT_SATISFIABLE") 416 -#define MHD_HTTP_EXPECTATION_FAILED 417 - -#define MHD_HTTP_MISDIRECTED_REQUEST 421 -#define MHD_HTTP_UNPROCESSABLE_ENTITY 422 -#define MHD_HTTP_LOCKED 423 -#define MHD_HTTP_FAILED_DEPENDENCY 424 -#define MHD_HTTP_UNORDERED_COLLECTION 425 -#define MHD_HTTP_UPGRADE_REQUIRED 426 - -#define MHD_HTTP_PRECONDITION_REQUIRED 428 -#define MHD_HTTP_TOO_MANY_REQUESTS 429 -#define MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 431 - -#define MHD_HTTP_NO_RESPONSE 444 - -#define MHD_HTTP_RETRY_WITH 449 -#define MHD_HTTP_BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS 450 -#define MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451 - -#define MHD_HTTP_INTERNAL_SERVER_ERROR 500 -#define MHD_HTTP_NOT_IMPLEMENTED 501 -#define MHD_HTTP_BAD_GATEWAY 502 -#define MHD_HTTP_SERVICE_UNAVAILABLE 503 -#define MHD_HTTP_GATEWAY_TIMEOUT 504 -#define MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED 505 -#define MHD_HTTP_VARIANT_ALSO_NEGOTIATES 506 -#define MHD_HTTP_INSUFFICIENT_STORAGE 507 -#define MHD_HTTP_LOOP_DETECTED 508 -#define MHD_HTTP_BANDWIDTH_LIMIT_EXCEEDED 509 -#define MHD_HTTP_NOT_EXTENDED 510 -#define MHD_HTTP_NETWORK_AUTHENTICATION_REQUIRED 511 - -/** @} */ /* end of group httpcode */ - -/** - * Returns the string reason phrase for a response code. - * - * If we don't have a string for a status code, we give the first - * message in that status code class. - */ -_MHD_EXTERN const char * -MHD_get_reason_phrase_for (unsigned int code); - - -/** - * Flag to be or-ed with MHD_HTTP status code for - * SHOUTcast. This will cause the response to begin - * with the SHOUTcast "ICY" line instad of "HTTP". - * @ingroup specialized - */ -#define MHD_ICY_FLAG ((uint32_t)(((uint32_t)1) << 31)) - -/** - * @defgroup headers HTTP headers - * These are the standard headers found in HTTP requests and responses. - * See: http://www.iana.org/assignments/message-headers/message-headers.xml - * Registry Version 2017-01-27 - * @{ - */ - -/* Main HTTP headers. */ -/* Standard. RFC7231, Section 5.3.2 */ -#define MHD_HTTP_HEADER_ACCEPT "Accept" -/* Standard. RFC7231, Section 5.3.3 */ -#define MHD_HTTP_HEADER_ACCEPT_CHARSET "Accept-Charset" -/* Standard. RFC7231, Section 5.3.4; RFC7694, Section 3 */ -#define MHD_HTTP_HEADER_ACCEPT_ENCODING "Accept-Encoding" -/* Standard. RFC7231, Section 5.3.5 */ -#define MHD_HTTP_HEADER_ACCEPT_LANGUAGE "Accept-Language" -/* Standard. RFC7233, Section 2.3 */ -#define MHD_HTTP_HEADER_ACCEPT_RANGES "Accept-Ranges" -/* Standard. RFC7234, Section 5.1 */ -#define MHD_HTTP_HEADER_AGE "Age" -/* Standard. RFC7231, Section 7.4.1 */ -#define MHD_HTTP_HEADER_ALLOW "Allow" -/* Standard. RFC7235, Section 4.2 */ -#define MHD_HTTP_HEADER_AUTHORIZATION "Authorization" -/* Standard. RFC7234, Section 5.2 */ -#define MHD_HTTP_HEADER_CACHE_CONTROL "Cache-Control" -/* Reserved. RFC7230, Section 8.1 */ -#define MHD_HTTP_HEADER_CLOSE "Close" -/* Standard. RFC7230, Section 6.1 */ -#define MHD_HTTP_HEADER_CONNECTION "Connection" -/* Standard. RFC7231, Section 3.1.2.2 */ -#define MHD_HTTP_HEADER_CONTENT_ENCODING "Content-Encoding" -/* Standard. RFC7231, Section 3.1.3.2 */ -#define MHD_HTTP_HEADER_CONTENT_LANGUAGE "Content-Language" -/* Standard. RFC7230, Section 3.3.2 */ -#define MHD_HTTP_HEADER_CONTENT_LENGTH "Content-Length" -/* Standard. RFC7231, Section 3.1.4.2 */ -#define MHD_HTTP_HEADER_CONTENT_LOCATION "Content-Location" -/* Standard. RFC7233, Section 4.2 */ -#define MHD_HTTP_HEADER_CONTENT_RANGE "Content-Range" -/* Standard. RFC7231, Section 3.1.1.5 */ -#define MHD_HTTP_HEADER_CONTENT_TYPE "Content-Type" -/* Standard. RFC7231, Section 7.1.1.2 */ -#define MHD_HTTP_HEADER_DATE "Date" -/* Standard. RFC7232, Section 2.3 */ -#define MHD_HTTP_HEADER_ETAG "ETag" -/* Standard. RFC7231, Section 5.1.1 */ -#define MHD_HTTP_HEADER_EXPECT "Expect" -/* Standard. RFC7234, Section 5.3 */ -#define MHD_HTTP_HEADER_EXPIRES "Expires" -/* Standard. RFC7231, Section 5.5.1 */ -#define MHD_HTTP_HEADER_FROM "From" -/* Standard. RFC7230, Section 5.4 */ -#define MHD_HTTP_HEADER_HOST "Host" -/* Standard. RFC7232, Section 3.1 */ -#define MHD_HTTP_HEADER_IF_MATCH "If-Match" -/* Standard. RFC7232, Section 3.3 */ -#define MHD_HTTP_HEADER_IF_MODIFIED_SINCE "If-Modified-Since" -/* Standard. RFC7232, Section 3.2 */ -#define MHD_HTTP_HEADER_IF_NONE_MATCH "If-None-Match" -/* Standard. RFC7233, Section 3.2 */ -#define MHD_HTTP_HEADER_IF_RANGE "If-Range" -/* Standard. RFC7232, Section 3.4 */ -#define MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since" -/* Standard. RFC7232, Section 2.2 */ -#define MHD_HTTP_HEADER_LAST_MODIFIED "Last-Modified" -/* Standard. RFC7231, Section 7.1.2 */ -#define MHD_HTTP_HEADER_LOCATION "Location" -/* Standard. RFC7231, Section 5.1.2 */ -#define MHD_HTTP_HEADER_MAX_FORWARDS "Max-Forwards" -/* Standard. RFC7231, Appendix A.1 */ -#define MHD_HTTP_HEADER_MIME_VERSION "MIME-Version" -/* Standard. RFC7234, Section 5.4 */ -#define MHD_HTTP_HEADER_PRAGMA "Pragma" -/* Standard. RFC7235, Section 4.3 */ -#define MHD_HTTP_HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" -/* Standard. RFC7235, Section 4.4 */ -#define MHD_HTTP_HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" -/* Standard. RFC7233, Section 3.1 */ -#define MHD_HTTP_HEADER_RANGE "Range" -/* Standard. RFC7231, Section 5.5.2 */ -#define MHD_HTTP_HEADER_REFERER "Referer" -/* Standard. RFC7231, Section 7.1.3 */ -#define MHD_HTTP_HEADER_RETRY_AFTER "Retry-After" -/* Standard. RFC7231, Section 7.4.2 */ -#define MHD_HTTP_HEADER_SERVER "Server" -/* Standard. RFC7230, Section 4.3 */ -#define MHD_HTTP_HEADER_TE "TE" -/* Standard. RFC7230, Section 4.4 */ -#define MHD_HTTP_HEADER_TRAILER "Trailer" -/* Standard. RFC7230, Section 3.3.1 */ -#define MHD_HTTP_HEADER_TRANSFER_ENCODING "Transfer-Encoding" -/* Standard. RFC7230, Section 6.7 */ -#define MHD_HTTP_HEADER_UPGRADE "Upgrade" -/* Standard. RFC7231, Section 5.5.3 */ -#define MHD_HTTP_HEADER_USER_AGENT "User-Agent" -/* Standard. RFC7231, Section 7.1.4 */ -#define MHD_HTTP_HEADER_VARY "Vary" -/* Standard. RFC7230, Section 5.7.1 */ -#define MHD_HTTP_HEADER_VIA "Via" -/* Standard. RFC7235, Section 4.1 */ -#define MHD_HTTP_HEADER_WWW_AUTHENTICATE "WWW-Authenticate" -/* Standard. RFC7234, Section 5.5 */ -#define MHD_HTTP_HEADER_WARNING "Warning" - -/* Additional HTTP headers. */ -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_A_IM "A-IM" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ACCEPT_ADDITIONS "Accept-Additions" -/* Informational. RFC7089 */ -#define MHD_HTTP_HEADER_ACCEPT_DATETIME "Accept-Datetime" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ACCEPT_FEATURES "Accept-Features" -/* No category. RFC5789 */ -#define MHD_HTTP_HEADER_ACCEPT_PATCH "Accept-Patch" -/* Standard. RFC7639, Section 2 */ -#define MHD_HTTP_HEADER_ALPN "ALPN" -/* Standard. RFC7838 */ -#define MHD_HTTP_HEADER_ALT_SVC "Alt-Svc" -/* Standard. RFC7838 */ -#define MHD_HTTP_HEADER_ALT_USED "Alt-Used" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_ALTERNATES "Alternates" -/* No category. RFC4437 */ -#define MHD_HTTP_HEADER_APPLY_TO_REDIRECT_REF "Apply-To-Redirect-Ref" -/* Experimental. RFC8053, Section 4 */ -#define MHD_HTTP_HEADER_AUTHENTICATION_CONTROL "Authentication-Control" -/* Standard. RFC7615, Section 3 */ -#define MHD_HTTP_HEADER_AUTHENTICATION_INFO "Authentication-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_EXT "C-Ext" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_MAN "C-Man" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_OPT "C-Opt" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_PEP "C-PEP" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_C_PEP_INFO "C-PEP-Info" -/* Standard. RFC7809, Section 7.1 */ -#define MHD_HTTP_HEADER_CALDAV_TIMEZONES "CalDAV-Timezones" -/* Obsoleted. RFC2068; RFC2616 */ -#define MHD_HTTP_HEADER_CONTENT_BASE "Content-Base" -/* Standard. RFC6266 */ -#define MHD_HTTP_HEADER_CONTENT_DISPOSITION "Content-Disposition" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_ID "Content-ID" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_MD5 "Content-MD5" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_SCRIPT_TYPE "Content-Script-Type" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_STYLE_TYPE "Content-Style-Type" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_CONTENT_VERSION "Content-Version" -/* Standard. RFC6265 */ -#define MHD_HTTP_HEADER_COOKIE "Cookie" -/* Obsoleted. RFC2965; RFC6265 */ -#define MHD_HTTP_HEADER_COOKIE2 "Cookie2" -/* Standard. RFC5323 */ -#define MHD_HTTP_HEADER_DASL "DASL" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DAV "DAV" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DEFAULT_STYLE "Default-Style" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DELTA_BASE "Delta-Base" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DEPTH "Depth" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DERIVED_FROM "Derived-From" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_DESTINATION "Destination" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DIFFERENTIAL_ID "Differential-ID" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_DIGEST "Digest" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_EXT "Ext" -/* Standard. RFC7239 */ -#define MHD_HTTP_HEADER_FORWARDED "Forwarded" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_GETPROFILE "GetProfile" -/* Experimental. RFC7486, Section 6.1.1 */ -#define MHD_HTTP_HEADER_HOBAREG "Hobareg" -/* Standard. RFC7540, Section 3.2.1 */ -#define MHD_HTTP_HEADER_HTTP2_SETTINGS "HTTP2-Settings" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_IM "IM" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_IF "If" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_IF_SCHEDULE_TAG_MATCH "If-Schedule-Tag-Match" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_KEEP_ALIVE "Keep-Alive" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_LABEL "Label" -/* No category. RFC5988 */ -#define MHD_HTTP_HEADER_LINK "Link" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_LOCK_TOKEN "Lock-Token" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_MAN "Man" -/* Informational. RFC7089 */ -#define MHD_HTTP_HEADER_MEMENTO_DATETIME "Memento-Datetime" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_METER "Meter" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_NEGOTIATE "Negotiate" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_OPT "Opt" -/* Experimental. RFC8053, Section 3 */ -#define MHD_HTTP_HEADER_OPTIONAL_WWW_AUTHENTICATE "Optional-WWW-Authenticate" -/* Standard. RFC4229 */ -#define MHD_HTTP_HEADER_ORDERING_TYPE "Ordering-Type" -/* Standard. RFC6454 */ -#define MHD_HTTP_HEADER_ORIGIN "Origin" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_OVERWRITE "Overwrite" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_P3P "P3P" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PEP "PEP" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PICS_LABEL "PICS-Label" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PEP_INFO "Pep-Info" -/* Standard. RFC4229 */ -#define MHD_HTTP_HEADER_POSITION "Position" -/* Standard. RFC7240 */ -#define MHD_HTTP_HEADER_PREFER "Prefer" -/* Standard. RFC7240 */ -#define MHD_HTTP_HEADER_PREFERENCE_APPLIED "Preference-Applied" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROFILEOBJECT "ProfileObject" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL "Protocol" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_INFO "Protocol-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_QUERY "Protocol-Query" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROTOCOL_REQUEST "Protocol-Request" -/* Standard. RFC7615, Section 4 */ -#define MHD_HTTP_HEADER_PROXY_AUTHENTICATION_INFO "Proxy-Authentication-Info" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROXY_FEATURES "Proxy-Features" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PROXY_INSTRUCTION "Proxy-Instruction" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_PUBLIC "Public" -/* Standard. RFC7469 */ -#define MHD_HTTP_HEADER_PUBLIC_KEY_PINS "Public-Key-Pins" -/* Standard. RFC7469 */ -#define MHD_HTTP_HEADER_PUBLIC_KEY_PINS_REPORT_ONLY "Public-Key-Pins-Report-Only" -/* No category. RFC4437 */ -#define MHD_HTTP_HEADER_REDIRECT_REF "Redirect-Ref" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SAFE "Safe" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_SCHEDULE_REPLY "Schedule-Reply" -/* Standard. RFC6638 */ -#define MHD_HTTP_HEADER_SCHEDULE_TAG "Schedule-Tag" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_ACCEPT "Sec-WebSocket-Accept" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_EXTENSIONS "Sec-WebSocket-Extensions" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_KEY "Sec-WebSocket-Key" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_PROTOCOL "Sec-WebSocket-Protocol" -/* Standard. RFC6455 */ -#define MHD_HTTP_HEADER_SEC_WEBSOCKET_VERSION "Sec-WebSocket-Version" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SECURITY_SCHEME "Security-Scheme" -/* Standard. RFC6265 */ -#define MHD_HTTP_HEADER_SET_COOKIE "Set-Cookie" -/* Obsoleted. RFC2965; RFC6265 */ -#define MHD_HTTP_HEADER_SET_COOKIE2 "Set-Cookie2" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SETPROFILE "SetProfile" -/* Standard. RFC5023 */ -#define MHD_HTTP_HEADER_SLUG "SLUG" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SOAPACTION "SoapAction" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_STATUS_URI "Status-URI" -/* Standard. RFC6797 */ -#define MHD_HTTP_HEADER_STRICT_TRANSPORT_SECURITY "Strict-Transport-Security" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SURROGATE_CAPABILITY "Surrogate-Capability" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_SURROGATE_CONTROL "Surrogate-Control" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_TCN "TCN" -/* Standard. RFC4918 */ -#define MHD_HTTP_HEADER_TIMEOUT "Timeout" -/* Standard. RFC8030, Section 5.4 */ -#define MHD_HTTP_HEADER_TOPIC "Topic" -/* Standard. RFC8030, Section 5.2 */ -#define MHD_HTTP_HEADER_TTL "TTL" -/* Standard. RFC8030, Section 5.3 */ -#define MHD_HTTP_HEADER_URGENCY "Urgency" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_URI "URI" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_VARIANT_VARY "Variant-Vary" -/* No category. RFC4229 */ -#define MHD_HTTP_HEADER_WANT_DIGEST "Want-Digest" -/* Informational. RFC7034 */ -#define MHD_HTTP_HEADER_X_FRAME_OPTIONS "X-Frame-Options" - -/* Some provisional headers. */ -#define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN "Access-Control-Allow-Origin" -/** @} */ /* end of group headers */ - -/** - * @defgroup versions HTTP versions - * These strings should be used to match against the first line of the - * HTTP header. - * @{ - */ -#define MHD_HTTP_VERSION_1_0 "HTTP/1.0" -#define MHD_HTTP_VERSION_1_1 "HTTP/1.1" - -/** @} */ /* end of group versions */ - -/** - * @defgroup methods HTTP methods - * HTTP methods (as strings). - * See: http://www.iana.org/assignments/http-methods/http-methods.xml - * Registry Version 2015-05-19 - * @{ - */ -/* Main HTTP methods. */ -/* Not safe. Not idempotent. RFC7231, Section 4.3.6. */ -#define MHD_HTTP_METHOD_CONNECT "CONNECT" -/* Not safe. Idempotent. RFC7231, Section 4.3.5. */ -#define MHD_HTTP_METHOD_DELETE "DELETE" -/* Safe. Idempotent. RFC7231, Section 4.3.1. */ -#define MHD_HTTP_METHOD_GET "GET" -/* Safe. Idempotent. RFC7231, Section 4.3.2. */ -#define MHD_HTTP_METHOD_HEAD "HEAD" -/* Safe. Idempotent. RFC7231, Section 4.3.7. */ -#define MHD_HTTP_METHOD_OPTIONS "OPTIONS" -/* Not safe. Not idempotent. RFC7231, Section 4.3.3. */ -#define MHD_HTTP_METHOD_POST "POST" -/* Not safe. Idempotent. RFC7231, Section 4.3.4. */ -#define MHD_HTTP_METHOD_PUT "PUT" -/* Safe. Idempotent. RFC7231, Section 4.3.8. */ -#define MHD_HTTP_METHOD_TRACE "TRACE" - -/* Additional HTTP methods. */ -/* Not safe. Idempotent. RFC3744, Section 8.1. */ -#define MHD_HTTP_METHOD_ACL "ACL" -/* Not safe. Idempotent. RFC3253, Section 12.6. */ -#define MHD_HTTP_METHOD_BASELINE_CONTROL "BASELINE-CONTROL" -/* Not safe. Idempotent. RFC5842, Section 4. */ -#define MHD_HTTP_METHOD_BIND "BIND" -/* Not safe. Idempotent. RFC3253, Section 4.4, Section 9.4. */ -#define MHD_HTTP_METHOD_CHECKIN "CHECKIN" -/* Not safe. Idempotent. RFC3253, Section 4.3, Section 8.8. */ -#define MHD_HTTP_METHOD_CHECKOUT "CHECKOUT" -/* Not safe. Idempotent. RFC4918, Section 9.8. */ -#define MHD_HTTP_METHOD_COPY "COPY" -/* Not safe. Idempotent. RFC3253, Section 8.2. */ -#define MHD_HTTP_METHOD_LABEL "LABEL" -/* Not safe. Idempotent. RFC2068, Section 19.6.1.2. */ -#define MHD_HTTP_METHOD_LINK "LINK" -/* Not safe. Not idempotent. RFC4918, Section 9.10. */ -#define MHD_HTTP_METHOD_LOCK "LOCK" -/* Not safe. Idempotent. RFC3253, Section 11.2. */ -#define MHD_HTTP_METHOD_MERGE "MERGE" -/* Not safe. Idempotent. RFC3253, Section 13.5. */ -#define MHD_HTTP_METHOD_MKACTIVITY "MKACTIVITY" -/* Not safe. Idempotent. RFC4791, Section 5.3.1. */ -#define MHD_HTTP_METHOD_MKCALENDAR "MKCALENDAR" -/* Not safe. Idempotent. RFC4918, Section 9.3. */ -#define MHD_HTTP_METHOD_MKCOL "MKCOL" -/* Not safe. Idempotent. RFC4437, Section 6. */ -#define MHD_HTTP_METHOD_MKREDIRECTREF "MKREDIRECTREF" -/* Not safe. Idempotent. RFC3253, Section 6.3. */ -#define MHD_HTTP_METHOD_MKWORKSPACE "MKWORKSPACE" -/* Not safe. Idempotent. RFC4918, Section 9.9. */ -#define MHD_HTTP_METHOD_MOVE "MOVE" -/* Not safe. Idempotent. RFC3648, Section 7. */ -#define MHD_HTTP_METHOD_ORDERPATCH "ORDERPATCH" -/* Not safe. Not idempotent. RFC5789, Section 2. */ -#define MHD_HTTP_METHOD_PATCH "PATCH" -/* Safe. Idempotent. RFC7540, Section 3.5. */ -#define MHD_HTTP_METHOD_PRI "PRI" -/* Safe. Idempotent. RFC4918, Section 9.1. */ -#define MHD_HTTP_METHOD_PROPFIND "PROPFIND" -/* Not safe. Idempotent. RFC4918, Section 9.2. */ -#define MHD_HTTP_METHOD_PROPPATCH "PROPPATCH" -/* Not safe. Idempotent. RFC5842, Section 6. */ -#define MHD_HTTP_METHOD_REBIND "REBIND" -/* Safe. Idempotent. RFC3253, Section 3.6. */ -#define MHD_HTTP_METHOD_REPORT "REPORT" -/* Safe. Idempotent. RFC5323, Section 2. */ -#define MHD_HTTP_METHOD_SEARCH "SEARCH" -/* Not safe. Idempotent. RFC5842, Section 5. */ -#define MHD_HTTP_METHOD_UNBIND "UNBIND" -/* Not safe. Idempotent. RFC3253, Section 4.5. */ -#define MHD_HTTP_METHOD_UNCHECKOUT "UNCHECKOUT" -/* Not safe. Idempotent. RFC2068, Section 19.6.1.3. */ -#define MHD_HTTP_METHOD_UNLINK "UNLINK" -/* Not safe. Idempotent. RFC4918, Section 9.11. */ -#define MHD_HTTP_METHOD_UNLOCK "UNLOCK" -/* Not safe. Idempotent. RFC3253, Section 7.1. */ -#define MHD_HTTP_METHOD_UPDATE "UPDATE" -/* Not safe. Idempotent. RFC4437, Section 7. */ -#define MHD_HTTP_METHOD_UPDATEREDIRECTREF "UPDATEREDIRECTREF" -/* Not safe. Idempotent. RFC3253, Section 3.5. */ -#define MHD_HTTP_METHOD_VERSION_CONTROL "VERSION-CONTROL" - -/** @} */ /* end of group methods */ - -/** - * @defgroup postenc HTTP POST encodings - * See also: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 - * @{ - */ -#define MHD_HTTP_POST_ENCODING_FORM_URLENCODED "application/x-www-form-urlencoded" -#define MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA "multipart/form-data" - -/** @} */ /* end of group postenc */ - - -/** - * @brief Handle for the daemon (listening on a socket for HTTP traffic). - * @ingroup event - */ -struct MHD_Daemon; - -/** - * @brief Handle for a connection / HTTP request. - * - * With HTTP/1.1, multiple requests can be run over the same - * connection. However, MHD will only show one request per TCP - * connection to the client at any given time. - * @ingroup request - */ -struct MHD_Connection; - -/** - * @brief Handle for a response. - * @ingroup response - */ -struct MHD_Response; - -/** - * @brief Handle for POST processing. - * @ingroup response - */ -struct MHD_PostProcessor; - - -/** - * @brief Flags for the `struct MHD_Daemon`. - * - * Note that MHD will run automatically in background thread(s) only - * if #MHD_USE_INTERNAL_POLLING_THREAD is used. Otherwise caller (application) - * must use #MHD_run() or #MHD_run_from_select() to have MHD processed - * network connections and data. - * - * Starting the daemon may also fail if a particular option is not - * implemented or not supported on the target platform (i.e. no - * support for TLS, epoll or IPv6). - */ -enum MHD_FLAG -{ - /** - * No options selected. - */ - MHD_NO_FLAG = 0, - - /** - * Print errors messages to custom error logger or to `stderr` if - * custom error logger is not set. - * @sa ::MHD_OPTION_EXTERNAL_LOGGER - */ - MHD_USE_ERROR_LOG = 1, - - /** - * Run in debug mode. If this flag is used, the library should - * print error messages and warnings to `stderr`. - */ - MHD_USE_DEBUG = 1, - - /** - * Run in HTTPS mode. The modern protocol is called TLS. - */ - MHD_USE_TLS = 2, - - /** @deprecated */ - MHD_USE_SSL = 2, -#if 0 - /* let's do this later once versions that define MHD_USE_TLS a more widely deployed. */ -#define MHD_USE_SSL \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SSL is deprecated, use MHD_USE_TLS") \ - MHD_USE_TLS -#endif - - /** - * Run using one thread per connection. - * Must be used only with #MHD_USE_INTERNAL_POLLING_THREAD. - */ - MHD_USE_THREAD_PER_CONNECTION = 4, - - /** - * Run using an internal thread (or thread pool) for sockets sending - * and receiving and data processing. Without this flag MHD will not - * run automatically in background thread(s). - * If this flag is set, #MHD_run() and #MHD_run_from_select() couldn't - * be used. - * This flag is set explicitly by #MHD_USE_POLL_INTERNAL_THREAD and - * by #MHD_USE_EPOLL_INTERNAL_THREAD. - */ - MHD_USE_INTERNAL_POLLING_THREAD = 8, - - /** @deprecated */ - MHD_USE_SELECT_INTERNALLY = 8, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_SELECT_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SELECT_INTERNALLY is deprecated, use MHD_USE_INTERNAL_POLLING_THREAD instead") \ - MHD_USE_INTERNAL_POLLING_THREAD -#endif /* 0 */ - - /** - * Run using the IPv6 protocol (otherwise, MHD will just support - * IPv4). If you want MHD to support IPv4 and IPv6 using a single - * socket, pass #MHD_USE_DUAL_STACK, otherwise, if you only pass - * this option, MHD will try to bind to IPv6-only (resulting in - * no IPv4 support). - */ - MHD_USE_IPv6 = 16, - - /** - * Be pedantic about the protocol (as opposed to as tolerant as - * possible). Specifically, at the moment, this flag causes MHD to - * reject HTTP 1.1 connections without a "Host" header. This is - * required by the standard, but of course in violation of the "be - * as liberal as possible in what you accept" norm. It is - * recommended to turn this ON if you are testing clients against - * MHD, and OFF in production. - */ - MHD_USE_PEDANTIC_CHECKS = 32, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_PEDANTIC_CHECKS \ - _MHD_DEPR_IN_MACRO("Flag MHD_USE_PEDANTIC_CHECKS is deprecated, use option MHD_OPTION_STRICT_FOR_CLIENT instead") \ - 32 -#endif /* 0 */ - - /** - * Use `poll()` instead of `select()`. This allows sockets with `fd >= - * FD_SETSIZE`. This option is not compatible with using an - * 'external' polling mode (as there is no API to get the file - * descriptors for the external poll() from MHD) and must also not - * be used in combination with #MHD_USE_EPOLL. - * @sa ::MHD_FEATURE_POLL, #MHD_USE_POLL_INTERNAL_THREAD - */ - MHD_USE_POLL = 64, - - /** - * Run using an internal thread (or thread pool) doing `poll()`. - * @sa ::MHD_FEATURE_POLL, #MHD_USE_POLL, #MHD_USE_INTERNAL_POLLING_THREAD - */ - MHD_USE_POLL_INTERNAL_THREAD = MHD_USE_POLL | MHD_USE_INTERNAL_POLLING_THREAD, - - /** @deprecated */ - MHD_USE_POLL_INTERNALLY = MHD_USE_POLL | MHD_USE_INTERNAL_POLLING_THREAD, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_POLL_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_POLL_INTERNALLY is deprecated, use MHD_USE_POLL_INTERNAL_THREAD instead") \ - MHD_USE_POLL_INTERNAL_THREAD -#endif /* 0 */ - - /** - * Suppress (automatically) adding the 'Date:' header to HTTP responses. - * This option should ONLY be used on systems that do not have a clock - * and that DO provide other mechanisms for cache control. See also - * RFC 2616, section 14.18 (exception 3). - */ - MHD_USE_SUPPRESS_DATE_NO_CLOCK = 128, - - /** @deprecated */ - MHD_SUPPRESS_DATE_NO_CLOCK = 128, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_SUPPRESS_DATE_NO_CLOCK \ - _MHD_DEPR_IN_MACRO("Value MHD_SUPPRESS_DATE_NO_CLOCK is deprecated, use MHD_USE_SUPPRESS_DATE_NO_CLOCK instead") \ - MHD_USE_SUPPRESS_DATE_NO_CLOCK -#endif /* 0 */ - - /** - * Run without a listen socket. This option only makes sense if - * #MHD_add_connection is to be used exclusively to connect HTTP - * clients to the HTTP server. This option is incompatible with - * using a thread pool; if it is used, #MHD_OPTION_THREAD_POOL_SIZE - * is ignored. - */ - MHD_USE_NO_LISTEN_SOCKET = 256, - - /** - * Use `epoll()` instead of `select()` or `poll()` for the event loop. - * This option is only available on some systems; using the option on - * systems without epoll will cause #MHD_start_daemon to fail. Using - * this option is not supported with #MHD_USE_THREAD_PER_CONNECTION. - * @sa ::MHD_FEATURE_EPOLL - */ - MHD_USE_EPOLL = 512, - - /** @deprecated */ - MHD_USE_EPOLL_LINUX_ONLY = 512, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_LINUX_ONLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_LINUX_ONLY is deprecated, use MHD_USE_EPOLL") \ - MHD_USE_EPOLL -#endif /* 0 */ - - /** - * Run using an internal thread (or thread pool) doing `epoll()`. - * This option is only available on certain platforms; using the option on - * platform without `epoll` support will cause #MHD_start_daemon to fail. - * @sa ::MHD_FEATURE_EPOLL, #MHD_USE_EPOLL, #MHD_USE_INTERNAL_POLLING_THREAD - */ - MHD_USE_EPOLL_INTERNAL_THREAD = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, - - /** @deprecated */ - MHD_USE_EPOLL_INTERNALLY = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, - /** @deprecated */ - MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY = MHD_USE_EPOLL | MHD_USE_INTERNAL_POLLING_THREAD, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_INTERNALLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_INTERNALLY is deprecated, use MHD_USE_EPOLL_INTERNAL_THREAD") \ - MHD_USE_EPOLL_INTERNAL_THREAD - /** @deprecated */ -#define MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY is deprecated, use MHD_USE_EPOLL_INTERNAL_THREAD") \ - MHD_USE_EPOLL_INTERNAL_THREAD -#endif /* 0 */ - - /** - * Use inter-thread communication channel. - * #MHD_USE_ITC can be used with #MHD_USE_INTERNAL_POLLING_THREAD - * and is ignored with any "external" mode. - * It's required for use of #MHD_quiesce_daemon - * or #MHD_add_connection. - * This option is enforced by #MHD_ALLOW_SUSPEND_RESUME or - * #MHD_USE_NO_LISTEN_SOCKET. - * #MHD_USE_ITC is always used automatically on platforms - * where select()/poll()/other ignore shutdown of listen - * socket. - */ - MHD_USE_ITC = 1024, - - /** @deprecated */ - MHD_USE_PIPE_FOR_SHUTDOWN = 1024, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_PIPE_FOR_SHUTDOWN \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_PIPE_FOR_SHUTDOWN is deprecated, use MHD_USE_ITC") \ - MHD_USE_ITC -#endif /* 0 */ - - /** - * Use a single socket for IPv4 and IPv6. - */ - MHD_USE_DUAL_STACK = MHD_USE_IPv6 | 2048, - - /** - * Enable `turbo`. Disables certain calls to `shutdown()`, - * enables aggressive non-blocking optimistic reads and - * other potentially unsafe optimizations. - * Most effects only happen with #MHD_USE_EPOLL. - */ - MHD_USE_TURBO = 4096, - - /** @deprecated */ - MHD_USE_EPOLL_TURBO = 4096, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_EPOLL_TURBO \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_EPOLL_TURBO is deprecated, use MHD_USE_TURBO") \ - MHD_USE_TURBO -#endif /* 0 */ - - /** - * Enable suspend/resume functions, which also implies setting up - * ITC to signal resume. - */ - MHD_ALLOW_SUSPEND_RESUME = 8192 | MHD_USE_ITC, - - /** @deprecated */ - MHD_USE_SUSPEND_RESUME = 8192 | MHD_USE_ITC, -#if 0 /* Will be marked for real deprecation later. */ -#define MHD_USE_SUSPEND_RESUME \ - _MHD_DEPR_IN_MACRO("Value MHD_USE_SUSPEND_RESUME is deprecated, use MHD_ALLOW_SUSPEND_RESUME instead") \ - MHD_ALLOW_SUSPEND_RESUME -#endif /* 0 */ - - /** - * Enable TCP_FASTOPEN option. This option is only available on Linux with a - * kernel >= 3.6. On other systems, using this option cases #MHD_start_daemon - * to fail. - */ - MHD_USE_TCP_FASTOPEN = 16384, - - /** - * You need to set this option if you want to use HTTP "Upgrade". - * "Upgrade" may require usage of additional internal resources, - * which we do not want to use unless necessary. - */ - MHD_ALLOW_UPGRADE = 32768, - - /** - * Automatically use best available polling function. - * Choice of polling function is also depend on other daemon options. - * If #MHD_USE_INTERNAL_POLLING_THREAD is specified then epoll, poll() or - * select() will be used (listed in decreasing preference order, first - * function available on system will be used). - * If #MHD_USE_THREAD_PER_CONNECTION is specified then poll() or select() - * will be used. - * If those flags are not specified then epoll or select() will be - * used (as the only suitable for MHD_get_fdset()) - */ - MHD_USE_AUTO = 65536, - - /** - * Run using an internal thread (or thread pool) with best available on - * system polling function. - * This is combination of #MHD_USE_AUTO and #MHD_USE_INTERNAL_POLLING_THREAD - * flags. - */ - MHD_USE_AUTO_INTERNAL_THREAD = MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD - -}; - - -/** - * Type of a callback function used for logging by MHD. - * - * @param cls closure - * @param fm format string (`printf()`-style) - * @param ap arguments to @a fm - * @ingroup logging - */ -typedef void -(*MHD_LogCallback)(void *cls, - const char *fm, - va_list ap); - - -/** - * @brief MHD options. - * - * Passed in the varargs portion of #MHD_start_daemon. - */ -enum MHD_OPTION -{ - - /** - * No more options / last option. This is used - * to terminate the VARARGs list. - */ - MHD_OPTION_END = 0, - - /** - * Maximum memory size per connection (followed by a `size_t`). - * Default is 32 kb (#MHD_POOL_SIZE_DEFAULT). - * Values above 128k are unlikely to result in much benefit, as half - * of the memory will be typically used for IO, and TCP buffers are - * unlikely to support window sizes above 64k on most systems. - */ - MHD_OPTION_CONNECTION_MEMORY_LIMIT = 1, - - /** - * Maximum number of concurrent connections to - * accept (followed by an `unsigned int`). - */ - MHD_OPTION_CONNECTION_LIMIT = 2, - - /** - * After how many seconds of inactivity should a - * connection automatically be timed out? (followed - * by an `unsigned int`; use zero for no timeout). - */ - MHD_OPTION_CONNECTION_TIMEOUT = 3, - - /** - * Register a function that should be called whenever a request has - * been completed (this can be used for application-specific clean - * up). Requests that have never been presented to the application - * (via #MHD_AccessHandlerCallback) will not result in - * notifications. - * - * This option should be followed by TWO pointers. First a pointer - * to a function of type #MHD_RequestCompletedCallback and second a - * pointer to a closure to pass to the request completed callback. - * The second pointer maybe NULL. - */ - MHD_OPTION_NOTIFY_COMPLETED = 4, - - /** - * Limit on the number of (concurrent) connections made to the - * server from the same IP address. Can be used to prevent one - * IP from taking over all of the allowed connections. If the - * same IP tries to establish more than the specified number of - * connections, they will be immediately rejected. The option - * should be followed by an `unsigned int`. The default is - * zero, which means no limit on the number of connections - * from the same IP address. - */ - MHD_OPTION_PER_IP_CONNECTION_LIMIT = 5, - - /** - * Bind daemon to the supplied `struct sockaddr`. This option should - * be followed by a `struct sockaddr *`. If #MHD_USE_IPv6 is - * specified, the `struct sockaddr*` should point to a `struct - * sockaddr_in6`, otherwise to a `struct sockaddr_in`. - */ - MHD_OPTION_SOCK_ADDR = 6, - - /** - * Specify a function that should be called before parsing the URI from - * the client. The specified callback function can be used for processing - * the URI (including the options) before it is parsed. The URI after - * parsing will no longer contain the options, which maybe inconvenient for - * logging. This option should be followed by two arguments, the first - * one must be of the form - * - * void * my_logger(void *cls, const char *uri, struct MHD_Connection *con) - * - * where the return value will be passed as - * (`* con_cls`) in calls to the #MHD_AccessHandlerCallback - * when this request is processed later; returning a - * value of NULL has no special significance (however, - * note that if you return non-NULL, you can no longer - * rely on the first call to the access handler having - * `NULL == *con_cls` on entry;) - * "cls" will be set to the second argument following - * #MHD_OPTION_URI_LOG_CALLBACK. Finally, uri will - * be the 0-terminated URI of the request. - * - * Note that during the time of this call, most of the connection's - * state is not initialized (as we have not yet parsed the headers). - * However, information about the connecting client (IP, socket) - * is available. - * - * The specified function is called only once per request, therefore some - * programmers may use it to instantiate their own request objects, freeing - * them in the notifier #MHD_OPTION_NOTIFY_COMPLETED. - */ - MHD_OPTION_URI_LOG_CALLBACK = 7, - - /** - * Memory pointer for the private key (key.pem) to be used by the - * HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_CERT. - */ - MHD_OPTION_HTTPS_MEM_KEY = 8, - - /** - * Memory pointer for the certificate (cert.pem) to be used by the - * HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_KEY. - */ - MHD_OPTION_HTTPS_MEM_CERT = 9, - - /** - * Daemon credentials type. - * Followed by an argument of type - * `gnutls_credentials_type_t`. - */ - MHD_OPTION_HTTPS_CRED_TYPE = 10, - - /** - * Memory pointer to a `const char *` specifying the - * cipher algorithm (default: "NORMAL"). - */ - MHD_OPTION_HTTPS_PRIORITIES = 11, - - /** - * Pass a listen socket for MHD to use (systemd-style). If this - * option is used, MHD will not open its own listen socket(s). The - * argument passed must be of type `MHD_socket` and refer to an - * existing socket that has been bound to a port and is listening. - */ - MHD_OPTION_LISTEN_SOCKET = 12, - - /** - * Use the given function for logging error messages. This option - * must be followed by two arguments; the first must be a pointer to - * a function of type #MHD_LogCallback and the second a pointer - * `void *` which will be passed as the first argument to the log - * callback. - * - * Note that MHD will not generate any log messages - * if it was compiled without the "--enable-messages" - * flag being set. - */ - MHD_OPTION_EXTERNAL_LOGGER = 13, - - /** - * Number (`unsigned int`) of threads in thread pool. Enable - * thread pooling by setting this value to to something - * greater than 1. Currently, thread model must be - * #MHD_USE_INTERNAL_POLLING_THREAD if thread pooling is enabled - * (#MHD_start_daemon returns NULL for an unsupported thread - * model). - */ - MHD_OPTION_THREAD_POOL_SIZE = 14, - - /** - * Additional options given in an array of `struct MHD_OptionItem`. - * The array must be terminated with an entry `{MHD_OPTION_END, 0, NULL}`. - * An example for code using #MHD_OPTION_ARRAY is: - * - * struct MHD_OptionItem ops[] = { - * { MHD_OPTION_CONNECTION_LIMIT, 100, NULL }, - * { MHD_OPTION_CONNECTION_TIMEOUT, 10, NULL }, - * { MHD_OPTION_END, 0, NULL } - * }; - * d = MHD_start_daemon (0, 8080, NULL, NULL, dh, NULL, - * MHD_OPTION_ARRAY, ops, - * MHD_OPTION_END); - * - * For options that expect a single pointer argument, the - * second member of the `struct MHD_OptionItem` is ignored. - * For options that expect two pointer arguments, the first - * argument must be cast to `intptr_t`. - */ - MHD_OPTION_ARRAY = 15, - - /** - * Specify a function that should be called for unescaping escape - * sequences in URIs and URI arguments. Note that this function - * will NOT be used by the `struct MHD_PostProcessor`. If this - * option is not specified, the default method will be used which - * decodes escape sequences of the form "%HH". This option should - * be followed by two arguments, the first one must be of the form - * - * size_t my_unescaper(void *cls, - * struct MHD_Connection *c, - * char *s) - * - * where the return value must be "strlen(s)" and "s" should be - * updated. Note that the unescape function must not lengthen "s" - * (the result must be shorter than the input and still be - * 0-terminated). "cls" will be set to the second argument - * following #MHD_OPTION_UNESCAPE_CALLBACK. - */ - MHD_OPTION_UNESCAPE_CALLBACK = 16, - - /** - * Memory pointer for the random values to be used by the Digest - * Auth module. This option should be followed by two arguments. - * First an integer of type `size_t` which specifies the size - * of the buffer pointed to by the second argument in bytes. - * Note that the application must ensure that the buffer of the - * second argument remains allocated and unmodified while the - * deamon is running. - */ - MHD_OPTION_DIGEST_AUTH_RANDOM = 17, - - /** - * Size of the internal array holding the map of the nonce and - * the nonce counter. This option should be followed by an `unsigend int` - * argument. - */ - MHD_OPTION_NONCE_NC_SIZE = 18, - - /** - * Desired size of the stack for threads created by MHD. Followed - * by an argument of type `size_t`. Use 0 for system default. - */ - MHD_OPTION_THREAD_STACK_SIZE = 19, - - /** - * Memory pointer for the certificate (ca.pem) to be used by the - * HTTPS daemon for client authentification. - * This option should be followed by a `const char *` argument. - */ - MHD_OPTION_HTTPS_MEM_TRUST = 20, - - /** - * Increment to use for growing the read buffer (followed by a - * `size_t`). Must fit within #MHD_OPTION_CONNECTION_MEMORY_LIMIT. - */ - MHD_OPTION_CONNECTION_MEMORY_INCREMENT = 21, - - /** - * Use a callback to determine which X.509 certificate should be - * used for a given HTTPS connection. This option should be - * followed by a argument of type `gnutls_certificate_retrieve_function2 *`. - * This option provides an - * alternative to #MHD_OPTION_HTTPS_MEM_KEY, - * #MHD_OPTION_HTTPS_MEM_CERT. You must use this version if - * multiple domains are to be hosted at the same IP address using - * TLS's Server Name Indication (SNI) extension. In this case, - * the callback is expected to select the correct certificate - * based on the SNI information provided. The callback is expected - * to access the SNI data using `gnutls_server_name_get()`. - * Using this option requires GnuTLS 3.0 or higher. - */ - MHD_OPTION_HTTPS_CERT_CALLBACK = 22, - - /** - * When using #MHD_USE_TCP_FASTOPEN, this option changes the default TCP - * fastopen queue length of 50. Note that having a larger queue size can - * cause resource exhaustion attack as the TCP stack has to now allocate - * resources for the SYN packet along with its DATA. This option should be - * followed by an `unsigned int` argument. - */ - MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE = 23, - - /** - * Memory pointer for the Diffie-Hellman parameters (dh.pem) to be used by the - * HTTPS daemon for key exchange. - * This option must be followed by a `const char *` argument. - */ - MHD_OPTION_HTTPS_MEM_DHPARAMS = 24, - - /** - * If present and set to true, allow reusing address:port socket - * (by using SO_REUSEPORT on most platform, or platform-specific ways). - * If present and set to false, disallow reusing address:port socket - * (does nothing on most plaform, but uses SO_EXCLUSIVEADDRUSE on Windows). - * This option must be followed by a `unsigned int` argument. - */ - MHD_OPTION_LISTENING_ADDRESS_REUSE = 25, - - /** - * Memory pointer for a password that decrypts the private key (key.pem) - * to be used by the HTTPS daemon. This option should be followed by a - * `const char *` argument. - * This should be used in conjunction with #MHD_OPTION_HTTPS_MEM_KEY. - * @sa ::MHD_FEATURE_HTTPS_KEY_PASSWORD - */ - MHD_OPTION_HTTPS_KEY_PASSWORD = 26, - - /** - * Register a function that should be called whenever a connection is - * started or closed. - * - * This option should be followed by TWO pointers. First a pointer - * to a function of type #MHD_NotifyConnectionCallback and second a - * pointer to a closure to pass to the request completed callback. - * The second pointer maybe NULL. - */ - MHD_OPTION_NOTIFY_CONNECTION = 27, - - /** - * Allow to change maximum length of the queue of pending connections on - * listen socket. If not present than default platform-specific SOMAXCONN - * value is used. This option should be followed by an `unsigned int` - * argument. - */ - MHD_OPTION_LISTEN_BACKLOG_SIZE = 28, - - /** - * If set to 1 - be strict about the protocol (as opposed to as - * tolerant as possible). Specifically, at the moment, this flag - * causes MHD to reject HTTP 1.1 connections without a "Host" header. - * This is required by the standard, but of course in violation of - * the "be as liberal as possible in what you accept" norm. It is - * recommended to set this to 1 if you are testing clients against - * MHD, and 0 in production. - * if set to -1 - be opposite to strict and be permissive about the - * protocol, allowing slight deviations that are technically not - * allowed by the RFC. Specifically, at the moment, this flag - * causes MHD to allow spaces in header field names. This is - * disallowed by the standard. - * It is not recommended to set it to -1 on publicly available - * servers as it may potentially lower level of protection. - * This option should be followed by an `int` argument. - */ - MHD_OPTION_STRICT_FOR_CLIENT = 29 -}; - - -/** - * Entry in an #MHD_OPTION_ARRAY. - */ -struct MHD_OptionItem -{ - /** - * Which option is being given. Use #MHD_OPTION_END - * to terminate the array. - */ - enum MHD_OPTION option; - - /** - * Option value (for integer arguments, and for options requiring - * two pointer arguments); should be 0 for options that take no - * arguments or only a single pointer argument. - */ - intptr_t value; - - /** - * Pointer option value (use NULL for options taking no arguments - * or only an integer option). - */ - void *ptr_value; - -}; - - -/** - * The `enum MHD_ValueKind` specifies the source of - * the key-value pairs in the HTTP protocol. - */ -enum MHD_ValueKind -{ - - /** - * Response header - * @deprecated - */ - MHD_RESPONSE_HEADER_KIND = 0, -#define MHD_RESPONSE_HEADER_KIND \ - _MHD_DEPR_IN_MACRO("Value MHD_RESPONSE_HEADER_KIND is deprecated and not used") \ - MHD_RESPONSE_HEADER_KIND - - /** - * HTTP header (request/response). - */ - MHD_HEADER_KIND = 1, - - /** - * Cookies. Note that the original HTTP header containing - * the cookie(s) will still be available and intact. - */ - MHD_COOKIE_KIND = 2, - - /** - * POST data. This is available only if a content encoding - * supported by MHD is used (currently only URL encoding), - * and only if the posted content fits within the available - * memory pool. Note that in that case, the upload data - * given to the #MHD_AccessHandlerCallback will be - * empty (since it has already been processed). - */ - MHD_POSTDATA_KIND = 4, - - /** - * GET (URI) arguments. - */ - MHD_GET_ARGUMENT_KIND = 8, - - /** - * HTTP footer (only for HTTP 1.1 chunked encodings). - */ - MHD_FOOTER_KIND = 16 -}; - - -/** - * The `enum MHD_RequestTerminationCode` specifies reasons - * why a request has been terminated (or completed). - * @ingroup request - */ -enum MHD_RequestTerminationCode -{ - - /** - * We finished sending the response. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_COMPLETED_OK = 0, - - /** - * Error handling the connection (resources - * exhausted, other side closed connection, - * application error accepting request, etc.) - * @ingroup request - */ - MHD_REQUEST_TERMINATED_WITH_ERROR = 1, - - /** - * No activity on the connection for the number - * of seconds specified using - * #MHD_OPTION_CONNECTION_TIMEOUT. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_TIMEOUT_REACHED = 2, - - /** - * We had to close the session since MHD was being - * shut down. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN = 3, - - /** - * We tried to read additional data, but the other side closed the - * connection. This error is similar to - * #MHD_REQUEST_TERMINATED_WITH_ERROR, but specific to the case where - * the connection died because the other side did not send expected - * data. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_READ_ERROR = 4, - - /** - * The client terminated the connection by closing the socket - * for writing (TCP half-closed); MHD aborted sending the - * response according to RFC 2616, section 8.1.4. - * @ingroup request - */ - MHD_REQUEST_TERMINATED_CLIENT_ABORT = 5 - -}; - - -/** - * The `enum MHD_ConnectionNotificationCode` specifies types - * of connection notifications. - * @ingroup request - */ -enum MHD_ConnectionNotificationCode -{ - - /** - * A new connection has been started. - * @ingroup request - */ - MHD_CONNECTION_NOTIFY_STARTED = 0, - - /** - * A connection is closed. - * @ingroup request - */ - MHD_CONNECTION_NOTIFY_CLOSED = 1 - -}; - - -/** - * Information about a connection. - */ -union MHD_ConnectionInfo -{ - - /** - * Cipher algorithm used, of type "enum gnutls_cipher_algorithm". - */ - int /* enum gnutls_cipher_algorithm */ cipher_algorithm; - - /** - * Protocol used, of type "enum gnutls_protocol". - */ - int /* enum gnutls_protocol */ protocol; - - /** - * The suspended status of a connection. - */ - int /* MHD_YES or MHD_NO */ suspended; - - /** - * Amount of second that connection could spend in idle state - * before automatically disconnected. - * Zero for no timeout (unlimited idle time). - */ - unsigned int connection_timeout; - - /** - * Connect socket - */ - MHD_socket connect_fd; - - /** - * Size of the client's HTTP header. - */ - size_t header_size; - - /** - * GNUtls session handle, of type "gnutls_session_t". - */ - void * /* gnutls_session_t */ tls_session; - - /** - * GNUtls client certificate handle, of type "gnutls_x509_crt_t". - */ - void * /* gnutls_x509_crt_t */ client_cert; - - /** - * Address information for the client. - */ - struct sockaddr *client_addr; - - /** - * Which daemon manages this connection (useful in case there are many - * daemons running). - */ - struct MHD_Daemon *daemon; - - /** - * Socket-specific client context. Points to the same address as - * the "socket_context" of the #MHD_NotifyConnectionCallback. - */ - void *socket_context; -}; - - -/** - * Values of this enum are used to specify what - * information about a connection is desired. - * @ingroup request - */ -enum MHD_ConnectionInfoType -{ - /** - * What cipher algorithm is being used. - * Takes no extra arguments. - * @ingroup request - */ - MHD_CONNECTION_INFO_CIPHER_ALGO, - - /** - * - * Takes no extra arguments. - * @ingroup request - */ - MHD_CONNECTION_INFO_PROTOCOL, - - /** - * Obtain IP address of the client. Takes no extra arguments. - * Returns essentially a `struct sockaddr **` (since the API returns - * a `union MHD_ConnectionInfo *` and that union contains a `struct - * sockaddr *`). - * @ingroup request - */ - MHD_CONNECTION_INFO_CLIENT_ADDRESS, - - /** - * Get the gnuTLS session handle. - * @ingroup request - */ - MHD_CONNECTION_INFO_GNUTLS_SESSION, - - /** - * Get the gnuTLS client certificate handle. Dysfunctional (never - * implemented, deprecated). Use #MHD_CONNECTION_INFO_GNUTLS_SESSION - * to get the `gnutls_session_t` and then call - * gnutls_certificate_get_peers(). - */ - MHD_CONNECTION_INFO_GNUTLS_CLIENT_CERT, - - /** - * Get the `struct MHD_Daemon *` responsible for managing this connection. - * @ingroup request - */ - MHD_CONNECTION_INFO_DAEMON, - - /** - * Request the file descriptor for the connection socket. - * No extra arguments should be passed. - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_FD, - - /** - * Returns the client-specific pointer to a `void *` that was (possibly) - * set during a #MHD_NotifyConnectionCallback when the socket was - * first accepted. Note that this is NOT the same as the "con_cls" - * argument of the #MHD_AccessHandlerCallback. The "con_cls" is - * fresh for each HTTP request, while the "socket_context" is fresh - * for each socket. - */ - MHD_CONNECTION_INFO_SOCKET_CONTEXT, - - /** - * Check whether the connection is suspended. - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_SUSPENDED, - - /** - * Get connection timeout - * @ingroup request - */ - MHD_CONNECTION_INFO_CONNECTION_TIMEOUT, - - /** - * Return length of the client's HTTP request header. - * @ingroup request - */ - MHD_CONNECTION_INFO_REQUEST_HEADER_SIZE -}; - - -/** - * Values of this enum are used to specify what - * information about a deamon is desired. - */ -enum MHD_DaemonInfoType -{ - /** - * No longer supported (will return NULL). - */ - MHD_DAEMON_INFO_KEY_SIZE, - - /** - * No longer supported (will return NULL). - */ - MHD_DAEMON_INFO_MAC_KEY_SIZE, - - /** - * Request the file descriptor for the listening socket. - * No extra arguments should be passed. - */ - MHD_DAEMON_INFO_LISTEN_FD, - - /** - * Request the file descriptor for the external epoll. - * No extra arguments should be passed. - */ - MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY, - MHD_DAEMON_INFO_EPOLL_FD = MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY, - - /** - * Request the number of current connections handled by the daemon. - * No extra arguments should be passed. - * Note: when using MHD in external polling mode, this type of request - * could be used only when #MHD_run()/#MHD_run_from_select is not - * working in other thread at the same time. - */ - MHD_DAEMON_INFO_CURRENT_CONNECTIONS, - - /** - * Request the daemon flags. - * No extra arguments should be passed. - * Note: flags may differ from original 'flags' specified for - * daemon, especially if #MHD_USE_AUTO was set. - */ - MHD_DAEMON_INFO_FLAGS -}; - - -/** - * Callback for serious error condition. The default action is to print - * an error message and `abort()`. - * - * @param cls user specified value - * @param file where the error occured - * @param line where the error occured - * @param reason error detail, may be NULL - * @ingroup logging - */ -typedef void -(*MHD_PanicCallback) (void *cls, - const char *file, - unsigned int line, - const char *reason); - -/** - * Allow or deny a client to connect. - * - * @param cls closure - * @param addr address information from the client - * @param addrlen length of @a addr - * @return #MHD_YES if connection is allowed, #MHD_NO if not - */ -typedef int -(*MHD_AcceptPolicyCallback) (void *cls, - const struct sockaddr *addr, - socklen_t addrlen); - - -/** - * A client has requested the given url using the given method - * (#MHD_HTTP_METHOD_GET, #MHD_HTTP_METHOD_PUT, - * #MHD_HTTP_METHOD_DELETE, #MHD_HTTP_METHOD_POST, etc). The callback - * must call MHD callbacks to provide content to give back to the - * client and return an HTTP status code (i.e. #MHD_HTTP_OK, - * #MHD_HTTP_NOT_FOUND, etc.). - * - * @param cls argument given together with the function - * pointer when the handler was registered with MHD - * @param url the requested url - * @param method the HTTP method used (#MHD_HTTP_METHOD_GET, - * #MHD_HTTP_METHOD_PUT, etc.) - * @param version the HTTP version string (i.e. - * #MHD_HTTP_VERSION_1_1) - * @param upload_data the data being uploaded (excluding HEADERS, - * for a POST that fits into memory and that is encoded - * with a supported encoding, the POST data will NOT be - * given in upload_data and is instead available as - * part of #MHD_get_connection_values; very large POST - * data *will* be made available incrementally in - * @a upload_data) - * @param upload_data_size set initially to the size of the - * @a upload_data provided; the method must update this - * value to the number of bytes NOT processed; - * @param con_cls pointer that the callback can set to some - * address and that will be preserved by MHD for future - * calls for this request; since the access handler may - * be called many times (i.e., for a PUT/POST operation - * with plenty of upload data) this allows the application - * to easily associate some request-specific state. - * If necessary, this state can be cleaned up in the - * global #MHD_RequestCompletedCallback (which - * can be set with the #MHD_OPTION_NOTIFY_COMPLETED). - * Initially, `*con_cls` will be NULL. - * @return #MHD_YES if the connection was handled successfully, - * #MHD_NO if the socket must be closed due to a serios - * error while handling the request - */ -typedef int -(*MHD_AccessHandlerCallback) (void *cls, - struct MHD_Connection *connection, - const char *url, - const char *method, - const char *version, - const char *upload_data, - size_t *upload_data_size, - void **con_cls); - - -/** - * Signature of the callback used by MHD to notify the - * application about completed requests. - * - * @param cls client-defined closure - * @param connection connection handle - * @param con_cls value as set by the last call to - * the #MHD_AccessHandlerCallback - * @param toe reason for request termination - * @see #MHD_OPTION_NOTIFY_COMPLETED - * @ingroup request - */ -typedef void -(*MHD_RequestCompletedCallback) (void *cls, - struct MHD_Connection *connection, - void **con_cls, - enum MHD_RequestTerminationCode toe); - -/** - * Signature of the callback used by MHD to notify the - * application about started/stopped connections - * - * @param cls client-defined closure - * @param connection connection handle - * @param socket_context socket-specific pointer where the - * client can associate some state specific - * to the TCP connection; note that this is - * different from the "con_cls" which is per - * HTTP request. The client can initialize - * during #MHD_CONNECTION_NOTIFY_STARTED and - * cleanup during #MHD_CONNECTION_NOTIFY_CLOSED - * and access in the meantime using - * #MHD_CONNECTION_INFO_SOCKET_CONTEXT. - * @param toe reason for connection notification - * @see #MHD_OPTION_NOTIFY_CONNECTION - * @ingroup request - */ -typedef void -(*MHD_NotifyConnectionCallback) (void *cls, - struct MHD_Connection *connection, - void **socket_context, - enum MHD_ConnectionNotificationCode toe); - - -/** - * Iterator over key-value pairs. This iterator - * can be used to iterate over all of the cookies, - * headers, or POST-data fields of a request, and - * also to iterate over the headers that have been - * added to a response. - * - * @param cls closure - * @param kind kind of the header we are looking at - * @param key key for the value, can be an empty string - * @param value corresponding value, can be NULL - * @return #MHD_YES to continue iterating, - * #MHD_NO to abort the iteration - * @ingroup request - */ -typedef int -(*MHD_KeyValueIterator) (void *cls, - enum MHD_ValueKind kind, - const char *key, - const char *value); - - -/** - * Callback used by libmicrohttpd in order to obtain content. The - * callback is to copy at most @a max bytes of content into @a buf. The - * total number of bytes that has been placed into @a buf should be - * returned. - * - * Note that returning zero will cause libmicrohttpd to try again. - * Thus, returning zero should only be used in conjunction - * with MHD_suspend_connection() to avoid busy waiting. - * - * @param cls extra argument to the callback - * @param pos position in the datastream to access; - * note that if a `struct MHD_Response` object is re-used, - * it is possible for the same content reader to - * be queried multiple times for the same data; - * however, if a `struct MHD_Response` is not re-used, - * libmicrohttpd guarantees that "pos" will be - * the sum of all non-negative return values - * obtained from the content reader so far. - * @param buf where to copy the data - * @param max maximum number of bytes to copy to @a buf (size of @a buf) - * @return number of bytes written to @a buf; - * 0 is legal unless we are running in internal select mode (since - * this would cause busy-waiting); 0 in external select mode - * will cause this function to be called again once the external - * select calls MHD again; - * #MHD_CONTENT_READER_END_OF_STREAM (-1) for the regular - * end of transmission (with chunked encoding, MHD will then - * terminate the chunk and send any HTTP footers that might be - * present; without chunked encoding and given an unknown - * response size, MHD will simply close the connection; note - * that while returning #MHD_CONTENT_READER_END_OF_STREAM is not technically - * legal if a response size was specified, MHD accepts this - * and treats it just as #MHD_CONTENT_READER_END_WITH_ERROR; - * #MHD_CONTENT_READER_END_WITH_ERROR (-2) to indicate a server - * error generating the response; this will cause MHD to simply - * close the connection immediately. If a response size was - * given or if chunked encoding is in use, this will indicate - * an error to the client. Note, however, that if the client - * does not know a response size and chunked encoding is not in - * use, then clients will not be able to tell the difference between - * #MHD_CONTENT_READER_END_WITH_ERROR and #MHD_CONTENT_READER_END_OF_STREAM. - * This is not a limitation of MHD but rather of the HTTP protocol. - */ -typedef ssize_t -(*MHD_ContentReaderCallback) (void *cls, - uint64_t pos, - char *buf, - size_t max); - - -/** - * This method is called by libmicrohttpd if we - * are done with a content reader. It should - * be used to free resources associated with the - * content reader. - * - * @param cls closure - * @ingroup response - */ -typedef void -(*MHD_ContentReaderFreeCallback) (void *cls); - - -/** - * Iterator over key-value pairs where the value - * maybe made available in increments and/or may - * not be zero-terminated. Used for processing - * POST data. - * - * @param cls user-specified closure - * @param kind type of the value, always #MHD_POSTDATA_KIND when called from MHD - * @param key 0-terminated key for the value - * @param filename name of the uploaded file, NULL if not known - * @param content_type mime-type of the data, NULL if not known - * @param transfer_encoding encoding of the data, NULL if not known - * @param data pointer to @a size bytes of data at the - * specified offset - * @param off offset of data in the overall value - * @param size number of bytes in @a data available - * @return #MHD_YES to continue iterating, - * #MHD_NO to abort the iteration - */ -typedef int -(*MHD_PostDataIterator) (void *cls, - enum MHD_ValueKind kind, - const char *key, - const char *filename, - const char *content_type, - const char *transfer_encoding, - const char *data, - uint64_t off, - size_t size); - -/* **************** Daemon handling functions ***************** */ - -/** - * Start a webserver on the given port. - * - * @param flags combination of `enum MHD_FLAG` values - * @param port port to bind to (in host byte order) - * @param apc callback to call to check which clients - * will be allowed to connect; you can pass NULL - * in which case connections from any IP will be - * accepted - * @param apc_cls extra argument to apc - * @param dh handler called for all requests (repeatedly) - * @param dh_cls extra argument to @a dh - * @param ap list of options (type-value pairs, - * terminated with #MHD_OPTION_END). - * @return NULL on error, handle to daemon on success - * @ingroup event - */ -_MHD_EXTERN struct MHD_Daemon * -MHD_start_daemon_va (unsigned int flags, - uint16_t port, - MHD_AcceptPolicyCallback apc, void *apc_cls, - MHD_AccessHandlerCallback dh, void *dh_cls, - va_list ap); - - -/** - * Start a webserver on the given port. Variadic version of - * #MHD_start_daemon_va. - * - * @param flags combination of `enum MHD_FLAG` values - * @param port port to bind to - * @param apc callback to call to check which clients - * will be allowed to connect; you can pass NULL - * in which case connections from any IP will be - * accepted - * @param apc_cls extra argument to apc - * @param dh handler called for all requests (repeatedly) - * @param dh_cls extra argument to @a dh - * @return NULL on error, handle to daemon on success - * @ingroup event - */ -_MHD_EXTERN struct MHD_Daemon * -MHD_start_daemon (unsigned int flags, - uint16_t port, - MHD_AcceptPolicyCallback apc, void *apc_cls, - MHD_AccessHandlerCallback dh, void *dh_cls, - ...); - - -/** - * Stop accepting connections from the listening socket. Allows - * clients to continue processing, but stops accepting new - * connections. Note that the caller is responsible for closing the - * returned socket; however, if MHD is run using threads (anything but - * external select mode), it must not be closed until AFTER - * #MHD_stop_daemon has been called (as it is theoretically possible - * that an existing thread is still using it). - * - * Note that some thread modes require the caller to have passed - * #MHD_USE_ITC when using this API. If this daemon is - * in one of those modes and this option was not given to - * #MHD_start_daemon, this function will return #MHD_INVALID_SOCKET. - * - * @param daemon daemon to stop accepting new connections for - * @return old listen socket on success, #MHD_INVALID_SOCKET if - * the daemon was already not listening anymore - * @ingroup specialized - */ -_MHD_EXTERN MHD_socket -MHD_quiesce_daemon (struct MHD_Daemon *daemon); - - -/** - * Shutdown an HTTP daemon. - * - * @param daemon daemon to stop - * @ingroup event - */ -_MHD_EXTERN void -MHD_stop_daemon (struct MHD_Daemon *daemon); - - -/** - * Add another client connection to the set of connections managed by - * MHD. This API is usually not needed (since MHD will accept inbound - * connections on the server socket). Use this API in special cases, - * for example if your HTTP server is behind NAT and needs to connect - * out to the HTTP client, or if you are building a proxy. - * - * If you use this API in conjunction with a internal select or a - * thread pool, you must set the option - * #MHD_USE_ITC to ensure that the freshly added - * connection is immediately processed by MHD. - * - * The given client socket will be managed (and closed!) by MHD after - * this call and must no longer be used directly by the application - * afterwards. - * - * Per-IP connection limits are ignored when using this API. - * - * @param daemon daemon that manages the connection - * @param client_socket socket to manage (MHD will expect - * to receive an HTTP request from this socket next). - * @param addr IP address of the client - * @param addrlen number of bytes in @a addr - * @return #MHD_YES on success, #MHD_NO if this daemon could - * not handle the connection (i.e. `malloc()` failed, etc). - * The socket will be closed in any case; `errno` is - * set to indicate further details about the error. - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_add_connection (struct MHD_Daemon *daemon, - MHD_socket client_socket, - const struct sockaddr *addr, - socklen_t addrlen); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. FD_SETSIZE is assumed - * to be platform's default. - * - * This function should only be called in when MHD is configured to - * use external select with @code{select()} or with @code{epoll()}. - * In the latter case, it will only add the single @code{epoll()} file - * descriptor used by MHD to the sets. - * - * This function must be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_fdset (struct MHD_Daemon *daemon, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *except_fd_set, - MHD_socket *max_fd); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. - * - * Passing custom FD_SETSIZE as @a fd_setsize allow usage of - * larger/smaller than platform's default fd_sets. - * - * This function should only be called in when MHD is configured to - * use external select with @code{select()} or with @code{epoll()}. - * In the latter case, it will only add the single @code{epoll()} file - * descriptor used by MHD to the sets. - * - * This function must be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @param fd_setsize value of FD_SETSIZE - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_fdset2 (struct MHD_Daemon *daemon, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *except_fd_set, - MHD_socket *max_fd, - unsigned int fd_setsize); - - -/** - * Obtain the `select()` sets for this daemon. - * Daemon's FDs will be added to fd_sets. To get only - * daemon FDs in fd_sets, call FD_ZERO for each fd_set - * before calling this function. Size of fd_set is - * determined by current value of FD_SETSIZE. - * - * This function could be called only for daemon started - * without #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to get sets from - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @param max_fd increased to largest FD added (if larger - * than existing value); can be NULL - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call or any FD didn't - * fit fd_set. - * @ingroup event - */ -#define MHD_get_fdset(daemon,read_fd_set,write_fd_set,except_fd_set,max_fd) \ - MHD_get_fdset2((daemon),(read_fd_set),(write_fd_set),(except_fd_set),(max_fd),FD_SETSIZE) - - -/** - * Obtain timeout value for `select()` for this daemon (only needed if - * connection timeout is used). The returned value is how many milliseconds - * `select()` or `poll()` should at most block, not the timeout value set for - * connections. This function MUST NOT be called if MHD is running with - * #MHD_USE_THREAD_PER_CONNECTION. - * - * @param daemon daemon to query for timeout - * @param timeout set to the timeout (in milliseconds) - * @return #MHD_YES on success, #MHD_NO if timeouts are - * not used (or no connections exist that would - * necessiate the use of a timeout right now). - * @ingroup event - */ -_MHD_EXTERN int -MHD_get_timeout (struct MHD_Daemon *daemon, - MHD_UNSIGNED_LONG_LONG *timeout); - - -/** - * Run webserver operations (without blocking unless in client - * callbacks). This method should be called by clients in combination - * with #MHD_get_fdset if the client-controlled select method is used. - * - * This function is a convenience method, which is useful if the - * fd_sets from #MHD_get_fdset were not directly passed to `select()`; - * with this function, MHD will internally do the appropriate `select()` - * call itself again. While it is always safe to call #MHD_run (if - * #MHD_USE_INTERNAL_POLLING_THREAD is not set), you should call - * #MHD_run_from_select if performance is important (as it saves an - * expensive call to `select()`). - * - * @param daemon daemon to run - * @return #MHD_YES on success, #MHD_NO if this - * daemon was not started with the right - * options for this call. - * @ingroup event - */ -_MHD_EXTERN int -MHD_run (struct MHD_Daemon *daemon); - - -/** - * Run webserver operations. This method should be called by clients - * in combination with #MHD_get_fdset if the client-controlled select - * method is used. - * - * You can use this function instead of #MHD_run if you called - * `select()` on the result from #MHD_get_fdset. File descriptors in - * the sets that are not controlled by MHD will be ignored. Calling - * this function instead of #MHD_run is more efficient as MHD will - * not have to call `select()` again to determine which operations are - * ready. - * - * This function cannot be used with daemon started with - * #MHD_USE_INTERNAL_POLLING_THREAD flag. - * - * @param daemon daemon to run select loop for - * @param read_fd_set read set - * @param write_fd_set write set - * @param except_fd_set except set - * @return #MHD_NO on serious errors, #MHD_YES on success - * @ingroup event - */ -_MHD_EXTERN int -MHD_run_from_select (struct MHD_Daemon *daemon, - const fd_set *read_fd_set, - const fd_set *write_fd_set, - const fd_set *except_fd_set); - - - - -/* **************** Connection handling functions ***************** */ - -/** - * Get all of the headers from the request. - * - * @param connection connection to get values from - * @param kind types of values to iterate over, can be a bitmask - * @param iterator callback to call on each header; - * maybe NULL (then just count headers) - * @param iterator_cls extra argument to @a iterator - * @return number of entries iterated over - * @ingroup request - */ -_MHD_EXTERN int -MHD_get_connection_values (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - MHD_KeyValueIterator iterator, - void *iterator_cls); - - -/** - * This function can be used to add an entry to the HTTP headers of a - * connection (so that the #MHD_get_connection_values function will - * return them -- and the `struct MHD_PostProcessor` will also see - * them). This maybe required in certain situations (see Mantis - * #1399) where (broken) HTTP implementations fail to supply values - - * needed by the post processor (or other parts of the application). - * - * This function MUST only be called from within the - * #MHD_AccessHandlerCallback (otherwise, access maybe improperly - * synchronized). Furthermore, the client must guarantee that the key - * and value arguments are 0-terminated strings that are NOT freed - * until the connection is closed. (The easiest way to do this is by - * passing only arguments to permanently allocated strings.). - * - * @param connection the connection for which a - * value should be set - * @param kind kind of the value - * @param key key for the value - * @param value the value itself - * @return #MHD_NO if the operation could not be - * performed due to insufficient memory; - * #MHD_YES on success - * @ingroup request - */ -_MHD_EXTERN int -MHD_set_connection_value (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - const char *key, - const char *value); - - -/** - * Sets the global error handler to a different implementation. @a cb - * will only be called in the case of typically fatal, serious - * internal consistency issues. These issues should only arise in the - * case of serious memory corruption or similar problems with the - * architecture. While @a cb is allowed to return and MHD will then - * try to continue, this is never safe. - * - * The default implementation that is used if no panic function is set - * simply prints an error message and calls `abort()`. Alternative - * implementations might call `exit()` or other similar functions. - * - * @param cb new error handler - * @param cls passed to @a cb - * @ingroup logging - */ -_MHD_EXTERN void -MHD_set_panic_func (MHD_PanicCallback cb, void *cls); - - -/** - * Process escape sequences ('%HH') Updates val in place; the - * result should be UTF-8 encoded and cannot be larger than the input. - * The result must also still be 0-terminated. - * - * @param val value to unescape (modified in the process) - * @return length of the resulting val (`strlen(val)` may be - * shorter afterwards due to elimination of escape sequences) - */ -_MHD_EXTERN size_t -MHD_http_unescape (char *val); - - -/** - * Get a particular header value. If multiple - * values match the kind, return any one of them. - * - * @param connection connection to get values from - * @param kind what kind of value are we looking for - * @param key the header to look for, NULL to lookup 'trailing' value without a key - * @return NULL if no such item was found - * @ingroup request - */ -_MHD_EXTERN const char * -MHD_lookup_connection_value (struct MHD_Connection *connection, - enum MHD_ValueKind kind, - const char *key); - - -/** - * Queue a response to be transmitted to the client (as soon as - * possible but after #MHD_AccessHandlerCallback returns). - * - * @param connection the connection identifying the client - * @param status_code HTTP status code (i.e. #MHD_HTTP_OK) - * @param response response to transmit - * @return #MHD_NO on error (i.e. reply already sent), - * #MHD_YES on success or if message has been queued - * @ingroup response - */ -_MHD_EXTERN int -MHD_queue_response (struct MHD_Connection *connection, - unsigned int status_code, - struct MHD_Response *response); - - -/** - * Suspend handling of network data for a given connection. This can - * be used to dequeue a connection from MHD's event loop for a while. - * - * If you use this API in conjunction with a internal select or a - * thread pool, you must set the option #MHD_USE_ITC to - * ensure that a resumed connection is immediately processed by MHD. - * - * Suspended connections continue to count against the total number of - * connections allowed (per daemon, as well as per IP, if such limits - * are set). Suspended connections will NOT time out; timeouts will - * restart when the connection handling is resumed. While a - * connection is suspended, MHD will not detect disconnects by the - * client. - * - * The only safe time to suspend a connection is from the - * #MHD_AccessHandlerCallback. - * - * Finally, it is an API violation to call #MHD_stop_daemon while - * having suspended connections (this will at least create memory and - * socket leaks or lead to undefined behavior). You must explicitly - * resume all connections before stopping the daemon. - * - * @param connection the connection to suspend - */ -_MHD_EXTERN void -MHD_suspend_connection (struct MHD_Connection *connection); - - -/** - * Resume handling of network data for suspended connection. It is - * safe to resume a suspended connection at any time. Calling this - * function on a connection that was not previously suspended will - * result in undefined behavior. - * - * If you are using this function in ``external'' select mode, you must - * make sure to run #MHD_run() afterwards (before again calling - * #MHD_get_fdset(), as otherwise the change may not be reflected in - * the set returned by #MHD_get_fdset() and you may end up with a - * connection that is stuck until the next network activity. - * - * @param connection the connection to resume - */ -_MHD_EXTERN void -MHD_resume_connection (struct MHD_Connection *connection); - - -/* **************** Response manipulation functions ***************** */ - - -/** - * Flags for special handling of responses. - */ -enum MHD_ResponseFlags -{ - /** - * Default: no special flags. - */ - MHD_RF_NONE = 0, - - /** - * Only respond in conservative HTTP 1.0-mode. In particular, - * do not (automatically) sent "Connection" headers and always - * close the connection after generating the response. - */ - MHD_RF_HTTP_VERSION_1_0_ONLY = 1 - -}; - - -/** - * MHD options (for future extensions). - */ -enum MHD_ResponseOptions -{ - /** - * End of the list of options. - */ - MHD_RO_END = 0 -}; - - -/** - * Set special flags and options for a response. - * - * @param response the response to modify - * @param flags to set for the response - * @param ... #MHD_RO_END terminated list of options - * @return #MHD_YES on success, #MHD_NO on error - */ -_MHD_EXTERN int -MHD_set_response_options (struct MHD_Response *response, - enum MHD_ResponseFlags flags, - ...); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response, #MHD_SIZE_UNKNOWN for unknown - * @param block_size preferred block size for querying crc (advisory only, - * MHD may still call @a crc using smaller chunks); this - * is essentially the buffer size used for IO, clients - * should pick a value that is appropriate for IO and - * memory performance requirements - * @param crc callback to use to obtain response data - * @param crc_cls extra argument to @a crc - * @param crfc callback to call to free @a crc_cls resources - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_callback (uint64_t size, - size_t block_size, - MHD_ContentReaderCallback crc, void *crc_cls, - MHD_ContentReaderFreeCallback crfc); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the @a data portion of the response - * @param data the data itself - * @param must_free libmicrohttpd should free data when done - * @param must_copy libmicrohttpd must make a copy of @a data - * right away, the data maybe released anytime after - * this call returns - * @return NULL on error (i.e. invalid arguments, out of memory) - * @deprecated use #MHD_create_response_from_buffer instead - * @ingroup response - */ -_MHD_DEPR_FUNC("MHD_create_response_from_data() is deprecated, use MHD_create_response_from_buffer()") \ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_data (size_t size, - void *data, - int must_free, - int must_copy); - - -/** - * Specification for how MHD should treat the memory buffer - * given for the response. - * @ingroup response - */ -enum MHD_ResponseMemoryMode -{ - - /** - * Buffer is a persistent (static/global) buffer that won't change - * for at least the lifetime of the response, MHD should just use - * it, not free it, not copy it, just keep an alias to it. - * @ingroup response - */ - MHD_RESPMEM_PERSISTENT, - - /** - * Buffer is heap-allocated with `malloc()` (or equivalent) and - * should be freed by MHD after processing the response has - * concluded (response reference counter reaches zero). - * @ingroup response - */ - MHD_RESPMEM_MUST_FREE, - - /** - * Buffer is in transient memory, but not on the heap (for example, - * on the stack or non-`malloc()` allocated) and only valid during the - * call to #MHD_create_response_from_buffer. MHD must make its - * own private copy of the data for processing. - * @ingroup response - */ - MHD_RESPMEM_MUST_COPY - -}; - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param buffer size bytes containing the response's data portion - * @param mode flags for buffer management - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_buffer (size_t size, - void *buffer, - enum MHD_ResponseMemoryMode mode); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd (size_t size, - int fd); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response; - * sizes larger than 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd64 (uint64_t size, - int fd); - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @param offset offset to start reading from in the file; - * Be careful! `off_t` may have been compiled to be a - * 64-bit variable for MHD, in which case your application - * also has to be compiled using the same options! Read - * the MHD manual for more details. - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_DEPR_FUNC("Function MHD_create_response_from_fd_at_offset() is deprecated, use MHD_create_response_from_fd_at_offset64()") \ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd_at_offset (size_t size, - int fd, - off_t offset); - -#if !defined(_MHD_NO_DEPR_IN_MACRO) || defined(_MHD_NO_DEPR_FUNC) -/* Substitute MHD_create_response_from_fd_at_offset64() instead of MHD_create_response_from_fd_at_offset() - to minimize potential problems with different off_t sizes */ -#define MHD_create_response_from_fd_at_offset(size,fd,offset) \ - _MHD_DEPR_IN_MACRO("Usage of MHD_create_response_from_fd_at_offset() is deprecated, use MHD_create_response_from_fd_at_offset64()") \ - MHD_create_response_from_fd_at_offset64((size),(fd),(offset)) -#endif /* !_MHD_NO_DEPR_IN_MACRO || _MHD_NO_DEPR_FUNC */ - - -/** - * Create a response object. The response object can be extended with - * header information and then be used any number of times. - * - * @param size size of the data portion of the response; - * sizes larger than 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @param fd file descriptor referring to a file on disk with the - * data; will be closed when response is destroyed; - * fd should be in 'blocking' mode - * @param offset offset to start reading from in the file; - * reading file beyond 2 GiB may be not supported by OS or - * MHD build; see ::MHD_FEATURE_LARGE_FILE - * @return NULL on error (i.e. invalid arguments, out of memory) - * @ingroup response - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_from_fd_at_offset64 (uint64_t size, - int fd, - uint64_t offset); - - -/** - * Enumeration for actions MHD should perform on the underlying socket - * of the upgrade. This API is not finalized, and in particular - * the final set of actions is yet to be decided. This is just an - * idea for what we might want. - */ -enum MHD_UpgradeAction -{ - - /** - * Close the socket, the application is done with it. - * - * Takes no extra arguments. - */ - MHD_UPGRADE_ACTION_CLOSE = 0 - -}; - - -/** - * Handle given to the application to manage special - * actions relating to MHD responses that "upgrade" - * the HTTP protocol (i.e. to WebSockets). - */ -struct MHD_UpgradeResponseHandle; - - -/** - * This connection-specific callback is provided by MHD to - * applications (unusual) during the #MHD_UpgradeHandler. - * It allows applications to perform 'special' actions on - * the underlying socket from the upgrade. - * - * @param urh the handle identifying the connection to perform - * the upgrade @a action on. - * @param action which action should be performed - * @param ... arguments to the action (depends on the action) - * @return #MHD_NO on error, #MHD_YES on success - */ -_MHD_EXTERN int -MHD_upgrade_action (struct MHD_UpgradeResponseHandle *urh, - enum MHD_UpgradeAction action, - ...); - - -/** - * Function called after a protocol "upgrade" response was sent - * successfully and the socket should now be controlled by some - * protocol other than HTTP. - * - * Any data already received on the socket will be made available in - * @e extra_in. This can happen if the application sent extra data - * before MHD send the upgrade response. The application should - * treat data from @a extra_in as if it had read it from the socket. - * - * Note that the application must not close() @a sock directly, - * but instead use #MHD_upgrade_action() for special operations - * on @a sock. - * - * Data forwarding to "upgraded" @a sock will be started as soon - * as this function return. - * - * Except when in 'thread-per-connection' mode, implementations - * of this function should never block (as it will still be called - * from within the main event loop). - * - * @param cls closure, whatever was given to #MHD_create_response_for_upgrade(). - * @param connection original HTTP connection handle, - * giving the function a last chance - * to inspect the original HTTP request - * @param con_cls last value left in `con_cls` of the `MHD_AccessHandlerCallback` - * @param extra_in if we happened to have read bytes after the - * HTTP header already (because the client sent - * more than the HTTP header of the request before - * we sent the upgrade response), - * these are the extra bytes already read from @a sock - * by MHD. The application should treat these as if - * it had read them from @a sock. - * @param extra_in_size number of bytes in @a extra_in - * @param sock socket to use for bi-directional communication - * with the client. For HTTPS, this may not be a socket - * that is directly connected to the client and thus certain - * operations (TCP-specific setsockopt(), getsockopt(), etc.) - * may not work as expected (as the socket could be from a - * socketpair() or a TCP-loopback). The application is expected - * to perform read()/recv() and write()/send() calls on the socket. - * The application may also call shutdown(), but must not call - * close() directly. - * @param urh argument for #MHD_upgrade_action()s on this @a connection. - * Applications must eventually use this callback to (indirectly) - * perform the close() action on the @a sock. - */ -typedef void -(*MHD_UpgradeHandler)(void *cls, - struct MHD_Connection *connection, - void *con_cls, - const char *extra_in, - size_t extra_in_size, - MHD_socket sock, - struct MHD_UpgradeResponseHandle *urh); - - -/** - * Create a response object that can be used for 101 UPGRADE - * responses, for example to implement WebSockets. After sending the - * response, control over the data stream is given to the callback (which - * can then, for example, start some bi-directional communication). - * If the response is queued for multiple connections, the callback - * will be called for each connection. The callback - * will ONLY be called after the response header was successfully passed - * to the OS; if there are communication errors before, the usual MHD - * connection error handling code will be performed. - * - * Setting the correct HTTP code (i.e. MHD_HTTP_SWITCHING_PROTOCOLS) - * and setting correct HTTP headers for the upgrade must be done - * manually (this way, it is possible to implement most existing - * WebSocket versions using this API; in fact, this API might be useful - * for any protocol switch, not just WebSockets). Note that - * draft-ietf-hybi-thewebsocketprotocol-00 cannot be implemented this - * way as the header "HTTP/1.1 101 WebSocket Protocol Handshake" - * cannot be generated; instead, MHD will always produce "HTTP/1.1 101 - * Switching Protocols" (if the response code 101 is used). - * - * As usual, the response object can be extended with header - * information and then be used any number of times (as long as the - * header information is not connection-specific). - * - * @param upgrade_handler function to call with the "upgraded" socket - * @param upgrade_handler_cls closure for @a upgrade_handler - * @return NULL on error (i.e. invalid arguments, out of memory) - */ -_MHD_EXTERN struct MHD_Response * -MHD_create_response_for_upgrade (MHD_UpgradeHandler upgrade_handler, - void *upgrade_handler_cls); - - -/** - * Destroy a response object and associated resources. Note that - * libmicrohttpd may keep some of the resources around if the response - * is still in the queue for some clients, so the memory may not - * necessarily be freed immediatley. - * - * @param response response to destroy - * @ingroup response - */ -_MHD_EXTERN void -MHD_destroy_response (struct MHD_Response *response); - - -/** - * Add a header line to the response. - * - * @param response response to add a header to - * @param header the header to add - * @param content value to add - * @return #MHD_NO on error (i.e. invalid header or content format), - * or out of memory - * @ingroup response - */ -_MHD_EXTERN int -MHD_add_response_header (struct MHD_Response *response, - const char *header, - const char *content); - - -/** - * Add a footer line to the response. - * - * @param response response to remove a header from - * @param footer the footer to delete - * @param content value to delete - * @return #MHD_NO on error (i.e. invalid footer or content format). - * @ingroup response - */ -_MHD_EXTERN int -MHD_add_response_footer (struct MHD_Response *response, - const char *footer, - const char *content); - - -/** - * Delete a header (or footer) line from the response. - * - * @param response response to remove a header from - * @param header the header to delete - * @param content value to delete - * @return #MHD_NO on error (no such header known) - * @ingroup response - */ -_MHD_EXTERN int -MHD_del_response_header (struct MHD_Response *response, - const char *header, - const char *content); - - -/** - * Get all of the headers (and footers) added to a response. - * - * @param response response to query - * @param iterator callback to call on each header; - * maybe NULL (then just count headers) - * @param iterator_cls extra argument to @a iterator - * @return number of entries iterated over - * @ingroup response - */ -_MHD_EXTERN int -MHD_get_response_headers (struct MHD_Response *response, - MHD_KeyValueIterator iterator, void *iterator_cls); - - -/** - * Get a particular header (or footer) from the response. - * - * @param response response to query - * @param key which header to get - * @return NULL if header does not exist - * @ingroup response - */ -_MHD_EXTERN const char * -MHD_get_response_header (struct MHD_Response *response, - const char *key); - - -/* ********************** PostProcessor functions ********************** */ - -/** - * Create a `struct MHD_PostProcessor`. - * - * A `struct MHD_PostProcessor` can be used to (incrementally) parse - * the data portion of a POST request. Note that some buggy browsers - * fail to set the encoding type. If you want to support those, you - * may have to call #MHD_set_connection_value with the proper encoding - * type before creating a post processor (if no supported encoding - * type is set, this function will fail). - * - * @param connection the connection on which the POST is - * happening (used to determine the POST format) - * @param buffer_size maximum number of bytes to use for - * internal buffering (used only for the parsing, - * specifically the parsing of the keys). A - * tiny value (256-1024) should be sufficient. - * Do NOT use a value smaller than 256. For good - * performance, use 32 or 64k (i.e. 65536). - * @param iter iterator to be called with the parsed data, - * Must NOT be NULL. - * @param iter_cls first argument to @a iter - * @return NULL on error (out of memory, unsupported encoding), - * otherwise a PP handle - * @ingroup request - */ -_MHD_EXTERN struct MHD_PostProcessor * -MHD_create_post_processor (struct MHD_Connection *connection, - size_t buffer_size, - MHD_PostDataIterator iter, void *iter_cls); - - -/** - * Parse and process POST data. Call this function when POST data is - * available (usually during an #MHD_AccessHandlerCallback) with the - * "upload_data" and "upload_data_size". Whenever possible, this will - * then cause calls to the #MHD_PostDataIterator. - * - * @param pp the post processor - * @param post_data @a post_data_len bytes of POST data - * @param post_data_len length of @a post_data - * @return #MHD_YES on success, #MHD_NO on error - * (out-of-memory, iterator aborted, parse error) - * @ingroup request - */ -_MHD_EXTERN int -MHD_post_process (struct MHD_PostProcessor *pp, - const char *post_data, size_t post_data_len); - - -/** - * Release PostProcessor resources. - * - * @param pp the PostProcessor to destroy - * @return #MHD_YES if processing completed nicely, - * #MHD_NO if there were spurious characters / formatting - * problems; it is common to ignore the return - * value of this function - * @ingroup request - */ -_MHD_EXTERN int -MHD_destroy_post_processor (struct MHD_PostProcessor *pp); - - -/* ********************* Digest Authentication functions *************** */ - - -/** - * Constant to indicate that the nonce of the provided - * authentication code was wrong. - * @ingroup authentication - */ -#define MHD_INVALID_NONCE -1 - - -/** - * Get the username from the authorization header sent by the client - * - * @param connection The MHD connection structure - * @return NULL if no username could be found, a pointer - * to the username if found - * @ingroup authentication - */ -_MHD_EXTERN char * -MHD_digest_auth_get_username (struct MHD_Connection *connection); - - -/** - * Authenticates the authorization header sent by the client - * - * @param connection The MHD connection structure - * @param realm The realm presented to the client - * @param username The username needs to be authenticated - * @param password The password used in the authentication - * @param nonce_timeout The amount of time for a nonce to be - * invalid in seconds - * @return #MHD_YES if authenticated, #MHD_NO if not, - * #MHD_INVALID_NONCE if nonce is invalid - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_digest_auth_check (struct MHD_Connection *connection, - const char *realm, - const char *username, - const char *password, - unsigned int nonce_timeout); - - -/** - * Queues a response to request authentication from the client - * - * @param connection The MHD connection structure - * @param realm The realm presented to the client - * @param opaque string to user for opaque value - * @param response reply to send; should contain the "access denied" - * body; note that this function will set the "WWW Authenticate" - * header and that the caller should not do this - * @param signal_stale #MHD_YES if the nonce is invalid to add - * 'stale=true' to the authentication header - * @return #MHD_YES on success, #MHD_NO otherwise - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_queue_auth_fail_response (struct MHD_Connection *connection, - const char *realm, - const char *opaque, - struct MHD_Response *response, - int signal_stale); - - -/** - * Get the username and password from the basic authorization header sent by the client - * - * @param connection The MHD connection structure - * @param password a pointer for the password - * @return NULL if no username could be found, a pointer - * to the username if found - * @ingroup authentication - */ -_MHD_EXTERN char * -MHD_basic_auth_get_username_password (struct MHD_Connection *connection, - char** password); - - -/** - * Queues a response to request basic authentication from the client - * The given response object is expected to include the payload for - * the response; the "WWW-Authenticate" header will be added and the - * response queued with the 'UNAUTHORIZED' status code. - * - * @param connection The MHD connection structure - * @param realm the realm presented to the client - * @param response response object to modify and queue - * @return #MHD_YES on success, #MHD_NO otherwise - * @ingroup authentication - */ -_MHD_EXTERN int -MHD_queue_basic_auth_fail_response (struct MHD_Connection *connection, - const char *realm, - struct MHD_Response *response); - -/* ********************** generic query functions ********************** */ - - -/** - * Obtain information about the given connection. - * - * @param connection what connection to get information about - * @param info_type what information is desired? - * @param ... depends on @a info_type - * @return NULL if this information is not available - * (or if the @a info_type is unknown) - * @ingroup specialized - */ -_MHD_EXTERN const union MHD_ConnectionInfo * -MHD_get_connection_info (struct MHD_Connection *connection, - enum MHD_ConnectionInfoType info_type, - ...); - - -/** - * MHD connection options. Given to #MHD_set_connection_option to - * set custom options for a particular connection. - */ -enum MHD_CONNECTION_OPTION -{ - - /** - * Set a custom timeout for the given connection. Specified - * as the number of seconds, given as an `unsigned int`. Use - * zero for no timeout. - * If timeout was set to zero (or unset) before, setup of new value by - * MHD_set_connection_option() will reset timeout timer. - */ - MHD_CONNECTION_OPTION_TIMEOUT - -}; - - -/** - * Set a custom option for the given connection, overriding defaults. - * - * @param connection connection to modify - * @param option option to set - * @param ... arguments to the option, depending on the option type - * @return #MHD_YES on success, #MHD_NO if setting the option failed - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_set_connection_option (struct MHD_Connection *connection, - enum MHD_CONNECTION_OPTION option, - ...); - - -/** - * Information about an MHD daemon. - */ -union MHD_DaemonInfo -{ - /** - * Size of the key, no longer supported. - * @deprecated - */ - size_t key_size; - - /** - * Size of the mac key, no longer supported. - * @deprecated - */ - size_t mac_key_size; - - /** - * Socket, returned for #MHD_DAEMON_INFO_LISTEN_FD. - */ - MHD_socket listen_fd; - - /** - * epoll FD, returned for #MHD_DAEMON_INFO_EPOLL_FD. - */ - int epoll_fd; - - /** - * Number of active connections, for #MHD_DAEMON_INFO_CURRENT_CONNECTIONS. - */ - unsigned int num_connections; - - /** - * Combination of #MHD_FLAG values, for #MHD_DAEMON_INFO_FLAGS. - * This value is actually a bitfield. - * Note: flags may differ from original 'flags' specified for - * daemon, especially if #MHD_USE_AUTO was set. - */ - enum MHD_FLAG flags; -}; - - -/** - * Obtain information about the given daemon - * (not fully implemented!). - * - * @param daemon what daemon to get information about - * @param info_type what information is desired? - * @param ... depends on @a info_type - * @return NULL if this information is not available - * (or if the @a info_type is unknown) - * @ingroup specialized - */ -_MHD_EXTERN const union MHD_DaemonInfo * -MHD_get_daemon_info (struct MHD_Daemon *daemon, - enum MHD_DaemonInfoType info_type, - ...); - - -/** - * Obtain the version of this library - * - * @return static version string, e.g. "0.9.9" - * @ingroup specialized - */ -_MHD_EXTERN const char* -MHD_get_version (void); - - -/** - * Types of information about MHD features, - * used by #MHD_is_feature_supported(). - */ -enum MHD_FEATURE -{ - /** - * Get whether messages are supported. If supported then in debug - * mode messages can be printed to stderr or to external logger. - */ - MHD_FEATURE_MESSAGES = 1, - - /** - * Get whether HTTPS is supported. If supported then flag - * #MHD_USE_TLS and options #MHD_OPTION_HTTPS_MEM_KEY, - * #MHD_OPTION_HTTPS_MEM_CERT, #MHD_OPTION_HTTPS_MEM_TRUST, - * #MHD_OPTION_HTTPS_MEM_DHPARAMS, #MHD_OPTION_HTTPS_CRED_TYPE, - * #MHD_OPTION_HTTPS_PRIORITIES can be used. - */ - MHD_FEATURE_TLS = 2, - MHD_FEATURE_SSL = 2, - - /** - * Get whether option #MHD_OPTION_HTTPS_CERT_CALLBACK is - * supported. - */ - MHD_FEATURE_HTTPS_CERT_CALLBACK = 3, - - /** - * Get whether IPv6 is supported. If supported then flag - * #MHD_USE_IPv6 can be used. - */ - MHD_FEATURE_IPv6 = 4, - - /** - * Get whether IPv6 without IPv4 is supported. If not supported - * then IPv4 is always enabled in IPv6 sockets and - * flag #MHD_USE_DUAL_STACK if always used when #MHD_USE_IPv6 is - * specified. - */ - MHD_FEATURE_IPv6_ONLY = 5, - - /** - * Get whether `poll()` is supported. If supported then flag - * #MHD_USE_POLL can be used. - */ - MHD_FEATURE_POLL = 6, - - /** - * Get whether `epoll()` is supported. If supported then Flags - * #MHD_USE_EPOLL and - * #MHD_USE_EPOLL_INTERNAL_THREAD can be used. - */ - MHD_FEATURE_EPOLL = 7, - - /** - * Get whether shutdown on listen socket to signal other - * threads is supported. If not supported flag - * #MHD_USE_ITC is automatically forced. - */ - MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET = 8, - - /** - * Get whether socketpair is used internally instead of pipe to - * signal other threads. - */ - MHD_FEATURE_SOCKETPAIR = 9, - - /** - * Get whether TCP Fast Open is supported. If supported then - * flag #MHD_USE_TCP_FASTOPEN and option - * #MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE can be used. - */ - MHD_FEATURE_TCP_FASTOPEN = 10, - - /** - * Get whether HTTP Basic authorization is supported. If supported - * then functions #MHD_basic_auth_get_username_password and - * #MHD_queue_basic_auth_fail_response can be used. - */ - MHD_FEATURE_BASIC_AUTH = 11, - - /** - * Get whether HTTP Digest authorization is supported. If - * supported then options #MHD_OPTION_DIGEST_AUTH_RANDOM, - * #MHD_OPTION_NONCE_NC_SIZE and - * #MHD_digest_auth_check() can be used. - */ - MHD_FEATURE_DIGEST_AUTH = 12, - - /** - * Get whether postprocessor is supported. If supported then - * functions #MHD_create_post_processor(), #MHD_post_process() and - * #MHD_destroy_post_processor() can - * be used. - */ - MHD_FEATURE_POSTPROCESSOR = 13, - - /** - * Get whether password encrypted private key for HTTPS daemon is - * supported. If supported then option - * ::MHD_OPTION_HTTPS_KEY_PASSWORD can be used. - */ - MHD_FEATURE_HTTPS_KEY_PASSWORD = 14, - - /** - * Get whether reading files beyond 2 GiB boundary is supported. - * If supported then #MHD_create_response_from_fd(), - * #MHD_create_response_from_fd64 #MHD_create_response_from_fd_at_offset() - * and #MHD_create_response_from_fd_at_offset64() can be used with sizes and - * offsets larger than 2 GiB. If not supported value of size+offset is - * limited to 2 GiB. - */ - MHD_FEATURE_LARGE_FILE = 15, - - /** - * Get whether MHD set names on generated threads. - */ - MHD_FEATURE_THREAD_NAMES = 16, - MHD_THREAD_NAMES = 16, - - /** - * Get whether HTTP "Upgrade" is supported. - * If supported then #MHD_ALLOW_UPGRADE, #MHD_upgrade_action() and - * #MHD_create_response_for_upgrade() can be used. - */ - MHD_FEATURE_UPGRADE = 17, - - /** - * Get whether it's safe to use same FD for multiple calls of - * #MHD_create_response_from_fd() and whether it's safe to use single - * response generated by #MHD_create_response_from_fd() with multiple - * connections at same time. - * If #MHD_is_feature_supported() return #MHD_NO for this feature then - * usage of responses with same file FD in multiple parallel threads may - * results in incorrect data sent to remote client. - * It's always safe to use same file FD in multiple responses if MHD - * is run in any single thread mode. - */ - MHD_FEATURE_RESPONSES_SHARED_FD = 18 -}; - - -/** - * Get information about supported MHD features. - * Indicate that MHD was compiled with or without support for - * particular feature. Some features require additional support - * by kernel. Kernel support is not checked by this function. - * - * @param feature type of requested information - * @return #MHD_YES if feature is supported by MHD, #MHD_NO if - * feature is not supported or feature is unknown. - * @ingroup specialized - */ -_MHD_EXTERN int -MHD_is_feature_supported (enum MHD_FEATURE feature); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/msgpackc/2.1.5/AIX-00FB437F4C00/include/msgpack.h b/msgpackc/2.1.5/AIX-00FB437F4C00/include/msgpack.h deleted file mode 100755 index af557a5..0000000 --- a/msgpackc/2.1.5/AIX-00FB437F4C00/include/msgpack.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * MessagePack for C - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - */ -/** - * @defgroup msgpack MessagePack C - * @{ - * @} - */ - -#include "msgpack/util.h" -#include "msgpack/object.h" -#include "msgpack/zone.h" -#include "msgpack/pack.h" -#include "msgpack/unpack.h" -#include "msgpack/sbuffer.h" -#include "msgpack/vrefbuffer.h" -#include "msgpack/version.h" - diff --git a/msgpackc/2.1.5/Linux-x86_64/include/msgpack.h b/msgpackc/2.1.5/Linux-x86_64/include/msgpack.h deleted file mode 100755 index af557a5..0000000 --- a/msgpackc/2.1.5/Linux-x86_64/include/msgpack.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * MessagePack for C - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - */ -/** - * @defgroup msgpack MessagePack C - * @{ - * @} - */ - -#include "msgpack/util.h" -#include "msgpack/object.h" -#include "msgpack/zone.h" -#include "msgpack/pack.h" -#include "msgpack/unpack.h" -#include "msgpack/sbuffer.h" -#include "msgpack/vrefbuffer.h" -#include "msgpack/version.h" - diff --git a/ocilib/4.4.0/AIX-00FB437F4C00/include/ocilib.h b/ocilib/4.4.0/AIX-00FB437F4C00/include/ocilib.h deleted file mode 100755 index 84dbb1f..0000000 --- a/ocilib/4.4.0/AIX-00FB437F4C00/include/ocilib.h +++ /dev/null @@ -1,19176 +0,0 @@ -/* - * OCILIB - C Driver for Oracle (C Wrapper for Oracle OCI) - * - * Website: http://www.ocilib.net - * - * Copyright (c) 2007-2017 Vincent ROGIER - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* IMPORTANT NOTICE - * - * This file contains explanations about Oracle and OCI technologies. - * OCILIB is a wrapper around OCI and thus exposes OCI features. - * The OCILIB documentation intends to explain Oracle / OCI concepts - * and is naturally based on the official Oracle OCI documentation. - * - * Some parts of OCILIB documentation may include some informations - * taken and adapted from the following Oracle documentations : - * - Oracle Call Interface Programmer's Guide - * - Oracle Streams - Advanced Queuing User's Guide - */ - -#ifndef OCILIB_H_INCLUDED -#define OCILIB_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/** - * @defgroup OcilibCApi C API - * @{ - * - */ - -/* --------------------------------------------------------------------------------------------- * - * Platform configuration - * --------------------------------------------------------------------------------------------- */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -/* --------------------------------------------------------------------------------------------- * - * C headers - * --------------------------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/* --------------------------------------------------------------------------------------------- * - * MS Windows platform detection - * --------------------------------------------------------------------------------------------- */ - -#ifndef _WINDOWS - #if defined(_WIN32)|| defined(WIN32) || defined(_WIN64) || defined(WIN64) || defined(_WIN32_WINNT) - #define _WINDOWS - #endif -#endif - -#ifdef _WINDOWS - #ifdef boolean - #undef boolean - #endif - #include - #ifdef boolean - #undef boolean - #endif -#endif - -/* --------------------------------------------------------------------------------------------- * - * OCILIB version information - * --------------------------------------------------------------------------------------------- */ - -#define OCILIB_MAJOR_VERSION 4 -#define OCILIB_MINOR_VERSION 4 -#define OCILIB_REVISION_VERSION 0 - -/* Import mode */ - -#define OCI_IMPORT_MODE_LINKAGE 1 -#define OCI_IMPORT_MODE_RUNTIME 2 - -#ifdef OCI_IMPORT_RUNTIME - #undef OCI_IMPORT_LINKAGE -#endif - -#ifdef OCI_IMPORT_LINKAGE - #undef OCI_IMPORT_RUNTIME -#endif - -#if !defined(OCI_IMPORT_RUNTIME) && !defined(OCI_IMPORT_LINKAGE) - #define OCI_IMPORT_LINKAGE -#endif - -#ifdef OCI_IMPORT_RUNTIME - #define OCI_IMPORT_MODE OCI_IMPORT_MODE_RUNTIME -#else - #define OCI_IMPORT_MODE OCI_IMPORT_MODE_LINKAGE -#endif - -/* Charset modes */ - -#ifdef OCI_CHARSET_UNICODE - #define OCI_CHARSET_WIDE -#endif - -#ifdef OCI_CHARSET_WIDE - #undef OCI_CHARSET_ANSI -#endif - -#ifdef OCI_CHARSET_ANSI - #undef OCI_CHARSET_ANSI -#endif - -#if !defined(OCI_CHARSET_ANSI) && !defined(OCI_CHARSET_WIDE) - #define OCI_CHARSET_ANSI -#endif - -/* Calling convention */ - -#ifndef OCI_API - #ifdef _MSC_VER - #define OCI_API __stdcall - #else - #define OCI_API - #endif -#endif - -/* Build mode */ - -#ifndef OCI_EXPORT - #define OCI_EXPORT -#endif - -/** - * @defgroup OcilibCApiSupportedCharsets Character sets - * @{ - * - * OCILIB supports both ANSI and Unicode. - * - * Oracle started a real Unicode support with Oracle8i but only for bind and fetch data. - * All SQL and PL/SQ/ statements, database objects names were still only supported in ANSI. - * - * With Oracle 9i, Oracle provides a full Unicode support. - * - * So depending on the compile time Oracle library or the runtime loaded library, Unicode support differs. - * - * OCILIB supports: - * - * - ANSI (char) - * - Unicode (wchar_t) - * - UTF8 strings - * - * OCILIB uses the character type 'otext' that is a define around char and wchar_t depending on the charset mode. - * - * @par Option OCI_CHARSET_ANSI - * - * - otext --> char - * - OTEXT(x) --> x - * - * @par Option OCI_CHARSET_WIDE - * - * - otext --> wchar_t - * - OTEXT(x) --> L ## x - * - * @par Unicode and ISO C - * - * Well, ISO C: - * - doesn't know anything about Unicode. - * - makes wide characters support tricky because wide character size is not defined and is freely adaptable by implementations. - * - * OCILIB uses char/wchar_t strings for both public interface and internal storage. - * - * Unicode builds of OCILIB initialize OCI in UTF16 Unicode mode. - * Oracle implements this mode with a 2 bytes (fixed length) UTF16 encoding. - * - * @warning - * When using Unicode builds of OCILIB, make sure that the target - * Database charset is also using an Unicode charset or is a superset of UTF16. - * If not, strings may be converted with substitution characters by the Oracle client ! - * - * So, on systems implementing wchar_t as 2 bytes based UTF16 (e.g. Ms Windows), - * strings are directly passed to Oracle and taken back from it. - * - * On other systems (most of the Unix systems) that use UTF32 as encoding, (4 bytes based wchar_t), OCILIB uses: - * - temporary buffers for statements and object names - * - buffer expansion from UTF16 to UTF32 for fetch and bind string: - * - allocation based on sizeof(wchar_t) - * - data filling based on sizeof(short) -> (UTF16 2 bytes) - * - data expansion to sizeof(wchar_t). - * - * Buffer expansion is done in place and has the advantage of not requiring extra buffer. - * That reduces the cost of the Unicode/ISO C handling overhead on Unix systems. - * - * @par UTF8 strings - * - * OCILIB fully supports UTF8 strings : - * - Within OCI_CHARSET_ANSI builds - * - NLS_LANG environment variable must be set to any valid UTF8 Oracle charset string - * - * @par Charset mapping macros - * - * OCILIB main header file provides macro around most common string functions of - * the C standard library. - * - * these macros are based on the model: ostr[libc function name]() - * - * xxx is the standard C library string function name without the character type prefix (str/wcs). - * - * List of available macros: - * - ostrdup - * - ostrcpy - * - ostrncpy - * - ostrcat - * - ostrncat - * - ostrlen - * - ostrcmp - * - ostrcasecmp - * - osprintf - * - ostol - * -**/ - -#if defined(__cplusplus) && defined(_MSC_VER) && (_MSC_VER < 1300) -extern "C++" { -#endif - -#include - -#if defined(__cplusplus) && defined(_MSC_VER) && (_MSC_VER < 1300) -} -#endif - -/* Charset macros */ - -#define OCI_CHAR_ANSI 1 -#define OCI_CHAR_WIDE 2 - -#ifdef OCI_CHARSET_ANSI - typedef char otext; - #define OTEXT(x) x - #define OCI_CHAR_TEXT OCI_CHAR_ANSI -#else - typedef wchar_t otext; - #define OTEXT(x) L ## x - #define OCI_CHAR_TEXT OCI_CHAR_WIDE -#endif - -/* - For ISO conformance, strdup/wcsdup/stricmp/strncasecmp are not used. - All wide char routines are part of the 1995 Normative Addendum 1 to the ISO C90 standard. - OCILIB also needs an ANSI equivalent to swprintf => ocisprintf - Thus OCILIB exports the following helper functions - -*/ - -OCI_EXPORT int ocisprintf -( - char *str, - int size, - const char *format, - ... -); - -OCI_EXPORT char * ocistrdup -( - const char * src -); - -OCI_EXPORT int ocistrcasecmp -( - const char *str1, - const char *str2 -); - -OCI_EXPORT wchar_t * ociwcsdup -( - const wchar_t * src -); - -OCI_EXPORT int ociwcscasecmp -( - const wchar_t *str1, - const wchar_t *str2 -); - -/* special defines for Microsoft C runtime that is not C ISO compliant */ - -#ifdef _WINDOWS - - #define vsnprintf _vsnprintf - #define swprintf _snwprintf - -#endif - -/* helpers mapping macros */ - -#ifdef OCI_CHARSET_ANSI - #define ostrdup ocistrdup - #define ostrcpy strcpy - #define ostrncpy strncpy - #define ostrcat strcat - #define ostrncat strncat - #define ostrlen strlen - #define ostrcmp strcmp - #define ostrcasecmp ocistrcasecmp - #define osprintf ocisprintf - #define ostrtol strtol - #define osscanf sscanf - #define otoupper toupper - #define oisdigit isdigit -#else - #define ostrdup ociwcsdup - #define ostrcpy wcscpy - #define ostrncpy wcsncpy - #define ostrcat wcscat - #define ostrncat wcsncat - #define ostrlen wcslen - #define ostrcmp wcscmp - #define ostrcasecmp ociwcscasecmp - #define osprintf swprintf - #define ostrtol wcstol - #define osscanf swscanf - #define otoupper towupper - #define oisdigit iswdigit - -#endif - -/* string size macros */ - -#define otextsize(s) (ostrlen(s) * sizeof(otext)) - -/** - * @} - */ - -/** - * @defgroup OcilibCApiDatatypes Data types - * @{ - * - * OCILIB implements: - * - * - Oracle Scalar data types through scalar C data types - * - Oracle opaque/complex objects though opaque library handles - * - Library objects for manipulating the database: connections, transactions, statements... - * - * @par Supported Oracle data types - * - * - All Database types are supported excluding REFs. - * - * Here is a summary of the supported data types: - * - * - Scalar types CHAR/NCHAR, VARCHAR2/NVARCHAR2, NUMBER, FLOAT, REAL, RAW, ... - * - Binary types: RAW, LONG RAW, VARRAW, .. - * - Larges Objects (Lobs and Files) : BLOB, CLOB, NCLOB, BFILE - * - LONG types: LONG, VAR LONG - * - Date, Timestamps et Intervals: DATE, TIMESTAMP, INTERVAL - * - PL/SQL types: Ref cursors, PL/SQL Tables - * - Named Types (by value): Built-in system objects and User defined objects - * - VARRAYs and Nested Tables - * - ROWIDs - * - * @par OCILIB library objects - * - * The public OCILIB library interface implements encapsulation for - * representing database objects (such as connections, statements ...) through - * opaque structures (pointers to structures whose definition is kept private) - * - * Instead of directly manipulating the structures and their members, the library - * has functions to access the underlying members. - * - * It's designed to make the user code as more independent as possible of - * the library details. - * -**/ - -/** - * @typedef OCI_Pool - * - * @brief - * Pool object (session or connection) - * - * A pool is a set of pooled objects - * - */ - -typedef struct OCI_Pool OCI_Pool; - -/** - * @typedef OCI_Connection - * - * @brief - * Oracle physical connection. - * - * It holds all information about a connection such as error handling, associated statements, ... - * Error handling and transactions are embedded within a connection object. - * - * @warning - * Multi threaded applications that use multiple connections should use one connection per thread - * as all statements associated with a connection share the same context. - * - */ - -typedef struct OCI_Connection OCI_Connection; - -/** - * @typedef OCI_Statement - * - * @brief - * Oracle SQL or PL/SQL statement. - * - * A Statement object allows users to prepare, execute SQL orders or PL/SQL blocks - * - */ - -typedef struct OCI_Statement OCI_Statement; - -/** - * @typedef OCI_Bind - * - * @brief - * Internal bind representation. - * - * A bind object is an object that holds all information about an Oracle statement binding operation - * - */ - -typedef struct OCI_Bind OCI_Bind; - -/** - * @typedef OCI_Resultset - * - * @brief - * Collection of output columns from a select statement. - * - * A resultset object is the result of 'select' SQL Statement. - * - * It's a set of data (ordered in columns) that can be fetched row by row - * to get data returned by the SQL statement - * - */ - -typedef struct OCI_Resultset OCI_Resultset; - -/** - * @typedef OCI_Column - * - * @brief - * Oracle SQL Column and Type member representation. - * - * A column object represents an output column from a select statement - * - */ - -typedef struct OCI_Column OCI_Column; - -/** - * @typedef OCI_Lob - * - * @brief - * Oracle Internal Large objects: - * - * The following internal Larges Objects are supported: - * - * - BLOBs : Binary large objects - * - CLOBs / NCLOBs : Character large objects - * - * LOBs were introduced by OCI8 to replace Long data types. - * - * It's designed to store really larges objects (buffer, files) inside the database - * - * Oracle encourages programmers to use those objects instead of LONG, LONG RAW, ... - * - * OCILIB supports both LOBs and LONGs - * - */ - -typedef struct OCI_Lob OCI_Lob; - -/** - * @typedef OCI_File - * - * @brief - * Oracle External Large objects: - * - * The following external Larges Objects are supported: - * - * - BFILEs : Binary files - * - CFILEs : Character files - * - * FILEs were introduced by OCI8 in order to store references to files located outside the database. - * - * @warning - * Only Read-only access is allowed on BFILEs - * - * Two way to use FILEs : - * - * - within statement context (query, binding) - * - without statement context (server files reading) through OCI_File properties functions - * - */ - -typedef struct OCI_File OCI_File; - -/** - * @typedef OCI_Transaction - * - * @brief - * Oracle Transaction. - * - * A transaction can be: - * - * - Local: it's implicitly created by OCILIB - * - Global: it's explicitly created by the program - * - */ - -typedef struct OCI_Transaction OCI_Transaction; - -/** - * @typedef OCI_Long - * - * @brief Oracle Long data type. - * - * The following long Objects are supported: - * - * - LONG RAW : Binary long objects - * - LONG : Character long objects - * - * Those types were used in older versions of Oracle (before Oracle8i) to store - * large chunks of data in the database. - * - * It's now depreciated by Oracle that recommends using LOBs - * - * Many databases and applications are still designed to use LONGs that's why - * OCILIB supports Long Objects and piecewise operations - * - */ - -typedef struct OCI_Long OCI_Long; - -/** -* @typedef OCI_Number -* -* @brief -* Oracle NUMBER representation. -* -*/ -typedef struct OCI_Number OCI_Number; - -/** - * @typedef OCI_Date - * - * @brief - * Oracle internal date representation. - * - */ - -typedef struct OCI_Date OCI_Date; - -/** - * @typedef OCI_Timestamp - * - * @brief - * Oracle internal timestamp representation. - * - */ - -typedef struct OCI_Timestamp OCI_Timestamp; - -/** - * @typedef OCI_Interval - * - * @brief - * Oracle internal interval representation. - * - */ - -typedef struct OCI_Interval OCI_Interval; - -/** - * @typedef OCI_Object - * - * @brief - * Oracle Named types representation. - * - */ - -typedef struct OCI_Object OCI_Object; - -/** - * @typedef OCI_Coll - * - * @brief - * Oracle Collections (VARRAYs and Nested Tables) representation. - * - */ - -typedef struct OCI_Coll OCI_Coll; - -/** - * @typedef OCI_Elem - * - * @brief - * Oracle Collection item representation. - * - */ - -typedef struct OCI_Elem OCI_Elem; - -/** - * @typedef OCI_Iter - * - * @brief - * Oracle Collection iterator representation. - * - */ -typedef struct OCI_Iter OCI_Iter; - -/** - * @typedef OCI_TypeInfo - * - * @brief - * Type info metadata handle. - * - */ - -/** - * @typedef OCI_Ref - * - * @brief - * Oracle REF type representation. - * - */ - -typedef struct OCI_Ref OCI_Ref; - -/** - * @typedef OCI_TypeInfo - * - * @brief - * Type info meta data handle. - * - */ - -typedef struct OCI_TypeInfo OCI_TypeInfo; - -/** - * @typedef OCI_HashTable - * - * @brief - * OCILIB implementation of hash tables. - * - */ - -typedef struct OCI_HashTable OCI_HashTable; - -/** - * @typedef OCI_Error - * - * @brief - * Encapsulates an Oracle or OCILIB exception. - * - * The error object is used to raise internal or oracle errors. - * When an error occurs, if the application has provided an error handler, an - * error object is constructed and passed to the handler - * - */ - -typedef struct OCI_Error OCI_Error; - -/** - * @typedef OCI_Mutex - * - * @brief - * OCILIB encapsulation of OCI mutexes. - * - */ - -typedef struct OCI_Mutex OCI_Mutex; - -/** - * @typedef OCI_Thread - * - * @brief - * OCILIB encapsulation of OCI Threads. - * - */ - -typedef struct OCI_Thread OCI_Thread; - -/** - * @typedef OCI_DirPath - * - * @brief - * OCILIB encapsulation of OCI Direct Path handle. - * - */ - -typedef struct OCI_DirPath OCI_DirPath; - -/** - * @typedef OCI_Subscription - * - * @brief - * OCILIB encapsulation of Oracle DCN notification - * - */ - -typedef struct OCI_Subscription OCI_Subscription; - -/** - * @typedef OCI_Event - * - * @brief - * OCILIB encapsulation of Oracle DCN event - * - */ - -typedef struct OCI_Event OCI_Event; - -/** - * @typedef OCI_Msg - * - * @brief - * OCILIB encapsulation of A/Q message - * - */ - -typedef struct OCI_Msg OCI_Msg; - -/** - * @typedef OCI_Agent - * - * @brief - * OCILIB encapsulation of A/Q Agent - * - */ - -typedef struct OCI_Agent OCI_Agent; - -/** - * @typedef OCI_Dequeue - * - * @brief - * OCILIB encapsulation of A/Q dequeuing operations - * - */ - -typedef struct OCI_Dequeue OCI_Dequeue; - -/** - * @typedef OCI_Enqueue - * - * @brief - * OCILIB encapsulation of A/Q enqueuing operations - * - */ - -typedef struct OCI_Enqueue OCI_Enqueue; - -/** - * @var POCI_ERROR - * - * @brief - * Error procedure prototype - * - * @param err - Error handle - * - */ - -typedef void (*POCI_ERROR) -( - OCI_Error *err -); - -/** - * @var POCI_THREAD - * - * @brief - * Thread procedure prototype - * - * @param thread - Thread handle - * @param arg - Pointer passed to OCI_ThreadRun() - * - */ - -typedef void (*POCI_THREAD) -( - OCI_Thread *thread, - void *arg -); - -/** - * @var POCI_THREADKEYDEST - * - * @brief - * Thread key destructor prototype. - * - * @param data - Thread Key current pointer value - * - */ - -typedef void (*POCI_THREADKEYDEST) -( - void *data -); - -/** - * @var POCI_NOTIFY - * - * @brief - * Database Change Notification User callback prototype. - * - * @param event - Event handle - * - */ - -typedef void (*POCI_NOTIFY) -( - OCI_Event *event -); - -/** - * @var POCI_NOTIFY_AQ - * - * @brief - * AQ notification callback prototype. - * - * @param dequeue - dequeue handle - * - */ - -typedef void (*POCI_NOTIFY_AQ) -( - OCI_Dequeue *dequeue -); - -/** - * @var POCI_TAF_HANDLER - * - * @brief - * Failover Notification User callback prototype. - * - * @param con - Connection handle related to the event - * @param type - Event type - * @param event - Event code - * - * @note - * Possible values for parameter 'type' : - * - OCI_FOT_NONE - * - OCI_FOT_SESSION - * - OCI_FOT_SELECT - * - * @note - * Possible values for parameter 'event' : - * - OCI_FOE_END - * - OCI_FOE_ABORT - * - OCI_FOE_REAUTH - * - OCI_FOE_BEGIN - * - OCI_FOE_ERROR - * - * @return - * User callback should return one of the following value : - * - OCI_FOC_OK - * - OCI_FOC_RETRY - * - */ - -typedef unsigned int (*POCI_TAF_HANDLER) -( - OCI_Connection *con, - unsigned int type, - unsigned int event -); - -/** - * @var POCI_HA_HANDLER - * - * @brief - * HA (High Availability) events Notification User callback prototype. - * - * @param con - Connection handle related to the event - * @param source - source of the event - * @param event - type of the event - * @param time - Timestamp of the event - * - * @note - * Currently, Oracle only send HA down events - * - * @note - * Possible values for parameter 'source' : - * - OCI_HES_INSTANCE - * - OCI_HES_DATABASE - * - OCI_HES_NODE - * - OCI_HES_SERVICE - * - OCI_HES_SERVICE_MEMBER - * - OCI_HES_ASM_INSTANCE - * - OCI_HES_PRECONNECT - * - * @note - * Possible values for parameter 'event' : - * - OCI_HET_DOWN : HA event type down - * - OCI_HET_UP : HA event type up - * - */ - -typedef void (*POCI_HA_HANDLER) -( - OCI_Connection *con, - unsigned int source, - unsigned int event, - OCI_Timestamp *time -); - -/* public structures */ - -/** - * @typedef OCI_XID - * - * @brief - * Global transaction identifier - * - */ - -typedef struct OCI_XID { - long formatID; - long gtrid_length; - long bqual_length; - char data[128]; -} OCI_XID; - -/** - * @typedef OCI_Variant - * - * @brief - * Internal Variant type based on union C type. - * - * @note - * Helpful for generic buffer, it reduces the amount of casts - * - */ - -typedef union OCI_Variant { - /* integers */ - int num; - - /* raw data */ - unsigned char *p_bytes; - - /* pointer to c natives types */ - void *p_void; - int *p_int; - float *p_float; - double *p_double; - otext *p_text; - - /* ocilib object types */ - OCI_Date *p_date; - OCI_Interval *p_interval; - OCI_Timestamp *p_timestamp; - OCI_Long *p_long; - OCI_Lob *p_lob; - OCI_File *p_file; - OCI_Statement *p_stmt; - OCI_Column *p_col; - OCI_Object *p_obj; - OCI_Coll *p_coll; - OCI_Iter *p_iter; - OCI_Elem *p_elem; -} OCI_Variant; - -/** -* @typedef OCI_HashValue -* -* @brief -* Hash table entry value -* -* OCILIB implementation of hash tables uses chaining method for dealing with collisions -* -*/ - -typedef struct OCI_HashValue { - OCI_Variant value; - struct OCI_HashValue *next; -} OCI_HashValue; - -/** - * @typedef OCI_HashEntry - * - * @brief - * Hash table entry - * - */ - -typedef struct OCI_HashEntry { - otext *key; - struct OCI_HashValue *values; - struct OCI_HashEntry *next; -} OCI_HashEntry; - -/** - * @typedef big_int - * - * @brief - * big_int is a C scalar integer (32 or 64 bits) depending on compiler support for 64bits integers. - * big_uint is an unsigned big_int - * - */ - -/* check for long long support */ - -#if defined(_LONGLONG) || defined(LONG_LONG_MAX) || defined(LLONG_MAX) || defined(__LONG_LONG_MAX__) - -/* C99 long long supported */ - -typedef long long big_int; -typedef unsigned long long big_uint; - - #define OCI_BIG_UINT_ENABLED - -#elif defined(_WINDOWS) - -/* Microsoft extension supported */ - -typedef __int64 big_int; -typedef unsigned __int64 big_uint; - - #define OCI_BIG_UINT_ENABLED - -#else - -typedef int big_int; -typedef unsigned int big_uint; - -#endif - -/** - * @} - */ - -/* boolean values */ - -#ifndef TRUE - #define TRUE 1 - #define FALSE 0 -#endif - -#ifndef boolean - #define boolean int -#endif - -/* oracle OCI key versions*/ - -#define OCI_8_0 800 -#define OCI_8_1 810 -#define OCI_9_0 900 -#define OCI_9_2 920 -#define OCI_10_1 1010 -#define OCI_10_2 1020 -#define OCI_11_1 1110 -#define OCI_11_2 1120 -#define OCI_12_1 1210 -#define OCI_12_2 1220 - -/* versions extract macros */ - -#define OCI_VER_MAJ(v) (unsigned int) (v/100) -#define OCI_VER_MIN(v) (unsigned int) ((v/10) - ((v/100)*10)) -#define OCI_VER_REV(v) (unsigned int) ((v) - ((v/10)*10)) - -/* OCILIB Error types */ - -#define OCI_ERR_ORACLE 1 -#define OCI_ERR_OCILIB 2 -#define OCI_ERR_WARNING 3 - -/* OCILIB Error codes */ - -#define OCI_ERR_NONE 0 -#define OCI_ERR_NOT_INITIALIZED 1 -#define OCI_ERR_LOADING_SHARED_LIB 2 -#define OCI_ERR_LOADING_SYMBOLS 3 -#define OCI_ERR_MULTITHREADED 4 -#define OCI_ERR_MEMORY 5 -#define OCI_ERR_NOT_AVAILABLE 6 -#define OCI_ERR_NULL_POINTER 7 -#define OCI_ERR_DATATYPE_NOT_SUPPORTED 8 -#define OCI_ERR_PARSE_TOKEN 9 -#define OCI_ERR_MAP_ARGUMENT 10 -#define OCI_ERR_OUT_OF_BOUNDS 11 -#define OCI_ERR_UNFREED_DATA 12 -#define OCI_ERR_MAX_BIND 13 -#define OCI_ERR_ATTR_NOT_FOUND 14 -#define OCI_ERR_MIN_VALUE 15 -#define OCI_ERR_NOT_COMPATIBLE 16 -#define OCI_ERR_STMT_STATE 17 -#define OCI_ERR_STMT_NOT_SCROLLABLE 18 -#define OCI_ERR_BIND_ALREADY_USED 19 -#define OCI_ERR_BIND_ARRAY_SIZE 20 -#define OCI_ERR_COLUMN_NOT_FOUND 21 -#define OCI_ERR_DIRPATH_STATE 22 -#define OCI_ERR_CREATE_OCI_ENVIRONMENT 23 -#define OCI_ERR_REBIND_BAD_DATATYPE 24 -#define OCI_ERR_TYPEINFO_DATATYPE 25 -#define OCI_ERR_ITEM_NOT_FOUND 26 -#define OCI_ERR_ARG_INVALID_VALUE 27 -#define OCI_ERR_XA_ENV_FROM_STRING 28 -#define OCI_ERR_XA_CONN_FROM_STRING 29 - -#define OCI_ERR_COUNT 30 - - -/* allocated bytes types */ - -#define OCI_MEM_ORACLE 1 -#define OCI_MEM_OCILIB 2 -#define OCI_MEM_ALL OCI_MEM_ORACLE | OCI_MEM_OCILIB - -/* binding */ - -#define OCI_BIND_BY_POS 0 -#define OCI_BIND_BY_NAME 1 -#define OCI_BIND_SIZE 6 -#define OCI_BIND_MAX 65535 - -/* fetching */ - -#define OCI_FETCH_SIZE 20 -#define OCI_PREFETCH_SIZE 20 -#define OCI_LONG_EXPLICIT 1 -#define OCI_LONG_IMPLICIT 2 - -/* unknown value */ - -#define OCI_UNKNOWN 0 - -/* C Data Type mapping */ - -#define OCI_CDT_NUMERIC 1 -#define OCI_CDT_DATETIME 3 -#define OCI_CDT_TEXT 4 -#define OCI_CDT_LONG 5 -#define OCI_CDT_CURSOR 6 -#define OCI_CDT_LOB 7 -#define OCI_CDT_FILE 8 -#define OCI_CDT_TIMESTAMP 9 -#define OCI_CDT_INTERVAL 10 -#define OCI_CDT_RAW 11 -#define OCI_CDT_OBJECT 12 -#define OCI_CDT_COLLECTION 13 -#define OCI_CDT_REF 14 -#define OCI_CDT_BOOLEAN 15 - -/* Data Type codes for OCI_ImmediateXXX() calls */ - -#define OCI_ARG_SHORT 1 -#define OCI_ARG_USHORT 2 -#define OCI_ARG_INT 3 -#define OCI_ARG_UINT 4 -#define OCI_ARG_BIGINT 5 -#define OCI_ARG_BIGUINT 6 -#define OCI_ARG_DOUBLE 7 -#define OCI_ARG_DATETIME 8 -#define OCI_ARG_TEXT 9 -#define OCI_ARG_LOB 10 -#define OCI_ARG_FILE 11 -#define OCI_ARG_TIMESTAMP 12 -#define OCI_ARG_INTERVAL 13 -#define OCI_ARG_RAW 14 -#define OCI_ARG_OBJECT 15 -#define OCI_ARG_COLLECTION 16 -#define OCI_ARG_REF 17 -#define OCI_ARG_FLOAT 18 -#define OCI_ARG_NUMBER 19 - -/* statement types */ - -#define OCI_CST_SELECT 1 -#define OCI_CST_UPDATE 2 -#define OCI_CST_DELETE 3 -#define OCI_CST_INSERT 4 -#define OCI_CST_CREATE 5 -#define OCI_CST_DROP 6 -#define OCI_CST_ALTER 7 -#define OCI_CST_BEGIN 8 -#define OCI_CST_DECLARE 9 -#define OCI_CST_CALL 10 - -/* environment modes */ - -#define OCI_ENV_DEFAULT 0 -#define OCI_ENV_THREADED 1 -#define OCI_ENV_CONTEXT 2 -#define OCI_ENV_EVENTS 4 - -/* sessions modes */ - -#define OCI_SESSION_DEFAULT 0x00000000 /* any version */ -#define OCI_SESSION_SYSDBA 0x00000002 /* any version */ -#define OCI_SESSION_SYSOPER 0x00000004 /* any version */ -#define OCI_SESSION_SYSASM 0x00008000 /* From 11gR1 */ -#define OCI_SESSION_SYSBKP 0x00020000 /* From 12cR1 */ -#define OCI_SESSION_SYSDGD 0x00040000 /* From 12cR1 */ -#define OCI_SESSION_SYSKMT 0x00080000 /* From 12cR1 */ -#define OCI_SESSION_SYSRAC 0x00100000 /* From 12cR2 */ - -#define OCI_SESSION_XA 0x00000001 -#define OCI_SESSION_PRELIM_AUTH 0x00000008 - -/* change notification types */ - -#define OCI_CNT_OBJECTS 1 -#define OCI_CNT_ROWS 2 -#define OCI_CNT_DATABASES 4 -#define OCI_CNT_ALL OCI_CNT_OBJECTS | OCI_CNT_ROWS | OCI_CNT_DATABASES - -/* event notification types */ - -#define OCI_ENT_STARTUP 1 -#define OCI_ENT_SHUTDOWN 2 -#define OCI_ENT_SHUTDOWN_ANY 3 -#define OCI_ENT_DROP_DATABASE 4 -#define OCI_ENT_DEREGISTER 5 -#define OCI_ENT_OBJECT_CHANGED 6 - -/* event object notification types */ - -#define OCI_ONT_INSERT 0x2 -#define OCI_ONT_UPDATE 0x4 -#define OCI_ONT_DELETE 0x8 -#define OCI_ONT_ALTER 0x10 -#define OCI_ONT_DROP 0x20 -#define OCI_ONT_GENERIC 0x40 - -/* database startup modes */ - -#define OCI_DB_SPM_START 1 -#define OCI_DB_SPM_MOUNT 2 -#define OCI_DB_SPM_OPEN 4 -#define OCI_DB_SPM_FULL OCI_DB_SPM_START | OCI_DB_SPM_MOUNT | OCI_DB_SPM_OPEN - -/* database startup flags */ - -#define OCI_DB_SPF_DEFAULT 0 -#define OCI_DB_SPF_FORCE 1 -#define OCI_DB_SPF_RESTRICT 2 - -/* database shutdown modes */ - -#define OCI_DB_SDM_SHUTDOWN 1 -#define OCI_DB_SDM_CLOSE 2 -#define OCI_DB_SDM_DISMOUNT 4 -#define OCI_DB_SDM_FULL OCI_DB_SDM_SHUTDOWN | OCI_DB_SDM_CLOSE | OCI_DB_SDM_DISMOUNT - -/* database shutdown flags */ - -#define OCI_DB_SDF_DEFAULT 0 -#define OCI_DB_SDF_TRANS 1 -#define OCI_DB_SDF_TRANS_LOCAL 2 -#define OCI_DB_SDF_IMMEDIATE 3 -#define OCI_DB_SDF_ABORT 4 - -/* charset form types */ - -#define OCI_CSF_NONE 0 -#define OCI_CSF_DEFAULT 1 -#define OCI_CSF_NATIONAL 2 - -/* statement fetch mode */ - -#define OCI_SFM_DEFAULT 0 -#define OCI_SFM_SCROLLABLE 0x08 - -/* statement fetch direction */ - -#define OCI_SFD_ABSOLUTE 0x20 -#define OCI_SFD_RELATIVE 0x40 - -/* bind allocation mode */ - -#define OCI_BAM_EXTERNAL 1 -#define OCI_BAM_INTERNAL 2 - -/* bind direction mode */ - -#define OCI_BDM_IN 1 -#define OCI_BDM_OUT 2 -#define OCI_BDM_IN_OUT (OCI_BDM_IN | OCI_BDM_OUT) - -/* Column property flags */ - -#define OCI_CPF_NONE 0 -#define OCI_CPF_IS_IDENTITY 1 -#define OCI_CPF_IS_GEN_ALWAYS 2 -#define OCI_CPF_IS_GEN_BY_DEFAULT_ON_NULL 4 - -/* Column collation IDs */ - -#define OCI_CCI_NONE 0x00000000 -#define OCI_CCI_NLS_COMP 0x00003FFE -#define OCI_CCI_NLS_SORT 0x00003FFD -#define OCI_CCI_NLS_SORT_CI 0x00003FFC -#define OCI_CCI_NLS_SORT_AI 0x00003FFB -#define OCI_CCI_NLS_SORT_CS 0x00003FFA -#define OCI_CCI_NLS_SORT_VAR1 0x00003FF9 -#define OCI_CCI_NLS_SORT_VAR1_CI 0x00003FF8 -#define OCI_CCI_NLS_SORT_VAR1_AI 0x00003FF7 -#define OCI_CCI_NLS_SORT_VAR1_CS 0x00003FF6 -#define OCI_CCI_BINARY 0x00003FFF -#define OCI_CCI_BINARY_CI 0x00023FFF -#define OCI_CCI_BINARY_AI 0x00013FFF - - -/* Integer sign flag */ - -#define OCI_NUM_UNSIGNED 2 - -/* External Integer types */ - -#define OCI_NUM_SHORT 4 -#define OCI_NUM_INT 8 -#define OCI_NUM_BIGINT 16 -#define OCI_NUM_FLOAT 32 -#define OCI_NUM_DOUBLE 64 -#define OCI_NUM_NUMBER 128 - -#define OCI_NUM_USHORT (OCI_NUM_SHORT | OCI_NUM_UNSIGNED) -#define OCI_NUM_UINT (OCI_NUM_INT | OCI_NUM_UNSIGNED) -#define OCI_NUM_BIGUINT (OCI_NUM_BIGINT | OCI_NUM_UNSIGNED) - -/* timestamp types */ - -#define OCI_TIMESTAMP 1 -#define OCI_TIMESTAMP_TZ 2 -#define OCI_TIMESTAMP_LTZ 3 - -/* interval types */ - -#define OCI_INTERVAL_YM 1 -#define OCI_INTERVAL_DS 2 - -/* long types */ - -#define OCI_BLONG 1 -#define OCI_CLONG 2 - -/* lob types */ - -#define OCI_BLOB 1 -#define OCI_CLOB 2 -#define OCI_NCLOB 3 - -/* lob opening mode */ - -#define OCI_LOB_READONLY 1 -#define OCI_LOB_READWRITE 2 - -/* file types */ - -#define OCI_BFILE 1 -#define OCI_CFILE 2 - -/* lob browsing mode */ - -#define OCI_SEEK_SET 1 -#define OCI_SEEK_END 2 -#define OCI_SEEK_CUR 3 - -/* type info types */ - -#define OCI_TIF_TABLE 1 -#define OCI_TIF_VIEW 2 -#define OCI_TIF_TYPE 3 - -/* object type */ - -#define OCI_OBJ_PERSISTENT 1 -#define OCI_OBJ_TRANSIENT 2 -#define OCI_OBJ_VALUE 3 - -/* collection types */ - -#define OCI_COLL_VARRAY 1 -#define OCI_COLL_NESTED_TABLE 2 -#define OCI_COLL_INDEXED_TABLE 3 - -/* pool types */ - -#define OCI_POOL_CONNECTION 1 -#define OCI_POOL_SESSION 2 - -/* AQ message state */ - -#define OCI_AMS_READY 1 -#define OCI_AMS_WAITING 2 -#define OCI_AMS_PROCESSED 3 -#define OCI_AMS_EXPIRED 4 - -/* AQ sequence deviation */ - -#define OCI_ASD_BEFORE 2 -#define OCI_ASD_TOP 3 - -/* AQ message visibility */ - -#define OCI_AMV_IMMEDIATE 1 -#define OCI_AMV_ON_COMMIT 2 - -/* AQ dequeue mode */ - -#define OCI_ADM_BROWSE 1 -#define OCI_ADM_LOCKED 2 -#define OCI_ADM_REMOVE 3 -#define OCI_ADM_REMOVE_NODATA 4 - -/* AQ dequeue navigation */ - -#define OCI_ADN_FIRST_MSG 1 -#define OCI_ADN_NEXT_TRANSACTION 2 -#define OCI_ADN_NEXT_MSG 3 - -/* AQ queue table purge mode */ - -#define OCI_APM_BUFFERED 1 -#define OCI_APM_PERSISTENT 2 -#define OCI_APM_ALL (OCI_APM_BUFFERED | OCI_APM_PERSISTENT) - -/* AQ queue table grouping mode */ - -#define OCI_AGM_NONE 0 -#define OCI_AGM_TRANSACTIONNAL 1 - -/* AQ queue table type */ - -#define OCI_AQT_NORMAL 0 -#define OCI_AQT_EXCEPTION 1 -#define OCI_AQT_NON_PERSISTENT 2 - -/* direct path processing return status */ - -#define OCI_DPR_COMPLETE 1 -#define OCI_DPR_ERROR 2 -#define OCI_DPR_FULL 3 -#define OCI_DPR_PARTIAL 4 -#define OCI_DPR_EMPTY 5 - -/* direct path conversion modes */ - -#define OCI_DCM_DEFAULT 1 -#define OCI_DCM_FORCE 2 - -/* trace size constants */ - -#define OCI_SIZE_TRACE_ID 64 -#define OCI_SIZE_TRACE_MODULE 48 -#define OCI_SIZE_TRACE_ACTION 32 -#define OCI_SIZE_TRACE_INFO 64 - -/* trace types */ - -#define OCI_TRC_IDENTITY 1 -#define OCI_TRC_MODULE 2 -#define OCI_TRC_ACTION 3 -#define OCI_TRC_DETAIL 4 - -/* HA event type */ - -#define OCI_HET_DOWN 0 -#define OCI_HET_UP 1 - -/* HA event source */ -#define OCI_HES_INSTANCE 0 -#define OCI_HES_DATABASE 1 -#define OCI_HES_NODE 2 -#define OCI_HES_SERVICE 3 -#define OCI_HES_SERVICE_MEMBER 4 -#define OCI_HES_ASM_INSTANCE 5 -#define OCI_HES_PRECONNECT 6 - -/* Fail over types */ - -#define OCI_FOT_NONE 1 -#define OCI_FOT_SESSION 2 -#define OCI_FOT_SELECT 4 - -/* fail over notifications */ - -#define OCI_FOE_END 1 -#define OCI_FOE_ABORT 2 -#define OCI_FOE_REAUTH 4 -#define OCI_FOE_BEGIN 8 -#define OCI_FOE_ERROR 16 - -/* fail over callback return code */ - -#define OCI_FOC_OK 0 -#define OCI_FOC_RETRY 25410 - -/* hash tables support */ - -#define OCI_HASH_STRING 1 -#define OCI_HASH_INTEGER 2 -#define OCI_HASH_POINTER 3 - -/* transaction types */ - -#define OCI_TRS_NEW 0x00000001 -#define OCI_TRS_READONLY 0x00000100 -#define OCI_TRS_READWRITE 0x00000200 -#define OCI_TRS_SERIALIZABLE 0x00000400 -#define OCI_TRS_LOOSE 0x00010000 -#define OCI_TRS_TIGHT 0x00020000 - -/* format types */ - -#define OCI_FMT_DATE 1 -#define OCI_FMT_TIMESTAMP 2 -#define OCI_FMT_NUMERIC 3 -#define OCI_FMT_BINARY_DOUBLE 4 -#define OCI_FMT_BINARY_FLOAT 5 - -/* sql function codes */ - -#define OCI_SFC_CREATE_TABLE 1 -#define OCI_SFC_SET_ROLE 2 -#define OCI_SFC_INSERT 3 -#define OCI_SFC_SELECT 4 -#define OCI_SFC_UPDATE 5 -#define OCI_SFC_DROP_ROLE 6 -#define OCI_SFC_DROP_VIEW 7 -#define OCI_SFC_DROP_TABLE 8 -#define OCI_SFC_DELETE 9 -#define OCI_SFC_CREATE_VIEW 10 -#define OCI_SFC_DROP_USER 11 -#define OCI_SFC_CREATE_ROLE 12 -#define OCI_SFC_CREATE_SEQUENCE 13 -#define OCI_SFC_ALTER_SEQUENCE 14 - -#define OCI_SFC_DROP_SEQUENCE 16 -#define OCI_SFC_CREATE_SCHEMA 17 -#define OCI_SFC_CREATE_CLUSTER 18 -#define OCI_SFC_CREATE_USER 19 -#define OCI_SFC_CREATE_INDEX 20 -#define OCI_SFC_DROP_INDEX 21 -#define OCI_SFC_DROP_CLUSTER 22 -#define OCI_SFC_VALIDATE_INDEX 23 -#define OCI_SFC_CREATE_PROCEDURE 24 -#define OCI_SFC_ALTER_PROCEDURE 25 -#define OCI_SFC_ALTER_TABLE 26 -#define OCI_SFC_EXPLAIN 27 -#define OCI_SFC_GRANT 28 -#define OCI_SFC_REVOKE 29 -#define OCI_SFC_CREATE_SYNONYM 30 -#define OCI_SFC_DROP_SYNONYM 31 -#define OCI_SFC_ALTER_SYSTEM_SWITCHLOG 32 -#define OCI_SFC_SET_TRANSACTION 33 -#define OCI_SFC_PLSQL_EXECUTE 34 -#define OCI_SFC_LOCK 35 -#define OCI_SFC_NOOP 36 -#define OCI_SFC_RENAME 37 -#define OCI_SFC_COMMENT 38 -#define OCI_SFC_AUDIT 39 -#define OCI_SFC_NO_AUDIT 40 -#define OCI_SFC_ALTER_INDEX 41 -#define OCI_SFC_CREATE_EXTERNAL_DATABASE 42 -#define OCI_SFC_DROP_EXTERNALDATABASE 43 -#define OCI_SFC_CREATE_DATABASE 44 -#define OCI_SFC_ALTER_DATABASE 45 -#define OCI_SFC_CREATE_ROLLBACK_SEGMENT 46 -#define OCI_SFC_ALTER_ROLLBACK_SEGMENT 47 -#define OCI_SFC_DROP_ROLLBACK_SEGMENT 48 -#define OCI_SFC_CREATE_TABLESPACE 49 -#define OCI_SFC_ALTER_TABLESPACE 50 -#define OCI_SFC_DROP_TABLESPACE 51 -#define OCI_SFC_ALTER_SESSION 52 -#define OCI_SFC_ALTER_USER 53 -#define OCI_SFC_COMMIT_WORK 54 -#define OCI_SFC_ROLLBACK 55 -#define OCI_SFC_SAVEPOINT 56 -#define OCI_SFC_CREATE_CONTROL_FILE 57 -#define OCI_SFC_ALTER_TRACING 58 -#define OCI_SFC_CREATE_TRIGGER 59 -#define OCI_SFC_ALTER_TRIGGER 60 -#define OCI_SFC_DROP_TRIGGER 61 -#define OCI_SFC_ANALYZE_TABLE 62 -#define OCI_SFC_ANALYZE_INDEX 63 -#define OCI_SFC_ANALYZE_CLUSTER 64 -#define OCI_SFC_CREATE_PROFILE 65 -#define OCI_SFC_DROP_PROFILE 66 -#define OCI_SFC_ALTER_PROFILE 67 -#define OCI_SFC_DROP_PROCEDURE 68 - -#define OCI_SFC_ALTER_RESOURCE_COST 70 -#define OCI_SFC_CREATE_SNAPSHOT_LOG 71 -#define OCI_SFC_ALTER_SNAPSHOT_LOG 72 -#define OCI_SFC_DROP_SNAPSHOT_LOG 73 -#define OCI_SFC_DROP_SUMMARY 73 -#define OCI_SFC_CREATE_SNAPSHOT 74 -#define OCI_SFC_ALTER_SNAPSHOT 75 -#define OCI_SFC_DROP_SNAPSHOT 76 -#define OCI_SFC_CREATE_TYPE 77 -#define OCI_SFC_DROP_TYPE 78 -#define OCI_SFC_ALTER_ROLE 79 -#define OCI_SFC_ALTER_TYPE 80 -#define OCI_SFC_CREATE_TYPE_BODY 81 -#define OCI_SFC_ALTER_TYPE_BODY 82 -#define OCI_SFC_DROP_TYPE_BODY 83 -#define OCI_SFC_DROP_LIBRARY 84 -#define OCI_SFC_TRUNCATE_TABLE 85 -#define OCI_SFC_TRUNCATE_CLUSTER 86 -#define OCI_SFC_CREATE_BITMAPFILE 87 -#define OCI_SFC_ALTER_VIEW 88 -#define OCI_SFC_DROP_BITMAPFILE 89 -#define OCI_SFC_SET_CONSTRAINTS 90 -#define OCI_SFC_CREATE_FUNCTION 91 -#define OCI_SFC_ALTER_FUNCTION 92 -#define OCI_SFC_DROP_FUNCTION 93 -#define OCI_SFC_CREATE_PACKAGE 94 -#define OCI_SFC_ALTER_PACKAGE 95 -#define OCI_SFC_DROP_PACKAGE 96 -#define OCI_SFC_CREATE_PACKAGE_BODY 97 -#define OCI_SFC_ALTER_PACKAGE_BODY 98 -#define OCI_SFC_DROP_PACKAGE_BODY 99 -#define OCI_SFC_CREATE_DIRECTORY 157 -#define OCI_SFC_DROP_DIRECTORY 158 -#define OCI_SFC_CREATE_LIBRARY 159 -#define OCI_SFC_CREATE_JAVA 160 -#define OCI_SFC_ALTER_JAVA 161 -#define OCI_SFC_DROP_JAVA 162 -#define OCI_SFC_CREATE_OPERATOR 163 -#define OCI_SFC_CREATE_INDEXTYPE 164 -#define OCI_SFC_DROP_INDEXTYPE 165 -#define OCI_SFC_ALTER_INDEXTYPE 166 -#define OCI_SFC_DROP_OPERATOR 167 -#define OCI_SFC_ASSOCIATE_STATISTICS 168 -#define OCI_SFC_DISASSOCIATE_STATISTICS 169 -#define OCI_SFC_CALL_METHOD 170 -#define OCI_SFC_CREATE_SUMMARY 171 -#define OCI_SFC_ALTER_SUMMARY 172 -#define OCI_SFC_CREATE_DIMENSION 174 -#define OCI_SFC_ALTER_DIMENSION 175 -#define OCI_SFC_DROP_DIMENSION 176 -#define OCI_SFC_CREATE_CONTEXT 177 -#define OCI_SFC_DROP_CONTEXT 178 -#define OCI_SFC_ALTER_OUTLINE 179 -#define OCI_SFC_CREATE_OUTLINE 180 -#define OCI_SFC_DROP_OUTLINE 181 -#define OCI_SFC_UPDATE_INDEXES 182 -#define OCI_SFC_ALTER_OPERATOR 183 - -/* size constants */ - -#define OCI_SIZE_FORMAT 64 -#define OCI_SIZE_BUFFER 512 -#define OCI_SIZE_LONG (64*1024)-1 -#define OCI_SIZE_DATE 45 -#define OCI_SIZE_TIMESTAMP 54 -#define OCI_SIZE_FORMAT_TODATE 14 -#define OCI_SIZE_NULL 4 -#define OCI_SIZE_PRECISION 10 -#define OCI_SIZE_ROWID 23 -#define OCI_SIZE_DIRECTORY 30 -#define OCI_SIZE_FILENAME 255 -#define OCI_SIZE_FORMAT_NUMS 40 -#define OCI_SIZE_FORMAT_NUML 65 -#define OCI_SIZE_OBJ_NAME 128 - -#define OCI_HASH_DEFAULT_SIZE 256 - -/* string constants */ - -#define OCILIB_DRIVER_NAME OTEXT("OCILIB") -#define OCI_STRING_NULL OTEXT("NULL") -#define OCI_STRING_EMPTY OTEXT("") -#define OCI_STRING_FORMAT_DATE OTEXT("YYYY-MM-DD") -#define OCI_STRING_FORMAT_TIME OTEXT("HH24:MI:SS") -#define OCI_STRING_FORMAT_DATETIME OTEXT("YYYY-MM-DD HH24:MI:SS") -#define OCI_STRING_FORMAT_TIMESTAMP OTEXT("YYYY-MM-DD HH24:MI:SS.FF") -#define OCI_STRING_DEFAULT_PREC 3 -#define OCI_STRING_FORMAT_NUM \ - OTEXT("FM99999999999999999999999999999999999990.999999999999999999999999") -#define OCI_STRING_FORMAT_NUM_BDOUBLE OTEXT("%lf") -#define OCI_STRING_FORMAT_NUM_BFLOAT OTEXT("%f") -#define OCI_STRING_FORMAT_NUM_SHORT OTEXT("%hd") -#define OCI_STRING_FORMAT_NUM_INT OTEXT("%d") -#define OCI_STRING_TRUE OTEXT("TRUE") -#define OCI_STRING_FALSE OTEXT("FALSE") -#define OCI_STRING_TRUE_SIZE 4 -#define OCI_STRING_FALSE_SIZE 5 - -#ifdef _WINDOWS - #define OCI_CHAR_SLASH '\\' -#else - #define OCI_CHAR_SLASH '/' -#endif - -/** - * @defgroup OcilibCApiInitialization Initializing the library - * @{ - * - * To use OCILIB, it first needs to be initialized through a call to OCI_Initialize(). - * - * Then, the application connects to server, executes queries... - * - * Finally, OCILIB resources must be released by OCI_Cleanup() - * - * @note - * - * The following objects are automatically freed by the library: - * - Connections - * - pools - * - Statements - * - Type info objects - * - Thread keys - * - * @warning - * - * All other standalone object instances (mutexes, threads, dates, lobs, ...) ARE NOT freed. - * - */ - -/** - * @brief - * Initialize the library - * - * @param err_handler - Pointer to error handler procedure (optional) - * @param lib_path - Oracle shared library path (optional) - * @param mode - Environment mode - * - * Possible values for parameter mode: - * - OCI_ENV_DEFAULT : default mode - * - OCI_ENV_THREADED : multi-threading support - * - OCI_ENV_CONTEXT : thread contextual error handling - * - OCI_ENV_EVENTS : enables events for subscription, HA Events, AQ notifications - * - * @note - * This function must be called before any OCILIB library function. - * - * @warning - * - The parameter 'libpath' is only used if OCILIB has been built with the option OCI_IMPORT_RUNTIME - * - If the parameter 'lib_path' is NULL, the Oracle library is loaded from system environment variables - * - * @warning - * OCI_Initialize() should be called ONCE per application - * - * @return - * TRUE on success otherwise FALSE (only with Oracle runtime loading mode - * if the oracle shared libraries can't be loaded or if OCI subsystem cannot be initialized) - * - */ - -OCI_EXPORT boolean OCI_API OCI_Initialize -( - POCI_ERROR err_handler, - const otext *lib_path, - unsigned int mode -); - -/** - * @brief - * Clean up all resources allocated by the library - * - * @note - * * This function must be the last OCILIB library function call. - * - It deallocates objects not explicitly freed by the program (connections, statements, ...) - * - It unloads the Oracle shared library if it has been dynamically loaded - * - * @warning - * OCI_Cleanup() should be called ONCE per application - * - * @return TRUE - */ - -OCI_EXPORT boolean OCI_API OCI_Cleanup -( - void -); - -/** - * @brief - * Return the version of OCI used for compilation - * - * @note - * - with linkage build option, the version is determined from the oci.h header through different ways - * - with runtime loading build option, the version is set to the highest version - * of OCI needed by OCILIB, not necessarily the real OCI version - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetOCICompileVersion -( - void -); - -/** - * @brief - * Return the version of OCI used at runtime - * - * @note - * - with linkage build option, the version is determined from the oci.h header - * through different ways - * - with runtime loading build option, the version determined from the symbols - * dynamically loaded. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetOCIRuntimeVersion -( - void -); - -/** - * @brief - * Return the Oracle shared library import mode - * - * @note - * Possible values are: - * - OCI_IMPORT_MODE_LINKAGE - * - OCI_IMPORT_MODE_RUNTIME - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetImportMode -( - void -); - -/** - * @brief - * Return the OCILIB charset type - * - * @note - * Possible values are: - * - OCI_CHAR_ANSI - * - OCI_CHAR_WIDE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetCharset -( - void -); - -/** -* @brief -* Return the current number of bytes allocated internally in the library -* -* @param mem_type : type of memory to request -* -* @note -* Possible values are: -* - OCI_MEM_ORACLE : bytes allocated by Oracle client library -* - OCI_MEM_OCILIB : bytes allocated by OCILIB library -* - OCI_MEM_ORACLE : bytes allocated by all libraries -* -*/ - -OCI_EXPORT big_uint OCI_API OCI_GetAllocatedBytes -( - unsigned int mem_type -); - -/** - * @brief - * Enable or disable Oracle warning notifications - * - * @param value - enable/disable warnings - * - * @note - * Default value is FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnableWarnings -( - boolean value -); - -/** - * @brief - * Set the global error user handler - * - * @param handler - Pointer to error handler procedure - * - * @note - * Use this call to change or remove the user callback error handler installed by OCI_Initialize() - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetErrorHandler -( - POCI_ERROR handler -); - -/** - * @brief - * Set the High availability (HA) user handler - * - * @param handler - Pointer to HA handler procedure - * - * @note - * See POCI_HA_HANDLER documentation for more details - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * HA events - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetHAHandler -( - POCI_HA_HANDLER handler -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiErrorHandling Error handling - * @{ - * - * OCILIB provides two mechanisms for error handling: - * - * - Global error handling through callbacks. - * - Contextual thread error handling - * - * Exceptions are raised: - * - * - On Oracle OCI API call error - * - On Oracle SQL statement error - * - On Internal OCILIB error (type checking, memory allocations ...) - * - On Oracle warnings (OCI API or SQL) - * - * If an error handler was provided to OCI_Initialize(), when an error occurs, the - * library generates an OCI_Error handle and pass it to the error handler. - * - * In order to use the thread contextual error handling, you must call - * OCI_Initialize() with the flag OCI_ENV_CONTEXT for the mode parameter. When - * activated, error handles are stored per thread and the last error within a - * thread can be retrieved with OCI_GetLastError() - * - * Exception properties are accessible through a set of functions - * - * @note - * The two ways to handle errors are not exclusive and can be mixed. - * - * @note - * Thread contextual error is also available for single thread based applications - * - * @par Oracle Warnings - * - * Oracle warnings are raised through OCI_Error API. - * Such error handles have their error type property (OCI_ErrorGetType()) set to OCI_ERR_WARNING. - * Warning handing is disabled by default. To activate/deactivate it, use OCI_EnableWarnings() - * - * @par Example with callbacks - * @include err.c - * - * @par Example with thread context - * @include err_ctx.c - * - *@par Example of warning handling - * @include err_warning.c - * - */ - -/** - * @brief - * Retrieve the last error or warning occurred within the last OCILIB call - * - * @note - * OCI_GetLastError() is based on thread context and thus OCILIB must be - * initialized with the flag OCI_ENV_CONTEXT - * - * @warning - * OCILIB functions that returns a boolean value to indicate their success : - * - return TRUE if no error occurred OR if a warning occurred - * - return FALSE if an error occurred - * - */ - -OCI_EXPORT OCI_Error * OCI_API OCI_GetLastError -( - void -); - -/** - * @brief - * Retrieve error message from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ErrorGetString -( - OCI_Error *err -); - -/** - * @brief - * Retrieve the type of error from error handle - * - * @param err - Error handle - * - * @note - * Returns one of the following values: - * - * - OCI_ERR_ORACLE - * - OCI_ERR_OCILIB - * - OCI_ERR_WARNING - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ErrorGetType -( - OCI_Error *err -); - -/** - * @brief - * Retrieve Oracle Error code from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT int OCI_API OCI_ErrorGetOCICode -( - OCI_Error *err -); - -/** - * @brief - * Retrieve Internal Error code from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT int OCI_API OCI_ErrorGetInternalCode -( - OCI_Error *err -); - -/** - * @brief - * Retrieve connection handle within the error occurred - * - * @param err - Error handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_ErrorGetConnection -( - OCI_Error *err -); - -/** - * @brief - * Retrieve statement handle within the error occurred - * - * @param err - Error handle - * - * @note - * If the error occurred outside of a statement context, it returns NULL - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_ErrorGetStatement -( - OCI_Error *err -); - -/** - * @brief - * Return the row index which caused an error during statement execution - * - * @param err - Error handle - * - * @warning - * Row index start at 1. - * - * @return - * 0 is the error is not related to array DML otherwise the index of the given - * row which caused the error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ErrorGetRow -( - OCI_Error *err -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiConnections Connecting to Database - * @{ - * - * Connecting to a database server is done with one call to OCI_ConnectionCreate(). - * - * OCI_ConnectionFree() closes the established connection. - * - * Connection properties are accessible through a set of functions - * - * @par Example - * @include conn.c - * - */ - -/** - * @brief - * Create a physical connection to an Oracle database server - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param mode - Session mode - * - * Possible values for parameter mode : - * - OCI_SESSION_DEFAULT - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - OCI_SESSION_XA - * - * @note - * External credentials are supported by supplying a null value for the - * 'user' and 'pwd' parameters. - * If the param 'db' is NULL then a connection to the default local DB is done - * - * @note - * For parameter 'mode', the possible values are exclusive and cannot be combined - * - * @par Oracle XA support - * - * OCILIB supports Oracle XA connectivity. In order to get a connection using - * the XA interface : - * - For parameter 'db' : pass the value of the 'DB' parameter of the given - * XA connection string passed to the Transaction Processing Monitor (TPM) - * - Pass NULL to the 'user' and 'pwd' parameters - * - Pass the value OCI_SESSION_XA to parameter 'mode' - * - * @par Oracle XA Connection String - * - * The XA connection string used in a transaction monitor to connect to Oracle must - * be compatible with OCILIB : - * - * - the XA parameter 'Objects' MUST be set to 'true' - * - If OCI_ENV_THREADED is passed to OCI_Initialize(), the XA parameter 'Threads' must - * be set to 'true', otherwise to 'false' - * - If OCI_ENV_EVENTS is passed to OCI_Initialize(), the XA parameter 'Events' must - * be set to 'true', otherwise to 'false' - * - As Oracle does not support Unicode UTF16 character set through the XA interface, - * Only OCI_CHARSET_ANSI builds of OCILIB can be used - * - You still can use UTF8 if the NLS_LANG environment variable is set with a valid - * UTF8 NLS value - * - DO NOT USE OCI_CHARSET_WIDE OCILIB builds with XA connections - * - * @note - * On success, a local transaction is automatically created and started ONLY for regular - * standalone connections and connections retrieved from connection pools. - * No transaction is created for a XA connection or q connection retrieved from session pools. - * - * @return - * Connection handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_ConnectionCreate -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int mode -); - -/** - * @brief - * Close a physical connection to an Oracle database server - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ConnectionFree -( - OCI_Connection *con -); - -/** - * @brief - * Returns TRUE is the given connection is still connected otherwise FALSE - * - * @param con - Connection handle - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsConnected -( - OCI_Connection *con -); - -/** - * @brief - * Return the pointer to user data previously associated with the connection - * - * @param con - Connection handle - * - */ - -OCI_EXPORT void * OCI_API OCI_GetUserData -( - OCI_Connection *con -); - -/** - * @brief - * Associate a pointer to user data to the given connection - * - * @param con - Connection handle - * @param data - User data pointer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetUserData -( - OCI_Connection *con, - void *data -); - -/** - * @brief - * Associate a tag to the given connection/session - * - * @param con - Connection handle - * @param tag - user tag string - * - * @note - * Use this call only for connections retrieved from a session pool - * See OCI_PoolGetConnection() for more details - * - * @note - * To untag a session, call OCI_SetSessionTag() with 'tag' parameter set to NULL - * - * @warning - * No error is raised if the connection is a standalone connection or retrieved from a connection - * pool - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetSessionTag -( - OCI_Connection *con, - const otext *tag -); - -/** - * @brief - * Return the tag associated the given connection - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSessionTag -( - OCI_Connection *con -); - -/** - * @brief - * Return the name of the connected database/service name - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDatabase -( - OCI_Connection *con -); - -/** - * @brief - * Return the current logged user name - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetUserName -( - OCI_Connection *con -); - -/** - * @brief - * Return the current logged user password - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetPassword -( - OCI_Connection *con -); - -/** - * @brief - * Change the password of the logged user - * - * @param con - Connection handle - * @param password - New password - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPassword -( - OCI_Connection *con, - const otext *password -); - -/** - * @brief - * Change the password of the given user on the given database - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param new_pwd - Oracle User New password - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetUserPassword -( - const otext *db, - const otext *user, - const otext *pwd, - const otext *new_pwd -); - -/** - * @brief - * Return the current session mode - * - * @param con - Connection handle - * - * @note - * See OCI_ConnectionCreate() for possible values - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSessionMode -( - OCI_Connection *con -); - -/** - * @brief - * Return the connected database server version - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetVersionServer -( - OCI_Connection *con -); - -/** - * @brief - * Return the major version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerMajorVersion -( - OCI_Connection *con -); - -/** - * @brief - * Return the minor version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerMinorVersion -( - OCI_Connection *con -); - -/** - * @brief - * Return the revision version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerRevisionVersion -( - OCI_Connection *con -); - -/** - * @brief - * Set the format string for implicit string conversions of the given type - * - * @param con - Connection handle (optional) - * @param type - Type of format - * @param format - Format string - * - * Formats can set at 2 levels: - * - Library level: by passing a NULL Connection handle - * - Connection level: by passing a valid Connection handle - * - * When the library needs to perform a string conversion, it search for a valid format using the - * following order: - * - Connection format - * - Library format - * - Default format - * - * @note - * Possible values of parameter 'type' : - * - * - OCI_FMT_DATE : format used to convert DATE to string - * - OCI_FMT_TIMESTAMP : format used to convert TIMESTAMP to string - * - OCI_FMT_NUMERIC : format used to convert numeric types to string - * - OCI_FMT_BINARY_DOUBLE : format used to convert BINARY_DOUBLE to string - * - OCI_FMT_BINARY FLOAT : format used to convert BINARY_FLOAT to string - * - * @note - * Default format values are : - * - OCI_FMT_DATE : constant OCI_STRING_FORMAT_DATE - * - OCI_FMT_TIMESTAMP : constant OCI_STRING_FORMAT_TIMESTAMP - * - OCI_FMT_NUMERIC : constant OCI_STRING_FORMAT_NUMERIC - * - OCI_FMT_BINARY_DOUBLE : constant OCI_STRING_FORMAT_BINARY_DOUBLE - * - OCI_FMT_BINARY FLOAT : constant OCI_STRING_FORMAT_BINARY_FLOAT - * - * @note - * Conversions are performed by Oracle built-in functions whenever possible. - * For DATE, TIMESTAMP and numeric types, see documentation of Oracle SQL to_char() function for more details - * For BINARY_DOUBLE and BINARY_FLOAT, refer to the C Standard Library printf() family documentation - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFormat -( - OCI_Connection *con, - unsigned int type, - const otext *format -); - -/** - * @brief - * Return the format string for implicit string conversions of the given type - * - * @param con - Connection handle - * @param type - Type of format - * - * @note - * See OCI_SetFormat() for possible values - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetFormat -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Return the current transaction of the connection - * - * @param con - Connection handle - * - * @note - * From v3.9.4, no more default transaction object is created for a new connection - * - */ - -OCI_EXPORT OCI_Transaction * OCI_API OCI_GetTransaction -( - OCI_Connection *con -); - -/** - * @brief - * Set a transaction to a connection - * - * @param con - Connection handle - * @param trans - Transaction handle to assign - * - * @note - * The current transaction (if any) is automatically stopped but the newly assigned is not - * started or resumed - * - * @warning - * Do not set transaction object to XA connection or connection retrieved from a session pool - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTransaction -( - OCI_Connection *con, - OCI_Transaction *trans -); - -/** - * @brief - * Return the highest Oracle version is supported by the connection - * - * @param con - connection handle - * - * @note - * The highest supported version is the lower version between client and server: - * - * @note - * Returns one of the following values: - * - * - OCI_UNKNOWN - * - OCI_8_0 - * - OCI_8_1 - * - OCI_9_0 - * - OCI_9_2 - * - OCI_10_1 - * - OCI_10_2 - * - OCI_11_1 - * - OCI_11_2 - * - OCI_12_1 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetVersionConnection -( - OCI_Connection *con -); - -/** - * @brief - * Set tracing information to the session of the given connection - * - * @param con - connection handle - * @param trace - trace type - * @param value - trace content - * - * Store current trace information to the given connection handle. - * These information: - * - * - is stored in the system view V$SESSION - * - can be retrieved from the connection property of an OCI_Error handle - * - * @note - * Possible values of parameter 'trace' : - * - * - OCI_TRC_IDENTITY : Specifies the user defined identifier in the session. - * It's recorded in the column CLIENT_IDENTIFIER of the - * system view V$SESSION - * - OCI_TRC_MODULE : name of the current module in the client application. - * It's recorded in the column MODULE of the - * system view V$SESSION - * - OCI_TRC_ACTION : name of the current action within the current module. - * It's recorded in the column ACTION of the - * system view V$SESSION - * - OCI_TRC_DETAIL : Client application additional information. - * It's recorded in the column CLIENT_INFO of the - * system view V$SESSION - * - * @warning - * The system view V$SESSION is updated on Oracle versions >= 10g - * - * @warning - * Oracle limits the size of these traces content and thus OCILIB will truncate - * the given values if needed : - * - * - OCI_TRC_IDENTITY : 64 bytes - * - OCI_TRC_MODULE : 48 bytes - * - OCI_TRC_ACTION : 32 bytes - * - OCI_TRC_DETAIL : 64 bytes - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTrace -( - OCI_Connection *con, - unsigned int trace, - const otext *value -); - -/** - * @brief - * Get the current trace for the trace type from the given connection. - * - * @param con - connection handle - * @param trace - trace type - * - * @note - * See OCI_SetTrace() for more details. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetTrace -( - OCI_Connection *con, - unsigned int trace -); - -/** - * @brief - * Makes a round trip call to the server to confirm that the connection and the server are active. - * - * @param con - Connection handle - * - * @note - * Returns TRUE is the connection is still alive otherwise FALSE - * - * @warning - * This call is supported from Oracle 10g. - * For previous versions, it returns FALSE without throwing any exception. - * - */ - -OCI_EXPORT boolean OCI_API OCI_Ping -( - OCI_Connection *con -); - -/** - * @brief - * Return the Oracle server database name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDBName -( - OCI_Connection *con -); - -/** - * @brief - * Return the Oracle server Instance name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetInstanceName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server service name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetServiceName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server machine name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetServerName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server domain name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDomainName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the date and time (Timestamp) server instance start of the - * connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetInstanceStartTime -( - OCI_Connection *con -); - -/** - * @brief - * Verify if the given connection support TAF events - * - * @param con - Connection handle - * - * @note - * Returns TRUE is the connection supports TAF event otherwise FALSE - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsTAFCapable -( - OCI_Connection *con -); - -/** - * @brief - * Set the Transparent Application Failover (TAF) user handler - * - * @param con - Connection handle - * @param handler - Pointer to TAF handler procedure - * - * @note - * See POCI_TAF_HANDLER documentation for more details - * -* @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTAFHandler -( - OCI_Connection *con, - POCI_TAF_HANDLER handler -); - -/** - * @brief - * Return the maximum number of statements to keep in the statement cache - * - * @param con - Connection handle - * - * @note - * Default value is 20 (value from Oracle Documentation) - * - * @warning - * Requires Oracle Client 9.2 or above - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetStatementCacheSize -( - OCI_Connection *con -); - -/** - * @brief - * Set the maximum number of statements to keep in the statement cache - * - * @param con - Connection handle - * @param value - maximum number of statements in the cache - * - * @warning - * Requires Oracle Client 9.2 or above - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStatementCacheSize -( - OCI_Connection *con, - unsigned int value -); - -/** - * @brief - * Return the default LOB prefetch buffer size for the connection - * - * @param con - Connection handle - * - * @warning - * Requires Oracle Client AND Server 11gR1 or above - * - * @note - * Prefetch size is: - * - number of bytes for BLOBs and BFILEs - * - number of characters for CLOBs. - * - * @note - * Default is 0 (prefetching disabled) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDefaultLobPrefetchSize -( - OCI_Connection *con -); - -/** - * @brief - * Enable or disable prefetching for all LOBs fetched in the connection - * - * @param con - Connection handle - * @param value - default prefetch buffer size - * - * @note - * If parameter 'value': - * - is == 0, it disables prefetching for all LOBs fetched in the connection. - * - is > 0, it enables prefetching for all LOBs fetched in the connection - * and the given buffer size is used for prefetching LOBs - * - * @note - * LOBs prefetching is disabled by default - * - * @warning - * Requires Oracle Client AND Server 11gR1 or above. - * - * @note - * Prefetch size is: - * - number of bytes for BLOBs and BFILEs - * - number of characters for CLOBs. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetDefaultLobPrefetchSize -( - OCI_Connection *con, - unsigned int value -); - - -/** -* @brief -* Return the maximum number of SQL statements that can be opened in one session -* -* @param con - Connection handle -* -* @warning -* Requires Oracle Client AND Server 12cR1 or above -* -* @note -* the returned value is the same as the db parameter 'open_cursors' from server's parameter file -* -* @note -* Return 0 if the client and server version are < 12cR1 -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_GetMaxCursors -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiPools Oracle Pools - * @{ - * - * OCILIB support the connections and sessions pooling features introduced - * in Oracle 9i. - * - * Let's Oracle talk about this features ! - * - * @par Connection pools (from Oracle Call Interface Programmer's Guide) - * - * Connection pooling is the use of a group (the pool) of reusable physical connections - * by several sessions, in order to balance loads. The management of the pool is done - * by OCI, not the application. Applications that can use connection pooling include - * middle-tier applications for Web application servers and e-mail servers. - * - * @par Session Pools (from Oracle Call Interface Programmer's Guide) - * - * Session pooling means that the application will create and maintain a group of stateless - * sessions to the database. These sessions will be handed over to thin clients as requested. - * If no sessions are available, a new one may be created. When the client is done with - * the session, the client will release it to the pool. Thus, the number of sessions in - * the pool can increase dynamically. - * - * @note - * OCILIB implements homogeneous session pools only. - * - * @par When using Pools (from Oracle Call Interface Programmer's Guide) - * - * If database sessions are not reusable by mid-tier threads (that is, they are stateful) - * and the number of back-end server processes may cause scaling problems on the database, - * use OCI connection pooling. - * - * If database sessions are reusable by mid-tier threads (that is, they are stateless) - * and the number of back-end server processes may cause scaling problems on the database, - * use OCI session pooling. - * - * If database sessions are not reusable by mid-tier threads (that is, they are stateful) - * and the number of back-end server processes will never be large enough to potentially - * cause any scaling issue on the database, there is no need to use any pooling mechanism. - * - * @par Oracle 8i support - * - * Pooling has bee introduced in : - * - 9iR1 for connection pools - * - 9iR2 for session pools - * For Oracle 8i, OCILIB implements its own pooling mechanism in order to remain compatible - * with older versions. But sessions pools then are handled as connection pools - * - * @par Example - * @include pool.c - * - */ - -/** - * @brief - * Create an Oracle pool of connections or sessions - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param type - Type of pool - * @param mode - Session mode - * @param min_con - minimum number of connections/sessions that can be opened. - * @param max_con - maximum number of connections/sessions that can be opened. - * @param incr_con - next increment for connections/sessions to be opened - * - * Possible values for parameter 'type': - * - OCI_POOL_CONNECTION - * - OCI_POOL_SESSION - * - * Possible values for parameter 'mode': - * - OCI_SESSION_DEFAULT - * - OCI_SESSION_SYSDAB - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' - * and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * @return - * Connection or session pool handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Pool * OCI_API OCI_PoolCreate -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int type, - unsigned int mode, - unsigned int min_con, - unsigned int max_con, - unsigned int incr_con -); - -/** - * @brief - * Destroy a pool object - * - * @param pool - Pool handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolFree -( - OCI_Pool *pool -); - -/** - * @brief - * Get a connection from the pool - * - * @param pool - Pool handle - * @param tag - user tag string - * - * @par Session tagging - * - * Session pools have a nice feature that is 'session tagging' - * It's possible to tag a session with a string identifier - * when the session is returned to the pool, it keeps its tags. - * When requesting a connection from the session pool, it's - * possible to request a session that has the given 'tag' parameter - * If one exists, it is returned. If not and if an untagged session - * is available, it is then returned. So check the connection tag - * property with OCI_GetSessionTag() to find out if the returned - * connection is tagged or not. - * - * This features is described in the OCI developer guide as the following : - * - * "The tags provide a way for users to customize sessions in the pool. - * A client may get a default or untagged session from a pool, set certain - * attributes on the session (such as NLS settings), and return the session - * to the pool, labeling it with an appropriate tag. - * The user may request a session with the same tags in order to have a - * session with the same attributes" - * - * @return - * Connection handle otherwise NULL on failure - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_PoolGetConnection -( - OCI_Pool *pool, - const otext *tag -); - -/** - * @brief - * Get the idle timeout for connections/sessions in the pool - * - * @param pool - Pool handle - * - * @note - * Connections/sessions idle for more than this time value (in seconds) is terminated - * - * @note - * Timeout is not available for internal pooling implementation (client < 9i) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetTimeout -( - OCI_Pool *pool -); - -/** - * @brief - * Set the connections/sessions idle timeout - * - * @param pool - Pool handle - * @param value - Timeout value - * - * @note - * connections/sessions idle for more than this time value (in seconds) is terminated - * - * @note - * This call has no effect if pooling is internally implemented (client < 9i) - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetTimeout -( - OCI_Pool *pool, - unsigned int value -); - -/** - * @brief - * Get the waiting mode used when no more connections/sessions are available - * from the pool - * - * @param pool - Pool handle - * - * @return - * - FALSE to wait for an available object if the pool is saturated - * - TRUE to not wait for an available object - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolGetNoWait -( - OCI_Pool *pool -); - -/** - * @brief - * Set the waiting mode used when no more connections/sessions are available - * from the pool - * - * @param pool - Pool handle - * @param value - wait for object - * - * @note - * Pass : - * - FALSE to wait for an available object if the pool is saturated - * - TRUE to not wait for an available object - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetNoWait -( - OCI_Pool *pool, - boolean value -); - -/** - * @brief - * Return the current number of busy connections/sessions - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetBusyCount -( - OCI_Pool *pool -); - -/** - * @brief - * Return the current number of opened connections/sessions - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetOpenedCount -( - OCI_Pool *pool -); - -/** - * @brief - * Return the minimum number of connections/sessions that can be opened to the database - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetMin -( - OCI_Pool *pool -); - -/** - * @brief - * Return the maximum number of connections/sessions that can be opened to the database - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetMax -( - OCI_Pool *pool -); - -/** - * @brief - * Return the increment for connections/sessions to be opened to the database when the pool is - * not full - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetIncrement -( - OCI_Pool *pool -); - -/** - * @brief - * Return the maximum number of statements to keep in the pool statement cache - * - * @param pool - Pool handle - * - * @note - * Default value is 20 (value from Oracle Documentation) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetStatementCacheSize -( - OCI_Pool *pool -); - -/** - * @brief - * Set the maximum number of statements to keep in the pool statement cache - * - * @param pool - Pool handle - * @param value - maximum number of statements in the cache - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetStatementCacheSize -( - OCI_Pool *pool, - unsigned int value -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiTransactions Managing transactions - * @{ - * - * OCILIB supports local and global transactions. - * - * Local transactions are implicit within connection objects and there is no - * specific call or programming step for using it. - * - * In order to control changes made in the database: - * - * - OCI_Commit() validates current pending modifications - * - OCI_Rollback() discards current pending modifications - * - * OCILIB supports a feature called 'Auto Commit' that performs an implicit and - * automatic commit call after every execute call - * - * @note - * Those actions are executed within a connection context and not directly to a transaction. - * - * @warning - * Global transactions are optional and are designed for distributed or global - * transaction environments. - * - * OCILIB supports them by : - * - * - Creating/Destroying explicitly a transaction object - * - Starting/Stopping/Resuming explicitly the transaction - * - Preparing the transaction for specific calls - * - */ - -/** - * @brief - * Commit current pending changes - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Commit -( - OCI_Connection *con -); - -/** - * @brief - * Cancel current pending changes - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Rollback -( - OCI_Connection *con -); - -/** - * @brief - * Enable / disable auto commit mode - * - * The auto commit mode allows commit changes after every executed SQL order - * - * @param con - Connection handle - * @param enable - Enable (TRUE) or disable (FALSE) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetAutoCommit -( - OCI_Connection *con, - boolean enable -); - -/** - * @brief - * Get current auto commit mode status - * - * @param con - Connection handle - * - * @return - * TRUE if auto commit mode is activated otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_GetAutoCommit -( - OCI_Connection *con -); - -/** - * @brief - * Create a new global transaction or a serializable/read-only local transaction - * - * @param con - Connection handle - * @param timeout - Time that a transaction stays inactive after being stopped - * @param mode - Transaction mode - * @param pxid - pointer to a global transaction identifier structure - * - * - * @note - * The parameter 'mode' can be one of the following values : - * - * - Global transactions: - * - OCI_TRS_NEW : By default starts a new, tightly coupled and - * migratable branch. - * - OCI_TRS_TIGHT : explicitly specifies a tightly coupled branch - * - OCI_TRS_LOOSE : specifies a loosely coupled branch - * - * - Global and local transactions : - * - OCI_TRS_READONLY - start a read-only transaction - * - OCI_TRS_READWRITE - start a read-write transaction - * - OCI_TRS_SERIALIZABLE : start a serializable transaction - * - * @note - * For local transaction: - * - pass a NULL value for pxid - * - */ - -OCI_EXPORT OCI_Transaction * OCI_API OCI_TransactionCreate -( - OCI_Connection *con, - unsigned int timeout, - unsigned int mode, - OCI_XID *pxid -); - -/** - * @brief - * Free current transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionFree -( - OCI_Transaction *trans -); - -/** - * @brief - * Start global transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionStart -( - OCI_Transaction *trans -); - -/** - * @brief - * Stop current global transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionStop -( - OCI_Transaction *trans -); - -/** - * @brief - * Resume a stopped global transaction - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionResume -( - OCI_Transaction *trans -); - -/** - * @brief - * Prepare a global transaction validation - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionPrepare -( - OCI_Transaction *trans -); - -/** - * @brief - * Cancel the prepared global transaction validation - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionForget -( - OCI_Transaction *trans -); - -/** - * @brief - * Return global transaction mode. - * - * @note: - * see OCI_TransactionCreate() for possible values - * - * @param trans - Global transaction handle - * - * @return - * Transaction mode or OCI_UNKNOW if trans is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TransactionGetMode -( - OCI_Transaction *trans -); - -/** - * @brief - * Return global transaction Timeout - * - * @param trans - Global transaction handle - * - * @return - * Transaction timeout or 0 if trans is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TransactionGetTimeout -( - OCI_Transaction *trans -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiStatements Executing statements - * @{ - * - * Executing SQL statements or PL/SQL blocks is really simple with OCILIB. - * - * First, call OCI_StatementCreate() to allocate a statement handle. Then : - * - * - Prepare the SQL with OCI_Prepare() - * - Parse and execute it with OCI_Execute() - * - * These two steps can be done together by calling OCI_ExecuteStmt() that - * prepares and executes in one go. - * - * To find out if the statement has affected any rows, call OCI_GetAffectedRows() - * - * Finally, release the statement and its resources with OCI_StatementFree() - * - * @note - * A statement can be prepared once and executed as many times as needed (see - * Binding variables section) - * - * @note - * An OCI_Statement can be used to prepare and/or execute different SQL and PL/SQL - * statements as many times as needed. - * For example, if the SQL processing of an application is sequential, only - * one statement handle is required - * - * @note - * OCILIB supports nested levels of SQL statement processing. - * An application can loop through the resultset of the statement handle A, - * executing statement B and fetching statement C at every loop, and so on ... - * - * @par Example - * @include exec.c - * - */ - -/** - * @brief - * Create a statement object and return its handle - * - * @param con - Connection handle - * - * @return - * A statement handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_StatementCreate -( - OCI_Connection *con -); - -/** - * @brief - * Free a statement and all resources associated to it (resultsets ...) - * - * @param stmt - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_StatementFree -( - OCI_Statement *stmt -); - -/** - * @brief - * Prepare a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order or PL/SQL block - * - * @note - * Do not call this function for fetched statements (REF cursors) - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_Prepare -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Execute a prepared SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_API OCI_Execute -( - OCI_Statement *stmt -); - -/** - * @brief - * Prepare and Execute a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order - PL/SQL block - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_API OCI_ExecuteStmt -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Parse a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order - PL/SQL block - * - * @note - * This call sends the SQL or PL/SQL command to the server for parsing only. - * The command is not executed. - * This call is only useful to check is a command is valid or not. - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to parse its SQL or PL/SQL command. - * OCI_Execute() can be call after OCI_Parse() in order to execute the - * statement, which means that the server will re-parse again the command. - * - * @warning - * Do not use OCI_Parse() unless you're only interested in the parsing result - * because the statement will be parsed again when executed and thus leading to - * unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Parse -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Describe the select list of a SQL select statement. - * - * @param stmt - Statement handle - * @param sql - SELECT sql statement - * - * @note - * This call sends the SELECT SQL order to the server for retrieving the - * description of the select order only. - * The command is not executed. - * This call is only useful to retrieve information on the associated resultset - * Call OCI_GetResultet() after OCI_Describe() to access to SELECT list - * information - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to describe the output SELECT list. - * OCI_Execute() can be called after OCI_Desbribe() in order to execute the - * statement, which means that the server will parse, and describe again the SQL - * order. - * - * @warning - * Do not use OCI_Desbribe() unless you're only interested in the resultset - * information because the statement will be parsed again when executed and thus - * leading to unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Describe -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Return the last SQL or PL/SQL statement prepared or executed by the statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSql -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the error position (in terms of characters) in the SQL statement - * where the error occurred in case of SQL parsing error - * - * @param stmt - Statement handle - * - * @note - * Positions start at 1. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSqlErrorPos -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the number of rows affected by the SQL statement - * - * @param stmt - Statement handle - * - * The returned value is : - * - For UPDATEs : number of rows updated - * - For INSERTs : number of rows inserted - * - For DELETEs : number of rows deleted - * - * @note - * For SELECTs statements, use OCI_GetRowCount() instead - * - * @note - * For PL/SQL blocks performing "select into :": - * - it returns the number of rows selected from PL/SQL - * - Up to version 4.3.0, OCI_Execute() returned FALSE and generated an error ORA-01403 - "No Data Found" - * - From version 4.3.1, OCI_Execute() returns 0 if no data found, otherwise the number of selected rows - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetAffectedRows -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the Oracle SQL code the command held by the statement handle - * - * @param stmt - Statement handle - * - * @warning - * OCI_GetSQLCommand() must be called after the statement has be executed - * because that's the server engine that computes the SQL command code - * - * @return - * The SQL command code of the statement otherwise OCI_UNKOWN - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSQLCommand -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the verb of the SQL command held by the statement handle - * - * @param stmt - Statement handle - * - * @warning - * OCI_GetSQLVerb() must be called after the statement has been executed - * because that's the server engine that computes the SQL verb - * - * @note - * The SQL verb list is available in Oracle documentations and guides - * - * @return - * The SQL command verb of the statement otherwise NULL - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSQLVerb -( - OCI_Statement *stmt -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiBinding Binding variables and arrays - * @{ - * - * OCILIB supports OCI data binding APIs - * - * Programs variables can be binded to an Oracle SQL PL/SQL statement in order to : - * - * - Provide input data for SQL statement - * - Provide input/output data for PL/SQL blocks - * - * OCILIB provides a set of binding functions to use with: - * - * - Basic data types: string (char/wchar_t *), int, float, double, raw - * - Object data types: lobs, files,longs, dates, cursors, statements, - * timestamps, intervals, objects - * - * To use binding: - * - * - Prepare a statement with OCI_Prepare() (see Executing statements) - * - Bind variables by calling one if the OCI_Bindxxxxx() function for every - * input variable referenced by the SQL statement - * - Setup up values of the program variables - * - Call OCI_Execute() as many times as needed - * - Each OCI_Execute() call may be preceded by an update of the program - * variables (for INSERTs for example) - * - * Bindings can be: - * - IN (host variable are not used anymore after statement execution) - * - OUT (host variable are set during statement execution) - * - IN/OUT (default) - * Use OCI_BindSetDirectionTo() to change a host variable bind direction mode after the binding call but before statement execution. - * Note that each direction mode may have a little overhead depending on the SQL type as OCILIB may have to do checks/conversions/mappings between host variable and buffers. - * Thus, to maximize performances: - * - set direction mode to OCI_BDM_IN if host variable is not updated by statement execution - * - set direction mode to OCI_BDM_OUT if host variable value does not matter prior to statement execution - * - set direction mode to OCI_BDM_IN_OUT when host variable value is used for execution and updated by statement execution - * - * OCILIB supports the OCI array Interface by binding arrays of C scalar types - * and OCILIB object types. - * - * - all types supported the library can be used for array binding except - * OCI_Statement and OCI_Long - * - Array binding is really fast for massive DML operations - * - For string/RAW arrays, the input array MUST BE a contiguous block of data - * and not an array of pointers. So to bind an array of 10 elements for a - * varchar2(30) column, binded variable must be a like array[10][31] - * - * OCILIB does not pre-parse statements (like other frameworks such as JDBC, ...) - * and lets Oracle recognize input variables embedded within the SQL statements. - * - * Bind variables must be preceded in the SQL code by the character ':'. - * - * Oracle and OCILIB supports two ways of binding: - * - * - by name (default mode in OCILIB): Oracle looks for variables in the SQL - * statement by searching their names provided to the binding function. - * So a variable can be binded once and used many times in the statement - * - by position: Oracle binds variables by position, so every variable is - * binded with a position number - * - * OCILIB Default binding mode is OCI_BIND_BY_NAME. - * - * When using binding by position, provide the position to OCI_BindXXXX() call - * through the name parameter. Within this mode the bind name must be the - * position preceded by a semicolon like ':1', ':2', .... - * - * @par Internal Bind allocation mode - * - * Bind variables or arrays can be internally allocated by OCILIB. - * That means that instead of allocating variables or arrays on the stack/heap - * in the user program, bind contents can be allocated internally and thus : - * - minimize the amount of program variables - * - optimize internal memory management for arrays - * - * To do so : - * - Call OCI_SetBindAllocation() with the mode OCI_BAM_INTERNAL - * - pass a NULL variable or array to OCI_BindXXX() calls - * - Retrieve the bind content allocated by OCILIB with OCI_BindGetData() - * - * Internal Bind allocation mode IS compatible with ALL array binding OCI_BindArrayOfxxx() methods. - * - * Internal Bind allocation mode IS NOT compatible with some single variable bind calls : - * - OCI_BindTimestamp() - * - OCI_BindInterval() - * - OCI_BindLob() - * - OCI_BindFile() - * - OCI_BindObject() - * - OCI_BindColl() - * - OCI_BindRef() - * - OCI_BindStatement() - * - OCI_BindLong() - * - * These methods need to know the data sub type (like OCI_CLOB/OCI_BLOB for lobs) in order - * to internally create variables. As these methods prototypes are not passing the sub type, - * calling them with the statement bind mode set to OCI_BAM_INTERNAL will raise - * an OCILIB error of type OCI_ERR_NULL_POINTER - * - * @note - * Rebinding is disabled by default (see OCI_AllowRebinding()) - * When using rebinding feature, host variable re-binded to a previously allocated - * bind MUST be of the SAME data type ! - * - * @par Basic input bind Example - * @include bind.c - * - * @par Array interface Example - * @include array.c - * - * @par Internal Array interface Example - * @include array_internal.c - * - * */ - -/** - * @brief - * Set the input array size for bulk operations - * - * @param stmt - Statement handle - * @param size - Array size - * - * @warning - * Do not use OCI_BindArraySetSize() for PL/SQL tables binding - * - * @note - * OCI_BindArraySetSize() is used to set the size of input bind array when using - * arrays for DML statements. - * OCI_BindArraySetSize() MUST be called to set the maximum size of the arrays - * to bind to the statement before any of its execution. This initial call must - * be bone AFTER OCI_Prepare() and BEFORE any OCI_BindArrayOfxxx() call. - * - * @note - * OCI_BindArraySetSize() can optionally be called before any later OCI_Execute() - * call in order to notify the statement of the exact number of elements - * populating the input arrays for the next execution. The array size passed to - * later OCI_BindArraySetSize() calls cannot be greater than the initial size - * otherwise an exception will be thrown. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArraySetSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the current input array size for bulk operations - * - * @param stmt - Statement handle - * - * @return - * Array size value or 0 if OCI_BindArraySetSize() has not been called - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindArrayGetSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Allow different host variables to be binded using the same bind name or - * position between executions of a prepared statement - * - * @param stmt - Statement handle - * @param value - Rebinding mode allowed - * - * @note - * Default value is FALSE - * - * @warning - * When using rebinding feature, host variable re-binded to a previously allocated - * bind MUST be of the same data type ! - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_AllowRebinding -( - OCI_Statement *stmt, - boolean value -); - -/** - * @brief - * Indicate if rebinding is allowed on the given statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_AllowRebinding() for more details - * - * @return - * TRUE if allowed otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_IsRebindingAllowed -( - OCI_Statement *stmt -); - -/** -* @brief -* Bind a boolean variable (PL/SQL ONLY) -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Pointer to boolean variable -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @warning -* - OCI_BindBoolean() CAN ONLY BE USED for PL/SQL boolean type when calling PL/SQL procedures/function -* - ONLY supported by Oracle 12c and above ! -* -* @return -* TRUE on success otherwise FALSE -*/ -OCI_EXPORT boolean OCI_API OCI_BindBoolean -( - OCI_Statement *stmt, - const otext *name, - boolean *data -); - -/** -* @brief -* Bind an Number variable -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Pointer to short variable -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @return -* TRUE on success otherwise FALSE -*/ - -OCI_EXPORT boolean OCI_API OCI_BindNumber -( - OCI_Statement *stmt, - const otext *name, - OCI_Number *data -); - -/** -* @brief -* Bind an array of Number -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Array of numbers -* @param nbelem - Number of element in the array (PL/SQL table only) -* -* @warning -* Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. -* For regular DML array operations, pass the value 0. -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @return -* TRUE on success otherwise FALSE -*/ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfNumbers -( - OCI_Statement *stmt, - const otext *name, - OCI_Number **data, - unsigned int nbelem -); - -/** - * @brief - * Bind an short variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to short variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindShort -( - OCI_Statement *stmt, - const otext *name, - short *data -); - -/** - * @brief - * Bind an array of shorts - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of shorts - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfShorts -( - OCI_Statement *stmt, - const otext *name, - short *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned short variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned short variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedShort -( - OCI_Statement *stmt, - const otext *name, - unsigned short *data -); - -/** - * @brief - * Bind an array of unsigned shorts - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned shorts - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedShorts -( - OCI_Statement *stmt, - const otext *name, - unsigned short *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindInt -( - OCI_Statement *stmt, - const otext *name, - int *data -); - -/** - * @brief - * Bind an array of integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfInts -( - OCI_Statement *stmt, - const otext *name, - int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedInt -( - OCI_Statement *stmt, - const otext *name, - unsigned int *data -); - -/** - * @brief - * Bind an array of unsigned integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedInts -( - OCI_Statement *stmt, - const otext *name, - unsigned int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a big integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to big int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindBigInt -( - OCI_Statement *stmt, - const otext *name, - big_int *data -); - -/** - * @brief - * Bind an array of big integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of big int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfBigInts -( - OCI_Statement *stmt, - const otext *name, - big_int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned big integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned big int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedBigInt -( - OCI_Statement *stmt, - const otext *name, - big_uint *data -); - -/** - * @brief - * Bind an array of unsigned big integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned big int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedBigInts -( - OCI_Statement *stmt, - const otext *name, - big_uint *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a string variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - String to bind - * @param len - Max length of the string (in character without - * the zero null terminal character) - * - * @note - * if len == 0, len is set to the string size - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindString -( - OCI_Statement *stmt, - const otext *name, - otext *data, - unsigned int len -); - -/** - * @brief - * Bind an array of strings - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of string - * @param len - Max length of a single string element (in character without - * the zero null terminal character) - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @warning - * if len <= 0, it returns FALSE - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfStrings -( - OCI_Statement *stmt, - const otext *name, - otext *data, - unsigned int len, - unsigned int nbelem -); - -/** - * @brief - * Bind a raw buffer - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - buffer to bind - * @param len - Max length of the buffer - * - * @note - * if len <= 0, it returns false - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindRaw -( - OCI_Statement *stmt, - const otext *name, - void *data, - unsigned int len -); - -/** - * @brief - * Bind an array of raw buffers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of buffers - * @param len - Size in bytes on a single RAW array element - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * The buffer must be a contiguous block of data elements - * - * @note - * If len <= 0, it returns FALSE - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfRaws -( - OCI_Statement *stmt, - const otext *name, - void *data, - unsigned int len, - unsigned int nbelem -); - -/** - * @brief - * Bind a double variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to double variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindDouble -( - OCI_Statement *stmt, - const otext *name, - double *data -); - -/** - * @brief - * Bind an array of doubles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of double - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfDoubles -( - OCI_Statement *stmt, - const otext *name, - double *data, - unsigned int nbelem -); - - -/** - * @brief - * Bind a float variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to float variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindFloat -( - OCI_Statement *stmt, - const otext *name, - float *data -); - -/** - * @brief - * Bind an array of floats - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of float - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfFloats -( - OCI_Statement *stmt, - const otext *name, - float *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a date variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Date handle - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindDate -( - OCI_Statement *stmt, - const otext *name, - OCI_Date *data -); - -/** - * @brief - * Bind an array of dates - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of date handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfDates -( - OCI_Statement *stmt, - const otext *name, - OCI_Date **data, - unsigned int nbelem -); - -/** - * @brief - * Bind a timestamp variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Timestamp handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindTimestamp -( - OCI_Statement *stmt, - const otext *name, - OCI_Timestamp *data -); - -/** - * @brief - * Bind an array of timestamp handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Timestamp handle - * @param type - Timestamp type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_TimestampCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfTimestamps -( - OCI_Statement *stmt, - const otext *name, - OCI_Timestamp **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind an interval variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Interval handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindInterval -( - OCI_Statement *stmt, - const otext *name, - OCI_Interval *data -); - -/** - * @brief - * Bind an array of interval handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Interval handle - * @param type - Interval type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_IntervalCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfIntervals -( - OCI_Statement *stmt, - const otext *name, - OCI_Interval **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind a Lob variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Lob handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindLob -( - OCI_Statement *stmt, - const otext *name, - OCI_Lob *data -); - -/** - * @brief - * Bind an array of Lob handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Lob handle - * @param type - Lob type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_LobCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfLobs -( - OCI_Statement *stmt, - const otext *name, - OCI_Lob **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind a File variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - File handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindFile -( - OCI_Statement *stmt, - const otext *name, - OCI_File *data -); - -/** - * @brief - * Bind an array of File handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of File handle - * @param type - File type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_FileCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfFiles -( - OCI_Statement *stmt, - const otext *name, - OCI_File **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind an object (named type) variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Object handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindObject -( - OCI_Statement *stmt, - const otext *name, - OCI_Object *data -); - -/** - * @brief - * Bind an array of object handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of object handle - * @param typinf - type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfObjects -( - OCI_Statement *stmt, - const otext *name, - OCI_Object **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Collection variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Collection handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindColl -( - OCI_Statement *stmt, - const otext *name, - OCI_Coll *data -); - -/** - * @brief - * Bind an array of Collection handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Collection handle - * @param typinf - Type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_CollCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfColls -( - OCI_Statement *stmt, - const otext *name, - OCI_Coll **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Ref variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Ref handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindRef -( - OCI_Statement *stmt, - const otext *name, - OCI_Ref *data -); - -/** - * @brief - * Bind an array of Ref handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Ref handle - * @param typinf - type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfRefs -( - OCI_Statement *stmt, - const otext *name, - OCI_Ref **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Statement variable (PL/SQL Ref Cursor) - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Statement handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindStatement -( - OCI_Statement *stmt, - const otext *name, - OCI_Statement *data -); - -/** - * @brief - * Bind a Long variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Long handle - * @param size - Size of the long buffer in bytes or characters - * - * @note - * Size is expressed in: - * - Bytes for BLONGs - * - Characters for CLONGs - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindLong -( - OCI_Statement *stmt, - const otext *name, - OCI_Long *data, - unsigned int size -); - -/** - * @brief - * Returns the first or next error that occurred within a DML array statement execution - * - * @param stmt - Statement handle - * - * @return - * The first or next error handle otherwise NULL - */ - -OCI_EXPORT OCI_Error * OCI_API OCI_GetBatchError -( - OCI_Statement *stmt -); - -/** - * @brief - * Returns the number of errors that occurred within the last DML array statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBatchErrorCount -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the number of binds currently associated to a statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindCount -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the bind handle at the given index in the internal array of bind - * handle - * - * @param stmt - Statement handle - * @param index - Bind position - * - * @note - * Index starts at 1. - * - * @note - * Bind handle are created sequentially. For example, the third call to a - * OCI_BindXXX() generates a bind handle of index 3. - * - * @return - * The bind handle or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Bind * OCI_API OCI_GetBind -( - OCI_Statement *stmt, - unsigned int index -); - -/** - * @brief - * Return a bind handle from its name - * - * @param stmt - Statement handle - * @param name - Bind variable name - * - * @note - * Bind names must include a semicolon at the beginning. - * - * @return - * The bind handle or NULL if not found - * - */ - -OCI_EXPORT OCI_Bind * OCI_API OCI_GetBind2 -( - OCI_Statement *stmt, - const otext *name -); - -/** -* @brief -* Return the index of the bind from its name belonging to the given statement -* -* @param stmt - Statement handle -* @param name - Bind variable name -* -* @warning -* The bind name is case insensitive -* -* @note -* Bind indexes start with 1 in OCILIB -* -* @return -* Bind index on success or zero if the bind does not exists or if statement is NULL -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindIndex -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Return the name of the given bind - * - * @param bnd - Bind handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_BindGetName -( - OCI_Bind *bnd -); - - -/** - * @brief - * Set the direction mode of a bind handle - * - * @param bnd - Bind handle - * @param direction - direction mode - * - * @note - * Possible values for parameter 'direction' : - * - OCI_BDM_IN : input values (not modified by the server) - * - OCI_BDM_OUT : output values (modified by the server) - * - OCI_BDM_IN_OUT : input and output values - * - * @note - * Default value is OCI_BDM_IN_OUT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDirection -( - OCI_Bind *bnd, - unsigned int direction -); - -/** - * @brief - * Get the direction mode of a bind handle - * - * @param bnd - Bind handle - * - * @note - * see OCI_BindSetDirection() for more details - * - * return the bind direction mode on success otherwise OCI_UNKNWON - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDirection -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the OCILIB type of the given bind - * - * @param bnd - Bind handle - * - * @note - * Possible values are : - * - * - OCI_CDT_NUMERIC : short, int, long long, float, double - * - OCI_CDT_DATETIME : OCI_Date * - * - OCI_CDT_TEXT : otext * - * - OCI_CDT_LONG : OCI_Long * - * - OCI_CDT_CURSOR : OCI_Statement * - * - OCI_CDT_LOB : OCI_Lob * - * - OCI_CDT_FILE : OCI_File * - * - OCI_CDT_TIMESTAMP : OCI_Timestamp * - * - OCI_CDT_INTERVAL : OCI_Interval * - * - OCI_CDT_RAW : void * - * - OCI_CDT_OBJECT : OCI_Object * - * - OCI_CDT_COLLECTION : OCI_Coll * - * - OCI_CDT_REF : OCI_Ref * - * - OCI_CDT_BOOLEAN : boolean - * - * @return - * The column type or OCI_CDT_UNKNOWN on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetType -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the OCILIB object subtype of the given bind - * - * @param bnd - Bind handle - * - * @note - * * This call is valid for the following OCILIB types: - * - OCI_CDT_NUMERIC - * - OCI_CDT_LONG - * - OCI_CDT_LOB - * - OCI_CDT_FILE - * - OCI_CDT_TIMESTAMP - * - OCI_CDT_INTERVAL - * - * For numeric binds the possible values are: - * - OCI_NUM_SHORT - * - OCI_NUM_INT - * - OCI_NUM_BIGINT - * - OCI_NUM_USHORT - * - OCI_NUM_UINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * For OCI_Long type the possible values are: - * - OCI_BLONG - * - OCI_CLONG - * - * For OCI_Lob type the possible values are: - * - OCI_BLOB - * - OCI_CLOB - * - OCI_NCLOB - * - * For OCI_File type the possible values are: - * - OCI_BFILE - * - OCI_CFILE - * - * For OCI_Timestamp type the possible values are: - * - OCI_TIMESTAMP - * - OCI_TIMESTAMP_TZ - * - OCI_TIMESTAMP_LTZ - * - * For OCI_Interval type the possible values are: - * - OCI_INTERVAL_YM - * - OCI_INTERVAL_DS - * - * @note - * For all other OCILIB types, it returns OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetSubtype -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the number of elements of the bind handle - * - * @param bnd - Bind handle - * - * @return - * - For single binds, it returns 1 - * - For array binds, it returns the number of element in the array - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataCount -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the user defined data associated with a bind handle - * - * @param bnd - Bind handle - * - * @return - * - The pointer to variable/array passed to an OCI_BindXXX() or - * OCI_BindArrayOfXXX() call - * - */ - -OCI_EXPORT void * OCI_API OCI_BindGetData -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the statement handle associated with a bind handle - * - * @param bnd - bind handle - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_BindGetStatement -( - OCI_Bind *bnd -); - -/** - * @brief - * Set the actual size of the element held by the given bind handle - * - * @param bnd - bind handle - * @param size - data size - * - * @note - * This call is not mandatory and should ONLY be called for RAWs binds to set - * the real size of the given data if different from the expected column or - * parameter size - * - * @note - * It works as well with string based PL/SQL tables (in or in/out but NOT out) - * even if it's not necessary. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the parameter 'size' is expressed in - * number of characters. - * - * @return - * Data size if the bind type is listed above otherwise 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDataSize -( - OCI_Bind *bnd, - unsigned int size -); - -/** - * @brief - * Set the size of the element at the given position in - * the bind input array - * - * @param bnd - bind handle - * @param position - Position in the array - * @param size - data size - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * Before execution, it returns the max default size for the bind and not the real - * data size, unless a custom size has been set with OCI_BindSetDataSizeXXX() - * After execution, it returns the real data size. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the parameter 'size' is expressed in - * number of characters. - * - * @return - * Data size if the bind type is listed above otherwise 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDataSizeAtPos -( - OCI_Bind *bnd, - unsigned int position, - unsigned int size -); - -/** - * @brief - * Return the actual size of the element held by the given bind handle - * - * @param bnd - bind handle - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataSize -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the actual size of the element at the given position in - * the bind input array - * - * @param bnd - bind handle - * @param position - Position in the array - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataSizeAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the bind variable to null - * - * @param bnd - Bind handle - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Set to null the entry in the bind variable input array - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the bind variable to NOT null - * - * @param bnd - Bind handle - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNotNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Set to NOT null the entry in the bind variable input array - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNotNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Check if the current value of the binded variable is marked as NULL - * - * @param bnd - Bind handle - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindIsNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Check if the current entry value at the given index of the binded array - * is marked as NULL - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @warning - * Position starts with 1 - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindIsNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the charset form of the given character based bind variable - * - * @param bnd - Bind handle - * @param csfrm - charset form - * - * @note - * Possible values are : - * - * - OCI_CSF_DEFAULT : the column has default charset - * - OCI_CSF_NATIONAL: the column has national charset - * - * @note - * This call has to be made after OCI_Prepare() but before OCI_Execute() - * - * @warning - * This call does nothing : - * - if the csform is out of range - * - if the bind type is not OCI_CFT_TEXT or OCI_CDT_LONG - * - * @return - * TRUE on success otherwise FALSE - * - */ - -boolean OCI_API OCI_BindSetCharsetForm -( - OCI_Bind *bnd, - unsigned int csfrm -); - -/** - * @brief - * Get the allocaton mode of a bind handle - * - * @param bnd - Bind handle - * - * @note - * Possible values are : - * - OCI_BAM_EXTERNAL : bind variable is allocated by user code - * - OCI_BAM_INTERNAL : bind variable is allocated internally - * - * return the allocaton mode on success otherwise OCI_UNKNWON - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetAllocationMode -( - OCI_Bind *bnd -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFetching Fetching data - * @{ - * - * OCILIB offers a really easy and smart mechanism to fetch data from a SQL Statement. - * It looks like what's found in JDBC and other object oriented databases frameworks. - * - * ONLY the following statements can return resultsets that can be fetched by host programs: - * - Statements executing SQL SELECT - * - Statements executing SQL UPDATE/DELETE using a RETURNING INTO clause - * - Statements binded to PL/SQL OPEN FOR argument - * - Statements binded to PL/SQL procedure OUT variables - * - Statements implicitly returned from PL/SQL procedure or blocks (new feature in Oracle 12cR1) using - * DBMS_SQL.RETURN_RESULT() - * - * These resultsets are encapsulated in OCILIB by OCI_Resultset objects. - * - * Thus, after any successful call to an OCI_Executexxx() function that executed - * a fetchable statement or filled output bind variables, the resultset can be - * retrieved by calling OCI_GetResultset() - * - * The creation of a OCI_Resultset object consists in : - * - * - Describing the output columns of the resultset - * - Allocating memory to hold the content data - * - * OCILIB supports multi-row fetching for increasing performances. Instead of - * fetching data row by row from the server (that induces lots of round-trips - * between the client and the server), the library prefetches data chunk by - * chunks (default is 20 rows). - * So, less network traffic and better performances. - * These mechanisms are completely hidden from the application which fetches the - * resultset row by row. - * - * Once the Resultset handle is retrieved : - * - * - It can be fetched by calling OCI_FetchNext() as long as it returns TRUE. - * - To retrieve the value of a column, call OCI_GetXXXX() where XXXX is the - * type of data you want to fetch. - * - * @note - * In case of a statement that has executed PL/SQL calls or blocks returning implicit resultsets: - * - OCI_GetResultset() return the first available resultset - * - OCI_GetNextResultset() return the next available resultset until no more resultset available - * - * @par Scrollable Resultsets - * - * Oracle 9i introduced scrollable cursors (resultsets in OCILIB) that can be - * fetched: - * - * - Sequentially in both directions: OCI_FetchPrev() and OCI_FetchNext() - * - To a relative position in the resultset: OCI_FetchSeek() with OCI_SFD_RELATIVE - * - To an absolute position in the resultset: OCI_FetchSeek() with OCI_SFD_ABOSLUTE - * - To the first or last row in the resultset: OCI_FetchFirst() and OCI_FetchLast() - * - * Scrollable statements uses more server and client resources and should only - * be used when necessary. - * - * Resultsets are 'forward only' by default. Call OCI_SetFetchMode() with - * OCI_SFM_SCROLLABLE to enable scrollable resultsets for a given statement. - * - * @warning - * Any use of scrollable fetching functions with a resultset that depends on a - * statement with fetch mode set to OCI_SFM_DEFAULT will fail ! - * - * @warning - * If you intend to use OCI_FetchSeek() on a scrollable statement and if any of the - * selected columns is a ref cursor or a nested table, OCILIB will internally set the - * resultset internal array size to 1 and thus ignore any values set using OCI_SetFetchSize() - * This is performed due to an Oracle bug. - * - * @note - * If the column internal data does not match the requested type, OCILIB tries - * to convert the data when it's possible and throws an error if not. - * - * The properties (columns names, types ...) of the resultset are accessible - * through a set of APIs. - * - * @par Implicit conversion to string types - * - * OCI_GetString() performs an implicit conversion from ANY Oracle types: - * - * - Numerics (based on the current connection handle numeric format) - * - Binary doubles and floats (using the standard C Library functions) - * - OCI_Date : uses OCI_DateToText() with current connection date format - * - OCI_Timestamp : uses OCI_TimestampToText() with current connection date format - * - OCI_Interval : uses OCI_IntervalToText() with Oracle default format - * - OCI_Coll : uses OCI_CollToText() - * - OCI_Object : uses OCI_ObjectToText() - * - OCI_Ref : uses OCI_RefToText() - * - OCI_File : returns "$(folder)/$(filename)" - no content returned - * - OCI_Lob : see note above for binary types - * - OCI_Long : see note above for binary types - * - RAWs : see note above for binary types - * - * @note - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * For LONG and CLOBs/NCLOBSs attributes, the whole string content is returned - * - * @note - * The following OCILIB types are not supported for implicit conversion: - * - OCI_Statement - * - * @warning - * For Dates and numerics types, OCILIB uses OCI client calls to perform - * the conversion. - * For binary double and binary floats data types, OCI client functions cannot - * handle the full double range of values. Thus, OCILIB is using the - * standard C library to convert theses data types to string - * - * @par Fetching rows into user structures - * - * It is possible to fetch a complete row into a user defined structure. - * Each column of the resultset is mapped to a structure member. - * The mapping rules are : - * - LOBs (CLOB, NCLOB, BLOB) : OCI_Lob * - * - DATE : OCI_Date * - * - TIMESTAMPS : OCI_Timestamp * - * - INTERVALS : OCI_Interval * - * - LONG, LONG RAW : OCI_Long * - * - REFs : OCI_Ref * - * - CURSOR, RESULSET : OCI_Statement * - * - OBJECTS, UDT : OCI_Object * - * - Character columns (CHAR,VARCHAR, etc..) : otext * - * - All NUMERIC types : - * - default : big_int - * - user defined (see OCI_SetStructNumericType()) - * - * See OCI_GetStruct() and OCI_SetStructNumericType() for more details - * - * @par Fetch Example - * @include fetch.c - * - * @par Fetch Rows into user structures Example - * @include fetch_struct.c - * - * @par Meta data Example - * @include meta.c - * - * @par Ref cursor Example - * @include cursor.c - * - * @par Implicit resultset Example - * @include implicit_resultset.c - * - * @par Scrollable resultset Example - * @include scroll.c - * - */ - -/** - * @brief - * Retrieve the resultset handle from an executed statement - * - * @param stmt - Statement handle - * - * @note - * See @ref OcilibCApiFetching for more details about what statements can return resultsets - * - * @warning - * If the statement has not been prepared and executed, no resultset will be returned - * - * @return - * A resultset handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Resultset * OCI_API OCI_GetResultset -( - OCI_Statement *stmt -); - -/** - * @brief - * Free the statement resultsets - * - * @param stmt - Statement handle - * - * @note - * This call is optional. Resultsets are automatically freed when the - * statement is destroyed or when it's reused. - * - * @note - * This function has been introduced for releasing big resultsets when the - * application wants to keep the statement alive and doesn't know when it - * will be destroyed. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ReleaseResultsets -( - OCI_Statement *stmt -); - -/** - * @brief - * Fetch the next row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchNext() works for normal and scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - Last row already fetched - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchNext -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the previous row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchPrev() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - First row already fetched - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchPrev -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the first row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchFirst() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - An error occurred - *f - */ - -OCI_EXPORT boolean OCI_API OCI_FetchFirst -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the last row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchLast() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if: - * - Empty resultset - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchLast -( - OCI_Resultset *rs -); - -/** - * @brief - * Custom Fetch of the resultset - * - * @param rs - Resultset handle - * @param mode - Fetch direction - * @param offset - Fetch offset - * - * @note - * Possible values for 'direction' parameter are: - * - OCI_SFD_ABSOLUTE - * - OCI_SFD_RELATIVE - * - * @note - * OCI_FetchSeek() works ONLY for scrollable resultsets - * - * @warning - * If you intend to use OCI_FetchSeek() on a scrollable statement and if any of the - * selected columns is a ref cursor or a nested table, you must set the fetching size - * to 1 using OCI_SetFetchSize() before calling OCI_GetResultset() - * Otherwise OCI_FetchSeek() will fails with a OCI-10002 error - * - * @return - * TRUE on success otherwise FALSE if: - * - Empty resultset - * - An error occurred - * - OCI_SetFetchMode() has not been called with OCI_SFM_SCROLLABLE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchSeek -( - OCI_Resultset *rs, - unsigned int mode, - int offset -); - -/** - * @brief - * Retrieve the number of rows fetched so far - * - * @param rs - Resultset handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRowCount -( - OCI_Resultset *rs -); - -/** - * @brief - * Retrieve the current row number - * - * @param rs - Resultset handle - * - * @note - * - OCI_GetCurrentRow() returns the current row number starting from 1 - * - If the resultset has not been fetched or if the resultset is empty, it returns 0 - * - If the resultset has been fully fetched, it returns the last fetched row number - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetCurrentRow -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the number of columns in the resultset - * - * @param rs - Resultset handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetColumnCount -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the column object handle at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @return - * - Column handle on success - * - NULL if index is out of bounds or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_GetColumn -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the column object handle from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * - Column handle on success or - * - NULL if no column found with the given name or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_GetColumn2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the index of the column in the result from its name - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @note - * Column indexes start with 1 in OCILIB - * - * @return - * Column index on success or zero on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetColumnIndex -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the name of the given column - * - * @param col - Column handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ColumnGetName -( - OCI_Column *col -); - -/** - * @brief - * Return the type of the given column - * - * @param col - Column handle - * - * @note - * Possible values are : - * - * - OCI_CDT_NUMERIC : short, int, long long, float, double - * - OCI_CDT_DATETIME : OCI_Date * - * - OCI_CDT_TEXT : otext * - * - OCI_CDT_LONG : OCI_Long * - * - OCI_CDT_CURSOR : OCI_Statement * - * - OCI_CDT_LOB : OCI_Lob * - * - OCI_CDT_FILE : OCI_File * - * - OCI_CDT_TIMESTAMP : OCI_Timestamp * - * - OCI_CDT_INTERVAL : OCI_Interval * - * - OCI_CDT_RAW : void * - * - OCI_CDT_OBJECT : OCI_Object * - * - OCI_CDT_COLLECTION : OCI_Coll * - * - OCI_CDT_REF : OCI_Ref * - * - OCI_CDT_BOOLEAN : boolean - * - * @return - * The column type or OCI_CDT_UNKNOWN if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetType -( - OCI_Column *col -); - -/** - * @brief - * Return the charset form of the given column - * - * @param col - Column handle - * - * @note - * Possible values are : - * - OCI_CSF_NONE : the column is not an character or lob column - * - OCI_CSF_DEFAULT : the column has server default charset - * - OCI_CSF_NATIONAL : the column has national server charset - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetCharsetForm -( - OCI_Column *col -); - -/** - * @brief - * Return the Oracle SQL type name of the column data type - * - * @param col - Column handle - * - * @note - * For possible values, consults Oracle Documentation - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ColumnGetSQLType -( - OCI_Column *col -); - -/** - * @brief - * Return the Oracle SQL Full name including precision and size of the - * column data type - * - * @param col - Column handle - * @param buffer - buffer to store the full column type name and size - * @param len - max size of the buffer in characters - * - * @note - * This function returns a description that matches the one given by SQL*Plus - * - * @note - * Return the number of characters written into the buffer - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetFullSQLType -( - OCI_Column *col, - otext *buffer, - unsigned int len -); - -/** - * @brief - * Return the size of the column - * - * @note - * For all types, the size is expressed is bytes, excepted for character - * based columns that were created with a character based size or of type NCHAR/NVARCHAR - * - * @param col - Column handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetSize -( - OCI_Column *col -); - -/** - * @brief - * Return the scale of the column for numeric columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetScale -( - OCI_Column *col -); - -/** - * @brief - * Return the precision of the column for numeric columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the fractional precision of the column for timestamp and interval columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetFractionalPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the leading precision of the column for interval columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetLeadingPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the nullable attribute of the column - * - * @param col - Column handle - * - * @return - * Return TRUE if the column is nullable otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ColumnGetNullable -( - OCI_Column *col -); - -/** - * @brief - * Return TRUE if the length of the column is character-length or FALSE if - * it is byte-length - * - * @param col - Column handle - * - * @note - * This was introduced in Oracle 9i. So for version that are not supporting this - * property, it always return FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ColumnGetCharUsed -( - OCI_Column *col -); - -/** - * @brief - * Return the column property flags - * - * @param col - Column handle - * - * For flags are: - * - OCI_CPF_NONE : The column has no flags or the OCI client does not support this call - * - OCI_CPF_IS_IDENTITY : - * - If Set, the column is an IDENTITY column - * - Otherwise, it is not an IDENTITY column - * - OCI_CPF_IS_GEN_ALWAYS (only if OCI_CPF_IS_IDENTITY is set) : - * - If set, means that the value is "ALWAYS GENERATED" - * - Otherwise mens that the value is "GENERATED BY" - * - OCI_CPF_IS_GEN_BY_DEFAULT_ON_NULL (only if OCI_CPF_IS_IDENTITY is set): - * - If set, means that the value is generated by default on NULL - * - * @note - * This was introduced in Oracle 12cR1. - * It is currently used for identifying Identity columns. - * For earlier versions, it always return OCI_CPF_NONE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetPropertyFlags -( - OCI_Column *col -); - -/** -* @brief -* Return the column collation ID -* -* @param col - Column handle -* -* Possible values: -* - OCI_CCI_NONE -* - OCI_CCI_NLS_COMP -* - OCI_CCI_NLS_SORT -* - OCI_CCI_NLS_SORT_CI -* - OCI_CCI_NLS_SORT_AI -* - OCI_CCI_NLS_SORT_CS -* - OCI_CCI_NLS_SORT_VAR1 -* - OCI_CCI_NLS_SORT_VAR1_CI -* - OCI_CCI_NLS_SORT_VAR1_AI -* - OCI_CCI_NLS_SORT_VAR1_CS -* - OCI_CCI_BINARY -* - OCI_CCI_BINARY_CI -* - OCI_CCI_BINARY_AI -* -* @note -* This was introduced in Oracle 12cR2. -* For earlier versions, it always return OCI_CCI_NONE -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetCollationID -( - OCI_Column *col -); - -/** - * @brief - * Return the type information object associated to the column - * - * @param col - Column handle - * - * @note - * This call is used only for Named Object typed and collection columns. - * It returns NULL if the column is not a Named Object or a collection. - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_ColumnGetTypeInfo -( - OCI_Column *col -); - -/** - * @brief - * Return the OCILIB object subtype of a column - * - * @param col - Column handle - * - * @note - * This call is valid for the following OCILIB types: - * - * - OCI_CDT_LONG - * - OCI_CDT_LOB - * - OCI_CDT_FILE - * - OCI_CDT_TIMESTAMP - * - OCI_CDT_INTERVAL - * - OCI_CDT_NUMERIC - * - * For OCI_Long type the possible values are: - * - OCI_BLONG - * - OCI_CLONG - * - * For OCI_Lob type the possible values are: - * - OCI_BLOB - * - OCI_CLOB - * - OCI_NCLOB - * - * For OCI_File type the possible values are: - * - OCI_BFILE - * - OCI_CFILE - * - * For OCI_Timestamp type the possible values are: - * - OCI_TIMESTAMP - * - OCI_TIMESTAMP_TZ - * - OCI_TIMESTAMP_LTZ - * - * For OCI_Interval type the possible values are: - * - OCI_INTERVAL_YM - * - OCI_INTERVAL_DS - * - * For numeric columns the possible values are: - * - OCI_NUM_SHORT - * - OCI_NUM_INT - * - OCI_NUM_BIGINT - * - OCI_NUM_USHORT - * - OCI_NUM_UINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @warning - * For numeric columns, the value may be not accurate at all! - * OCI does not allow to find out the real SQL precise type of an numeric column (int, real, ...). - * OCI based libraries can only 'guess' some types in some situations : float, binary_float, binary_float, number. - * For example: - * - with the statement 'select 101 from dual', OCI would report numeric type NUMBER. - * - if a column is declared as "INT", OCI would report also NUMBER. - * - * - * @note - * For all other OCILIB types, it returns OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetSubType -( - OCI_Column *col -); - -/** - * @brief - * set the numeric data type of the given structure member (identified from position in the - * resultset) to retrieve when calling OCI_GetStruct() - * - * @param rs - Resultset handle - * @param index - Column position - * @param type - Numeric type - * - * @note - * Possible values for parameter 'type' : - * - OCI_NUM_SHORT - * - OCI_NUM_USHORT - * - OCI_NUM_INT - * - OCI_NUM_UINT - * - OCI_NUM_BIGINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStructNumericType -( - OCI_Resultset *rs, - unsigned int index, - unsigned int type -); - -/** - * @brief - * set the numeric data type of the given structure member (identified from column name in the - * resultset) to retrieve when calling OCI_GetStruct() - * - * @param rs - Resultset handle - * @param name - Column name - * @param type - Numeric type - * - * @note - * Possible values for parameter 'type' : - * - OCI_NUM_SHORT - * - OCI_NUM_USHORT - * - OCI_NUM_INT - * - OCI_NUM_UINT - * - OCI_NUM_BIGINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStructNumericType2 -( - OCI_Resultset *rs, - const otext *name, - unsigned int type -); - -/** - * @brief - * Return the row columns values into a single structure - * - * @param rs - Resultset handle - * @param row_struct - pointer to user row structure - * @param row_struct_ind - pointer to user indicator structure - * - * @note - * Structure members values are contextual to the current row. - * The returned values can get out of scope when the current row - * changes when calling any OCI_FecthXXX() calls - * - * @par User row structure - * - * The user structure must have the same members than the resultset. - * Each column in the resultset must have its equivalent in the structure. - * Fields must be in the same order. - * - * The mapping rules are : - * - * - LOBs (CLOB, NCLOB, BLOB) : OCI_Lob * - * - DATE : OCI_Date * - * - TIMESTAMPS : OCI_Timestamp * - * - INTERVALS : OCI_Interval * - * - LONG, LONG RAW : OCI_Long * - * - REFs : OCI_Ref * - * - CURSOR, RESULSET : OCI_Statement * - * - OBJECTS, UDT : OCI_Object * - * - Character columns (CHAR,VARCHAR, etc..) : otext * - * - All NUMERIC types : - * - default : big_int - * - user defined (see OCI_SetStructNumericType()) - * - * The user structure pointer is not mandatory - * - * @par User row indicator structure - - * This structure must have one boolean field per column in - * the resultset and respect in the same member order. - * - * If the value of the given member is TRUE, it means the value in - * the user row structure is NOT NULL, otherwise its NULL - * - * The user indicator structure pointer is mandatory - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_GetStruct -( - OCI_Resultset *rs, - void *row_struct, - void *row_struct_ind -); - -/** -* @brief -* Return the current Number value of the column at the given index in the resultset -* -* @param rs - Resultset handle -* @param index - Column position -* -* @note -* Column position starts at 1. -* -* @return -* The column current row value or 0 if index is out of bounds -* -*/ -OCI_EXPORT OCI_Number * OCI_API OCI_GetNumber -( - OCI_Resultset *rs, - unsigned int index -); - -/** -* @brief -* Return the current number value of the column from its name in the resultset -* -* @param rs - Resultset handle -* @param name - Column name -* -* @note -* The column name is case insensitive -* -* @return -* The column current row value or 0 if no column found with the given name -* -*/ - -OCI_EXPORT OCI_Number * OCI_API OCI_GetNumber2 -( - OCI_Resultset *rs, - const otext *name -); - - -/** - * @brief - * Return the current short value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT short OCI_API OCI_GetShort -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current short value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT short OCI_API OCI_GetShort2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned short value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_GetUnsignedShort -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned short value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_GetUnsignedShort2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT int OCI_API OCI_GetInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT int OCI_API OCI_GetInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetUnsignedInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetUnsignedInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current big integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT big_int OCI_API OCI_GetBigInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current big integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT big_int OCI_API OCI_GetBigInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned big integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT big_uint OCI_API OCI_GetUnsignedBigInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned big integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT big_uint OCI_API OCI_GetUnsignedBigInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current string value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @note - * OCI_GetString() performs an implicit conversion from the - * following data types: - * - * - Numerics (based on the current connection handle numeric format) - * - Binary doubles and floats (using the standard C Library functions) - * - OCI_Number (based on the current connection handle numeric format) - * - OCI_Date (based on the current connection handle date format) - * - OCI_Timestamp (based on the current connection handle date format) - * - OCI_Interval (based on Oracle default conversion) - * - OCI_Lob (for BLOBs, output is expressed in hexadecimal) - * - OCI_Long (for BLONGs, output is expressed in hexadecimal) - * - OCI_File ("[directory]/[name]" will be output) - * - OCI_Object (Textual SQL string representation) - * - OCI_Coll (Textual SQL string representation) - * - RAW buffer (expressed in hexadecimal) - * - OCI_Statement (SQL statement string or cursor name) - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetString -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current string value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetString2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Copy the current raw value of the column at the given index into the specified buffer - * - * @param rs - Resultset handle - * @param index - Column position - * @param buffer - Buffer that receive the raw value - * @param len - Max size of the input buffer in bytes - * - * @note - * Column position starts at 1. - * - * @return - * Number of bytes copied into the buffer on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRaw -( - OCI_Resultset *rs, - unsigned int index, - void *buffer, - unsigned int len -); - -/** - * @brief - * Copy the current raw value of the column from its name into the specified buffer - * - * @param rs - Resultset handle - * @param name - Column name - * @param buffer - Buffer that receive the raw value - * @param len - Max size of the input buffer - * - * @note - * The column name is case insensitive - * - * @return - * Number of bytes copied into the buffer on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRaw2 -( - OCI_Resultset *rs, - const otext *name, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the current double value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0.O if index is out of bounds - * - */ - -OCI_EXPORT double OCI_API OCI_GetDouble -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current double value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0.0 if no column found with the given name - * - */ - -OCI_EXPORT double OCI_API OCI_GetDouble2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current float value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0.O if index is out of bounds - * - */ - -OCI_EXPORT float OCI_API OCI_GetFloat -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current float value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0.0 if no column found with the given name - * - */ - -OCI_EXPORT float OCI_API OCI_GetFloat2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current date value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_GetDate -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current date value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_GetDate2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current timestamp value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetTimestamp -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current timestamp value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetTimestamp2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current interval value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_GetInterval -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current interval value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_GetInterval2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current cursor value (Nested table) of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_GetStatement -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current cursor value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_GetStatement2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current lob value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_GetLob -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current lob value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_GetLob2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current File value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_GetFile -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current File value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_GetFile2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Object value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_GetObject -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Object value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_GetObject2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Collection value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_GetColl -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Collection value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_GetColl2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Ref value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_GetRef -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Ref value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_GetRef2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Long value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_GetLong -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Long value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_GetLong2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Check if the current row value is null for the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsNull -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the size of the value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - * @return value size of 0 if the value is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataSize -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the size of the value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - * @return value size of 0 if the value is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataSize2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Check if the current row value is null for the column of the given name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsNull2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the statement handle associated with a resultset handle - * - * @param rs - resultset handle - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_ResultsetGetStatement -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the current row data length of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row data length or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataLength -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiPlSql PL/SQL Support - * @{ - * - * OCILIB has a strong PL/SQL support : - * - * - Blocks, procedures and function can be used with OCILIB statements. - * - Ref cursors - * - Nested tables - * - Tables (indexed by integer types) - * - Access to the server side output generated by the DBMS_OUTPUT package - * - * Stored procedures/functions calls, blocks declarations are done like regular - * SQL calls using OCI_Prepare(), OCI_Execute(), OCI_ExecuteStmt() and - * OCI_ExecuteStmtFmt() functions. - * - * All PL/SQL statements must: - * - * - start with a 'begin' or 'declare' keyword - * - end with a 'end;' keyword - * - * Binding Host arrays to PL/SQL tables is done with OCI_BindArrayXXX() calls - * - * @par Using a PL/SQL block with OCILIB - * @include plsql_block.c - * - * @par Binding host arrays to PL/SQL tables parameters of a stored procedure - * @include plsql_table.c - * - * @par Retrieve the output generated by the dbms_output package on the server - * @include output.c - * - */ - -/** - * @brief - * Enable the server output - * - * @param con - Connection handle - * @param bufsize - server buffer max size (server side) - * @param arrsize - number of lines to retrieve per server round-trip - * @param lnsize - maximum size of one line - * - * @note - * This call is equivalent to the command 'set serveroutput on' in SQL*PLUS - * - * @note - * 'bufsize' minimum value is 2000, maximum 1000000 with Oracle < 10.2g and can be unlimited above - * - * @note - * 'lnsize' maximum value is 255 with Oracle < 10g R2 and 32767 above - * - * @warning - * If OCI_ServerEnableOutput() is not called, OCI_ServerGetOutput() will return NULL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ServerEnableOutput -( - OCI_Connection *con, - unsigned int bufsize, - unsigned int arrsize, - unsigned int lnsize -); - -/** - * @brief - * Disable the server output - * - * @param con - Connection handle - * - * @note - * After this call, OCI_ServerGetOutput() will return NULL. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ServerDisableOutput -( - OCI_Connection *con -); - -/** - * @brief - * Retrieve one line of the server buffer - * - * @param con - Connection handle - * - * @note - * Internally, OCILIB gets the server buffer through an array of lines in - * order to minimize round-trips with the server - * - * @return - * return a server output buffer line or NULL if the server buffer is empty - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ServerGetOutput -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiCollections Oracle collections (VARRAYS and Nested Tables) - * @{ - * - * OCILIB supports all Oracle collections: - * - * - PL/SQL Tables: only available in PL/SQL, unbounded, sparse arrays of - homogeneous elements. - * - VARRAYS : available in SQL and PL/SQL, they are bounded arrays of - * homogeneous elements - * - Nested Tables: available in SQL and PL/SQL, they are unbounded arrays of - * homogeneous elements and can become sparse through deletions - * - * PL/SQL tables are implemented by binding regular C arrays with the array - * interface (using OCI_BindArrayOfXXX() calls) - * - * VARRAYS and Nested tables are implemented in OCILIB with the type OCI_Coll. - * It's possible to bind and fetch VARRAYS and Nested tables using OCI_Coll handle. - * - * It's also possible to declare local collections based on some database type without using queries - * - * OCI (and thus OCILIB) offers the possibility to access collection elements : - * - * - directly by index (OCI_CollGetElem() and OCI_CollSetElem()) - * - using an iterator (OCI_Iter) to iterate through the collection - * (OCI_IterGetNext(), OCI_IterGetPrev()) - * - * Collection Items are implemented through the type OCI_Elem and use the series - * of calls OCI_ElemGetXXX() and OCI_ElemSetXXX() to manipulate elements - * content values - * - * @par Example - * @include coll.c - * - */ - -/** - * @brief - * Create a local collection instance - * - * @param typinf - Type info handle of the collection type descriptor - * - * @return - * Return the collection object handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_CollCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local collection - * - * @param coll - Collection handle - * - * @warning - * Only collection created with OCI_CollCreate() should be freed - * by OCI_CollFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollFree -( - OCI_Coll *coll -); - -/** - * @brief - * Create an array of Collection object - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_ObjectCreate() for more details - * - * @return - * Return the Collection handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Coll ** OCI_API OCI_CollArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Collection objects - * - * @param colls - Array of Collection objects - * - * @warning - * Only arrays of Collection created with OCI_CollArrayCreate() - * should be freed by OCI_CollArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollArrayFree -( - OCI_Coll **colls -); - -/** - * @brief - * Assign a collection to another one - * - * @param coll - Destination Collection handle - * @param coll_src - Source Collection handle - * - * @note - * Oracle proceeds to a deep copy of the collection content - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollAssign -( - OCI_Coll *coll, - OCI_Coll *coll_src -); - -/** - * @brief - * Return the type info object associated to the collection - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_CollGetTypeInfo -( - OCI_Coll *coll -); - -/** - * @brief - * Return the collection type - * - * @param coll - Collection handle - * - * @note - * Current collection types are: - * - * - OCI_COLL_VARRAY: Oracle VARRAY - * - OCI_COLL_NESTED_TABLE: Oracle Nested Table - * - * @return - * Collection type or OCI_UNKNOWN if the collection handle is null - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetType -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the maximum number of elements of the given collection. - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetMax -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the total number of elements of the given collection. - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetSize -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the current number of elements of the given collection. - * - * @note - * - For VARRAYs, it returns the same value than OCI_CollGetSize() as VARRAYs cannot contains holes - * - For Nested Tables that are spare collections that can have holes, it returns the total number - * of elements minus the total of deleted elements - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetCount -( - OCI_Coll *coll -); - -/** - * @brief - * Trims the given number of elements from the end of the collection - * - * @param coll - Collection handle - * @param nb_elem - Number of elements to trim - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollTrim -( - OCI_Coll *coll, - unsigned int nb_elem -); - -/** - * @brief - * clear all items of the given collection - * - * @param coll - Collection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollClear -( - OCI_Coll *coll -); - -/** - * @brief - * Return the element at the given position in the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * - * @note - * Collection indexes start at position 1. - * - * @return - * Element handle on success otherwise FALSE - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_CollGetElem -( - OCI_Coll *coll, - unsigned int index -); - -/** - * @brief - * Return the element at the given position in the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * @param elem - Element handle to hold the collection item data - * - * @note - * Collection indexes start at position 1. - * - * @return - * Element handle on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollGetElem2 -( - OCI_Coll *coll, - unsigned int index, - OCI_Elem *elem -); - -/** - * @brief - * Assign the given element value to the element at the given position in - * the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * @param elem - Source element handle to assign - * - * @note - * Collection indexes start at position 1. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollSetElem -( - OCI_Coll *coll, - unsigned int index, - OCI_Elem *elem -); - -/** - * @brief - * Append the given element at the end of the collection - * - * @param coll - Collection handle - * @param elem - Element handle to add - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollAppend -( - OCI_Coll *coll, - OCI_Elem *elem -); - -/** - * @brief - * Convert a collection handle value to a string - * - * @param coll - Collection handle - * @param size - Destination string length pointer in characters - * @param str - Destination string - * - * @note - * In order to compute the needed string length, call the method with a NULL string - * Then call the method again with a valid buffer - * - * @note - * The resulting string is similar to the SQL*PLUS output for collections - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * - * @warning - * This convenient method shall not be used when performance matters. It is usually called twice (buffer length - * computation) and must also care about quotes within strings. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollToText -( - OCI_Coll *coll, - unsigned int *size, - otext *str -); - -/** - * @brief - * Delete the element at the given position in the Nested Table Collection - * - * @param coll - Collection handle - * @param index - Index of the element to delete - * - * @note - * Collection indexes start at position 1. - * - * @warning - * OCI_CollDeleteElem() is only valid for nested tables. - * - * @return - * - if the input collection is a nested table, it returns TRUE if the element - * is successfully deleted otherwise FALSE on error - * - if the input collection is a VARRAY, it always returns FALSE without spawning an exception - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollDeleteElem -( - OCI_Coll *coll, - unsigned int index -); - -/** - * @brief - * Create an iterator handle to iterate through a collection - * - * @param coll - Collection handle - * - * @return - * Return the iterator handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Iter * OCI_API OCI_IterCreate -( - OCI_Coll *coll -); - -/** - * @brief - * Free an iterator handle - * - * @param iter - Iterator handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IterFree -( - OCI_Iter *iter -); - -/** - * @brief - * Get the next element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetNext -( - OCI_Iter *iter -); - -/** - * @brief - * Get the previous element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetPrev -( - OCI_Iter *iter -); - -/** - * @brief - * Get the current element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetCurrent -( - OCI_Iter *iter -); - -/** - * @brief - * Create a local collection element instance based on a collection type - * descriptor - * - * @param typinf - Type info handle - * - * @return - * Return the collection element handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_ElemCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local collection element - * - * @param elem - Element handle - * - * @warning - * Only element created with OCI_ElemCreate() should be freed - * by OCI_ElemFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemFree -( - OCI_Elem *elem -); - -/** -* @brief -* Return the boolean value of the given collection element -* -* @param elem - Element handle -* -* @warning -* OCI_ElemGetBoolean() returns a valid value only for collection elements of PL/SQL boolean type -* -* @return -* boolean value or FALSE on failure -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemGetBoolean -( - OCI_Elem *elem -); - -/** -* @brief -* Return the number value of the given collection element -* -* @param elem - Element handle -* -* @return -* number handle or NULL on failure -* -*/ - -OCI_EXPORT OCI_Number* OCI_API OCI_ElemGetNumber -( - OCI_Elem *elem -); - -/** - * @brief - * Return the short value of the given collection element - * - * @param elem - Element handle - * - * @return - * Short value or 0 on failure - * - */ - -OCI_EXPORT short OCI_API OCI_ElemGetShort -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned short value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned short value or 0 on failure - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_ElemGetUnsignedShort -( - OCI_Elem *elem -); - -/** - * @brief - * Return the int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Int value or 0 on failure - * - */ - -OCI_EXPORT int OCI_API OCI_ElemGetInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned int value or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetUnsignedInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the big int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Big int value or 0 on failure - * - */ - -OCI_EXPORT big_int OCI_API OCI_ElemGetBigInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned big int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned big int value or 0 on failure - * - */ - -OCI_EXPORT big_uint OCI_API OCI_ElemGetUnsignedBigInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Double value of the given collection element - * - * @param elem - Element handle - * - * @return - * Double value or 0 on failure - * - */ - -OCI_EXPORT double OCI_API OCI_ElemGetDouble -( - OCI_Elem *elem -); - -/** - * @brief - * Return the float value of the given collection element - * - * @param elem - Element handle - * - * @return - * Double value or 0 on failure - * - */ - -OCI_EXPORT float OCI_API OCI_ElemGetFloat -( - OCI_Elem *elem -); - -/** - * @brief - * Return the String value of the given collection element - * - * @param elem - Element handle - * - * @return - * String value or NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ElemGetString -( - OCI_Elem *elem -); - -/** - * @brief - * Read the RAW value of the collection element into the given buffer - * - * @param elem - Element handle - * @param value - Buffer to store the RAW value - * @param len - Size of the buffer - * - * @return - * Number of bytes read from the RAW value or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetRaw -( - OCI_Elem *elem, - void *value, - unsigned int len -); - -/** -* @brief -* Return the raw attribute value size of the given element handle -* -* @param elem - Element handle -* -* @return -* size in bytes of the RAW value or 0 on failure or wrong attribute type -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetRawSize -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Date value of the given collection element - * - * @param elem - Element handle - * - * @return - * Date handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_ElemGetDate -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Timestamp value of the given collection element - * - * @param elem - Element handle - * - * @return - * Timestamp handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_ElemGetTimestamp -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Interval value of the given collection element - * - * @param elem - Element handle - * - * @return - * Interval handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_ElemGetInterval -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Lob value of the given collection element - * - * @param elem - Element handle - * - * @return - * Lob handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_ElemGetLob -( - OCI_Elem *elem -); - -/** - * @brief - * Return the File value of the given collection element - * - * @param elem - Element handle - * - * @return - * File handle or NULL on failure - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_ElemGetFile -( - OCI_Elem *elem -); - -/** - * @brief - * Return the object value of the given collection element - * - * @param elem - Element handle - * - * @return - * Object handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ElemGetObject -( - OCI_Elem *elem -); - -/** - * @brief - * Return the collection value of the given collection element - * - * @param elem - Element handle - * - * @return - * Collection handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_ElemGetColl -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Ref value of the given collection element - * - * @param elem - Element handle - * - * @return - * Ref handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_ElemGetRef -( - OCI_Elem *elem -); - -/** -* @brief -* Set a boolean value to a collection element -* -* @param elem - Element handle -* @param value - Short value -* -*@warning -* OCI_ElemSetBoolean() is only valid value only for collection elements of PL / SQL boolean type -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemSetBoolean -( - OCI_Elem *elem, - boolean value -); - -/** -* @brief -* Set a number value to a collection element -* -* @param elem - Element handle -* @param value - number value -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemSetNumber -( - OCI_Elem *elem, - OCI_Number *value -); - -/** - * @brief - * Set a short value to a collection element - * - * @param elem - Element handle - * @param value - Short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetShort -( - OCI_Elem *elem, - short value -); - -/** - * @brief - * Set a unsigned short value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedShort -( - OCI_Elem *elem, - unsigned short value -); - -/** - * @brief - * Set a int value to a collection element - * - * @param elem - Element handle - * @param value - Int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetInt -( - OCI_Elem *elem, - int value -); - -/** - * @brief - * Set a unsigned int value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedInt -( - OCI_Elem *elem, - unsigned int value -); - -/** - * @brief - * Set a big int value to a collection element - * - * @param elem - Element handle - * @param value - big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetBigInt -( - OCI_Elem *elem, - big_int value -); - -/** - * @brief - * Set a unsigned big_int value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedBigInt -( - OCI_Elem *elem, - big_uint value -); - -/** - * @brief - * Set a double value to a collection element - * - * @param elem - Element handle - * @param value - Double value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetDouble -( - OCI_Elem *elem, - double value -); - -/** - * @brief - * Set a float value to a collection element - * - * @param elem - Element handle - * @param value - float value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetFloat -( - OCI_Elem *elem, - float value -); - -/** - * @brief - * Set a string value to a collection element - * - * @param elem - Element handle - * @param value - String value - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetString -( - OCI_Elem *elem, - const otext *value -); - -/** - * @brief - * Set a RAW value to a collection element - * - * @param elem - Element handle - * @param value - Raw value - * @param len - Size of the raw value - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetRaw -( - OCI_Elem *elem, - void *value, - unsigned int len -); - -/** - * @brief - * Assign a Date handle to a collection element - * - * @param elem - Element handle - * @param value - Date Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetDate -( - OCI_Elem *elem, - OCI_Date *value -); - -/** - * @brief - * Assign a Timestamp handle to a collection element - * - * @param elem - Element handle - * @param value - Timestamp Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetTimestamp -( - OCI_Elem *elem, - OCI_Timestamp *value -); - -/** - * @brief - * Assign an Interval handle to a collection element - * - * @param elem - Element handle - * @param value - Interval Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetInterval -( - OCI_Elem *elem, - OCI_Interval *value -); - -/** - * @brief - * Assign a Collection handle to a collection element - * - * @param elem - Element handle - * @param value - Collection Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetColl -( - OCI_Elem *elem, - OCI_Coll *value -); - -/** - * @brief - * Assign an Object handle to a collection element - * - * @param elem - Element handle - * @param value - Object Handle - * - * @warning - * This function assigns a copy of the object to the given attribute. - * Any further modifications of the object passed as the parameter 'value' - * will not be reflected to object 's attribute set with this call - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetObject -( - OCI_Elem *elem, - OCI_Object *value -); - -/** - * @brief - * Assign a Lob handle to a collection element - * - * @param elem - Element handle - * @param value - Lob Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetLob -( - OCI_Elem *elem, - OCI_Lob *value -); - -/** - * @brief - * Assign a File handle to a collection element - * - * @param elem - Element handle - * @param value - File Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetFile -( - OCI_Elem *elem, - OCI_File *value -); - -/** - * @brief - * Assign a Ref handle to a collection element - * - * @param elem - Element handle - * @param value - Ref Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetRef -( - OCI_Elem *elem, - OCI_Ref *value -); - -/** - * @brief - * Check if the collection element value is null - * - * @param elem - Element handle - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemIsNull -( - OCI_Elem *elem -); - -/** - * @brief - * Set a collection element value to null - * - * @param elem - Element handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetNull -( - OCI_Elem *elem -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFeatureReturningInto Oracle Returning feature - * @{ - * - * OCILIB supports the Oracle feature 'Returning into' for DML statements. - * - * Let's Oracle talk about this features: - * - * @par - * 'Using the RETURNING clause with a DML statement allows you to essentially - * combine two SQL statements into one, possibly saving you a server round-trip. - * This is accomplished by adding an extra clause to the traditional UPDATE, - * INSERT, and DELETE statements. The extra clause effectively adds a query to - * the DML statement. In the OCI, the values are returned to the application - * through the use of OUT bind variables.' - * - * OCILIB implements this features by providing a set of functions that allows - * to register output placeholders for the returned values. - * Once the DML is executed with OCI_Execute(), the output returned data is - * available through a regular resultset object that can be fetched. - * - * @note - * Array binding interface is also supported with 'returning into' DML statement. - * Every iteration (or row of given arrays) generates an resultset object. - * Once a resultset is fetched, the next on can be retrieved with OCI_GetNextResultset() - * - * @par - * - * @note - * OCI_Long are not supported for 'returning into' clause .This is a limitation imposed by Oracle. - * - * @note - * OCI_Column objects retrieved from output OCI_Resultset have the following - * particularities: - * - * - their names are the provided bind names to the DML statement - * (by example, ':out1'). So any call to the functions OCI_GetXXX2() - * should be aware of it - * - The columns detailed SQL attributes might be not all set or accurate. By - * example, the scale and precision are not set, the SQL type is the one - * chosen by OCILIB regarding the OCILIB object data type and might be - * slightly different from the real one. - * - * @par Example - * @include returning.c - * - */ - -/** - * @brief - * Retrieve the next available resultset - * - * @param stmt - Statement handle - * - * @note - * it is only valid for the following statements: - * - Statements executing SQL UPDATE/DELETE using a RETURNING INTO clause - * - Statements implicitly returned from PL/SQL procedure or blocks (new feature in Oracle 12cR1) using - * DBMS_SQL.RETURN_RESULT() - * - * @note - * SQL statements with a 'returning' clause can return multiple resultsets. - * When arrays of program variables are binded to the statement, Oracle will - * execute the statement for every row (iteration). - * Each iteration generates a resultset that can be fetched like regular ones. - * - * @note - * Starting withOracle 12cR1, PL/SQ procedure and blocks ca return multiple implicit resultsets - * Refer to Oracle documentation for more information. - * - * @return - * A resultset handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Resultset * OCI_API OCI_GetNextResultset -( - OCI_Statement *stmt -); - -/** -* @brief -* Register a register output bind placeholder -* -* @param stmt - Statement handle -* @param name - Output bind name -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_RegisterNumber -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a short output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterShort -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned short output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedShort -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a big integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterBigInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned big integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedBigInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a string output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param len - Max length of single string (in characters) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterString -( - OCI_Statement *stmt, - const otext *name, - unsigned int len -); - -/** - * @brief - * Register an raw output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param len - Max length of the buffer (in bytes) - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterRaw -( - OCI_Statement *stmt, - const otext *name, - unsigned int len -); - -/** - * @brief - * Register a double output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterDouble -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a float output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterFloat -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a date output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterDate -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a timestamp output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Timestamp type - * - * @note - * See OCI_TimestampCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterTimestamp -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register an interval output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Interval type - * - * @note - * See OCI_IntervalCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterInterval -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register an object output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param typinf - Type info handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterObject -( - OCI_Statement *stmt, - const otext *name, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Register a lob output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Lob type - * - * @note - * See OCI_LobCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterLob -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register a file output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - File type - * - * @note - * See OCI_FileCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterFile -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register a Ref output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param typinf - Type info handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterRef -( - OCI_Statement *stmt, - const otext *name, - OCI_TypeInfo *typinf -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiRowIds Oracle Rowids - * @{ - * - * OCILIB supports the Oracle ROWID type through C scalar string types (otext). - * - * - ROWIDs can be retrieved from resultset with OCI_GetString() - * - ROWIDs can be binded to statements with OCI_BindString() - * - * The maximum size of an ROWID buffer is defined by the constant OCI_SIZE_ROWID - * - * @par Example - * @include rowid.c - * - * @} - */ - -/** - * @defgroup OcilibCApiStatementControl Statements control - * @{ - * - * Those functions give extra information about OCILIB statements and can modify their behavior. - * - */ - -/** - * @brief - * Return the type of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * Possible values are : - * - * - OCI_CST_SELECT : select statement - * - OCI_CST_UPDATE : update statement - * - OCI_CST_DELETE : delete statement - * - OCI_CST_INSERT : insert statement - * - OCI_CST_CREATE : create statement - * - OCI_CST_DROP : drop statement - * - OCI_CST_ALTER : alter statement - * - OCI_CST_BEGIN : begin (pl/sql) statement - * - OCI_CST_DECLARE : declare (pl/sql) statement - * - OCI_CST_CALL : kpu call - * - * @return - * The statement type on success or OCI_UNKOWN on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetStatementType -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the fetch mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - fetch mode value - * - * @warning - * OCI_SetFetchMode() MUST be called before any OCI_ExecuteXXX() call - * - * @note - * Possible values are : - * - OCI_SFM_DEFAULT - * - OCI_SFM_SCROLLABLE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFetchMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the fetch mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetFetchMode() for possible values - * Default value is OCI_SFM_DEFAULT - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetFetchMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the binding mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - binding mode value - * - * @note - * Possible values are : - * - OCI_BIND_BY_POS : position binding - * - OCI_BIND_BY_NAME : name binding - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetBindMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the binding mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetBindMode() for possible values - * Default value is OCI_BIND_BY_NAME - * - * @note - * if stmt is NULL, the return value is OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the current bind allocation mode that will be used for subsequent binding calls - * - * @param stmt - Statement handle - * @param mode - bind allocation mode value - * - * @note - * Possible values are : - * - OCI_BAM_EXTERNAL : bind variable are allocated by user code - * - OCI_BAM_INTERNAL : bind variable are allocated internally - * - * @warning - * This call has to be made after preparing a statement as OCI_Prepare() reset it by default to OCI_BAM_EXTERNAL. - * When calling an OCI_BindXXXX() call, this value is used and stored in the OCI_Bind object created during the bind call. - * Each bind can have is own allocation mode that is returned by OCI_BindGetAllocationMode() - * OCI_SetBindAllocation() can be called before each binding call if needed, resulting having some bind allocated externally and other ones internally. - * - * @note - * Refer to the section "Binding variables and arrays" of the documention about allocation mode as OCI_BAM_INTERNAL is not compatible with all bind calls - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetBindAllocation -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the current bind allocation mode used for subsequent binding calls - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetBindAllocation() for possible values - * Default value is OCI_BAM_EXTERNAL - * - * @warning - * Each OCI_Bind object has its own allocation mode that may differ from the one returned by OCI_GetBindAllocation() - * The return value of OCI_GetBindAllocation() is the mode that will be used for any subsequent OCI_BindXXXX() calls - * - * @note - * if stmt is NULL, the return value is OCI_UNKNOWN - * - */ -OCI_EXPORT unsigned int OCI_API OCI_GetBindAllocation -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the number of rows fetched per internal server fetch call - * - * @param stmt - Statement handle - * @param size - number of rows to fetch - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFetchSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the number of rows fetched per internal server fetch call - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_FETCH_SIZE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetFetchSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the number of rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * @param size - number of rows to pre-fetch - * - * @note - * To turn off pre-fetching, set both attributes (size and memory) to 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPrefetchSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the number of rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_PREFETCH_SIZE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetPrefetchSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the amount of memory pre-fetched by OCI Client - * - * @param stmt - Statement handle - * @param size - amount of memory to fetch - * - * @note - * Default value is 0 and the pre-fetch size attribute is used instead. - * When both attributes are set (pre-fetch size and memory) and pre-fetch memory - * value can hold more rows than specified by pre-fetch size, OCI uses pre-fetch - * size instead. - * - * @note - * OCILIB set pre-fetch attribute to OCI_PREFETCH_SIZE when a statement is created. - * To setup a big value for OCI_SetPrefetchMemory(), you must call - * OCI_SetPrefetchSize() to 0 to make OCI consider this attribute. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPrefetchMemory -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the amount of memory used to retrieve rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * - * @note - * Default value is 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetPrefetchMemory -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the LONG data type piece buffer size - * - * @param stmt - Statement handle - * @param size - maximum size for long buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetLongMaxSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the LONG data type piece buffer size - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_SIZE_LONG - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetLongMaxSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the long data type handling mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - long mode value - * - * @note - * Possible values are : - * - * - OCI_LONG_EXPLICIT : LONGs are explicitly handled by OCI_Long type - * - OCI_LONG_IMPLICIT : LONGs are implicitly mapped to string type in the - * limits of VARCHAR2 size capacity - * - * LONG RAWs can't be handled with OCI_LONG_IMPLICIT - */ - -OCI_EXPORT boolean OCI_API OCI_SetLongMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the long data type handling mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetLongMode() for possible values - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetLongMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the connection handle associated with a statement handle - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_StatementGetConnection -( - OCI_Statement *stmt -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiLobs Internal Large Objects (LOBs) - * @{ - * - * Large Objects (LOBs) were introduced with Oracle 8i to replace LONGs - * - * Oracle OCI supplies a set APIs to manipulate this data type. - * - * OCILIB encapsulates this API by supplying: - * - * - An OCI_Lob C type - * - A set of really easy APIs to manipulate OCI_Lob objects - * - * OCILIB currently supports 3 types of Lobs : - * - * - BLOB : Binary LOBs (replacement for LONG RAW data type) - * - CLOB : Character LOBs (replacement for LONG data type) - * - NCLOB : National Character LOBs - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statements - * - Manipulated (copy, append, ...) - * - * @par Lobs > 4 Go - * - * Oracle 10g extended lobs by increasing maximum size from 4Go to 128 To. - * - * OCILIB, with version 2.1.0, supports now this new limit. - * For handling sizes and offsets up to 128 To, 64 bit integers are requested. - * - * So, A new scalar integer type has been introduced: big_uint (elderly lobsize_t). - * This type can be a 32 bits or 64 bits integer depending on : - * - Compiler support for 64 bits integers (C99 compiler, MS compilers) - * - Oracle client version - * - * big_uint will be a 64 bits integer : - * - if the compiler supports it - * - if OCILIB is build with option OCI_IMPORT_LINKAGE and the Oracle version is >= 10.1 - * - or OCILIB is build with option OCI_IMPORT_RUNTIME (oracle version is not known at - * compilation stage) - * - * @par Example - * @include lob.c - * - */ - -/** - * @brief - * Create a local temporary Lob instance - * - * @param con - Connection handle - * @param type - Lob type - * - * Supported lob types : - * - * - OCI_BLOB : Binary Lob - * - OCI_CLOB : Character Lob - * - OCI_NCLOB ! National Character Lob - * - * @return - * Return the lob handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_LobCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free a local temporary lob - * - * @param lob - Lob handle - * - * @warning - * Only lobs created with OCI_LobCreate() should be freed by OCI_LobFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobFree -( - OCI_Lob *lob -); - -/** - * @brief - * Create an array of lob object - * - * @param con - Connection handle - * @param type - Lob type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_LobCreate() for more details - * - * @return - * Return the lob handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Lob ** OCI_API OCI_LobArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** -* @brief -* Free an array of lob objects -* -* @param lobs - Array of lob objects -* -* @warning -* Only arrays of lobs created with OCI_LobArrayCreate() should be freed -* by OCI_LobArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_LobArrayFree -( - OCI_Lob **lobs -); - -/** - * @brief - * Return the type of the given Lob object - * - * @param lob - Lob handle - * - * @note - * For possible values, see OCI_LobCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobGetType -( - OCI_Lob *lob -); - -/** - * @brief - * Perform a seek operation on the OCI_lob content buffer - * - * @param lob - Lob handle - * @param offset - Offset from current position (bytes or characters) - * @param mode - Seek mode - * - * Parameter 'mode' can be one of the following value : - * - * - OCI_SEEK_SET : set the lob current offset to the given absolute offset - * - OCI_SEEK_END : set the lob current offset to the end of the lob - * - OCI_SEEK_CUR : move the lob current offset to the number of bytes or - * characters given by parameter 'offset' - * - * @note - * - For CLOB and CLOB, offset in characters - * - For BLOB and BFILE, offset is in bytes - * - * @note - * Position in the Lob buffer starts at 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobSeek -( - OCI_Lob *lob, - big_uint offset, - unsigned int mode -); - -/** - * @brief - * Return the current position in the Lob content buffer - * - * @param lob - Lob handle - * - * @return - * Lob position (starting with 0) or 0 on failure - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetOffset -( - OCI_Lob *lob -); - -/** - * @brief - * [OBSOLETE] Read a portion of a lob into the given buffer - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBS - * - * @warning - * This call is obsolete ! Use OCI_LobRead2() instead. - * - * @return - * Number of bytes/characters read on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobRead -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Read a portion of a lob into the given buffer - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to read into the buffer - * In output, 'char_count' and 'byte_count' are values read into the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobRead2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * [OBSOLETE] Write a buffer into a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBs - * - * @warning - * This call is obsolete ! Use OCI_LobWrite2() instead. - * - * @return - * Number of bytes / characters written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobWrite -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Write a buffer into a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to write from the buffer - * In output, 'char_count' and 'byte_count' are values written from the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobWrite2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * Truncate the given lob to a shorter length - * - * @param lob - Lob handle - * @param size - New length (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBs - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobTruncate -( - OCI_Lob *lob, - big_uint size -); - -/** - * @brief - * Return the actual length of a lob - * - * @param lob - Lob handle - * - * @note - * The returned value is in bytes for BLOBS and characters for CLOBS/NCLOBs - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetLength -( - OCI_Lob *lob -); - -/** - * @brief - * Returns the chunk size of a LOB - * - * @param lob - Lob handle - * - * @note - * This chunk size corresponds to the chunk size used by the LOB data layer - * when accessing and modifying the LOB value. According to Oracle - * documentation, performance will be improved if the application issues - * read or write requests using a multiple of this chunk size - * - * @note - * The returned value is in bytes for BLOBS and characters for CLOBS/NCLOBs - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobGetChunkSize -( - OCI_Lob *lob -); - -/** - * @brief - * Erase a portion of the lob at a given position - * - * @param lob - Lob handle - * @param offset - Absolute position in source lob - * @param len - Number of bytes or characters to erase - * - * @note - * Absolute position starts at 0. - * Erasing means that spaces overwrite the existing LOB value. - * - * @return - * Number of bytes (BLOB) or characters (CLOB/NCLOB) erased on success - * otherwise 0 on failure - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobErase -( - OCI_Lob *lob, - big_uint offset, - big_uint len -); - -/** - * @brief - * Append a buffer at the end of a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs - * - * @return - * Number of bytes / characters written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobAppend -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Append a buffer at the end of a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to write from the buffer - * In output, 'char_count' and 'byte_count' are values written from the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAppend2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * Append a source LOB at the end of a destination LOB - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAppendLob -( - OCI_Lob *lob, - OCI_Lob *lob_src -); - -/** - * @brief - * Check if the given lob is a temporary lob - * - * @param lob - Lob handle - * - * @return - * TRUE if it's a temporary lob otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobIsTemporary -( - OCI_Lob *lob -); - -/** - * @brief - * Copy a portion of a source LOB into a destination LOB - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * @param offset_dst - Absolute position in destination lob - * @param offset_src - Absolute position in source lob - * @param count - Number of bytes or character to copy - * - * @note - * For character LOB (CLOB/NCLOBS) the parameters count, offset_dst and - * offset_src are expressed in characters and not in bytes. - * - * @note - * Absolute position starts at 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobCopy -( - OCI_Lob *lob, - OCI_Lob *lob_src, - big_uint offset_dst, - big_uint offset_src, - big_uint count -); - -/** - * @brief - * Copy a portion of a source FILE into a destination LOB - * - * @param lob - Destination Lob handle - * @param file - Source File handle - * @param offset_dst - Absolute position in destination lob - * @param offset_src - Absolute position in source file - * @param count - Number of bytes to copy - * - * @note - * - For character LOB (CLOB/NCLOB) the parameter offset_src are expressed in - * characters and not in bytes. - * - Offset_src is always in bytes - * - * @note - * Absolute position starts at 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobCopyFromFile -( - OCI_Lob *lob, - OCI_File *file, - big_uint offset_dst, - big_uint offset_src, - big_uint count -); - -/** - * @brief - * Open explicitly a Lob - * - * @param lob - Lob handle - * @param mode - open mode - * - * Possible values for mode are : - * - * - OCI_LOB_READONLY : read only access - * - OCI_LOB_READWRITE : read/write access - * - * @note - * - A call to OCI_LobOpen is not necessary to manipulate a Lob. - * - If a lob hasn't been opened explicitly, triggers are fired and - * indexes updated at every read/write/append operation - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobOpen -( - OCI_Lob *lob, - unsigned int mode -); - -/** - * @brief - * Close explicitly a Lob - * - * @param lob - Lob handle - * - * @note - * - A call to OCI_LobClose is not necessary to manipulate a Lob. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobClose -( - OCI_Lob *lob -); - -/** - * @brief - * Compare two lob handles for equality - * - * @param lob - Lob handle - * @param lob2 - Lob2 handle - * - * @return - * TRUE is the lobs are not null and equal otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobIsEqual -( - OCI_Lob *lob, - OCI_Lob *lob2 -); - -/** - * @brief - * Assign a lob to another one - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAssign -( - OCI_Lob *lob, - OCI_Lob *lob_src -); - -/** - * @brief - * Return the maximum size that the lob can contain - * - * @param lob - Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetMaxSize -( - OCI_Lob *lob -); - -/** - * @brief - * Flush Lob content to the server - * - * @param lob - Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobFlush -( - OCI_Lob *lob -); - -/** - * @brief - * Enable / disable buffering mode on the given lob handle - * - * @param lob - Lob handle - * @param value - Enable/disable buffering mode - * - * @note - * Oracle "LOB Buffering Subsystem" allows client applications - * to speedup read/write of small buffers on Lobs Objects. - * Check Oracle Documentation for more details on "LOB Buffering Subsystem". - * This reduces the number of network round trips and LOB versions, thereby - * improving LOB performance significantly. - * - * @warning - * According to Oracle documentation the following operations are not permitted - * on Lobs when buffering is on : OCI_LobCopy(), OCI_LobAppend, OCI_LobErase(), - * OCI_LobGetLength(), OCI_LobTruncate() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobEnableBuffering -( - OCI_Lob *lob, - boolean value -); - -/** -* @brief -* Retrieve connection handle from the lob handle -* -* @param lob - lob handle -* -*/ - -OCI_EXPORT OCI_Connection * OCI_API OCI_LobGetConnection -( - OCI_Lob *lob -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFiles External Large Objects (FILEs) - * @{ - * - * External Large Objects (FILEs) were introduced with Oracle 8i - * - * Oracle OCI supplies a set APIs to manipulate this data type. - * - * OCILIB encapsulates this API by supplying: - * - * - An OCI_File C type - * - A set of really easy APIs to manipulate OCI_File objects - * - * OCILIB currently supports 2 types of Lobs : - * - * - BFILE : Binary files - * - CFILE : Character files - * - * @warning - * FILEs are read-only. - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statements - * - Used for reading server files content - * - * @par Files > 4 Go - * - * - New maximum file size limit (128 To) applies to OCI_Files objects. - * - See Internal Large Objects (LOBs) section for Files > 4 Go information - * - * @par Example - * @include file.c - * - */ - -/** - * @brief - * Create a file object instance - * - * @param con - Connection handle - * @param type - File type - * - * Supported file types : - * - * - OCI_BFILE : Binary file - * - OCI_CFILE : Character file - * - * @return - * Return the lob handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_FileCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free a local File object - * - * @param file - File handle - * - * @warning - * Only Files created with OCI_FileCreate() should be freed by OCI_FileFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileFree -( - OCI_File *file -); - -/** - * @brief - * Create an array of file object - * - * @param con - Connection handle - * @param type - File type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_FileCreate() for more details - * - * @return - * Return the file handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_File ** OCI_API OCI_FileArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** -* @brief -* Free an array of file objects -* -* @param files - Array of file objects -* -* @warning -* Only arrays of lobs created with OCI_FileArrayCreate() should be freed by OCI_FileArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_FileArrayFree -( - OCI_File **files -); - -/** - * @brief - * Return the type of the given File object - * - * @param file - File handle - * - * @note - * For possible values, see OCI_FileCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_FileGetType -( - OCI_File *file -); - -/** - * @brief - * Perform a seek operation on the OCI_File content buffer - * - * @param file - File handle - * @param offset - Offset from current position - * @param mode - Seek mode - * - * Mode parameter can be one of the following value : - * - * - OCI_SEEK_SET : set the file current offset to the given absolute offset - * - OCI_SEEK_END : set the file current offset to the end of the lob - * - OCI_SEEK_CUR : move the file current offset to the number of bytes given by - * parameter 'offset' - * - * @note - * Position in the File buffer starts at 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileSeek -( - OCI_File *file, - big_uint offset, - unsigned int mode -); - -/** - * @brief - * Return the current position in the file - * - * @param file - File handle - * - * @return - * File position (starting with 0) or 0 on failure - */ - -OCI_EXPORT big_uint OCI_API OCI_FileGetOffset -( - OCI_File *file -); - -/** - * @brief - * Read a portion of a file into the given buffer - * - * @param file - File handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer in bytes - * - * @return - * Number of bytes read on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_FileRead -( - OCI_File *file, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the size in bytes of a file - * - * @param file - File handle - * - */ - -OCI_EXPORT big_uint OCI_API OCI_FileGetSize -( - OCI_File *file -); - -/** - * @brief - * Check if the given file exists on server - * - * @param file - File handle - * - * @note - * For local FILEs object, OCI_LobFileSetName() must be called before to set the filename to check - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileExists -( - OCI_File *file -); - -/** - * @brief - * Set the directory and file name of FILE handle - * - * @param file - File handle - * @param dir - File directory - * @param name - File name - *in - * @note - * - For local FILEs only - * - Files fetched from resultset can't be assigned a new directory and name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileSetName -( - OCI_File *file, - const otext *dir, - const otext *name -); - -/** - * @brief - * Return the directory of the given file - * - * @param file - File handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_FileGetDirectory -( - OCI_File *file -); - -/** - * @brief - * Return the name of the given file - * - * @param file - File handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_FileGetName -( - OCI_File *file -); - -/** - * @brief - * Open a file for reading - * - * @param file - File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileOpen -( - OCI_File *file -); - -/** - * @brief - * Check if the specified file is opened within the file handle - * - * @param file - File handle - * - * @return - * TRUE if the file was opened with this handle otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileIsOpen -( - OCI_File *file -); - -/** - * @brief - * Close a file - * - * @param file - File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileClose -( - OCI_File *file -); - -/** - * @brief - * Compare two file handle for equality - * - * @param file - File handle - * @param file2 - File2 handle - * - * @return - * TRUE is the lobs are not null and equal otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileIsEqual -( - OCI_File *file, - OCI_File *file2 -); - -/** - * @brief - * Assign a file to another one - * - * @param file - Destination File handle - * @param file_src - Source File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileAssign -( - OCI_File *file, - OCI_File *file_src -); - -/** -* @brief -* Retrieve connection handle from the file handle -* -* @param file - file handle -* -*/ - -OCI_EXPORT OCI_Connection * OCI_API OCI_FileGetConnection -( - OCI_File *file -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiLongs Long objects - * @{ - * - * Long Objects encapsulate Oracle LONGs data types and were used to store large - * buffers in Oracle database. - * - * They're still supported but are depreciated. Oracle now provides a - * newer and better way to deal with data that needs large storage : LOBs - * - * OCILIB supports this data type because it was and still is widely used - * - * OCILIB provides a set of API for manipulating LONGs that is really close to - * the one provided for LOBs. - * - * OCILIB currently supports 3 types of Long Objects: - * - * - OCI_BLONG : LONG RAW columns - * - OCI_CLONG : LONG columns - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statement - * - * @par Example - * @include long.c - * - */ - -/** - * @brief - * Create a local temporary Long instance - * - * @param stmt - Statement handle - * @param type - Long type - * - * Supported lob types : - * - * - OCI_BLONG : Binary Long - * - OCI_CLONG : Character Long - * - * @return - * Return the long handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_LongCreate -( - OCI_Statement *stmt, - unsigned int type -); - -/** - * @brief - * Free a local temporary long - * - * @param lg - Long handle - * - * @warning - * Only lobs created with OCI_LongCreate() should be freed by OCI_LongFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LongFree -( - OCI_Long *lg -); - -/** - * @brief - * Return the type of the given Long object - * - * @param lg - Long handle - * - * @note - * For possible values, see OCI_LobCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongGetType -( - OCI_Long *lg -); - -/** - * @brief - * Read a portion of a long into the given buffer [Obsolete] - * - * @param lg - Long handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer in bytes / characters - * - * @note - * - From version 2.0.0, this function is obsolete because OCILIB fetches now - * all data during OCIFetchNext() call - * - So, this call reads now the internal OCI_Long object allocated buffer - * - The internal buffer can be directly accessed with OCI_LongGetBuffer() - * - * @note - * - For OCI_CLONG, parameter 'len' and returned value are expressed in characters - * - For OCI_BLONG, parameter 'len' and returned value are expressed in bytes - * - * @return - * - Number of bytes/characters read on success - * - 0 if there is nothing more to read - * - 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongRead -( - OCI_Long *lg, - void *buffer, - unsigned int len -); - -/** - * @brief - * Write a buffer into a Long - * - * @param lg - Long handle - * @param buffer - the pointer to a buffer - * @param len - the length of the buffer in bytes (OCI_BLONG) or - * character (OCI_CLONG) - * - * @return - * Number of bytes (OCI_BLONG) / character (OCI_CLONG) written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongWrite -( - OCI_Long *lg, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the buffer size of a long object in bytes (OCI_BLONG) or character (OCI_CLONG) - * - * @param lg - Long handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongGetSize -( - OCI_Long *lg -); - -/** - * @brief - * Return the internal buffer of an OCI_Long object read from a fetch sequence - * - * @param lg - Long handle - * - */ - -OCI_EXPORT void * OCI_API OCI_LongGetBuffer -( - OCI_Long *lg -); - -/** -* @} -*/ - -/** -* @defgroup OcilibCApiOracleNumber Oracle NUMBER manipulation (optional) -* @{ -* -* OCILIB encapsulates Oracle SQL all Numeric types using C native data types. -* But it also provides an optional OCI_Number handle for manipulating and accessing Oracle NUMBER type. -* OCI_Number provides management for some special value that cannot be addressed in C such as positive -* and negative infinity. -* -* @par Example -* @include number.c -* -*/ - -/** -* @brief -* Create a local number object -* -* @param con - Connection handle -* -* @note -* Parameter 'con' can be NULL in order to manipulate numbers -* independently from database connections -* -* @return -* Return the number handle on success otherwise NULL on failure -* -*/ - -OCI_EXPORT OCI_Number * OCI_API OCI_NumberCreate -( - OCI_Connection *con -); - -/** -* @brief -* Free a number object -* -* @param number - Number handle -* -* @warning -* Only Numbers created with OCI_NumberCreate() should be freed by OCI_NumberFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberFree -( - OCI_Number *number -); - -/** -* @brief -* Create an array of number object -* -* @param con - Connection handle -* @param nbelem - number of elements in the array -* -* @note -* see OCI_NumberCreate() for more details -* -* @return -* Return the number handle array on success otherwise NULL on failure -* -*/ - -OCI_EXPORT OCI_Number ** OCI_API OCI_NumberArrayCreate -( - OCI_Connection *con, - unsigned int nbelem -); - -/** -* @brief -* Free an array of number objects -* -* @param numbers - Array of number objects -* -* @warning -* Only arrays of numbers created with OCI_NumberArrayCreate() should be freed by OCI_NumberArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberArrayFree -( - OCI_Number **numbers -); - -/** -* @brief -* Assign the value of a number handle to another one -* -* @param number - Destination number handle -* @param number_src - Source number handle -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT int OCI_API OCI_NumberAssign -( - OCI_Number *number, - OCI_Number *number_src -); - -/** -* @brief -* Convert a number value from the given number handle to a string -* -* @param number - source number handle -* @param fmt - Number format -* @param size - Destination string size in characters -* @param str - Destination date string -* -* @note -* Output string can be one the following 'magic strings': -* - '~' for positive infinity -* - '-~' for negative infinity -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberToText -( - OCI_Number *number, - const otext *fmt, - int size, - otext *str -); - -/** -* @brief -* Convert a string to a number and store it in the given number handle -* -* @param number - Destination number handle -* @param str - Source number string -* @param fmt - Number format -* -* @note -* Input string can be one the following 'magic strings': -* - '~' for positive infinity -* - '-~' for negative infinity -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberFromText -( - OCI_Number *number, - const otext *str, - const otext *fmt -); - -/** -* @brief -* Return the number value content -* -* @param number - number handle -* -* @note -* Returned content is a buffer of 22 bytes corresponding to Oracle C native -* representation of NUMBER values -* See oracle Documentation of its layout -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT unsigned char * OCI_API OCI_NumberGetContent -( - OCI_Number *number -); - -/** -* @brief -* Assign the number value content -* -* @param number - number handle -* @param content - raw number content -* -* @note -* See OCI_NumberSetContent() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSetContent -( - OCI_Number *number, - unsigned char *content -); - -/** -* @brief -* Assign the number value with the value of a native C numeric type -* -* @param number - number handle -* @param type - native C type to assign -* @param value - pointer to value to set -* -* @note -* Argument @param type can be : -* -* - OCI_NUM_SHORT : value is a pointer to a signed short -* - OCI_NUM_USHORT : value is a pointer to an unsigned short -* - OCI_NUM_INT : value is a pointer to a signed int -* - OCI_NUM_UINT : value is a pointer to an unsigned short -* - OCI_NUM_BIGINT : value is a pointer to a signed big_int -* - OCI_NUM_BIGUINT : value is a pointer to an unsigned big_uint -* - OCI_NUM_FLOAT : value is a pointer to an float -* - OCI_NUM_DOUBLE : value is a pointer to a double -* - OCI_NUM_NUMBER : value is a pointer to a OCI_Number -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSetValue -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Assign the number value to a native C numeric type -* -* @param number - number handle -* @param type - native C type to assign -* @param value - pointer to a native C variable -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberGetValue -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Add the value of a native C numeric type to the given number -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to add -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberAdd -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Subtract the value of a native C numeric type to the given number -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to subtract -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSub -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Multiply the given number with the value of a native C numeric -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to multiply by -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberMultiply -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Divide the given number with the value of a native C numeric -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to divide by -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberDivide -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** - * @brief - * Compares two number handles - * - * @param number1 - number1 handle - * @param number2 - number2 handle - * - * @return - * - -1 if number1 is smaller than number2, - * - 0 if they are equal - * - 1 if number1 is greater than number2. - * - */ - -OCI_EXPORT int OCI_API OCI_NumberCompare -( - OCI_Number *number1, - OCI_Number *number2 -); - -/** -* @} -*/ - -/** - * @} - */ - -/** - * @defgroup OcilibCApiDatetimes Date/time manipulation - * @{ - * - * OCILIB encapsulates Oracle SQL Date data type within OCI_Date structure - * - * Basically, the OCI_Date routines are wrappers around the Oracle OCIDate APIs - * - * @par Example - * @include date.c - * - */ - -/** - * @brief - * Create a local date object - * - * @param con - Connection handle - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate dates - * independently from database connections - * - * @return - * Return the date handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_DateCreate -( - OCI_Connection *con -); - -/** - * @brief - * Free a date object - * - * @param date - Date handle - * - * @warning - * Only dates created with OCI_DateCreate() should be freed by OCI_DateFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFree -( - OCI_Date *date -); - -/** - * @brief - * Create an array of date object - * - * @param con - Connection handle - * @param nbelem - number of elements in the array - * - * @note - * see OCI_DateCreate() for more details - * - * @return - * Return the date handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Date ** OCI_API OCI_DateArrayCreate -( - OCI_Connection *con, - unsigned int nbelem -); - -/** - * @brief - * Free an array of date objects - * - * @param dates - Array of date objects - * - * @warning - * Only arrays of dates created with OCI_DateArrayCreate() should be freed by OCI_DateArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateArrayFree -( - OCI_Date **dates -); - -/** - * @brief - * Add or subtract days to a date handle - * - * @param date - Date handle - * @param nb - Number of days to add/remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateAddDays -( - OCI_Date *date, - int nb -); - -/** - * @brief - * Add or subtract months to a date handle - * - * @param date - Date handle - * @param nb - Number of months to add/remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateAddMonths -( - OCI_Date *date, - int nb -); - -/** - * @brief - * Assign the value of a date handle to another one - * - * @param date - Destination Date handle - * @param date_src - Source Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT int OCI_API OCI_DateAssign -( - OCI_Date *date, - OCI_Date *date_src -); - -/** - * @brief - * Check if the given date is valid - * - * @param date - Date handle - * - * @return - * - Zero if date is valid - * - Any other value means the date is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_DateCheck -( - OCI_Date *date -); - -/** - * @brief - * Compares two date handles - * - * @param date - Date1 handle - * @param date2 - Date2 handle - * - * @return - * - -1 if date1 is smaller than date2, - * - 0 if they are equal - * - 1 if date1 is greater than date2. - * - */ - -OCI_EXPORT int OCI_API OCI_DateCompare -( - OCI_Date *date, - OCI_Date *date2 -); - -/** - * @brief - * Return the number of days betWeen two dates - * - * @param date - Date1 handle - * @param date2 - Date2 handle - * - * @return - * Number of days on success otherwise OCI_ERROR on failure - * - */ - -OCI_EXPORT int OCI_API OCI_DateDaysBetween -( - OCI_Date *date, - OCI_Date *date2 -); - -/** - * @brief - * Convert a string to a date and store it in the given date handle - * - * @param date - Destination Date handle - * @param str - Source date string - * @param fmt - Date format - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFromText -( - OCI_Date *date, - const otext *str, - const otext *fmt -); - -/** - * @brief - * Convert a Date value from the given date handle to a string - * - * @param date - source Date handle - * @param fmt - Date format - * @param size - Destination string size in characters - * @param str - Destination date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateToText -( - OCI_Date *date, - const otext *fmt, - int size, - otext *str -); - -/** - * @brief - * Extract the date part from a date handle - * - * @param date - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetDate -( - OCI_Date *date, - int *year, - int *month, - int *day -); - -/** - * @brief - * Extract the time part from a date handle - * - * @param date - Date handle - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetTime -( - OCI_Date *date, - int *hour, - int *min, - int *sec -); - -/** - * @brief - * Extract the date and time parts from a date handle - * - * @param date - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetDateTime -( - OCI_Date *date, - int *year, - int *month, - int *day, - int *hour, - int *min, - int *sec -); - -/** - * @brief - * Set the date portion if the given date handle - * - * @param date - Date handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetDate -( - OCI_Date *date, - int year, - int month, - int day -); - -/** - * @brief - * Set the time portion if the given date handle - * - * @param date - Date handle - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetTime -( - OCI_Date *date, - int hour, - int min, - int sec -); - -/** - * @brief - * Set the date and time portions if the given date handle - * - * @param date - Date handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetDateTime -( - OCI_Date *date, - int year, - int month, - int day, - int hour, - int min, - int sec -); - -/** - * @brief - * Place the last day of month (from the given date) into the given date - * - * @param date - Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateLastDay -( - OCI_Date *date -); - -/** - * @brief - * Gets the date of next day of the week, after a given date - * - * @param date - Date handle - * @param day - Day of the week - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateNextDay -( - OCI_Date *date, - const otext *day -); - -/** - * @brief - * Return the current system date/time into the date handle - * - * @param date - Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSysDate -( - OCI_Date *date -); - -/** - * @brief - * Convert a date from one zone to another zone - * - * @param date - Date handle - * @param zone1 - Source zone - * @param zone2 - Destination zone - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateZoneToZone -( - OCI_Date *date, - const otext *zone1, - const otext *zone2 -); - -/** - * @brief - * Affect an OCI_Date handle value to ISO C time data types - * - * @param date - Date handle - * @param ptm - Pointer to a structure tm to receive date/time values - * @param pt - Pointer to a time_t to hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateToCTime -( - OCI_Date *date, - struct tm *ptm, - time_t *pt -); - -/** - * @brief - * Affect ISO C time data types values to an OCI_Date handle - * - * @param date - Date handle - * @param ptm - Pointer to a structure tm that hold the date/time value - * @param t - Value (time_t) that hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * If 'ptm' is not null, its value is affected to the OCI_Timestamp handle, - * otherwise the value of 't' is used. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFromCTime -( - OCI_Date *date, - struct tm *ptm, - time_t t -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiTimestamps Timestamps and intervals manipulation - * @{ - * - * OCILIB encapsulates Oracle : - * - * - SQL timestamp data type within OCI_Timestamp structure - * - SQL interval data type within OCI_Interval structure - * - * Basically, the OCI_Timestamp and OCI_Interval routines are wrappers around - * the Oracle OCIDatetime and OCIInterval APIs - * - * @par Examples - * @include timestamp.c - * - */ - -/** - * @brief - * Create a local Timestamp instance - * - * @param con - Connection handle - * @param type - Timestamp type - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate - * timestamps independently from database connections - * - * @note - * Timestamp type can be : - * - * - OCI_TIMESTAMP : timestamp - * - OCI_TIMESTAMP_TZ : timestamp with time zone - * - OCI_TIMESTAMP_LTZ : timestamp with local time zone - * - * @return - * Return the Timestamp handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_TimestampCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free an OCI_Timestamp handle - * - * @param tmsp - Timestamp handle - * - * @warning - * Only Timestamp created with OCI_TimestampCreate() should be freed by OCI_IntervalFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFree -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Create an array of timestamp object - * - * @param con - Connection handle - * @param type - Timestamp type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_TimestampCreate() for more details - * - * @return - * Return the timestamp handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp ** OCI_API OCI_TimestampArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Free an array of timestamp objects - * - * @param tmsps - Array of timestamp objects - * - * @warning - * Only arrays of timestamp created with OCI_TimestampArrayCreate() - * should be freed by OCI_TimestampArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampArrayFree -( - OCI_Timestamp **tmsps -); - -/** - * @brief - * Return the type of the given Timestamp object - * - * @param tmsp - Timestamp handle - * - * @note - * For possible values, see OCI_TimestampCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TimestampGetType -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Assign the value of a timestamp handle to another one - * - * @param tmsp - Destination Timestamp handle - * @param tmsp_src - Source Timestamp handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampAssign -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp_src -); - -/** - * @brief - * Check if the given timestamp is valid - * - * @param tmsp - Timestamp handle - * - * @return - * - Zero if the timestamp value is valid - * - Any other value means the timestamp value is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_TimestampCheck -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Compares two timestamp handles - * - * @param tmsp - Timestamp1 handle - * @param tmsp2 - Timestamp2 handle - * - * @return - * - -1 if Timestamp1 is smaller than Timestamp2, - * - 0 if they are equal - * - 1 if Timestamp1 is greater than Timestamp2. - * - */ - -OCI_EXPORT int OCI_API OCI_TimestampCompare -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp2 -); - -/** - * @brief - * Set a timestamp handle value - * - * @param tmsp - Timestamp handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * @param hour - hour value - * @param min - minutes value - * @param sec - seconds value - * @param fsec - fractional part of seconds value - * @param time_zone - name of a time zone to use [optional] - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampConstruct -( - OCI_Timestamp *tmsp, - int year, - int month, - int day, - int hour, - int min, - int sec, - int fsec, - const otext *time_zone -); - -/** - * @brief - * Convert one timestamp value from one type to another. - * - * @param tmsp - Timestamp handle to convert - * @param tmsp_src - Timestamp handle to use for the type conversion - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampConvert -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp_src -); - -/** - * @brief - * Convert a string to a timestamp and store it in the given timestamp handle - * - * @param tmsp - Destination Timestamp handle - * @param str - Source date string - * @param fmt - Date format - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFromText -( - OCI_Timestamp *tmsp, - const otext *str, - const otext *fmt -); - -/** - * @brief - * Convert a timestamp value from the given timestamp handle to a string - * - * @param tmsp - source Timestamp handle - * @param fmt - Timestamp format - * @param size - Destination string size in characters - * @param str - Destination date string - * @param precision - Precision for fractional part of the seconds - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampToText -( - OCI_Timestamp *tmsp, - const otext *fmt, - int size, - otext *str, - int precision -); - -/** - * @brief - * Extract the date part from a timestamp handle - * - * @param tmsp - Timestamp handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetDate -( - OCI_Timestamp *tmsp, - int *year, - int *month, - int *day -); - -/** - * @brief - * Extract the time portion from a timestamp handle - * - * @param tmsp - Timestamp handle - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * @param fsec - Place holder for fractional part of second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTime -( - OCI_Timestamp *tmsp, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Extract the date and time parts from a date handle - * - * @param tmsp - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * @param fsec - Place holder for fractional part of seconds value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetDateTime -( - OCI_Timestamp *tmsp, - int *year, - int *month, - int *day, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Return the time zone name of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param size - Destination string size in characters - * @param str - Destination zone name string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTimeZoneName -( - OCI_Timestamp *tmsp, - int size, - otext *str -); - -/** - * @brief - * Return the time zone (hour, minute) portion of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param hour - Place holder for hour value - * @param min - Place holder for min value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTimeZoneOffset -( - OCI_Timestamp *tmsp, - int *hour, - int *min -); - -/** - * @brief - * Add an interval value to a timestamp value of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param itv - Interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampIntervalAdd -( - OCI_Timestamp *tmsp, - OCI_Interval *itv -); - -/** - * @brief - * Subtract an interval value from a timestamp value of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param itv - Interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampIntervalSub -( - OCI_Timestamp *tmsp, - OCI_Interval *itv -); - -/** - * @brief - * Store the difference of two timestamp handles into an interval handle - * - * @param tmsp - Timestamp handle (subtrahend) - * @param tmsp2 - Timestamp2 handle (minuend) - * @param itv - Interval handle - * - * @note - * The function acts like tmsp - tmsp2 = itv - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampSubtract -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp2, - OCI_Interval *itv -); - -/** - * @brief - * Stores the system current date and time as a timestamp value with time zone - * into the timestamp handle. - * - * @param tmsp - Timestamp handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampSysTimestamp -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Affect an OCI_Timestamp handle value to ISO C time data types - * - * @param tmsp - Timestamp handle - * @param ptm - Pointer to a structure tm to receive date/time values - * @param pt - Pointer to a time_t to hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampToCTime -( - OCI_Timestamp *tmsp, - struct tm *ptm, - time_t *pt -); - -/** - * @brief - * Affect ISO C time data types values to an OCI_Timestamp handle - * - * @param tmsp - Timestamp handle - * @param ptm - Pointer to a structure tm that hold the date/time value - * @param t - Value (time_t) that hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * If 'ptm' is not null, its value is affected to the OCI_Timestamp handle, - * otherwise the value of 't' is used. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFromCTime -( - OCI_Timestamp *tmsp, - struct tm *ptm, - time_t t -); - -/** - * @brief - * Create a local interval object - * - * @param con - Connection handle - * @param type - Type of Interval - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate - * intervals independently from database connections - * - * @note - * Interval type can be : - * - OCI_INTERVAL_YM : year / month interval - * - OCI_INTERVAL_DS : date/ time interval - * - * @return - * Return the Interval handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_IntervalCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free an OCI_Interval handle - * - * @param itv - Interval handle - * - * @warning - * Only Intervals created with OCI_IntervalCreate() should be freed by - * OCI_IntervalFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFree -( - OCI_Interval *itv -); - -/** - * @brief - * Create an array of Interval object - * - * @param con - Connection handle - * @param type - Type of Interval - * @param nbelem - number of elements in the array - * - * @note - * see OCI_IntervalCreate() for more details - * - * @return - * Return the Interval handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Interval ** OCI_API OCI_IntervalArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Interval objects - * - * @param itvs - Array of Interval objects - * - * @warning - * Only arrays of Interval created with OCI_IntervalArrayCreate() should be freed by - * OCI_IntervalArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalArrayFree -( - OCI_Interval **itvs -); - -/** - * @brief - * Return the type of the given Interval object - * - * @param itv - Interval handle - * - * @note - * For possible values, see OCI_IntervalCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_IntervalGetType -( - OCI_Interval *itv -); - -/** - * @brief - * Assign the value of a interval handle to another one - * - * @param itv - Destination interval handle - * @param itv_src - Source interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalAssign -( - OCI_Interval *itv, - OCI_Interval *itv_src -); - -/** - * @brief - * Check if the given interval is valid - * - * @param itv - Interval handle - * - * @return - * - Zero if the interval value is valid - * - Any other value means the interval value is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_IntervalCheck -( - OCI_Interval *itv -); - -/** - * @brief - * Compares two interval handles - * - * @param itv - Interval1 handle - * @param itv2 - Interval2 handle - * - * @return - * - -1 if interval1 is smaller than interval2, - * - 0 if they are equal - * - 1 if interval1 is greater than interval2. - * - */ - -OCI_EXPORT int OCI_API OCI_IntervalCompare -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @brief - * Convert a string to an interval and store it in the given interval handle - * - * @param itv - Destination interval handle - * @param str - Source date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFromText -( - OCI_Interval *itv, - const otext *str -); - -/** - * @brief - * Convert an interval value from the given interval handle to a string - * - * @param itv - source Interval handle - * @param leading_prec - Precision of the leading part - * @param fraction_prec - Precision of the fractional part - * @param size - Destination string size in characters - * @param str - Destination date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalToText -( - OCI_Interval *itv, - int leading_prec, - int fraction_prec, - int size, - otext *str -); - -/** - * @brief - * Correct an interval handle value with the given time zone - * - * @param itv - Interval handle - * @param str - Time zone name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFromTimeZone -( - OCI_Interval *itv, - const otext *str -); - -/** - * @brief - * Return the day / time portion of an interval handle - * - * @param itv - Interval handle - * @param day - Place holder for day value - * @param hour - Place holder for hours value - * @param min - Place holder for minutes value - * @param sec - Place holder for seconds value - * @param fsec - Place holder for fractional part of seconds value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalGetDaySecond -( - OCI_Interval *itv, - int *day, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Return the year / month portion of an interval handle - * - * @param itv - Interval handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalGetYearMonth -( - OCI_Interval *itv, - int *year, - int *month -); - -/** - * @brief - * Set the day / time portion if the given interval handle - * - * @param itv - Interval handle - * @param day - day value - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * @param fsec - Fractional part of the seconds - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSetDaySecond -( - OCI_Interval *itv, - int day, - int hour, - int min, - int sec, - int fsec -); - -/** - * @brief - * Set the year / month portion if the given Interval handle - * - * @param itv - Interval handle - * @param year - Year value - * @param month - Month value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSetYearMonth -( - OCI_Interval *itv, - int year, - int month -); - -/** - * @brief - * Adds an interval handle value to another - * - * @param itv - Interval handle from witch to add - * @param itv2 - Interval handle to add - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalAdd -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @brief - * Subtract an interval handle value from another - * - * @param itv - Interval handle from witch to remove - * @param itv2 - Interval handle to remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSubtract -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiUserTypes Oracle Named Types (Oracle OBJECTs) - * @{ - * - * OCILIB implements Oracle Named types (user types and built-in types) through - * the OCI_Object type. - * - * OTT and C structures are not required to use objects in OCILIB. - * - * In order to manipulate objects attributes, OCILIB proposes a set of functions - * to get/set properties for various supported types. - * - * Objects can be: - * - Created as standalone instances (transient objects) - * - Used for binding (persistent / transient objects) - * - Retrieved from select statements (persistent / embedded objects) - * - * References (Oracle type REF) are identifiers (smart pointers) to objects and - * are implemented in OCILIB with the type OCI_Ref. - * - * OCILIB implements Oracle REFs as strong typed Reference (underlying OCI REFs - * are weaker in terms of typing). - * It means it's mandatory to provide type information to: - * - create a local OCI_Ref handle. - * - register an OCI_Ref handle for a 'returning into' clause. - * - * @note - * See Oracle Database SQL Language Reference for more details about REF data type - * - * @warning - * Prior to v3.5.0, OCILIB relied on some OCI routines to set/get objects - * attributes. these OCI calls had known bugs in Unicode mode that has been fixed in Oracle 11gR2. - * From v3.5.0, OCILIB directly sets objects attributes and thus OCILIB objects - * can now be used in Unicode mode. - * - * @par Example : Inserting a local object into a table - * @include object.c - * - * @par Example : Using Object References - * @include ref.c - * - */ - -/** - * @brief - * Create a local object instance - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * - * @return - * Return the object handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ObjectCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local object - * - * @param obj - Object handle - * - * @warning - * Only object created with OCI_ObjectCreate() should be freed - * by OCI_ObjectFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectFree -( - OCI_Object *obj -); - -/** - * @brief - * Create an array of Object objects - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_ObjectCreate() for more details - * - * @return - * Return the Object handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Object ** OCI_API OCI_ObjectArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Object objects - * - * @param objs - Array of Object objects - * - * @warning - * Only arrays of Object created with OCI_ObjectArrayCreate() - * should be freed by OCI_ObjectArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectArrayFree -( - OCI_Object **objs -); - -/** - * @brief - * Assign an object to another one - * - * @param obj - Destination Object handle - * @param obj_src - Source Object handle - * - * @note - * Oracle proceeds to a deep copy of the object content - * - * @note - * The two object handles must have the same type otherwise an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectAssign -( - OCI_Object *obj, - OCI_Object *obj_src -); - -/** - * @brief - * Return the type of an object instance - * - * @param obj - Object handle - * - * @note - * Possibles values are : - * - * - OCI_OBJ_PERSISTENT: persistent object from the DB - * - OCI_OBJ_TRANSIENT : local temporary object - * - OCI_OBJ_VALUE : embedded object - * - * @return - * Instance type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetType -( - OCI_Object *obj -); - -/** - * @brief - * Retrieve an Oracle Ref handle from an object and assign it to the given - * OCILIB OCI_Ref handle - * - * @param obj - Object handle - * @param ref - Ref handle - * - * @note - * The type information of the object and the ref must be the same, otherwise - * an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetSelfRef -( - OCI_Object *obj, - OCI_Ref *ref -); - -/** - * @brief - * Return the type info object associated to the object - * - * @param obj - Object handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_ObjectGetTypeInfo -( - OCI_Object *obj -); - -/** - * @brief - * Return the boolean value of the given object attribute (ONLY for PL/SQL records) - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetBoolean() returns a valid value only for PL/SQL boolean based attributes - * - * @warning - * - ONLY supported by Oracle 12c and above ! - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetBoolean -( - OCI_Object *obj, - const otext *attr -); - -/** -* @brief -* Return the number value of the given object attribute -* -* @param obj - Object handle -* @param attr - Attribute name -* -* @note -* If the attribute is found in the object descriptor attributes list, then a -* data type check is performed for integrity. -* OCI_ObjectGetNumber() returns a valid value only for number based attributes -* -* @return -* Attribute value or NULL on failure or wrong attribute type -* -*/ - -OCI_EXPORT OCI_Number* OCI_API OCI_ObjectGetNumber -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the short value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetShort() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT short OCI_API OCI_ObjectGetShort -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned short value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedShort() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_ObjectGetUnsignedShort -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT int OCI_API OCI_ObjectGetInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetUnsignedInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the big integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetBigInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT big_int OCI_API OCI_ObjectGetBigInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned big integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedBigInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT big_uint OCI_API OCI_ObjectGetUnsignedBigInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the double value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetDouble() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0.0 on failure or wrong attribute type - * - */ - -OCI_EXPORT double OCI_API OCI_ObjectGetDouble -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the float value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetFloat() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0.0 on failure or wrong attribute type - * - */ - -OCI_EXPORT float OCI_API OCI_ObjectGetFloat -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the string value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * The method can return a string value for any attributes types. - * It performs implicit string conversions using the same - * mechanisms than OCI_GetString(). See its documentation for more details. - * - * @return - * Attribute value or NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ObjectGetString -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the raw attribute value of the given object attribute into the - * given buffer - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Destination buffer - * @param len - Max size to write into buffer - - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetRaw() copies data into the buffer only for raw based attributes - * - * @return - * Number of bytes written to the buffer or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT int OCI_API OCI_ObjectGetRaw -( - OCI_Object *obj, - const otext *attr, - void *value, - unsigned int len -); - -/** -* @brief -* Return the raw attribute value size of the given object attribute into the -* given buffer -* -* @param obj - Object handle -* @param attr - Attribute name -* -* @note -* If the attribute is found in the object descriptor attributes list, then a -* data type check is performed for integrity. -* -* @return -* size in bytes of the RAW value or 0 on failure or wrong attribute type -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetRawSize -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the date value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetDate() returns a valid value only for date based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_ObjectGetDate -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the timestamp value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetTimestamp() returns a valid value only for timestamps based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_ObjectGetTimestamp -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the interval value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetInterval() returns a valid value only for intervals based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_ObjectGetInterval -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the collection value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetColl() returns a valid value only for intervals based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_ObjectGetColl -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the Ref value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetRef() returns a valid value only for Refs based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_ObjectGetRef -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the object value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetObject() returns a valid value only for object based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ObjectGetObject -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the lob value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetLob() returns a valid value only for lobs based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_ObjectGetLob -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the file value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetFile() returns a valid value only for files based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_ObjectGetFile -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Set an object attribute of type boolean (ONLY for PL/SQL records) - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - boolean value - * - * @warning - * - ONLY supported by Oracle 12c and above ! - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetBoolean -( - OCI_Object *obj, - const otext *attr, - boolean value -); - -/** -* @brief -* Set an object attribute of type number -* -* @param obj - Object handle -* @param attr - Attribute name -* @param value - number value -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetNumber -( - OCI_Object *obj, - const otext *attr, - OCI_Number *value -); - -/** - * @brief - * Set an object attribute of type short - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetShort -( - OCI_Object *obj, - const otext *attr, - short value -); - -/** - * @brief - * Set an object attribute of type unsigned short - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedShort -( - OCI_Object *obj, - const otext *attr, - unsigned short value -); - -/** - * @brief - * Set an object attribute of type int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetInt -( - OCI_Object *obj, - const otext *attr, - int value -); - -/** - * @brief - * Set an object attribute of type unsigned int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedInt -( - OCI_Object *obj, - const otext *attr, - unsigned int value -); - -/** - * @brief - * Set an object attribute of type big int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetBigInt -( - OCI_Object *obj, - const otext *attr, - big_int value -); - -/** - * @brief - * Set an object attribute of type unsigned big int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedBigInt -( - OCI_Object *obj, - const otext *attr, - big_uint value -); - -/** - * @brief - * Set an object attribute of type double - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Double value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetDouble -( - OCI_Object *obj, - const otext *attr, - double value -); - -/** - * @brief - * Set an object attribute of type float - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Float value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetFloat -( - OCI_Object *obj, - const otext *attr, - float value -); - -/** - * @brief - * Set an object attribute of type string - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - String value - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetString -( - OCI_Object *obj, - const otext *attr, - const otext *value -); - -/** - * @brief - * Set an object attribute of type RAW - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Raw value - * @param len - Size of the raw value - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetRaw -( - OCI_Object *obj, - const otext *attr, - void *value, - unsigned int len -); - -/** - * @brief - * Set an object attribute of type Date - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Date Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetDate -( - OCI_Object *obj, - const otext *attr, - OCI_Date *value -); - -/** - * @brief - * Set an object attribute of type Timestamp - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Timestamp Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetTimestamp -( - OCI_Object *obj, - const otext *attr, - OCI_Timestamp *value -); - -/** - * @brief - * Set an object attribute of type Interval - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Interval Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetInterval -( - OCI_Object *obj, - const otext *attr, - OCI_Interval *value -); - -/** - * @brief - * Set an object attribute of type Collection - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Collection Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetColl -( - OCI_Object *obj, - const otext *attr, - OCI_Coll *value -); - -/** - * @brief - * Set an object attribute of type Object - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Object Handle - * - * @warning - * This function assigns a copy of the object to the given attribute. - * Any further modifications of the object passed as the parameter 'value' - * will not be reflected to object 's attribute set with this call - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetObject -( - OCI_Object *obj, - const otext *attr, - OCI_Object *value -); - -/** - * @brief - * Set an object attribute of type Lob - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Lob Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetLob -( - OCI_Object *obj, - const otext *attr, - OCI_Lob *value -); - -/** - * @brief - * Set an object attribute of type File - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - File Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetFile -( - OCI_Object *obj, - const otext *attr, - OCI_File *value -); - -/** - * @brief - * Set an object attribute of type Ref - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Ref Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetRef -( - OCI_Object *obj, - const otext *attr, - OCI_Ref *value -); - -/** - * @brief - * Check if an object attribute is null - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @return - * FALSE if the attribute is not null otherwise TRUE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectIsNull -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Set an object attribute to null - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetNull -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Retrieve the underlying C (OTT/OCI style) structure of an OCI_Object handle - * - * @param obj - Object handle - * @param pp_struct - Address of a pointer that retrieve the C structure of data - * @param pp_ind - Address of a pointer that retrieve the C structure of indicators - * - * @note - * See Oracle OCI programming guide for more details about OTT structures. - * The members of these structures are OCI data types like OCINumber, OCIString - * that requires mixing OCILIB code and raw OCI code. - * OCI Object API headers have to be included to handle this data types using OCI object functions - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetStruct -( - OCI_Object *obj, - void **pp_struct, - void **pp_ind -); - -/** - * @brief - * Convert an object handle value to a string - * - * @param obj - Object handle - * @param size - Destination string length pointer in characters - * @param str - Destination string - * - * @note - * In order to compute the needed string length, call the method with a NULL string - * Then call the method again with a valid buffer - * - * @note - * The resulting string is similar to the SQL*PLUS output for UDTs (user types and objects) - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * - * @warning - * This convenient method shall not be used when performance matters. It is usually called twice (buffer length - * computation) and must also care about quotes within strings. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectToText -( - OCI_Object *obj, - unsigned int *size, - otext *str -); - -/** - * @brief - * Create a local Ref instance - * - * @param con - Connection handle - * @param typinf - Ref type - * - * @return - * Return the Ref handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_RefCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local Ref - * - * @param ref - Ref handle - * - * @warning - * Only Refs created with OCI_RefCreate() should be freed - * by OCI_RefFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefFree -( - OCI_Ref *ref -); - -/** - * @brief - * Create an array of Ref object - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_RefCreate() for more details - * - * @return - * Return the Ref handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Ref ** OCI_API OCI_RefArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Ref objects - * - * @param refs - Array of Ref objects - * - * @warning - * Only arrays of Ref created with OCI_RefArrayCreate() - * should be freed by OCI_RefArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefArrayFree -( - OCI_Ref **refs -); - -/** - * @brief - * Assign a Ref to another one - * - * @param ref - Destination Ref handle - * @param ref_src - Source Ref handle - * - * @note - * The two Ref handles must have the same type otherwise an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefAssign -( - OCI_Ref *ref, - OCI_Ref *ref_src -); - -/** - * @brief - * Return the type info object associated to the Ref - * - * @param ref - Ref handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_RefGetTypeInfo -( - OCI_Ref *ref -); - -/** - * @brief - * Returns the object pointed by the Ref handle. - * - * @param ref - Ref handle - * - * @return - * The object handle is the ref is not null otherwise NULL - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_RefGetObject -( - OCI_Ref *ref -); - -/** - * @brief - * Check if the Ref points to an object or not. - * - * @param ref - Ref handle - * - * @return - * TRUE if it does not point to a valid object otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefIsNull -( - OCI_Ref *ref -); - -/** - * @brief - * Nullify the given Ref handle - * - * @param ref - Ref handle - * - * @note - * this call clears the reference to object pointed by the Ref handle. - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RefSetNull -( - OCI_Ref *ref -); - -/** - * @brief - * Returns the size of the hex representation of the given Ref handle - * - * @param ref - Ref handle - * - * @note - * the returned size is the number of character needed to store the - * hex representation of the Ref that can be retrieved with OCI_RefToText() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_RefGetHexSize -( - OCI_Ref *ref -); - -/** - * @brief - * Converts a Ref handle value to a hexadecimal string. - * - * @param ref - Ref handle - * @param size - Destination string size in characters - * @param str - Destination string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefToText -( - OCI_Ref *ref, - unsigned int size, - otext *str -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiAbort Aborting long operations - * @{ - * - * The Oracle OCI provides the ability to establish a server connection in : - * - * - blocking mode: each call to an OCI function returns control to the - * application when the call completes - * - non-blocking mode (based on polling paradigm) : the application have to - * call each function until its has completed its job - * - * OCILIB implements OCI in blocking mode. The application has to wait for OCI - * calls to complete to continue. - * - * Some operations can be long to be processed by the server. - * - * In order to cancel the current pending call, OCILIB provides OCI_Break() that - * cancel the last internal OCI Call and then raise an OCI abortion error code. - * - * @note - * Any call to OCI_Break() has to be done from a separate thread because the - * thread that has executed a long OCI call is waiting for its OCI call to complete. - * - * @par Example - * @include abort.c - * - */ - -/** - * @brief - * Perform an immediate abort of any currently Oracle OCI call - * - * @param con - connection handle - * - * @note - * The current call will abort and generate an error - * - * @return - * Returns FALSE if connection handle is NULL otherwise TRUE - */ - -OCI_EXPORT boolean OCI_API OCI_Break -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiMetadata Describing Schema Meta data and Objects - * @{ - * - * - * @par Example - * @include desc.c - * - */ - -/** - * @brief - * Retrieve the available type info information - * - * @param con - Connection handle - * @param name - Table/view name to query for - * @param type - Type of object - * - * @note - * Possible values for parameter type are : - * - * - OCI_UNKNOWN - * - OCI_TIF_TABLE - * - OCI_TIF_VIEW - * - OCI_TIF_TYPE - * - * @return - * - Type info handle on success - = - NULL if the object does not exist - * - NULL on failure - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_TypeInfoGet -( - OCI_Connection *con, - const otext *name, - unsigned int type -); - -/** - * @brief - * Return the type of the type info object - * - * @param typinf - Type info handle - * - * @note - * Possible values for parameter type are : - * - * - OCI_UNKNOWM - * - OCI_TIF_TABLE - * - OCI_TIF_VIEW - * - OCI_TIF_TYPE - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TypeInfoGetType -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Retrieve connection handle from the type info handle - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_TypeInfoGetConnection -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a type info object - * - * @param typinf - Type info handle - * - * @note - * this call is optional. - * OCI_TypeInfo object are internally tracked and - * automatically freed when their related connection is freed - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TypeInfoFree -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Return the number of columns of a table/view/object - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TypeInfoGetColumnCount -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Return the column object handle at the given index in the table - * - * @param typinf - Type info handle - * @param index - Column position - * - * @return - * - Column handle on success - * - NULL if index is out of bounds or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_TypeInfoGetColumn -( - OCI_TypeInfo *typinf, - unsigned int index -); - -/** - * @brief - * Return the name described by the type info object - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_TypeInfoGetName -( - OCI_TypeInfo *typinf -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFormatting Formatted functions - * @{ - * - * OCILIB offers some smart routines that takes a variable number of arguments - * in order to minimize OCILIB function calls and reduce the amount of code lines - * - * On Windows platforms, the target programming language must support the __cdecl - * calling convention - * - * @note - * OCI_Immediate() and OCI_ImmediateFmt() support all OCILIB supported types - * for output result, except : - * - OCI_Long - * - OCI_Statement - * If a query output result contains one of these unsupported types, the function returns FALSE - * - * @note - * In the parameter list, every output placeholder MUST be preceded by - * an integer parameter that indicates the type of the placeholder - * in order to handle correctly the given pointer. - * - * Possible values for indicating placeholders type : - * - * - OCI_ARG_SHORT ------> short * - * - OCI_ARG_USHORT -----> unsigned short * - * - OCI_ARG_INT --------> int * - * - OCI_ARG_UINT -------> unsigned int* - * - OCI_ARG_BIGINT -----> big_int * - * - OCI_ARG_BIGUINT ----> unsigned big_int * - * - OCI_ARG_DOUBLE ----> double * - * - OCI_ARG_FLOAT ------> float * - * - OCI_ARG_NUMBER -----> OCI_Number * - * - OCI_ARG_TEXT -------> otext * - * - OCI_ARG_RAW --------> void * - * - OCI_ARG_DATETIME ---> OCI_Date * - * - OCI_ARG_LOB --------> OCI_Lob * - * - OCI_ARG_FILE -------> OCI_File * - * - OCI_ARG_TIMESTAMP --> OCI_Timestamp * - * - OCI_ARG_INTERVAL ---> OCI_Interval * - * - OCI_ARG_OBJECT -----> OCI_Object * - * - OCI_ARG_COLLECTION -> OCI_Coll * - * - OCI_ARG_REF --------> OCI_Ref * - * - * @note - * For output strings and Raws, returned data is copied to the given buffer - * instead of returning a pointer the real data. - * So these buffers must be big enough to hold the column content. No size check is performed. - * - * - For strings, only the real string is copied. - * - For Raws, the number of bytes copied is the column size - * - * @warning - * Input parameters for formatted function only support a restricted set of data types ! - * - * Supported input identifiers : - * - * - '%s' : (otext *) ----------> input string (quotes are added) - * - '%m' : (otext *) ----------> meta data string (no quotes added) - * - '%t' : (OCI_Date *) -------> Date - * - '%p' : (OCI_Timestamp *) --> timestamp - * - '%v' : (OCI_Interval *) ---> Interval - * - '%i' : (int) --------------> signed 32 bits integer - * - '%u' : (unsigned int) -----> unsigned 32 bits integer - * - '%li' : (big_int) ----------> signed 64 bits integer - * - '%lu' : (big_uint) ---------> unsigned 64 bits integer - * - '%hi' : (short) ------------> signed 16 bits integer - * - '%hu' : (unsigned short) ---> unsigned 16 bits integer - * - '%g' : (double, float ) ---> Numerics - * - '%n' : (OCI_Number *) -----> Number - * - '%r' : (OCI_Ref *) --------> Reference - * - '%o' : (OCI_Object *) -----> Object (not implemented yet) - * - '%c' : (OCI_Coll *) -------> collection (not implemented yet) - * - * @par Example - * @include format.c - * - */ - -/** - * @brief - * Perform 3 calls (prepare+execute+fetch) in 1 call - * - * @param con - Connection handle - * @param sql - SQL statement - * @param ... - List of program variables address to store the result of fetch operation - * - * @note - * Every output parameter MUST be preceded by an integer parameter that indicates the type - * of the placeholder in order to handle correctly the given pointer. - * - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_Immediate -( - OCI_Connection *con, - const otext *sql, - ... -); - -/** - * @brief - * Performs 4 call (prepare+bind+execute+fetch) in 1 call - * - * @param con - Connection handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL followed by the - * output variables addresses for the fetch operation - * - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_ImmediateFmt -( - OCI_Connection *con, - const otext *sql, - ... -); - -/** - * @brief - * Prepare a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_PrepareFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Execute a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_ExecuteStmtFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Parse a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @note - * This call sends the SQL or PL/SQL command to the server for parsing only. - * The command is not executed. - * This call is only useful to check is a command is valid or not. - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to parse its SQL or PL/SQL command. - * OCI_Execute() can be call after OCI_ParseFmt() in order to execute the - * statement, which means that the server will re-parse again the command. - * - * @warning - * Do not use OCI_ParseFmt() unless you're only interested in the parsing result - * because the statement will be parsed again when executed and thus leading to - * unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_ParseFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Describe the select list of a formatted SQL select statement. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @note - * This call sends the SELECT SQL order to the server for retrieving the - * description of the select order only. - * The command is not executed. - * This call is only useful to retrieve information on the associated resultset - * Call OCI_GetResultet() after OCI_Describe() to access to SELECT list - * information - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to describe the output SELECT list. - * OCI_Execute() can be call after OCI_Desbribe() in order to execute the - * statement, which means that the server will parse, and describe again the SQL - * order. - * - * @warning - * Do not use OCI_Desbribe() unless you're only interested in the resultset - * information because the statement will be parsed again when executed and thus - * leading to unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_DescribeFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiHashTables Hash tables - * @{ - * - * OCILIB uses hash tables internally for index/name columns mapping. - * - * OCILIB makes public its hash tables implementation public for general purpose - * uses. - * - * OCI_HashTable objects manage string keys / values that can be : - * - * - integers - * - strings - * - pointers - * - * This hash table implementation : - * - * - handle collisions - * - allows multiple values per key - * - * @par Internal conception - * - * - The hash table is composed of an array of slots. - * - Each slot can hold a linked list of entries (one per key) - * - Each entry can hold a linked list of values - * - * @note - * - The internal hash function computes the index in the array where the entry - * has to be inserted/looked up. - * - * - * @note - * Collisions are handled by chaining method. - * - * @include hash.c - * - */ - -/** - * @brief - * Create a hash table - * - * @param size - size of the hash table - * @param type - type of the hash table - * - * @note - * Parameter can be one of the following values : - * - * - OCI_HASH_STRING : string values - * - OCI_HASH_INTEGER : integer values - * - OCI_HASH_POINTER : pointer values - * - * @return - * Hash handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_HashTable * OCI_API OCI_HashCreate -( - unsigned int size, - unsigned int type -); - -/** - * @brief - * Destroy a hash table - * - * @param table - Table handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashFree -( - OCI_HashTable *table -); - -/** - * @brief - * Return the size of the hash table - * - * @param table - Table handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_HashGetSize -( - OCI_HashTable *table -); - -/** - * @brief - * Return the type of the hash table - * - * @param table - Table handle - * - * @note - * the return value can be one of the following values : - * - * - OCI_HASH_STRING : string values - * - OCI_HASH_INTEGER : integer values - * - OCI_HASH_POINTER : pointer values - * - * @return - * Hash table data type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_HashGetType -( - OCI_HashTable *table -); - -/** - * @brief - * Add a pair string key / string value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - string value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddString -( - OCI_HashTable *table, - const otext *key, - const otext *value -); - -/** - * @brief - * Return the string value associated to the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored string associated with the key otherwise NULL - * - */ - -OCI_EXPORT const otext * OCI_API OCI_HashGetString -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Adds a pair string key / integer value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - Integer value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddInt -( - OCI_HashTable *table, - const otext *key, - int value -); - -/** - * @brief - * Return the integer value associated to the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored integer associated with the key otherwise 0 - * - */ - -OCI_EXPORT int OCI_API OCI_HashGetInt -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Adds a pair string key / pointer value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - Pointer value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddPointer -( - OCI_HashTable *table, - const otext *key, - void *value -); - -/** - * @brief - * Return a pointer associated with the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored pointer associated with the key otherwise NULL - * - */ - -OCI_EXPORT void * OCI_API OCI_HashGetPointer -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Lookup for an entry matching the key in the table - * - * @param table - Table handle - * @param key - String key - * @param create - Do create the entry if not exists - * - * @return - * Entry handle if key found/added otherwise NULL - * - */ - -OCI_EXPORT OCI_HashEntry * OCI_API OCI_HashLookup -( - OCI_HashTable *table, - const otext *key, - boolean create -); - -/** - * @brief - * Return the first hash slot that matches the key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Slot handle if key found otherwise NULL - * - */ - -OCI_EXPORT OCI_HashValue * OCI_API OCI_HashGetValue -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Return the entry slot of the hash table internal list at the given position - * - * @param table - Table handle - * @param index - index - * - * @warning - * Index start at at - * - * @return - * Slot handle otherwise NULL - * - */ - -OCI_EXPORT OCI_HashEntry * OCI_API OCI_HashGetEntry -( - OCI_HashTable *table, - unsigned int index -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiThreading Threads and mutexes - * @{ - * - * Oracle proposes a portable implementation of Mutex and Thread objects - * - * OCILIB implements these OCI features for portable multi-threading support. - * - * Mutexes are designed for mutual exclusion between thread in order to lock resources temporarily - * - * Thread keys can be seen as process-wide variables that have a thread-specific - * values. It allows to create a unique key identified by a name (string) that - * can store values specific to each thread. - * - * OCILIB exposes the types OCI_Mutex, OCI_Thread - * - * @warning - * OCILIB MUST be initialized with OCI_ENV_THREADED to enable threads support - * - * @warning - * OCI_Thread relies on Oracle API which uses natives threading capabilities of - * the supported platform - * - * @warning - * Using OCI_Mutex : - * - On Microsoft Windows, a thread can call OCI_MutexAcquire() more than once - * without any blocking. Just be sure that there is an OCI_MutexRelease() for - * every OCI_MutexAcquire() call - * - On Unix systems, a thread MUST call OCI_MutexRelease() after every call to - * OCI_MutexAcquire() in order to be able to call OCI_MutexAcquire() again. If - * not, it will be blocked... - * - * @par Example - * @include thread.c - * - */ - -/** - * @brief - * Create a Mutex object - * - * @return - * Mutex handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Mutex * OCI_API OCI_MutexCreate -( - void -); - -/** - * @brief - * Destroy a mutex object - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexFree -( - OCI_Mutex *mutex -); - -/** - * @brief - * Acquire a mutex lock - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexAcquire -( - OCI_Mutex *mutex -); - -/** - * @brief - * Release a mutex lock - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexRelease -( - OCI_Mutex *mutex -); - -/** - * @brief - * Create a Thread object - * - * @return - * Thread handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Thread * OCI_API OCI_ThreadCreate -( - void -); - -/** - * @brief - * Destroy a thread object - * - * @param thread - Thread handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadFree -( - OCI_Thread *thread -); - -/** - * @brief - * Execute the given routine within the given thread object - * - * @param thread - Thread handle - * @param proc - routine to execute - * @param arg - parameter to pass to the routine - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadRun -( - OCI_Thread *thread, - POCI_THREAD proc, - void *arg -); - -/** - * @brief - * Join the given thread - * - * @param thread - Thread handle - * - * @note - * This function waits for the given thread to finish - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadJoin -( - OCI_Thread *thread -); - -/** - * @brief - * Create a thread key object - * - * @param name - Thread key name - * @param destfunc - Thread key value destructor function - * - * @note - * Parameter proc is optional. It's called when the thread terminates to allow - * the program to deal with the thread specific value of the key - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadKeyCreate -( - const otext *name, - POCI_THREADKEYDEST destfunc -); - -/** - * @brief - * Set a thread key value - * - * @param name - Thread key name - * @param value - user value to set - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadKeySetValue -( - const otext *name, - void *value -); - -/** - * @brief - * Get a thread key value - * - * @param name - Thread key name - * - * @return - * Thread key value on success otherwise FALSE - * - */ - -OCI_EXPORT void * OCI_API OCI_ThreadKeyGetValue -( - const otext *name -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApidirectPath Direct Path loading - * @{ - * - * OCILIB (from version 3.2.0) support the OCI direct Path API. - * - * Actual implementation of direct path API does not support the following - * elements : - * - Objects data types (User Defined Types and Object References) - * - Object tables - * - Nested tables - * - SQL String functions - * - * All scalar data types (numerics, characters and date/time), including LOBs - * and LONG types are supported - * - * @par Oracle direct API features (from Oracle Documentation) - * - * The direct path load interface allows an application to access the direct path - * load engine of the Oracle database server to perform the functions of the - * Oracle SQL*Loader utility. - * This functionality provides the ability to load data from external files - * into Oracle database objects, either a table or a partition of a partitioned - * table. - * The OCI direct path load interface has the ability to load multiple rows by - * loading a direct path stream which contains data for multiple rows. - * - * @par Oracle direct API limitation (from Oracle Documentation) - * The direct path load interface has the following limitations which are the - * same as SQL*Loader: - * - triggers are not supported - * - check constraints are not supported - * - referential integrity constraints are not supported - * - clustered tables are not supported - * - loading of remote objects is not supported - * - user-defined types are not supported - * - LOBs must be specified after all scalar columns - * - LONGs must be specified last - * - * @warning - * - * Its recommended to use direct path interface with an Oracle client that is - * the same version than the database. With version < 10g, it is mandatory - * regarding that it causes segmentation faults and it's known from Oracle that - * advices to use the same version for client and server (see metalink KB) - * - * @par How to use direct path - * - * - 1 : Create a direct path handle with OCI_DirPathCreate() - * - 2 : Set (optional) some direct path load attributes - * - 3 : Describe the columns to load with OCI_DirPathSetColumn() - * - 4 : Populate data with OCI_DirPathSetEntry() - * - 5 : Convert the data with OCI_DirPathConvert() - * - 6 : Load the data into the database with OCI_DirPathLoad() - * - 7 : Repeat step 4,5,6 + reset the stream with OCI_DirPathReset() until all - * rows has been loaded - * - 8 : Commit the load with OCI_DirPathFinish() - * - 9 : Free the direct path handle with OCI_DirPathFree() - * - * @par Example - * @include dirpath.c - * - */ - -/** - * @brief - * Create a direct path object - * - * @param typinf - Table type info handle - * @param partition - Partition name - * @param nb_cols - Number of columns to load - * @param nb_rows - Maximum of rows to handle per load operation - * - * @note - * Retrieve the table type info handle with OCI_TypeInfoGet(). - * The partition name is not mandatory - * - * @note - * Parameter 'nb_rows' is ignored for Oracle 8i. Prior to Oracle 9i, it's the - * OCI client that decides of the number of rows to process per convert/load calls. - * From Oracle 9i, OCI allows application to specify this value. Note that, the - * OCI client might not accept the input value. After OCI_DirPathPrepare() has - * been successfully called, OCI_DirPathGetMaxRows() returns the final number - * of rows used for the given direct path operation. - * - * @return - * Return the direct path handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_DirPath * OCI_API OCI_DirPathCreate -( - OCI_TypeInfo *typinf, - const otext *partition, - unsigned int nb_cols, - unsigned int nb_rows -); - -/** - * @brief - * Free an OCI_DirPath handle - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ -OCI_EXPORT boolean OCI_API OCI_DirPathFree -( - OCI_DirPath *dp -); - -/** - * @brief - * Describe a column to load into the given table - * - * @param dp - Direct path Handle - * @param index - Column index - * @param name - Column name - * @param maxsize - Maximum input value size for a column entry - * @param format - Date or numeric format to use - * - * @note - * An error is thrown if : - * - If the column specified by the 'name' parameter is not found in the table - * referenced by the type info handle passed to OCI_DirPathCreate() - * - the index is out of bounds (= 0 or >= number of columns) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetColumn -( - OCI_DirPath *dp, - unsigned int index, - const otext *name, - unsigned int maxsize, - const otext *format -); - -/** - * @brief - * Prepares the OCI direct path load interface before any rows can be converted - * or loaded - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathPrepare -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the value of the given row/column array entry - * - * @param dp - Direct path Handle - * @param row - Row index - * @param index - Column index - * @param value - Value to set - * @param size - Size of the input value - * @param complete - Is the entry content fully provided ? - * - * @note - * Rows and columns indexes start at 1. - * - * @note - * The 'size' parameter is expressed in number of : - * - bytes for binary columns - * - characters for other columns - * - * @note - * Direct path support piece loading for LONGs and LOBs columns. When filling - * these columns, it's possible to provide input buffer piece by piece. In order - * to do so : - * - set the 'complete' parameter to FALSE - * - set the 'size' parameter to the piece size - * - Repeat calls to OCI_DirPathSetEntry() until the data is totally provided - * - The last call that set the last piece or an entry must specify the value - * TRUE for the 'complete' parameter - * - * @warning - * Current Direct Path OCILIB implementation DOES NOT support setting entry - * content piece by piece as mentioned above. It was planned in the original design - * but not supported yet. So, always set the complete parameter to TRUE. - * Setting entries content piece by piece may be supported in future releases - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetEntry -( - OCI_DirPath *dp, - unsigned int row, - unsigned int index, - void *value, - unsigned size, - boolean complete -); - -/** - * @brief - * Convert provided user data to the direct path stream format - * - * @param dp - Direct path Handle - * - * @return - * Possible return values : - * - OCI_DPR_COMPLETE : load has been successful - * - OCI_DPR_ERROR : an error happened while loading data - * - OCI_DPR_FULL : the internal stream is full - * - OCI_DPR_PARTIAL : a column hasn't been fully filled yet - * - OCI_DPR_EMPTY : no data was found to convert - * - * @note - * - When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() stops when - * any error is encountered and returns OCI_DPR_ERROR - * - When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() does not stop - * on errors. Instead it discards any erred rows and returns OCI_DPR_COMPLETE once - * all rows are processed. - * - * @note - * List of faulted rows and columns can be retrieved using OCI_DirPathGetErrorRow() and - * OCI_DirPathGetErrorColumn() - * - * @note - * OCI_DirPathGetAffectedRows() returns the number of rows converted in the last call. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathConvert -( - OCI_DirPath *dp -); - -/** - * @brief - * Loads the data converted to direct path stream format - * - * @param dp - Direct path Handle - * - * @return - * Possible return values : - * - OCI_DPR_COMPLETE : conversion has been successful - * - OCI_DPR_ERROR : an error happened while converting data - * - OCI_DPR_FULL : the internal stream is full - * - OCI_DPR_PARTIAL : a column hasn't been fully filled yet - * - OCI_DPR_EMPTY : no data was found to load - * - * @note - * List of faulted rows can be retrieved using OCI_DirPathGetErrorRow() - * - * @note - * OCI_DirPathGetAffectedRows() returns the number of rows successfully loaded in the last call. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathLoad -( - OCI_DirPath *dp -); - -/** - * @brief - * Reset internal arrays and streams to prepare another load - * - * @param dp - Direct path Handle - * - * @note - * Once some data have been converted or loaded, OCI_DirPathReset() resets - * internal OCI structures in order to prepare another load operation - * (set entries, convert and load) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathReset -( - OCI_DirPath *dp -); - -/** - * @brief - * Terminate a direct path operation and commit changes into the database - * - * @param dp - Direct path Handle - * - * @warning - * The direct path handle cannot be used anymore after this call for any more - * loading operations and must be freed with OCI_DirPathFree(). - * - * @note - * Some properties functions of the direct path handle, such as - * OCI_DirPathGetRowCount() can be called on a terminated direct path handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathFinish -( - OCI_DirPath *dp -); - -/** - * @brief - * Terminate a direct path operation without committing changes - * - * @param dp - Direct path Handle - * - * @note - * Any pending loaded data are canceled. - * Any load completion operations, such as index maintenance operations, are not performed. - * - * @warning - * The direct path handle cannot be used anymore after this call for any more - * loading operations and must be freed with OCI_DirPathFree(). - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathAbort -( - OCI_DirPath *dp -); - -/** - * @brief - * Execute a data save-point (server side) - * - * @param dp - Direct path Handle - * - * @note - * Executing a data save-point is not allowed for LOBs - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSave -( - OCI_DirPath *dp -); - -/** - * @brief - * Flushes a partially loaded row from server - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathFlushRow -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the current number of rows to convert and load - * - * @param dp - Direct path Handle - * @param nb_rows - Number of row to process - * - * @warning - * An OCILIB error will be thrown if the value exceeds the maximum number of - * rows in the internals arrays - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetCurrentRows -( - OCI_DirPath *dp, - unsigned int nb_rows -); - -/** - * @brief - * Return the current number of rows used in the OCILIB internal - * arrays of rows - * - * @param dp - Direct path Handle - * - * @return - * Internal current array size on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetCurrentRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the maximum number of rows allocated in the OCI and OCILIB - * internal arrays of rows - * - * @param dp - Direct path Handle - * - * @return - * Internal maximum array size on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetMaxRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the default date format string for input conversion - * - * @param dp - Direct path Handle - * @param format - date format - * - * @note - * For string to date conversion, Oracle uses : - * - Column date format - * - Default date format (modified by this call) - * - Default global support environment setting - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetDateFormat -( - OCI_DirPath *dp, - const otext *format -); - -/** - * @brief - * Set the parallel loading mode - * - * @param dp - Direct path Handle - * @param value - enable/disable parallel mode - * - * @note - * Default value is FALSE. - * - * @note - * Setting the value to TRUE allows multiple load sessions to load the same - * segment concurrently - * - * @par Parallel loading mode (From Oracle documentation) - * - * A direct load operation requires that the object being loaded is locked to - * prevent DML on the object. - * Note that queries are lock-free and are allowed while the object is being loaded. - * - For a table load, if the option is set to: - * - FALSE, then the table DML X-Lock is acquired. - * - TRUE, then the table DML S-Lock is acquired. - * - For a partition load, if the option is set to: - * - FALSE, then the table DML SX-Lock and partition DML X-Lock is acquired. - * - TRUE, then the table DML SS-Lock and partition DML S-Lock is acquired. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetParallel -( - OCI_DirPath *dp, - boolean value -); - -/** - * @brief - * Set the logging mode for the loading operation - * - * @param dp - Direct path Handle - * @param value - enable/disable logging - * - * @par Logging mode (from Oracle Documentation) - * - * The NOLOG attribute of each segment determines whether image redo or - * invalidation redo is generated: - * - FALSE : Use the attribute of the segment being loaded. - * - TRUE : No logging. Overrides DDL statement, if necessary. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetNoLog -( - OCI_DirPath *dp, - boolean value -); - -/** - * @brief - * Set number of elements in the date cache - * - * @param dp - Direct path Handle - * @param size - Buffer size - * - * @note - * Default value is 0. - * - * @note - * Setting the value to 0 disables the cache - * - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetCacheSize -( - OCI_DirPath *dp, - unsigned int size -); - -/** - * @brief - * Set the size of the internal stream transfer buffer - * - * @param dp - Direct path Handle - * @param size - Buffer size - * - * @note - * Default value is 64KB. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetBufferSize -( - OCI_DirPath *dp, - unsigned int size -); - -/** - * @brief - * Set the direct path conversion mode - * - * @param dp - Direct path Handle - * @param mode - Conversion mode - * - * @note - * Possible values for parameter 'mode' : - * - OCI_DCM_DEFAULT : conversion fails on error - * - OCI_DCM_FORCE : conversion does not fail on error - * - * @note - * See OCI_DirPathConvert() for conversion mode details - * - * @note - * Default value is OCI_DCM_DEFAULT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetConvertMode -( - OCI_DirPath *dp, - unsigned int mode -); - -/** - * @brief - * Return the number of rows successfully loaded into the database so far - * - * @param dp - Direct path Handle - * - * @note - * Insertions are committed with OCI_DirPathFinish() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetRowCount -( - OCI_DirPath *dp -); - -/** - * @brief - * return the number of rows successfully processed during in the last - * conversion or loading call - * - * @param dp - Direct path Handle - * - * @note - * This function called after : - * - * - OCI_DirPathConvert(), returns the number of converted rows - * - OCI_DirPathload(), returns the number of loaded rows - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetAffectedRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the index of a column which caused an error during data conversion - * - * @param dp - Direct path Handle - * - * @warning - * Direct path column indexes start at 1. - * - * @note - * Errors may happen while data is converted to direct path stream format - * using OCI_DirPathConvert(). - * When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() returns - * OCI_DPR_ERROR on error. OCI_DirPathGetErrorColumn() returns the column index - * that caused the error - * When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() returns - * OCI_DPR_COMPLETE even on errors. In order to retrieve the list of all column - * indexes that have erred, the application can call OCI_DirPathGetErrorColumn() - * repeatedly until it returns 0. - * - * @note - * The internal value is reset to 0 when calling OCI_DirPathConvert() - * - * @return - * 0 is no error occurs otherwise the index of the given column which caused an - * error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetErrorColumn -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the index of a row which caused an error during data conversion - * - * @param dp - Direct path Handle - * - * @warning - * Direct path row indexes start at 1. - * - * @note - * Errors may happen : - * - while data is converted to direct path stream format using OCI_DirPathConvert() - * - while data is loaded to database using OCI_DirPathLoad() - * - * @note - * When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() returns - * OCI_DPR_ERROR on error. OCI_DirPathGetErrorRow() returns the row index that - * caused the error. - * When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() returns - * OCI_DPR_COMPLETE even on errors. In order to retrieve the list of all row - * indexes that have erred, the application can call OCI_DirPathGetErrorRow() - * repeatedly until it returns 0. - * - * @note - * After a call to OCI_DirPathLoad(), in order to retrieve the list of all faulted rows - * indexes, the application can call OCI_DirPathGetErrorRow() repeatedly until it returns 0. - * - * @note - * The internal value is reset to 0 when calling OCI_DirPathConvert(), - * OCI_DirPathReset() or OCI_DirPathLoad() - * - * @return - * 0 is no error occurs otherwise the index of the given row which caused an - * error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetErrorRow -( - OCI_DirPath *dp -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiAdvancedQueuing Oracle Advanced Queuing (A/Q) - * @{ - * - * OCILIB supports Oracle Advanced Queues features - * - * Let's Oracle talk about this features ! - * - * @par Oracle Queues (from Oracle Streams - Advanced Queuing User's Guide) - * - * Oracle Streams AQ provides database-integrated message queuing functionality. - * It is built on top of Oracle Streams and leverages the functions of Oracle - * Database so that messages can be stored persistently, propagated between - * queues on different computers and databases, and transmitted using Oracle - * Net Services and HTTP(S). - * Because Oracle Streams AQ is implemented in database tables, all operational - * benefits of high availability, scalability, and reliability are also - * applicable to queue data. Standard database features such as recovery, - * restart, and security are supported by Oracle Streams AQ. You can use - * database development and management tools such as Oracle Enterprise Manager - * to monitor queues. Like other database tables, queue tables can be imported - * and exported. - * - * @par OCILIB implementation - * - * OCILIB provides a (nearly) full C implementation of Advanced Queues available in - * Oracle OCI and proposes the following data types : - * - OCI_Msg : Implementation of message to enqueue/dequeue from/to queues - * - OCI_Enqueue : Implementation of enqueuing process - * - OCI_Dequeue : Implementation of dequeuing process - * - OCI_Agent : Implementation of Advanced queues Agents - * - * OCILIB support AQ messages notification with Oracle Client 10gR2 or above - * - * Note that the only AQ features not supported yet by OCILIB are : - * - Payloads of type AnyData - * - Enqueuing/dequeuing arrays of messages - * - Optional delivery mode introduced in 10gR2 - * - * OCILIB provides as well a C API to administrate queues and queue tables initially - * reserved to PL/SQL and Java (wrappers around PL/SQL calls). - * This API, based on internal PL/SQL calls wrapping the DBMS_AQADM packages procedures, allow the - * following actions : - * - create, alter, drop and purge queue tables (OCI_QueueTableXXX calls) - * - create, alter, drop, start, stop queues (OCI_QueueXXX calls) - * - * Note that the user connected to the database needs particular privileges to manipulate or - * administrate queues (See Oracle Streams - Advanced Queuing User's Guide for more informations - * on these privileges) - * - *@par Example - * @include queue.c - * - */ - -/** - * @brief - * Create a message object based on the given payload type - * - * @param typinf - Type info handle - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @warning - * Newly created Message handles have NULL payloads. - * For Message handling Objects payloads, OCI_MsgGetObject() returns NULL until an object handle is - * assigned to the message. - * - * @note - * When a local OCI_Msg handle is enqueued, it keeps its attributes. If it's enqueued again, another - * identical message is posted into the queue. - * To reset a message and empty all its properties, call OCI_MsgReset() - * Note that OCI_MsgReset() clears the message payload. - * - * @return - * Return the message handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Msg * OCI_API OCI_MsgCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a message object - * - * @param msg - Message handle - * - * @warning - * Only message handles created with OCI_MsgCreate() should be freed by OCI_MsgFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgFree -( - OCI_Msg *msg -); - -/** - * @brief - * Reset all attributes of a message object - * - * @param msg - Message handle - * - * @note - * This function calls OCI_MsgSetxxx() with default or NULL attributes - * - * @warning - * OCI_MsgReset() clears the message payload and set it to NULL - * For messages handling objects payloads, OCI_MsgSetObject() must be called again to assign a - * payload. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgReset -( - OCI_Msg *msg -); - -/** - * @brief - * Get the object payload of the given message - * - * @param msg - Message handle - * - * @return - * Return the object handle on success otherwise NULL on failure or if payload is NULL - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_MsgGetObject -( - OCI_Msg *msg -); - -/** - * @brief - * Set the object payload of the given message - * - * @param msg - Message handle - * @param obj - Object handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetObject -( - OCI_Msg *msg, - OCI_Object *obj -); - -/** - * @brief - * Get the RAW payload of the given message - * - * @param msg - Message handle - * @param raw - Input buffer - * @param size - Input buffer maximum size - * - * @note - * On output, parameter 'size' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE on failure or if payload is object based. - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetRaw -( - OCI_Msg *msg, - void *raw, - unsigned int *size -); - -/** - * @brief - * Set the RAW payload of the given message - * - * @param msg - Message handle - * @param raw - Raw data - * @param size - Raw data size - * - * @return - * TRUE on success otherwise FALSE on failure or if payload is object based. - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetRaw -( - OCI_Msg *msg, - const void *raw, - unsigned int size -); - -/** - * @brief - * Return the number of attempts that have been made to dequeue the message - * - * @param msg - Message handle - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetAttemptCount -( - OCI_Msg *msg -); - -/** - * @brief - * Return the number of seconds that a message is delayed for dequeuing - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetEnqueueDelay() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetEnqueueDelay -( - OCI_Msg *msg -); - -/** - * @brief - * set the number of seconds to delay the enqueued message - * - * @param msg - Message handle - * @param value - Delay in seconds - * - * @note - * The delay represents the number of seconds after which a message is available for dequeuing. - * When the message is enqueued, its state is set to OCI_AMS_WAITING. - * When the delay expires, its state is set to OCI_AMS_READY. - * - * @note - * If parameter 'value' is set to zero (default value), the message will be immediately available - * for dequeuing - * - * @warning - * Dequeuing by Message ID overrides the delay specification. - * - * @warning - * Delaying processing requires the queue monitor to be started. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetEnqueueDelay -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * return the time the message was enqueued - * - * @param msg - Message handle - * - * @note - * Only use this function for message dequeued from queues - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_MsgGetEnqueueTime -( - OCI_Msg *msg -); - -/** - * @brief - * Return the duration that the message is available for dequeuing - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetExpiration() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetExpiration -( - OCI_Msg *msg -); - -/** - * @brief - * set the duration that the message is available for dequeuing - * - * @param msg - Message handle - * @param value - duration in seconds - * - * @note - * This parameter is an offset from the delay (see OCI_MsgSetEnqueueDelay()) - * While waiting for expiration, the message state is set to OCI_AMS_READY. - * If the message is not dequeued before it expires, it will be moved to the exception queue - * with the state OCI_AMS_EXPIRED. - * - * @note - * If parameter 'value' is set to -1 (default value), the message will not expire - * - * @warning - * Expiration processing requires the queue monitor to be started. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetExpiration -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * Return the state of the message at the time of the dequeue - * - * @param msg - Message handle - * - * @return - * - OCI_UNKNOWN : the function has failed to get the message state - * - OCI_AMS_READY : the message is ready to be processed - * - OCI_AMS_WAITING : the message delay has not yet completed - * - OCI_AMS_PROCESSED : the message has been processed - * - OCI_AMS_EXPIRED : the message has moved to exception queue - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_MsgGetState -( - OCI_Msg *msg -); - -/** - * @brief - * Return the priority of the message - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetPriority() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetPriority -( - OCI_Msg *msg -); - -/** - * @brief - * Set the priority of the message - * - * @param msg - Message handle - * @param value - Message priority - * - * @note - * - The priority can be any number, including negative numbers. - * - A smaller number indicates higher priority. - * - Default value is zero. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetPriority -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * Return the ID of the message - * - * @param msg - Message handle - * @param id - Input buffer - * @param len - Input buffer maximum size - * - * @note - * The message ID is : - * - generated when the message is enqueued in the queue - * - retrieved when the message is dequeued from the queue - * - * @note - * On output, parameter 'len' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetID -( - OCI_Msg *msg, - void *id, - unsigned int *len -); - -/** - * @brief - * Return the original ID of the message in the last queue that generated this message - * - * @param msg - Message handle - * @param id - Input buffer - * @param len - Input buffer maximum size - * - * @warning - * When a message is propagated from/to different queues, this ID is the one generated for the - * message in the previous queue. - * - * @note - * On output, parameter 'len' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetOriginalID -( - OCI_Msg *msg, - void *id, - unsigned int *len -); - -/** - * @brief - * Set the original ID of the message in the last queue that generated this message - * - * @param msg - Message handle - * @param id - Message ID - * @param len - Message ID size - * - * @warning - * When a message is propagated from/to different queues, this ID is the one generated for the - * message in the previous queue. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetOriginalID -( - OCI_Msg *msg, - const void *id, - unsigned int len -); - -/** - * @brief - * Return the original sender of a message - * - * @param msg - Message handle - * - * @return - * Sender Handle (OCI_Agent *) on success (if set at enqueue time) otherwise NULL - * - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_MsgGetSender -( - OCI_Msg *msg -); - -/** - * @brief - * Set the original sender of a message - * - * @param msg - Message handle - * @param sender - Message sender - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetSender -( - OCI_Msg *msg, - OCI_Agent *sender -); - -/** - * @brief - * Set the recipient list of a message to enqueue - * - * @param msg - Message handle - * @param consumers - Recipients list (array of agent handles) - * @param count - Number of recipients - * - * @warning - * This function should only be used for queues which allow multiple consumers. - * The default recipients are the queue subscribers. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetConsumers -( - OCI_Msg *msg, - OCI_Agent **consumers, - unsigned int count -); - -/** - * @brief - * Get the correlation identifier of the message - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetCorrelation() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_MsgGetCorrelation -( - OCI_Msg *msg -); - -/** - * @brief - * set the correlation identifier of the message - * - * @param msg - Message handle - * @param correlation - Message correlation text - * - * @note - * see OCI_DequeueSetCorrelation() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetCorrelation -( - OCI_Msg *msg, - const otext *correlation -); - -/** - * @brief - * Get the Exception queue name of the message - * - * @param msg - Message handle - * - * @warning - * When calling this function on a message retrieved with OCI_DequeueGet(), the returned value is - * NULL if the default exception queue associated with the current queue is used (e.g. no user - * defined specified at enqueue time for the message) - * - * @note - * see OCI_MsgSetExceptionQueue() for more details - * - */ -OCI_EXPORT const otext * OCI_API OCI_MsgGetExceptionQueue -( - OCI_Msg *msg -); - -/** - * @brief - * Set the name of the queue to which the message is moved to if it cannot be - * processed successfully - * - * @param msg - Message handle - * @param queue - Exception queue name - * - * @warning - * From Oracle Documentation : - * - * "Messages are moved into exception queues in two cases : - * - If the number of unsuccessful dequeue attempts has exceeded the attribute 'max_retries' of - * given queue - * - if the message has expired. - * - * All messages in the exception queue are in the EXPIRED state. - * - * The default is the exception queue associated with the queue table. - * - * If the exception queue specified does not exist at the time of the move the message will be - * moved to the default exception queue associated with the queue table and a warning will be - * logged in the alert file. - * - * This attribute must refer to a valid queue name." - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetExceptionQueue -( - OCI_Msg *msg, - const otext *queue -); - -/** - * @brief - * Create a Enqueue object for the given queue - * - * @param typinf - Type info handle - * @param name - Queue name - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload to enqueue to the given queue : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @return - * Return the Enqueue handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Enqueue * OCI_API OCI_EnqueueCreate -( - OCI_TypeInfo *typinf, - const otext *name -); - -/** - * @brief - * Free a Enqueue object - * - * @param enqueue - Enqueue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueFree -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Enqueue a message on the queue associated to the Enqueue object - * - * @param enqueue - Enqueue handle - * @param msg - Message handle to enqueue - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueuePut -( - OCI_Enqueue *enqueue, - OCI_Msg *msg -); - -/** -* @brief -* Set the enqueuing sequence of messages to put in the queue -* -* @param enqueue - Enqueue handle -* @param sequence - enqueuing sequence -* -* @note -* Possible values for parameter 'sequence' : -* - OCI_ASD_BEFORE : enqueue message before another message -* - OCI_ASD_TOP : enqueue message before all messages -* -* @note -* Default value is OCI_ASD_TOP -* -* @note -* if the parameter 'sequence' is set to OCI_ASD_BEFORE, the application must -* call OCI_EnqueueSetRelativeMsgID() before enqueuing the next message in the queue. -* -* @note -* In order to stop enqueuing message using a sequence deviation, call -* OCI_EnqueueSetSequenceDeviation() with the value OCI_ASD_TOP -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetSequenceDeviation -( - OCI_Enqueue *enqueue, - unsigned int sequence -); - -/** - * @brief - * Return the sequence deviation of messages to enqueue to the queue - * - * @param enqueue - Enqueue handle - * - * @note - * see OCI_EnqueueSetSequenceDeviation() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EnqueueGetSequenceDeviation -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Set whether the new message is enqueued as part of the current transaction - * - * @param enqueue - Enqueue handle - * @param visibility - Enqueuing visibility - * - * @note - * Possible values for parameter 'visibility' : - * - OCI_AMV_IMMEDIATE : enqueue is an independent transaction - * - OCI_AMV_ON_COMMIT : enqueue is part of current transaction - * - * @note - * Default value is OCI_AMV_ON_COMMIT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetVisibility -( - OCI_Enqueue *enqueue, - unsigned int visibility -); - -/** - * @brief - * Get the enqueuing/locking behavior - * - * @param enqueue - Enqueue handle - * - * @note - * see OCI_EnqueueSetVisibility() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EnqueueGetVisibility -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Set a message identifier to use for enqueuing messages using a sequence deviation - * - * @param enqueue - Enqueue handle - * @param id - message identifier - * @param len - pointer to message identifier length - * - * @note - * This call is only valid if OCI_EnqueueSetSequenceDeviation() has been called - * with the value OCI_ASD_BEFORE - * - * @warning - * if the function cannot assign the message id, the content of the parameter 'len' is set to zero. - * - * @note - * see OCI_EnqueueSetSequenceDeviation() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetRelativeMsgID -( - OCI_Enqueue *enqueue, - const void *id, - unsigned int len -); - -/** - * @brief - * Get the current associated message identifier used for enqueuing messages - * using a sequence deviation - * - * @param enqueue - Enqueue handle - * @param id - buffer to receive the message identifier - * @param len - pointer to buffer max length - * - * @warning - * When the function returns, parameter 'len' hold the number of bytes assigned to parameter 'id' - * - * @note - * see OCI_EnqueueGetRelativeMsgID() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueGetRelativeMsgID -( - OCI_Enqueue *enqueue, - void *id, - unsigned int *len -); - -/** - * @brief - * Create a Dequeue object for the given queue - * - * @param typinf - Type info handle - * @param name - Queue name - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload to dequeue from the given queue : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @return - * Return the Dequeue handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Dequeue * OCI_API OCI_DequeueCreate -( - OCI_TypeInfo *typinf, - const otext *name -); - -/** - * @brief - * Free a Dequeue object - * - * @param dequeue - Dequeue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueFree -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Dequeue messages from the given queue - * - * @param dequeue - Dequeue handle - * - * @warning - * The returned message is handled by the dequeue object. - * Do not release it with OCI_MsgFree() - * - * @warning - * When dequeuing from a multiple consumer queue, you need - * to set the navigation mode to OCI_ADN_FIRST_MSG using - * OCI_DequeueSetNavigation() - * - * @return - * Message handle on success otherwise NULL on failure or on timeout - * - */ - -OCI_EXPORT OCI_Msg * OCI_API OCI_DequeueGet -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Subscribe for asynchronous messages notifications - * - * @param dequeue - Dequeue handle - * @param port - Port to use for notifications - * @param timeout - notification timeout - * @param callback - User handler callback fired when messages are ready to be dequeued - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * asynchronous messages notifications - * - * @note - * Requires Oracle Client 10gR2 or above - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSubscribe -( - OCI_Dequeue *dequeue, - unsigned int port, - unsigned int timeout, - POCI_NOTIFY_AQ callback -); - -/** - * @brief - * Unsubscribe for asynchronous messages notifications - * - * @param dequeue - Dequeue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueUnsubscribe -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the current consumer name to retrieve message for. - * - * @param dequeue - Dequeue handle - * @param consumer - consumer name - * - * @warning - * If a queue is not set up for multiple consumers, OCI_DequeueSetConsumer() - * should not be called or called with parameter 'consumer' set to NULL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetConsumer -( - OCI_Dequeue *dequeue, - const otext *consumer -); - -/** - * @brief - * Get the current consumer name associated with the dequeuing process. - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetConsumer() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_DequeueGetConsumer -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * set the correlation identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param pattern - correlation identifier - * - * @note - * Special pattern matching characters, such as "%" or "_" can be used. - * If more than one message satisfies the pattern, the order of dequeuing is undetermined. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetCorrelation -( - OCI_Dequeue *dequeue, - const otext *pattern -); - -/** - * @brief - * Get the correlation identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetCorrelation() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_DequeueGetCorrelation -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the message identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param id - message identifier - * @param len - size of the message identifier - * - * @warning - * if the function cannot assign the message id, the content of the parameter 'len' is set to zero. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetRelativeMsgID -( - OCI_Dequeue *dequeue, - const void *id, - unsigned int len -); - -/** - * @brief - * Get the message identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param id - message identifier - * @param len - size of the message identifier - * - * @warning - * When the function returns, parameter 'len' hold the number of bytes assigned to parameter 'id' - * - * @note - * see OCI_DequeueSetRelativeMsgID() for more details - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueGetRelativeMsgID -( - OCI_Dequeue *dequeue, - void *id, - unsigned int *len -); - -/** - * @brief - * Set whether the new message is dequeued as part of the current transaction - * - * @param dequeue - Dequeue handle - * @param visibility - dequeuing mode - * - * @warning - * The visibility parameter is ignored when using the OCI_ADM_BROWSE dequeuing - * mode (see OCI_DequeueSetMode()) - * - * @note - * Possible values for parameter 'mode' : - * - OCI_AMV_IMMEDIATE : dequeue is an independent transaction - * - OCI_AMV_ON_COMMIT : dequeue is part of current transaction - * - * @note - * Default value is OCI_AMV_ON_COMMIT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetVisibility -( - OCI_Dequeue *dequeue, - unsigned int visibility -); - -/** - * @brief - * Get the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetVisibility() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetVisibility -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * @param mode - dequeuing mode - * - * @note - * Possible values for parameter 'mode' : - * - OCI_ADM_BROWSE : read message without acquiring a lock - * - OCI_ADM_LOCKED : read and obtain write lock on message - * - OCI_ADM_REMOVE : read the message and delete it - * - OCI_ADM_REMOVE_NODATA : confirm receipt of the message, but do not - * deliver the actual message content - * - * @note - * Default value is OCI_ADM_REMOVE - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetMode -( - OCI_Dequeue *dequeue, - unsigned int mode -); - -/** - * @brief - * Get the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetMode() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetMode -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the position of messages to be retrieved. - * - * @param dequeue - Dequeue handle - * @param position - navigation position - * - * @note - * The dequeuing uses the following sequence : - * - find messages using the navigation position - * - apply search criteria (message correlation) - * - get message - * - * @note - * Possible values for parameter 'position' : - * - OCI_ADN_FIRST_MSG : retrieves the first message which is available - * - OCI_ADN_NEXT_MSG : retrieves the next message which is available - * - OCI_ADN_NEXT_TRANSACTION : skips the remainder of the current transaction - * group (if any) and retrieves the first message - * of the next transaction group. - * - * @note - * Default value is OCI_ADN_NEXT_MSG - * - * @warning - * OCI_ADN_NEXT_TRANSACTION can only be used if message grouping is enabled for the given queue. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetNavigation -( - OCI_Dequeue *dequeue, - unsigned int position -); - -/** - * @brief - * Return the navigation position of messages to retrieve from the queue - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetNavigation() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetNavigation -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * set the time that OCIDequeueGet() waits for messages if no messages are - * currently available - * - * @param dequeue - Dequeue handle - * @param timeout - timeout in seconds - * - *@note - * - Any positive values in seconds are valid. - * - The value 0 is accepted and means OCIDequeueGet() does not wait for - * messages and returns immediately if no messages are available - * - The value -1 is accepted and means OCIDequeueGet() waits for ever (until - * a message is available in the queue) - * - * @note - * Default value is -1 (wait for ever) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetWaitTime -( - OCI_Dequeue *dequeue, - int timeout -); - -/** - * @brief - * Return the time that OCIDequeueGet() waits for messages if no messages are currently available - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetWaitTime() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_DequeueGetWaitTime -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the Agent list to listen to message for - * - * @param dequeue - Dequeue handle - * @param consumers - Agent handle array - * @param count - Number of agents the array - * - * @return - * return TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetAgentList -( - OCI_Dequeue *dequeue, - OCI_Agent **consumers, - unsigned int count -); - -/** - * @brief - * Listen for messages that match any recipient of the associated Agent list - * - * @param dequeue - Dequeue handle - * @param timeout - Timeout in second - * - * @note - * If an Agent handle is returned, messages are available for this agent. - * In order to retrieve its messages : - * - call OCI_DequeueSetConsumer() with the name of agent using OCI_AgentGetName() - * - call OCI_DequeueGet() to dequeue it's pending messages - * - * @warning - * The return value is valid only until: - * - OCIDequeueListen() is called again - * - OCI_DequeueFree( is called to free the Dequeue object - * So Do not store the handle value across calls to OCIDequeueListen() - * - * @return - * An Agent handle for who messages are available on success otherwise NULL - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_DequeueListen -( - OCI_Dequeue *dequeue, - int timeout -); - -/** - * @brief - * Create an AQ agent object - * - * @param con - Connection handle - * @param name - Agent name - * @param address - Agent address - * - * @note - * An AQ agent object is : - * - used as recipient information when enqueuing a message - * - used as sender information when dequeuing a message - * - used for listening message only from identified senders - * - * @note - * the AQ agent address can be any Oracle identifier, up to 128 bytes. - * the AQ agent name can be any Oracle identifier, up to 30 bytes. - * - * @return - * AQ agent handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_AgentCreate -( - OCI_Connection *con, - const otext *name, - const otext *address -); - -/** - * @brief - * Free an AQ agent object - * - * @param agent - AQ agent handle - * - * @warning - * Only AQ agent handle created with OCI_AgentCreate() should be freed by OCI_AgentFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentFree -( - OCI_Agent *agent -); - -/** - * @brief - * Set the given AQ agent name - * - * @param agent - AQ agent handle - * @param name - AQ agent name - * - * @note - * the AQ agent name is used to identified an message send or recipient when enqueuing/dequeuing - * a message - * - * @note - * the AQ agent name can be any Oracle identifier, up to 30 bytes. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentSetName -( - OCI_Agent *agent, - const otext *name -); - -/** - * @brief - * Get the given AQ agent name - * - * @param agent - AQ agent handle - * - * @return - * AQ agent name on success otherwise NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_AgentGetName -( - OCI_Agent *agent -); - -/** - * @brief - * Set the given AQ agent address - * - * @param agent - AQ agent handle - * @param address - AQ agent address - * - * @note - * the parameter 'address' must be of the form : [schema.]queue_name[\@dblink] - * - * @note - * the AQ agent address can be any Oracle identifier, up to 128 bytes. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentSetAddress -( - OCI_Agent *agent, - const otext *address -); - -/** - * @brief - * Get the given AQ agent address - * - * @param agent - AQ agent handle - * - * @note - * See OCI_AgentSetAddress() - * - * @return - * AQ agent address on success otherwise NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_AgentGetAddress -( - OCI_Agent *agent -); - -/** - * @brief - * Create a queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param queue_table - Queue table name - * @param queue_type - Queue type - * @param max_retries - Maximum number of attempts to dequeue a message - * @param retry_delay - Number of seconds between attempts to dequeue a message - * @param retention_time - number of seconds a message is retained in the queue table after - * being dequeued from the queue - * @param dependency_tracking - Parameter reserved for future use by Oracle (MUST be set to FALSE) - * @param comment - Description of the queue - * - * @note - * Parameter 'queue_name' can specify the schema where to create to queue ([schema.]queue_name) - * Queue names cannot be longer than 24 characters (Oracle limit for user queues) - * - * @note - * Possible values for parameter 'queue_type' : - * - OCI_AQT_NORMAL : Normal queue - * - OCI_AQT_EXCEPTION : Exception queue - * - OCI_AQT_NON_PERSISTENT : Non persistent queue - * - * To set default values, pass : - * - queue_type : OCI_AQT_NORMAL - * - max_retries : 0 - * - retry_delay : 0 - * - retention_time : 0 - * - comment : NULL - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.CREATE_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueCreate -( - OCI_Connection *con, - const otext *queue_name, - const otext *queue_table, - unsigned int queue_type, - unsigned int max_retries, - unsigned int retry_delay, - unsigned int retention_time, - boolean dependency_tracking, - const otext *comment -); - -/** - * @brief - * Alter the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param max_retries - Maximum number of attempts to dequeue a message - * @param retry_delay - Number of seconds between attempts to dequeue a message - * @param retention_time - number of seconds a message is retained in the queue table after - * being dequeued from the queue - * @param comment - Description of the queue - * - * @note - * See OCI_QueueCreate() for more details - * - * @warning - * This function updates all attributes handled in the parameter list ! - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.ALTER_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueAlter -( - OCI_Connection *con, - const otext *queue_name, - unsigned int max_retries, - unsigned int retry_delay, - unsigned int retention_time, - const otext *comment -); - -/** - * @brief - * Drop the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * - * @warning - * A queue can be dropped only if it has been stopped before. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.DROP_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueDrop -( - OCI_Connection *con, - const otext *queue_name -); - -/** - * @brief - * Start the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param enqueue - Enable enqueue - * @param dequeue - Enable dequeue - * - * @warning - * For exception queues, only enqueuing is allowed - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.START_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueStart -( - OCI_Connection *con, - const otext *queue_name, - boolean enqueue, - boolean dequeue -); - -/** - * @brief - * Stop enqueuing or dequeuing or both on the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param enqueue - Disable enqueue - * @param dequeue - Disable dequeue - * @param wait - Wait for current pending enqueues/dequeues - * - * @warning - * A queue cannot be stopped if there are pending transactions against the queue. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.STOP_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueStop -( - OCI_Connection *con, - const otext *queue_name, - boolean enqueue, - boolean dequeue, - boolean wait -); - -/** - * @brief - * Create a queue table for messages of the given type - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param queue_payload_type - Message type name - * @param storage_clause - Additional clauses for the table storage - * @param sort_list - Additional columns name to use for sorting - * @param multiple_consumers - Enable multiple consumers for each messages - * @param message_grouping - Specifies if messages are grouped within a transaction - * @param comment - Description of the queue table - * @param primary_instance - primary owner (instance) of the queue table - * @param secondary_instance - Owner of the queue table if the primary instance is not available - * @param compatible - lowest database version with which the queue table is compatible - * - * @note - * Parameter 'queue_table' can specify the schema where to create to queue table ([schema.]queue_table) - * Queue table names cannot be longer than 24 characters (Oracle limit for user queue tables) - * - * @note - * Possible values for parameter 'queue_payload_type' : - * - For Oracle types (UDT) : use the type name ([schema.].type_name) - * - For RAW data : use "SYS.RAW" or "RAW" - * - * @note - * Possible values for parameter 'message_grouping' : - * - OCI_AGM_NONE : each message is treated individually - * - OCI_AGM_TRANSACTIONNAL : all messages enqueued in one transaction are considered part of - * the same group and can be dequeued as a group of related messages. - * - * @note - * Possible values for parameter 'compatible' : - * - "8.0", "8.1", "10.0" - * - * To set default values, pass : - * - storage_clause : NULL - * - sort_list : NULL - * - message_grouping : OCI_AGM_NONE - * - comment : NULL - * - primary_instance : 0 - * - primary_instance : 0 - * - compatible : NULL - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.CREATE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableCreate -( - OCI_Connection *con, - const otext *queue_table, - const otext *queue_payload_type, - const otext *storage_clause, - const otext *sort_list, - boolean multiple_consumers, - unsigned int message_grouping, - const otext *comment, - unsigned int primary_instance, - unsigned int secondary_instance, - const otext *compatible -); - -/** - * @brief - * Alter the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param comment - Description of the queue table - * @param primary_instance - primary owner (instance) of the queue table - * @param secondary_instance - Owner of the queue table if the primary instance is not available - * - * @note - * See OCI_QueueTableCreate() from more details - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.ALTER_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableAlter -( - OCI_Connection *con, - const otext *queue_table, - const otext *comment, - unsigned int primary_instance, - unsigned int secondary_instance -); - -/** - * @brief - * Drop the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param force - Force the deletion of objects related to the queue table - * - * @note - * Possible values for 'force' : - * - TRUE : all queues using the queue table and their associated propagation schedules are - * dropped automatically - * - FALSE : All the queues using the given queue table must be stopped and dropped before the - * queue table can be dropped. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.DROP_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableDrop -( - OCI_Connection *con, - const otext *queue_table, - boolean force -); - -/** - * @brief - * Purge messages from the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param purge_condition - Optional SQL based conditions (see notes) - * @param block - Lock all queues using the queue table while doing the purge - * @param delivery_mode - Type of message to purge - * - * @note - * Possible values for parameter 'delivery_mode' : - * - OCI_APM_BUFFERED : purge only buffered messages - * - OCI_APM_PERSISTENT : purge only persistent messages - * - OCI_APM_ALL : purge all messages - * - * @note - * For more information about the SQL purge conditions, refer to - * Oracle Streams - Advanced Queuing User's Guide for more details - * - * @warning - * This feature is only available from ORacle 10gR2. - * This function does nothing and returns TRUE is the server version is < Oracle 10gR2 - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.PURGE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTablePurge -( - OCI_Connection *con, - const otext *queue_table, - const otext *purge_condition, - boolean block, - unsigned int delivery_mode -); - -/** - * @brief - * Migrate a queue table from one version to another - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param compatible - Database version with witch the queue table has to migrate - * - * @note - * Possible values for parameter 'compatible' : - * - "8.0", "8.1", "10.0" - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.MIGRATE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableMigrate -( - OCI_Connection *con, - const otext *queue_table, - const otext *compatible -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiSubscriptions Database Change notifications (DCN or CQN) - * @{ - * - * OCILIB supports Oracle 10gR2 feature Database Change Notifications (DCN) - * also named Continuous Query Notifications (CQN) - * - * This features allows a client application to register notifications - * when some changes are made in a database : - * - Database status changes : startup and shutdown - * - Database objects changes : - * - DDL changes : alter or drop actions - * - DML changes : insert, delete, update actions - * - * This feature can be really useful in applications that hold - * a cache of data. Instead of refreshing data periodically by - * connecting to the server, the application could only refresh - * modified data when necessary or perform specific tasks depending on - * the events. It saves application time, network traffic and can help - * the design of the application logic. - * - * The database status change notification is also interesting to be - * informed of instance startup / shutdown - * - * Check Oracle documentation for more details about this feature - * - * @note - * No active database connection is required to receive the - * notifications as they are handled by the Oracle client using a - * dedicated socket connection to the server - * - * @par Database changes - * - * The client application can be notified of any database status - * change (single DB or multiple DB in a RAC environment). - * - * @par Object changes - * - * The notifications of object changes are based on the registration - * of a query ('select' SQL statement). - * - * Oracle server will notify of any changes of any object that is - * part of the statement result set. - * - * Registering a statement will notify about any changes on its - * result set rows performed after the registration of the query. - * - * The query can be a simple 'select * from table' or a complex - * query involving many tables and/or criteria in the where clause. - * - * For Object changes, the notification can be at : - * - At Object level : only the object name (schema + object) is given - * - At row level : same that object level + RowID of the altered row - * - * @warning - * Trying to use this features with a client/server version < 10gR2 will raise an error - * - * @par Example - * @include notification.c - * - */ - -/** - * @brief - * Register a notification against the given database - * - * @param con - Connection handle - * @param name - Notification name - * @param type - Subscription type - * @param handler - User handler callback - * @param port - Port to use for notifications - * @param timeout - notification timeout - * - * @note - * Parameter 'type' can be one of the following values : - * - * - OCI_CNT_OBJECTS : request for changes at objects (e.g. tables) level (DDL / DML) - * - OCI_CNT_ROWS : request for changes at rows level (DML) - * - OCI_CNT_DATABASES : request for changes at database level (startup, shutdown) - * - OCI_CNT_ALL : request for all changes - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * Requires Oracle Client 10gR2 or above - * - * @note - * Subscription handles are automatically managed by the library - * - * @return - * Subscription handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Subscription * OCI_API OCI_SubscriptionRegister -( - OCI_Connection *con, - const otext *name, - unsigned int type, - POCI_NOTIFY handler, - unsigned int port, - unsigned int timeout -); - -/** - * @brief - * Unregister a previously registered notification - * - * @param sub - Subscription handle - * - * @note - * OCI_Cleanup() will automatically unregister any registered subscriptions - * - * @note - * If the database connection passed to OCI_SubscriptionRegister() - * has been closed by the time that the application calls - * OCI_SubscriptionUnregister, the library internally reconnects - * to the given database, performs the unregistration and then disconnects - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SubscriptionUnregister -( - OCI_Subscription *sub -); - -/** - * @brief - * Add a statement to the notification to monitor - * - * @param sub - Subscription handle - * @param stmt - Statement handle - * - * @note - * The given statement must be prepared but not executed before being passed to this function. - * OCI_SubscriptionAddStatement() executes the statement and register it for notifications - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * The given statement must hold a 'SELECT' SQL statement - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SubscriptionAddStatement -( - OCI_Subscription *sub, - OCI_Statement *stmt -); - -/** - * @brief - * Return the name of the given registered subscription - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_SubscriptionGetName -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the port used by the notification - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_SubscriptionGetPort -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the timeout of the given registered subscription - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_SubscriptionGetTimeout -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the connection handle associated with a subscription handle - * - * @param sub - Subscription handle - * - * @note - * It may return a NULL handle if the connection used in OCI_SubscriptionRegister has been closed. - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_SubscriptionGetConnection -( -OCI_Subscription *sub -); - -/** - * @brief - * Return the type of event reported by a notification - * - * @param event - Event handle - * - * @note - * The returned value can be one of the following values : - * - * - OCI_ENT_STARTUP : a database has been started up - * - OCI_ENT_SHUTDOWN : a database has been shut down - * - OCI_ENT_SHUTDOWN_ANY : a database has been shut down (RAC) - * - OCI_ENT_DROP_DATABASE : a database has been dropped - * - OCI_ENT_DEREGISTER : the notification is timed out - * - OCI_ENT_OBJECT_CHANGED : a database object has been modified - * - * @note - * OCI_EventGetDatabase() returns the affected database - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * OCI_EventGetObject() returns the affected object - * ('schema_name'.'object_name') - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EventGetType -( - OCI_Event *event -); - -/** - * @brief - * Return the type of operation reported by a notification - * - * @param event - Event handle - * - * @note - * This call is only valid when OCI_EventGetType() reports the - * event type OCI_ENT_OBJECT_CHANGED - * - * @note - * The returned value can be one of the following values : - * - * - OCI_ONT_INSERT : an insert has been performed - * - OCI_ONT_UPDATE : an update has been performed - * - OCI_ONT_DELETE : a delete has been performed - * - OCI_ONT_ALTER : an alter has been performed - * - OCI_ONT_DROP : a drop has been performed - * - OCI_ONT_GENERIC : generic undefined action - * - * @note - * OCI_EventGetDatabase() returns the affected database - * - * @note - * OCI_EventGetObject() returns the affected object ('schema_name'.'object_name') - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * if OCI_CNT_ROWS is passed to OCI_SubscriptionRegister(), - * the rowid of the altered row can be retrieved with OCI_EventGetRowid() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EventGetOperation -( - OCI_Event *event -); - -/** - * @brief - * Return the name of the database that generated the event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetDatabase -( - OCI_Event *event -); - -/** - * @brief - * Return the name of the object that generated the event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetObject -( - OCI_Event *event -); - -/** - * @brief - * Return the rowid of the altered database object row - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetRowid -( - OCI_Event *event -); - -/** - * @brief - * Return the subscription handle that generated this event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT OCI_Subscription * OCI_API OCI_EventGetSubscription -( - OCI_Event *event -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiInstancesManagement Remote Instance startup/shutdown - * @{ - * - * OCILIB supports Oracle 11g client features for manipulating remote Oracle instances. - * - * Oracle instances (on the same computer or on a remote server) can be : - * - * - started with OCI_DatabaseStartup() - * - shutdown with OCI_DatabaseShutdown() - * - * Several options are handled for this actions - * - * @par Example - * @include instance.c - * - */ - -/** - * @brief - * Start a database instance - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param sess_mode - Session mode - * @param start_mode - Start mode - * @param start_flag - Start flags - * @param spfile - Client-side spfile to start up the database (optional) - * - * Possible values for parameter sess_mode : - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * Possible (combined) values for parameter start_mode : - * - OCI_DB_SPM_START : start the instance - * - OCI_DB_SPM_MOUNT : mount the instance - * - OCI_DB_SPM_OPEN : open the instance - * - OCI_DB_SPM_FULL : start, mount and open the instance - * - * Possible (combined) values for parameter start_flag : - * - OCI_DB_SPF_DEFAULT : default startup - * - OCI_DB_SPF_FORCE : shuts down a running instance (if needed) using - * ABORT command and starts a new instance - * - OCI_DB_SPF_RESTRICT : allows database access only to users with both - * CREATE SESSION and RESTRICTED SESSION privileges - * - * @note - * If the client side spfile is not provided, the database is started with its server-side spfile - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DatabaseStartup -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int sess_mode, - unsigned int start_mode, - unsigned int start_flag, - const otext *spfile -); - -/** - * @brief - * Shutdown a database instance - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param sess_mode - Session mode - * @param shut_mode - Shutdown mode - * @param shut_flag - Shutdown flag - * - * - * @warning - * Possible values for parameter sess_mode : - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * Possible (combined) values for parameter shut_mode : - * - OCI_DB_SDM_SHUTDOWN : shutdown the instance - * - OCI_DB_SDM_CLOSE : close the instance - * - OCI_DB_SDM_DISMOUNT : dismount the instance - * - OCI_DB_SDM_FULL : shutdown, close and dismount the instance - * - * Possible (exclusive) value for parameter shut_flag (from Oracle documentation) : - * - OCI_DB_SDF_DEFAULT : - * - Further connects are prohibited. - * - Waits for users to disconnect from the database - * - OCI_DB_SDF_TRANS : - * - Further connects are prohibited - * - No new transactions are allowed. - * - Waits for active transactions to complete - * - OCI_DB_SDF_TRANS_LOCAL : - * - Further connects are prohibited - * - No new transactions are allowed. - * - Waits only for local transactions to complete - * - OCI_DB_SDF_IMMEDIATE : - * - Does not wait for current calls to complete or users to disconnect from the database. - * - All uncommitted transactions are terminated and rolled back - * - OCI_DB_SDF_ABORT : - * - Does not wait for current calls to complete or users to disconnect from the database. - * - All uncommitted transactions are terminated and are not rolled back. - * - This is the fastest possible way to shut down the database, but the next - * database startup may require instance recovery. - * - Therefore, this option should be used only in unusual circumstances - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DatabaseShutdown -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int sess_mode, - unsigned int shut_mode, - unsigned int shut_flag -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiRawHandles Using OCI Handles directly - * @{ - * - * OCILIB conception was focused on a full but closed encapsulation of OCI. - * - * All OCI headers, data types, prototypes are imported internally - * (linkage or runtime import). - * - * OCILIB public interface exposes only ISO C scalar types and OCILIB objects - * - * OCI is a wide and rich API that can deals with hundreds of options ! - * - * OCILIB tries to implements most of it. But, sometimes in really specific - * contexts, it might be necessary to directly call OCI APIs in order to use - * uncovered OCI functionalities or options - * - * OCILIB proposes now a set of functions to retrieve its internal OCI handles - * - * @warning - * - * The OCILIB author strongly advises against the use of internal handles, - * unless there is no other way to accomplish the task - * - * @warning - * - * Using these handles for direct application calls to OCI might lead - * to OCILIB instability or crash if handles are incorrectly used ! - * - */ - -/** - * @brief - * Return the OCI Environment Handle (OCIEnv *) of OCILIB library - * - * @return - * OCI Environment handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetEnvironment -( - void -); - -/** - * @brief - * Return the OCI Context Handle (OCISvcCtx *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Context handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetContext -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Server Handle (OCIServer *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Server handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetServer -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Error Handle (OCIError *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Error handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetError -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Session Handle (OCISession *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Session handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetSession -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Transaction Handle (OCITrans *) of an OCILIB OCI_Transaction object - * - * @param trans - Transaction handle - * - * @return - * OCI Transaction handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetTransaction -( - OCI_Transaction *trans -); - -/** - * @brief - * Return the OCI Statement Handle (OCIStmt *) of an OCILIB OCI_Statement object - * - * @param stmt - Statement handle - * - * @return - * OCI Statement handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetStatement -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the OCI LobLocator Handle (OCILobLocator *) of an OCILIB OCI_Lob object - * - * @param lob - Lob handle - * - * @return - * OCI LobLocator handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetLob -( - OCI_Lob *lob -); - -/** - * @brief - * Return the OCI LobLocator Handle (OCILobLocator *) of an OCILIB OCI_File object - * - * @param file - File handle - * - * @return - * OCI LobLocator handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetFile -( - OCI_File *file -); - -/** - * @brief - * Return the OCI Date Handle (OCIDate *) of an OCILIB OCI_Date object - * - * @param date - Date handle - * - * @return - * OCI Date handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDate -( - OCI_Date *date -); - -/** - * @brief - * Return the OCI Date time Handle (OCIDatetime *) of an OCILIB OCI_Timestamp object - * - * @param tmsp - Timestamp handle - * - * @return - * OCI Date time handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetTimestamp -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Return OCI Interval Handle (OCIInterval *) of an OCILIB OCI_Interval object - * - * @param itv - Interval handle - * - * @return - * OCI Interval handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetInterval -( - OCI_Interval *itv -); - -/** - * @brief - * Return OCI Object Handle (void *) of an OCILIB OCI_Object object - * - * @param obj - Object handle - * - * @return - * OCI Object handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetObject -( - OCI_Object *obj -); - -/** - * @brief - * Return OCI Collection Handle (OCIColl *) of an OCILIB OCI_Coll object - * - * @param coll - Collection handle - * - * @return - * OCI Collection handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetColl -( - OCI_Coll *coll -); - -/** - * @brief - * Return OCI Ref Handle (OCIRef *) of an OCILIB OCI_Ref object - * - * @param ref - Ref handle - * - * @return - * OCI Ref handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetRef -( - OCI_Ref *ref -); - -/** - * @brief - * Return OCI Mutex handle (OCIThreadMutex *) of an OCILIB OCI_Mutex object - * - * @param mutex - Mutex handle - * - * @return - * OCI Mutex handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetMutex -( - OCI_Mutex *mutex -); - -/** - * @brief - * Return OCI Thread ID (OCIThreadId *) of an OCILIB OCI_Thread object - * - * @param thread - Thread handle - * - * @return - * OCI Thread ID otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetThreadID -( - OCI_Thread *thread -); - -/** - * @brief - * Return OCI Thread handle (OCIThreadHandle *) of an OCILIB OCI_Thread object - * - * @param thread - Thread handle - * - * @return - * OCI Thread handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetThread -( - OCI_Thread *thread -); - -/** - * @brief - * Return OCI DirectPath Context handle (OCIDirPathCtx *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Context handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathCtx -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI DirectPath Column array handle (OCIDirPathColArray *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Column array handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathColArray -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI DirectPath Stream handle (OCIDirPathStream *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Stream handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathStream -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI Subscription handle (OCISubscription *) of an OCILIB OCI_Subscription object - * - * @param sub - Subscription handle - * - * @return - * OCI Subscription otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetSubscription -( - OCI_Subscription *sub -); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -/** -* @defgroup OcilibCApiEnvironmentVariables Environment Variables -* @{ -* -* Some environment variables can be defined in order to activate specific features -* They must have one of the following values (case insensitive) for being enabled : "TRUE", "1" -* -* - "OCILIB_WORKAROUND_UTF16_COLUMN_NAME": This variable enables an experimental workaround for the Oracle bug 9838993: -* - When calling OCI_GetResultset(), OCILIB queries column names against the Oracle Client -* - Unicode builds of OCILIB initialize Oracle client into UTF16 mode -* - In such environments, a memory leak occurs when statements are re-executed multiple times followed by OCI_GetResultset() -* - This workaround retrieves column names using direct access to undocumented Oracle structures instead of using buggy Oracle calls -* - As Oracle undocumented structures may change upon versions, this workaround is provided as-is in case the Oracle bug represents an real issue for applications -* - This workaround has been tested with 32bit and 64bit Oracle 12g clients and Unicode OCILIB builds -*/ - -#define VAR_OCILIB_WORKAROUND_UTF16_COLUMN_NAME "OCILIB_WORKAROUND_UTF16_COLUMN_NAME" - -/** -* @} -*/ - -/** - * @defgroup OcilibCApiDemoApplication OCILIB main demo application code - * @{ - * - * Portable Main demo application header - * @include ocilib_demo.h - * - * Portable Main demo application source - * @include ocilib_demo.c - * - * @} - */ - -/* Compatibility with sources built with older versions of OCILIB */ - -/* macros added in version 2.3.0 */ - -#define OCI_CreateConnection OCI_ConnectionCreate -#define OCI_FreeConnection OCI_ConnectionFree -#define OCI_CreateStatement OCI_StatementCreate -#define OCI_FreeStatement OCI_StatementFree - -/* macros added in version 2.4.0 */ - -#define OCI_CreateTransaction OCI_TransactionCreate -#define OCI_FreeTransaction OCI_TransactionFree -#define OCI_CreateHashTable OCI_HashCreate -#define OCI_FreeHashTable OCI_HashFree - -/* macros added in version 3.0.0 */ - -#define OCI_GetColumnName OCI_ColumnGetName -#define OCI_GetColumnType OCI_ColumnGetType -#define OCI_GetColumnCharsetForm OCI_ColumnGetCharsetForm -#define OCI_GetColumnSQLType OCI_ColumnGetSQLType -#define OCI_GetColumnFullSQLType OCI_ColumnGetFullSQLType -#define OCI_GetColumnSize OCI_ColumnGetSize -#define OCI_GetColumnScale OCI_ColumnGetScale -#define OCI_GetColumnPrecision OCI_ColumnGetPrecision -#define OCI_GetColumnFractionnalPrecision OCI_ColumnGetFractionnalPrecision -#define OCI_GetColumnLeadingPrecision OCI_ColumnGetLeadingPrecision -#define OCI_GetColumnNullable OCI_ColumnGetNullable -#define OCI_GetColumnCharUsed OCI_ColumnGetCharUsed - -#define OCI_GetFormatDate(s) OCI_GetDefaultFormatDate(OCI_StatementGetConnection(s)) -#define OCI_SetFormatDate(s, f) OCI_SetDefaultFormatDate(OCI_StatementGetConnection(s), f) - -#define OCI_ERR_API OCI_ERR_ORACLE - -/* macros added in version 3.2.0 */ - -#define OCI_ERR_NOT_SUPPORTED OCI_ERR_DATATYPE_NOT_SUPPORTED -#define OCI_SCHEMA_TABLE OCI_TIF_TABLE -#define OCI_SCHEMA_VIEW OCI_TIF_VIEW -#define OCI_SCHEMA_TYPE OCI_TIF_TYPE - -#define OCI_Schema OCI_TypeInfo - -#define OCI_SchemaGet OCI_TypeInfoGet -#define OCI_SchemaFree OCI_TypeInfoFree -#define OCI_SchemaGetColumnCount OCI_TypeInfoGetColumnCount -#define OCI_SchemaGetColumn OCI_TypeInfoGetColumn -#define OCI_SchemaGetName OCI_TypeInfoGetName - -#define OCI_ColumnGetFractionnalPrecision OCI_ColumnGetFractionalPrecision - -/* macro added in version 3.3.0 */ - -/** - * @brief - * [OBSOLETE] Set the bind variable at the given index to null - * - * @param stmt - Statement handle - * @param index - Index of the bind variable - * - * @warning - * This call is obsolete ! Use OCI_BindSetNull() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Index starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -#define OCI_SetNull(stmt, index) \ - OCI_BindSetNull(OCI_GetBind(stmt, index)) - -/** - * @brief - * [OBSOLETE] Set the bind variable of the given name to null - * - * @param stmt - Statement handle - * @param name - Bind variable name - * - * @warning - * This call is obsolete ! Use OCI_BindSetNull() instead. - * - * @note - * There is no notion of null value in C. - * it's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -#define OCI_SetNull2(stmt, name) \ - OCI_BindSetNull(OCI_GetBind2(stmt, name)) - -/** - * @brief - * [OBSOLETE] Set to null the bind variable at the given position in an input array - * - * @param stmt - Statement handle - * @param index - Index of the bind variable - * @param position - Position in the array - * - * @warning - * This call is obsolete ! Use OCI_BindSetNullAtPos() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Index and Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - * - */ - -#define OCI_SetNullAtPos(stmt, index, position) \ - OCI_BindSetNullAtPos(OCI_GetBind(stmt, index), position) - -/** - * @brief - * [OBSOLETE] Set to null the bind variable of the given name in an input array - * - * @param stmt - Statement handle - * @param name - Bind variable name - * @param position - Position in the array - * - * @warning - * This call is obsolete ! Use OCI_BindSetNullAtPos() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - * - */ - -#define OCI_SetNullAtPos2(stmt, name, position) \ - OCI_BindSetNullAtPos(OCI_GetBind2(stmt, name), position) - -/* macro added in version 3.4.0 */ - -#define OCI_8 OCI_8_1 -#define OCI_9 OCI_9_0 -#define OCI_10 OCI_10_1 -#define OCI_11 OCI_11_1 - -/* macro added in version 3.6.0 */ - -#define OCI_CHAR_UNICODE OCI_CHAR_WIDE -#define OCI_CSF_CHARSET OCI_CSF_DEFAULT - -/* macro added in version 3.7.0 */ - -#define OCI_ConnPool OCI_Pool - -#define OCI_ConnPoolCreate(db, us, pw, mo, mi, ma, in) \ - OCI_PoolCreate(db, us, pw, OCI_POOL_CONNECTION, mo, mi, ma, in) - -#define OCI_ConnPoolGetConnection(p) \ - OCI_PoolGetConnection(p, NULL) - -#define OCI_ConnPoolFree OCI_PoolFree -#define OCI_ConnPoolGetTimeout OCI_PoolGetConnection -#define OCI_ConnPoolSetTimeout OCI_PoolSetTimeout -#define OCI_ConnPoolGetNoWait OCI_PoolGetNoWait -#define OCI_ConnPoolSetNoWait OCI_PoolSetNoWait -#define OCI_ConnPoolGetBusyCount OCI_PoolGetBusyCount -#define OCI_ConnPoolGetOpenedCount OCI_PoolGetOpenedCount -#define OCI_ConnPoolGetMin OCI_PoolGetMin -#define OCI_ConnPoolGetMax OCI_PoolGetMax -#define OCI_ConnPoolGetIncrement OCI_PoolGetIncrement - -/* macro added in version 3.8.0 */ - -#define OCI_ObjectGetTimeStamp OCI_ObjectGetTimestamp -#define OCI_ElemGetTimeStamp OCI_ElemGetTimestamp -#define OCI_TimestampSysTimeStamp OCI_TimestampSysTimestamp - -/* macro added in version 4.0.0 */ - -#define OCI_CollSetAt OCI_CollSetElem -#define OCI_CollGetAt OCI_CollGetElem -#define OCI_CollGetAt2 OCI_CollGetElem2 - -#define OCI_GetCharsetMetaData OCI_GetCharset -#define OCI_GetCharsetUserData OCI_GetCharset -#define OCI_SIZE_TRACE_INF0 OCI_SIZE_TRACE_INFO - -#define MT(x) OTEXT(x) -#define mtext otext -#define DT(x) OTEXT(x) -#define dtext otext - -#define mtsdup ostrdup -#define mtscpy ostrcpy -#define mtsncpy ostrncpy -#define mtscat ostrcat -#define mtsncat ostrncat -#define mtslen ostrlen -#define mtscmp ostrcmp -#define mtscasecmp ostrcasecmp -#define mtsprintf osprintf -#define mtstol ostrtol -#define mtsscanf osscanf - -#define dtsdup ostrdup -#define dtscpy ostrcpy -#define dtsncpy ostrncpy -#define dtscat ostrcat -#define dtsncat ostrncat -#define dtslen ostrlen -#define dtscmp ostrcmp -#define dtscasecmp ostrcasecmp -#define dtsprintf osprintf -#define dtstol ostrtol -#define dtsscanf osscanf - -/* macro added in version 4.1.0 */ - -#define OCI_SetDefaultFormatDate(con, fmt) OCI_SetFormat(con, OCI_FMT_DATE, fmt) -#define OCI_SetDefaultFormatNumeric(con, fmt) OCI_SetFormat(con, OCI_FMT_NUMERIC, fmt) - -#define OCI_GetDefaultFormatDate(con) OCI_GetFormat(con, OCI_FMT_DATE) -#define OCI_GetDefaultFormatNumeric(con) OCI_GetFormat(con, OCI_FMT_NUMERIC) - -#define OCI_STRING_FORMAT_NUM_BIN OCI_STRING_FORMAT_NUM_BDOUBLE - -/** - * @} - */ - -#endif /* OCILIB_H_INCLUDED */ - diff --git a/ocilib/4.4.0/Linux-x86_64/include/ocilib.h b/ocilib/4.4.0/Linux-x86_64/include/ocilib.h deleted file mode 100755 index 06088b1..0000000 --- a/ocilib/4.4.0/Linux-x86_64/include/ocilib.h +++ /dev/null @@ -1,19176 +0,0 @@ -/* - * OCILIB - C Driver for Oracle (C Wrapper for Oracle OCI) - * - * Website: http://www.ocilib.net - * - * Copyright (c) 2007-2017 Vincent ROGIER - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* IMPORTANT NOTICE - * - * This file contains explanations about Oracle and OCI technologies. - * OCILIB is a wrapper around OCI and thus exposes OCI features. - * The OCILIB documentation intends to explain Oracle / OCI concepts - * and is naturally based on the official Oracle OCI documentation. - * - * Some parts of OCILIB documentation may include some informations - * taken and adapted from the following Oracle documentations : - * - Oracle Call Interface Programmer's Guide - * - Oracle Streams - Advanced Queuing User's Guide - */ - -#ifndef OCILIB_H_INCLUDED -#define OCILIB_H_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/** - * @defgroup OcilibCApi C API - * @{ - * - */ - -/* --------------------------------------------------------------------------------------------- * - * Platform configuration - * --------------------------------------------------------------------------------------------- */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -/* --------------------------------------------------------------------------------------------- * - * C headers - * --------------------------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/* --------------------------------------------------------------------------------------------- * - * MS Windows platform detection - * --------------------------------------------------------------------------------------------- */ - -#ifndef _WINDOWS - #if defined(_WIN32)|| defined(WIN32) || defined(_WIN64) || defined(WIN64) || defined(_WIN32_WINNT) - #define _WINDOWS - #endif -#endif - -#ifdef _WINDOWS - #ifdef boolean - #undef boolean - #endif - #include - #ifdef boolean - #undef boolean - #endif -#endif - -/* --------------------------------------------------------------------------------------------- * - * OCILIB version information - * --------------------------------------------------------------------------------------------- */ - -#define OCILIB_MAJOR_VERSION 4 -#define OCILIB_MINOR_VERSION 4 -#define OCILIB_REVISION_VERSION 0 - -/* Import mode */ - -#define OCI_IMPORT_MODE_LINKAGE 1 -#define OCI_IMPORT_MODE_RUNTIME 2 - -#ifdef OCI_IMPORT_RUNTIME - #undef OCI_IMPORT_LINKAGE -#endif - -#ifdef OCI_IMPORT_LINKAGE - #undef OCI_IMPORT_RUNTIME -#endif - -#if !defined(OCI_IMPORT_RUNTIME) && !defined(OCI_IMPORT_LINKAGE) - #define OCI_IMPORT_LINKAGE -#endif - -#ifdef OCI_IMPORT_RUNTIME - #define OCI_IMPORT_MODE OCI_IMPORT_MODE_RUNTIME -#else - #define OCI_IMPORT_MODE OCI_IMPORT_MODE_LINKAGE -#endif - -/* Charset modes */ - -#ifdef OCI_CHARSET_UNICODE - #define OCI_CHARSET_WIDE -#endif - -#ifdef OCI_CHARSET_WIDE - #undef OCI_CHARSET_ANSI -#endif - -#ifdef OCI_CHARSET_ANSI - #undef OCI_CHARSET_ANSI -#endif - -#if !defined(OCI_CHARSET_ANSI) && !defined(OCI_CHARSET_WIDE) - #define OCI_CHARSET_ANSI -#endif - -/* Calling convention */ - -#ifndef OCI_API - #ifdef _MSC_VER - #define OCI_API __stdcall - #else - #define OCI_API - #endif -#endif - -/* Build mode */ - -#ifndef OCI_EXPORT - #define OCI_EXPORT -#endif - -/** - * @defgroup OcilibCApiSupportedCharsets Character sets - * @{ - * - * OCILIB supports both ANSI and Unicode. - * - * Oracle started a real Unicode support with Oracle8i but only for bind and fetch data. - * All SQL and PL/SQ/ statements, database objects names were still only supported in ANSI. - * - * With Oracle 9i, Oracle provides a full Unicode support. - * - * So depending on the compile time Oracle library or the runtime loaded library, Unicode support differs. - * - * OCILIB supports: - * - * - ANSI (char) - * - Unicode (wchar_t) - * - UTF8 strings - * - * OCILIB uses the character type 'otext' that is a define around char and wchar_t depending on the charset mode. - * - * @par Option OCI_CHARSET_ANSI - * - * - otext --> char - * - OTEXT(x) --> x - * - * @par Option OCI_CHARSET_WIDE - * - * - otext --> wchar_t - * - OTEXT(x) --> L ## x - * - * @par Unicode and ISO C - * - * Well, ISO C: - * - doesn't know anything about Unicode. - * - makes wide characters support tricky because wide character size is not defined and is freely adaptable by implementations. - * - * OCILIB uses char/wchar_t strings for both public interface and internal storage. - * - * Unicode builds of OCILIB initialize OCI in UTF16 Unicode mode. - * Oracle implements this mode with a 2 bytes (fixed length) UTF16 encoding. - * - * @warning - * When using Unicode builds of OCILIB, make sure that the target - * Database charset is also using an Unicode charset or is a superset of UTF16. - * If not, strings may be converted with substitution characters by the Oracle client ! - * - * So, on systems implementing wchar_t as 2 bytes based UTF16 (e.g. Ms Windows), - * strings are directly passed to Oracle and taken back from it. - * - * On other systems (most of the Unix systems) that use UTF32 as encoding, (4 bytes based wchar_t), OCILIB uses: - * - temporary buffers for statements and object names - * - buffer expansion from UTF16 to UTF32 for fetch and bind string: - * - allocation based on sizeof(wchar_t) - * - data filling based on sizeof(short) -> (UTF16 2 bytes) - * - data expansion to sizeof(wchar_t). - * - * Buffer expansion is done in place and has the advantage of not requiring extra buffer. - * That reduces the cost of the Unicode/ISO C handling overhead on Unix systems. - * - * @par UTF8 strings - * - * OCILIB fully supports UTF8 strings : - * - Within OCI_CHARSET_ANSI builds - * - NLS_LANG environment variable must be set to any valid UTF8 Oracle charset string - * - * @par Charset mapping macros - * - * OCILIB main header file provides macro around most common string functions of - * the C standard library. - * - * these macros are based on the model: ostr[libc function name]() - * - * xxx is the standard C library string function name without the character type prefix (str/wcs). - * - * List of available macros: - * - ostrdup - * - ostrcpy - * - ostrncpy - * - ostrcat - * - ostrncat - * - ostrlen - * - ostrcmp - * - ostrcasecmp - * - osprintf - * - ostol - * -**/ - -#if defined(__cplusplus) && defined(_MSC_VER) && (_MSC_VER < 1300) -extern "C++" { -#endif - -#include - -#if defined(__cplusplus) && defined(_MSC_VER) && (_MSC_VER < 1300) -} -#endif - -/* Charset macros */ - -#define OCI_CHAR_ANSI 1 -#define OCI_CHAR_WIDE 2 - -#ifdef OCI_CHARSET_ANSI - typedef char otext; - #define OTEXT(x) x - #define OCI_CHAR_TEXT OCI_CHAR_ANSI -#else - typedef wchar_t otext; - #define OTEXT(x) L ## x - #define OCI_CHAR_TEXT OCI_CHAR_WIDE -#endif - -/* - For ISO conformance, strdup/wcsdup/stricmp/strncasecmp are not used. - All wide char routines are part of the 1995 Normative Addendum 1 to the ISO C90 standard. - OCILIB also needs an ANSI equivalent to swprintf => ocisprintf - Thus OCILIB exports the following helper functions - -*/ - -OCI_EXPORT int ocisprintf -( - char *str, - int size, - const char *format, - ... -); - -OCI_EXPORT char * ocistrdup -( - const char * src -); - -OCI_EXPORT int ocistrcasecmp -( - const char *str1, - const char *str2 -); - -OCI_EXPORT wchar_t * ociwcsdup -( - const wchar_t * src -); - -OCI_EXPORT int ociwcscasecmp -( - const wchar_t *str1, - const wchar_t *str2 -); - -/* special defines for Microsoft C runtime that is not C ISO compliant */ - -#ifdef _WINDOWS - - #define vsnprintf _vsnprintf - #define swprintf _snwprintf - -#endif - -/* helpers mapping macros */ - -#ifdef OCI_CHARSET_ANSI - #define ostrdup ocistrdup - #define ostrcpy strcpy - #define ostrncpy strncpy - #define ostrcat strcat - #define ostrncat strncat - #define ostrlen strlen - #define ostrcmp strcmp - #define ostrcasecmp ocistrcasecmp - #define osprintf ocisprintf - #define ostrtol strtol - #define osscanf sscanf - #define otoupper toupper - #define oisdigit isdigit -#else - #define ostrdup ociwcsdup - #define ostrcpy wcscpy - #define ostrncpy wcsncpy - #define ostrcat wcscat - #define ostrncat wcsncat - #define ostrlen wcslen - #define ostrcmp wcscmp - #define ostrcasecmp ociwcscasecmp - #define osprintf swprintf - #define ostrtol wcstol - #define osscanf swscanf - #define otoupper towupper - #define oisdigit iswdigit - -#endif - -/* string size macros */ - -#define otextsize(s) (ostrlen(s) * sizeof(otext)) - -/** - * @} - */ - -/** - * @defgroup OcilibCApiDatatypes Data types - * @{ - * - * OCILIB implements: - * - * - Oracle Scalar data types through scalar C data types - * - Oracle opaque/complex objects though opaque library handles - * - Library objects for manipulating the database: connections, transactions, statements... - * - * @par Supported Oracle data types - * - * - All Database types are supported excluding REFs. - * - * Here is a summary of the supported data types: - * - * - Scalar types CHAR/NCHAR, VARCHAR2/NVARCHAR2, NUMBER, FLOAT, REAL, RAW, ... - * - Binary types: RAW, LONG RAW, VARRAW, .. - * - Larges Objects (Lobs and Files) : BLOB, CLOB, NCLOB, BFILE - * - LONG types: LONG, VAR LONG - * - Date, Timestamps et Intervals: DATE, TIMESTAMP, INTERVAL - * - PL/SQL types: Ref cursors, PL/SQL Tables - * - Named Types (by value): Built-in system objects and User defined objects - * - VARRAYs and Nested Tables - * - ROWIDs - * - * @par OCILIB library objects - * - * The public OCILIB library interface implements encapsulation for - * representing database objects (such as connections, statements ...) through - * opaque structures (pointers to structures whose definition is kept private) - * - * Instead of directly manipulating the structures and their members, the library - * has functions to access the underlying members. - * - * It's designed to make the user code as more independent as possible of - * the library details. - * -**/ - -/** - * @typedef OCI_Pool - * - * @brief - * Pool object (session or connection) - * - * A pool is a set of pooled objects - * - */ - -typedef struct OCI_Pool OCI_Pool; - -/** - * @typedef OCI_Connection - * - * @brief - * Oracle physical connection. - * - * It holds all information about a connection such as error handling, associated statements, ... - * Error handling and transactions are embedded within a connection object. - * - * @warning - * Multi threaded applications that use multiple connections should use one connection per thread - * as all statements associated with a connection share the same context. - * - */ - -typedef struct OCI_Connection OCI_Connection; - -/** - * @typedef OCI_Statement - * - * @brief - * Oracle SQL or PL/SQL statement. - * - * A Statement object allows users to prepare, execute SQL orders or PL/SQL blocks - * - */ - -typedef struct OCI_Statement OCI_Statement; - -/** - * @typedef OCI_Bind - * - * @brief - * Internal bind representation. - * - * A bind object is an object that holds all information about an Oracle statement binding operation - * - */ - -typedef struct OCI_Bind OCI_Bind; - -/** - * @typedef OCI_Resultset - * - * @brief - * Collection of output columns from a select statement. - * - * A resultset object is the result of 'select' SQL Statement. - * - * It's a set of data (ordered in columns) that can be fetched row by row - * to get data returned by the SQL statement - * - */ - -typedef struct OCI_Resultset OCI_Resultset; - -/** - * @typedef OCI_Column - * - * @brief - * Oracle SQL Column and Type member representation. - * - * A column object represents an output column from a select statement - * - */ - -typedef struct OCI_Column OCI_Column; - -/** - * @typedef OCI_Lob - * - * @brief - * Oracle Internal Large objects: - * - * The following internal Larges Objects are supported: - * - * - BLOBs : Binary large objects - * - CLOBs / NCLOBs : Character large objects - * - * LOBs were introduced by OCI8 to replace Long data types. - * - * It's designed to store really larges objects (buffer, files) inside the database - * - * Oracle encourages programmers to use those objects instead of LONG, LONG RAW, ... - * - * OCILIB supports both LOBs and LONGs - * - */ - -typedef struct OCI_Lob OCI_Lob; - -/** - * @typedef OCI_File - * - * @brief - * Oracle External Large objects: - * - * The following external Larges Objects are supported: - * - * - BFILEs : Binary files - * - CFILEs : Character files - * - * FILEs were introduced by OCI8 in order to store references to files located outside the database. - * - * @warning - * Only Read-only access is allowed on BFILEs - * - * Two way to use FILEs : - * - * - within statement context (query, binding) - * - without statement context (server files reading) through OCI_File properties functions - * - */ - -typedef struct OCI_File OCI_File; - -/** - * @typedef OCI_Transaction - * - * @brief - * Oracle Transaction. - * - * A transaction can be: - * - * - Local: it's implicitly created by OCILIB - * - Global: it's explicitly created by the program - * - */ - -typedef struct OCI_Transaction OCI_Transaction; - -/** - * @typedef OCI_Long - * - * @brief Oracle Long data type. - * - * The following long Objects are supported: - * - * - LONG RAW : Binary long objects - * - LONG : Character long objects - * - * Those types were used in older versions of Oracle (before Oracle8i) to store - * large chunks of data in the database. - * - * It's now depreciated by Oracle that recommends using LOBs - * - * Many databases and applications are still designed to use LONGs that's why - * OCILIB supports Long Objects and piecewise operations - * - */ - -typedef struct OCI_Long OCI_Long; - -/** -* @typedef OCI_Number -* -* @brief -* Oracle NUMBER representation. -* -*/ -typedef struct OCI_Number OCI_Number; - -/** - * @typedef OCI_Date - * - * @brief - * Oracle internal date representation. - * - */ - -typedef struct OCI_Date OCI_Date; - -/** - * @typedef OCI_Timestamp - * - * @brief - * Oracle internal timestamp representation. - * - */ - -typedef struct OCI_Timestamp OCI_Timestamp; - -/** - * @typedef OCI_Interval - * - * @brief - * Oracle internal interval representation. - * - */ - -typedef struct OCI_Interval OCI_Interval; - -/** - * @typedef OCI_Object - * - * @brief - * Oracle Named types representation. - * - */ - -typedef struct OCI_Object OCI_Object; - -/** - * @typedef OCI_Coll - * - * @brief - * Oracle Collections (VARRAYs and Nested Tables) representation. - * - */ - -typedef struct OCI_Coll OCI_Coll; - -/** - * @typedef OCI_Elem - * - * @brief - * Oracle Collection item representation. - * - */ - -typedef struct OCI_Elem OCI_Elem; - -/** - * @typedef OCI_Iter - * - * @brief - * Oracle Collection iterator representation. - * - */ -typedef struct OCI_Iter OCI_Iter; - -/** - * @typedef OCI_TypeInfo - * - * @brief - * Type info metadata handle. - * - */ - -/** - * @typedef OCI_Ref - * - * @brief - * Oracle REF type representation. - * - */ - -typedef struct OCI_Ref OCI_Ref; - -/** - * @typedef OCI_TypeInfo - * - * @brief - * Type info meta data handle. - * - */ - -typedef struct OCI_TypeInfo OCI_TypeInfo; - -/** - * @typedef OCI_HashTable - * - * @brief - * OCILIB implementation of hash tables. - * - */ - -typedef struct OCI_HashTable OCI_HashTable; - -/** - * @typedef OCI_Error - * - * @brief - * Encapsulates an Oracle or OCILIB exception. - * - * The error object is used to raise internal or oracle errors. - * When an error occurs, if the application has provided an error handler, an - * error object is constructed and passed to the handler - * - */ - -typedef struct OCI_Error OCI_Error; - -/** - * @typedef OCI_Mutex - * - * @brief - * OCILIB encapsulation of OCI mutexes. - * - */ - -typedef struct OCI_Mutex OCI_Mutex; - -/** - * @typedef OCI_Thread - * - * @brief - * OCILIB encapsulation of OCI Threads. - * - */ - -typedef struct OCI_Thread OCI_Thread; - -/** - * @typedef OCI_DirPath - * - * @brief - * OCILIB encapsulation of OCI Direct Path handle. - * - */ - -typedef struct OCI_DirPath OCI_DirPath; - -/** - * @typedef OCI_Subscription - * - * @brief - * OCILIB encapsulation of Oracle DCN notification - * - */ - -typedef struct OCI_Subscription OCI_Subscription; - -/** - * @typedef OCI_Event - * - * @brief - * OCILIB encapsulation of Oracle DCN event - * - */ - -typedef struct OCI_Event OCI_Event; - -/** - * @typedef OCI_Msg - * - * @brief - * OCILIB encapsulation of A/Q message - * - */ - -typedef struct OCI_Msg OCI_Msg; - -/** - * @typedef OCI_Agent - * - * @brief - * OCILIB encapsulation of A/Q Agent - * - */ - -typedef struct OCI_Agent OCI_Agent; - -/** - * @typedef OCI_Dequeue - * - * @brief - * OCILIB encapsulation of A/Q dequeuing operations - * - */ - -typedef struct OCI_Dequeue OCI_Dequeue; - -/** - * @typedef OCI_Enqueue - * - * @brief - * OCILIB encapsulation of A/Q enqueuing operations - * - */ - -typedef struct OCI_Enqueue OCI_Enqueue; - -/** - * @var POCI_ERROR - * - * @brief - * Error procedure prototype - * - * @param err - Error handle - * - */ - -typedef void (*POCI_ERROR) -( - OCI_Error *err -); - -/** - * @var POCI_THREAD - * - * @brief - * Thread procedure prototype - * - * @param thread - Thread handle - * @param arg - Pointer passed to OCI_ThreadRun() - * - */ - -typedef void (*POCI_THREAD) -( - OCI_Thread *thread, - void *arg -); - -/** - * @var POCI_THREADKEYDEST - * - * @brief - * Thread key destructor prototype. - * - * @param data - Thread Key current pointer value - * - */ - -typedef void (*POCI_THREADKEYDEST) -( - void *data -); - -/** - * @var POCI_NOTIFY - * - * @brief - * Database Change Notification User callback prototype. - * - * @param event - Event handle - * - */ - -typedef void (*POCI_NOTIFY) -( - OCI_Event *event -); - -/** - * @var POCI_NOTIFY_AQ - * - * @brief - * AQ notification callback prototype. - * - * @param dequeue - dequeue handle - * - */ - -typedef void (*POCI_NOTIFY_AQ) -( - OCI_Dequeue *dequeue -); - -/** - * @var POCI_TAF_HANDLER - * - * @brief - * Failover Notification User callback prototype. - * - * @param con - Connection handle related to the event - * @param type - Event type - * @param event - Event code - * - * @note - * Possible values for parameter 'type' : - * - OCI_FOT_NONE - * - OCI_FOT_SESSION - * - OCI_FOT_SELECT - * - * @note - * Possible values for parameter 'event' : - * - OCI_FOE_END - * - OCI_FOE_ABORT - * - OCI_FOE_REAUTH - * - OCI_FOE_BEGIN - * - OCI_FOE_ERROR - * - * @return - * User callback should return one of the following value : - * - OCI_FOC_OK - * - OCI_FOC_RETRY - * - */ - -typedef unsigned int (*POCI_TAF_HANDLER) -( - OCI_Connection *con, - unsigned int type, - unsigned int event -); - -/** - * @var POCI_HA_HANDLER - * - * @brief - * HA (High Availability) events Notification User callback prototype. - * - * @param con - Connection handle related to the event - * @param source - source of the event - * @param event - type of the event - * @param time - Timestamp of the event - * - * @note - * Currently, Oracle only send HA down events - * - * @note - * Possible values for parameter 'source' : - * - OCI_HES_INSTANCE - * - OCI_HES_DATABASE - * - OCI_HES_NODE - * - OCI_HES_SERVICE - * - OCI_HES_SERVICE_MEMBER - * - OCI_HES_ASM_INSTANCE - * - OCI_HES_PRECONNECT - * - * @note - * Possible values for parameter 'event' : - * - OCI_HET_DOWN : HA event type down - * - OCI_HET_UP : HA event type up - * - */ - -typedef void (*POCI_HA_HANDLER) -( - OCI_Connection *con, - unsigned int source, - unsigned int event, - OCI_Timestamp *time -); - -/* public structures */ - -/** - * @typedef OCI_XID - * - * @brief - * Global transaction identifier - * - */ - -typedef struct OCI_XID { - long formatID; - long gtrid_length; - long bqual_length; - char data[128]; -} OCI_XID; - -/** - * @typedef OCI_Variant - * - * @brief - * Internal Variant type based on union C type. - * - * @note - * Helpful for generic buffer, it reduces the amount of casts - * - */ - -typedef union OCI_Variant { - /* integers */ - int num; - - /* raw data */ - unsigned char *p_bytes; - - /* pointer to c natives types */ - void *p_void; - int *p_int; - float *p_float; - double *p_double; - otext *p_text; - - /* ocilib object types */ - OCI_Date *p_date; - OCI_Interval *p_interval; - OCI_Timestamp *p_timestamp; - OCI_Long *p_long; - OCI_Lob *p_lob; - OCI_File *p_file; - OCI_Statement *p_stmt; - OCI_Column *p_col; - OCI_Object *p_obj; - OCI_Coll *p_coll; - OCI_Iter *p_iter; - OCI_Elem *p_elem; -} OCI_Variant; - -/** -* @typedef OCI_HashValue -* -* @brief -* Hash table entry value -* -* OCILIB implementation of hash tables uses chaining method for dealing with collisions -* -*/ - -typedef struct OCI_HashValue { - OCI_Variant value; - struct OCI_HashValue *next; -} OCI_HashValue; - -/** - * @typedef OCI_HashEntry - * - * @brief - * Hash table entry - * - */ - -typedef struct OCI_HashEntry { - otext *key; - struct OCI_HashValue *values; - struct OCI_HashEntry *next; -} OCI_HashEntry; - -/** - * @typedef big_int - * - * @brief - * big_int is a C scalar integer (32 or 64 bits) depending on compiler support for 64bits integers. - * big_uint is an unsigned big_int - * - */ - -/* check for long long support */ - -#if defined(_LONGLONG) || defined(LONG_LONG_MAX) || defined(LLONG_MAX) || defined(__LONG_LONG_MAX__) - -/* C99 long long supported */ - -typedef long long big_int; -typedef unsigned long long big_uint; - - #define OCI_BIG_UINT_ENABLED - -#elif defined(_WINDOWS) - -/* Microsoft extension supported */ - -typedef __int64 big_int; -typedef unsigned __int64 big_uint; - - #define OCI_BIG_UINT_ENABLED - -#else - -typedef int big_int; -typedef unsigned int big_uint; - -#endif - -/** - * @} - */ - -/* boolean values */ - -#ifndef TRUE - #define TRUE 1 - #define FALSE 0 -#endif - -#ifndef boolean - #define boolean int -#endif - -/* oracle OCI key versions*/ - -#define OCI_8_0 800 -#define OCI_8_1 810 -#define OCI_9_0 900 -#define OCI_9_2 920 -#define OCI_10_1 1010 -#define OCI_10_2 1020 -#define OCI_11_1 1110 -#define OCI_11_2 1120 -#define OCI_12_1 1210 -#define OCI_12_2 1220 - -/* versions extract macros */ - -#define OCI_VER_MAJ(v) (unsigned int) (v/100) -#define OCI_VER_MIN(v) (unsigned int) ((v/10) - ((v/100)*10)) -#define OCI_VER_REV(v) (unsigned int) ((v) - ((v/10)*10)) - -/* OCILIB Error types */ - -#define OCI_ERR_ORACLE 1 -#define OCI_ERR_OCILIB 2 -#define OCI_ERR_WARNING 3 - -/* OCILIB Error codes */ - -#define OCI_ERR_NONE 0 -#define OCI_ERR_NOT_INITIALIZED 1 -#define OCI_ERR_LOADING_SHARED_LIB 2 -#define OCI_ERR_LOADING_SYMBOLS 3 -#define OCI_ERR_MULTITHREADED 4 -#define OCI_ERR_MEMORY 5 -#define OCI_ERR_NOT_AVAILABLE 6 -#define OCI_ERR_NULL_POINTER 7 -#define OCI_ERR_DATATYPE_NOT_SUPPORTED 8 -#define OCI_ERR_PARSE_TOKEN 9 -#define OCI_ERR_MAP_ARGUMENT 10 -#define OCI_ERR_OUT_OF_BOUNDS 11 -#define OCI_ERR_UNFREED_DATA 12 -#define OCI_ERR_MAX_BIND 13 -#define OCI_ERR_ATTR_NOT_FOUND 14 -#define OCI_ERR_MIN_VALUE 15 -#define OCI_ERR_NOT_COMPATIBLE 16 -#define OCI_ERR_STMT_STATE 17 -#define OCI_ERR_STMT_NOT_SCROLLABLE 18 -#define OCI_ERR_BIND_ALREADY_USED 19 -#define OCI_ERR_BIND_ARRAY_SIZE 20 -#define OCI_ERR_COLUMN_NOT_FOUND 21 -#define OCI_ERR_DIRPATH_STATE 22 -#define OCI_ERR_CREATE_OCI_ENVIRONMENT 23 -#define OCI_ERR_REBIND_BAD_DATATYPE 24 -#define OCI_ERR_TYPEINFO_DATATYPE 25 -#define OCI_ERR_ITEM_NOT_FOUND 26 -#define OCI_ERR_ARG_INVALID_VALUE 27 -#define OCI_ERR_XA_ENV_FROM_STRING 28 -#define OCI_ERR_XA_CONN_FROM_STRING 29 - -#define OCI_ERR_COUNT 30 - - -/* allocated bytes types */ - -#define OCI_MEM_ORACLE 1 -#define OCI_MEM_OCILIB 2 -#define OCI_MEM_ALL OCI_MEM_ORACLE | OCI_MEM_OCILIB - -/* binding */ - -#define OCI_BIND_BY_POS 0 -#define OCI_BIND_BY_NAME 1 -#define OCI_BIND_SIZE 6 -#define OCI_BIND_MAX 65535 - -/* fetching */ - -#define OCI_FETCH_SIZE 20 -#define OCI_PREFETCH_SIZE 20 -#define OCI_LONG_EXPLICIT 1 -#define OCI_LONG_IMPLICIT 2 - -/* unknown value */ - -#define OCI_UNKNOWN 0 - -/* C Data Type mapping */ - -#define OCI_CDT_NUMERIC 1 -#define OCI_CDT_DATETIME 3 -#define OCI_CDT_TEXT 4 -#define OCI_CDT_LONG 5 -#define OCI_CDT_CURSOR 6 -#define OCI_CDT_LOB 7 -#define OCI_CDT_FILE 8 -#define OCI_CDT_TIMESTAMP 9 -#define OCI_CDT_INTERVAL 10 -#define OCI_CDT_RAW 11 -#define OCI_CDT_OBJECT 12 -#define OCI_CDT_COLLECTION 13 -#define OCI_CDT_REF 14 -#define OCI_CDT_BOOLEAN 15 - -/* Data Type codes for OCI_ImmediateXXX() calls */ - -#define OCI_ARG_SHORT 1 -#define OCI_ARG_USHORT 2 -#define OCI_ARG_INT 3 -#define OCI_ARG_UINT 4 -#define OCI_ARG_BIGINT 5 -#define OCI_ARG_BIGUINT 6 -#define OCI_ARG_DOUBLE 7 -#define OCI_ARG_DATETIME 8 -#define OCI_ARG_TEXT 9 -#define OCI_ARG_LOB 10 -#define OCI_ARG_FILE 11 -#define OCI_ARG_TIMESTAMP 12 -#define OCI_ARG_INTERVAL 13 -#define OCI_ARG_RAW 14 -#define OCI_ARG_OBJECT 15 -#define OCI_ARG_COLLECTION 16 -#define OCI_ARG_REF 17 -#define OCI_ARG_FLOAT 18 -#define OCI_ARG_NUMBER 19 - -/* statement types */ - -#define OCI_CST_SELECT 1 -#define OCI_CST_UPDATE 2 -#define OCI_CST_DELETE 3 -#define OCI_CST_INSERT 4 -#define OCI_CST_CREATE 5 -#define OCI_CST_DROP 6 -#define OCI_CST_ALTER 7 -#define OCI_CST_BEGIN 8 -#define OCI_CST_DECLARE 9 -#define OCI_CST_CALL 10 - -/* environment modes */ - -#define OCI_ENV_DEFAULT 0 -#define OCI_ENV_THREADED 1 -#define OCI_ENV_CONTEXT 2 -#define OCI_ENV_EVENTS 4 - -/* sessions modes */ - -#define OCI_SESSION_DEFAULT 0x00000000 /* any version */ -#define OCI_SESSION_SYSDBA 0x00000002 /* any version */ -#define OCI_SESSION_SYSOPER 0x00000004 /* any version */ -#define OCI_SESSION_SYSASM 0x00008000 /* From 11gR1 */ -#define OCI_SESSION_SYSBKP 0x00020000 /* From 12cR1 */ -#define OCI_SESSION_SYSDGD 0x00040000 /* From 12cR1 */ -#define OCI_SESSION_SYSKMT 0x00080000 /* From 12cR1 */ -#define OCI_SESSION_SYSRAC 0x00100000 /* From 12cR2 */ - -#define OCI_SESSION_XA 0x00000001 -#define OCI_SESSION_PRELIM_AUTH 0x00000008 - -/* change notification types */ - -#define OCI_CNT_OBJECTS 1 -#define OCI_CNT_ROWS 2 -#define OCI_CNT_DATABASES 4 -#define OCI_CNT_ALL OCI_CNT_OBJECTS | OCI_CNT_ROWS | OCI_CNT_DATABASES - -/* event notification types */ - -#define OCI_ENT_STARTUP 1 -#define OCI_ENT_SHUTDOWN 2 -#define OCI_ENT_SHUTDOWN_ANY 3 -#define OCI_ENT_DROP_DATABASE 4 -#define OCI_ENT_DEREGISTER 5 -#define OCI_ENT_OBJECT_CHANGED 6 - -/* event object notification types */ - -#define OCI_ONT_INSERT 0x2 -#define OCI_ONT_UPDATE 0x4 -#define OCI_ONT_DELETE 0x8 -#define OCI_ONT_ALTER 0x10 -#define OCI_ONT_DROP 0x20 -#define OCI_ONT_GENERIC 0x40 - -/* database startup modes */ - -#define OCI_DB_SPM_START 1 -#define OCI_DB_SPM_MOUNT 2 -#define OCI_DB_SPM_OPEN 4 -#define OCI_DB_SPM_FULL OCI_DB_SPM_START | OCI_DB_SPM_MOUNT | OCI_DB_SPM_OPEN - -/* database startup flags */ - -#define OCI_DB_SPF_DEFAULT 0 -#define OCI_DB_SPF_FORCE 1 -#define OCI_DB_SPF_RESTRICT 2 - -/* database shutdown modes */ - -#define OCI_DB_SDM_SHUTDOWN 1 -#define OCI_DB_SDM_CLOSE 2 -#define OCI_DB_SDM_DISMOUNT 4 -#define OCI_DB_SDM_FULL OCI_DB_SDM_SHUTDOWN | OCI_DB_SDM_CLOSE | OCI_DB_SDM_DISMOUNT - -/* database shutdown flags */ - -#define OCI_DB_SDF_DEFAULT 0 -#define OCI_DB_SDF_TRANS 1 -#define OCI_DB_SDF_TRANS_LOCAL 2 -#define OCI_DB_SDF_IMMEDIATE 3 -#define OCI_DB_SDF_ABORT 4 - -/* charset form types */ - -#define OCI_CSF_NONE 0 -#define OCI_CSF_DEFAULT 1 -#define OCI_CSF_NATIONAL 2 - -/* statement fetch mode */ - -#define OCI_SFM_DEFAULT 0 -#define OCI_SFM_SCROLLABLE 0x08 - -/* statement fetch direction */ - -#define OCI_SFD_ABSOLUTE 0x20 -#define OCI_SFD_RELATIVE 0x40 - -/* bind allocation mode */ - -#define OCI_BAM_EXTERNAL 1 -#define OCI_BAM_INTERNAL 2 - -/* bind direction mode */ - -#define OCI_BDM_IN 1 -#define OCI_BDM_OUT 2 -#define OCI_BDM_IN_OUT (OCI_BDM_IN | OCI_BDM_OUT) - -/* Column property flags */ - -#define OCI_CPF_NONE 0 -#define OCI_CPF_IS_IDENTITY 1 -#define OCI_CPF_IS_GEN_ALWAYS 2 -#define OCI_CPF_IS_GEN_BY_DEFAULT_ON_NULL 4 - -/* Column collation IDs */ - -#define OCI_CCI_NONE 0x00000000 -#define OCI_CCI_NLS_COMP 0x00003FFE -#define OCI_CCI_NLS_SORT 0x00003FFD -#define OCI_CCI_NLS_SORT_CI 0x00003FFC -#define OCI_CCI_NLS_SORT_AI 0x00003FFB -#define OCI_CCI_NLS_SORT_CS 0x00003FFA -#define OCI_CCI_NLS_SORT_VAR1 0x00003FF9 -#define OCI_CCI_NLS_SORT_VAR1_CI 0x00003FF8 -#define OCI_CCI_NLS_SORT_VAR1_AI 0x00003FF7 -#define OCI_CCI_NLS_SORT_VAR1_CS 0x00003FF6 -#define OCI_CCI_BINARY 0x00003FFF -#define OCI_CCI_BINARY_CI 0x00023FFF -#define OCI_CCI_BINARY_AI 0x00013FFF - - -/* Integer sign flag */ - -#define OCI_NUM_UNSIGNED 2 - -/* External Integer types */ - -#define OCI_NUM_SHORT 4 -#define OCI_NUM_INT 8 -#define OCI_NUM_BIGINT 16 -#define OCI_NUM_FLOAT 32 -#define OCI_NUM_DOUBLE 64 -#define OCI_NUM_NUMBER 128 - -#define OCI_NUM_USHORT (OCI_NUM_SHORT | OCI_NUM_UNSIGNED) -#define OCI_NUM_UINT (OCI_NUM_INT | OCI_NUM_UNSIGNED) -#define OCI_NUM_BIGUINT (OCI_NUM_BIGINT | OCI_NUM_UNSIGNED) - -/* timestamp types */ - -#define OCI_TIMESTAMP 1 -#define OCI_TIMESTAMP_TZ 2 -#define OCI_TIMESTAMP_LTZ 3 - -/* interval types */ - -#define OCI_INTERVAL_YM 1 -#define OCI_INTERVAL_DS 2 - -/* long types */ - -#define OCI_BLONG 1 -#define OCI_CLONG 2 - -/* lob types */ - -#define OCI_BLOB 1 -#define OCI_CLOB 2 -#define OCI_NCLOB 3 - -/* lob opening mode */ - -#define OCI_LOB_READONLY 1 -#define OCI_LOB_READWRITE 2 - -/* file types */ - -#define OCI_BFILE 1 -#define OCI_CFILE 2 - -/* lob browsing mode */ - -#define OCI_SEEK_SET 1 -#define OCI_SEEK_END 2 -#define OCI_SEEK_CUR 3 - -/* type info types */ - -#define OCI_TIF_TABLE 1 -#define OCI_TIF_VIEW 2 -#define OCI_TIF_TYPE 3 - -/* object type */ - -#define OCI_OBJ_PERSISTENT 1 -#define OCI_OBJ_TRANSIENT 2 -#define OCI_OBJ_VALUE 3 - -/* collection types */ - -#define OCI_COLL_VARRAY 1 -#define OCI_COLL_NESTED_TABLE 2 -#define OCI_COLL_INDEXED_TABLE 3 - -/* pool types */ - -#define OCI_POOL_CONNECTION 1 -#define OCI_POOL_SESSION 2 - -/* AQ message state */ - -#define OCI_AMS_READY 1 -#define OCI_AMS_WAITING 2 -#define OCI_AMS_PROCESSED 3 -#define OCI_AMS_EXPIRED 4 - -/* AQ sequence deviation */ - -#define OCI_ASD_BEFORE 2 -#define OCI_ASD_TOP 3 - -/* AQ message visibility */ - -#define OCI_AMV_IMMEDIATE 1 -#define OCI_AMV_ON_COMMIT 2 - -/* AQ dequeue mode */ - -#define OCI_ADM_BROWSE 1 -#define OCI_ADM_LOCKED 2 -#define OCI_ADM_REMOVE 3 -#define OCI_ADM_REMOVE_NODATA 4 - -/* AQ dequeue navigation */ - -#define OCI_ADN_FIRST_MSG 1 -#define OCI_ADN_NEXT_TRANSACTION 2 -#define OCI_ADN_NEXT_MSG 3 - -/* AQ queue table purge mode */ - -#define OCI_APM_BUFFERED 1 -#define OCI_APM_PERSISTENT 2 -#define OCI_APM_ALL (OCI_APM_BUFFERED | OCI_APM_PERSISTENT) - -/* AQ queue table grouping mode */ - -#define OCI_AGM_NONE 0 -#define OCI_AGM_TRANSACTIONNAL 1 - -/* AQ queue table type */ - -#define OCI_AQT_NORMAL 0 -#define OCI_AQT_EXCEPTION 1 -#define OCI_AQT_NON_PERSISTENT 2 - -/* direct path processing return status */ - -#define OCI_DPR_COMPLETE 1 -#define OCI_DPR_ERROR 2 -#define OCI_DPR_FULL 3 -#define OCI_DPR_PARTIAL 4 -#define OCI_DPR_EMPTY 5 - -/* direct path conversion modes */ - -#define OCI_DCM_DEFAULT 1 -#define OCI_DCM_FORCE 2 - -/* trace size constants */ - -#define OCI_SIZE_TRACE_ID 64 -#define OCI_SIZE_TRACE_MODULE 48 -#define OCI_SIZE_TRACE_ACTION 32 -#define OCI_SIZE_TRACE_INFO 64 - -/* trace types */ - -#define OCI_TRC_IDENTITY 1 -#define OCI_TRC_MODULE 2 -#define OCI_TRC_ACTION 3 -#define OCI_TRC_DETAIL 4 - -/* HA event type */ - -#define OCI_HET_DOWN 0 -#define OCI_HET_UP 1 - -/* HA event source */ -#define OCI_HES_INSTANCE 0 -#define OCI_HES_DATABASE 1 -#define OCI_HES_NODE 2 -#define OCI_HES_SERVICE 3 -#define OCI_HES_SERVICE_MEMBER 4 -#define OCI_HES_ASM_INSTANCE 5 -#define OCI_HES_PRECONNECT 6 - -/* Fail over types */ - -#define OCI_FOT_NONE 1 -#define OCI_FOT_SESSION 2 -#define OCI_FOT_SELECT 4 - -/* fail over notifications */ - -#define OCI_FOE_END 1 -#define OCI_FOE_ABORT 2 -#define OCI_FOE_REAUTH 4 -#define OCI_FOE_BEGIN 8 -#define OCI_FOE_ERROR 16 - -/* fail over callback return code */ - -#define OCI_FOC_OK 0 -#define OCI_FOC_RETRY 25410 - -/* hash tables support */ - -#define OCI_HASH_STRING 1 -#define OCI_HASH_INTEGER 2 -#define OCI_HASH_POINTER 3 - -/* transaction types */ - -#define OCI_TRS_NEW 0x00000001 -#define OCI_TRS_READONLY 0x00000100 -#define OCI_TRS_READWRITE 0x00000200 -#define OCI_TRS_SERIALIZABLE 0x00000400 -#define OCI_TRS_LOOSE 0x00010000 -#define OCI_TRS_TIGHT 0x00020000 - -/* format types */ - -#define OCI_FMT_DATE 1 -#define OCI_FMT_TIMESTAMP 2 -#define OCI_FMT_NUMERIC 3 -#define OCI_FMT_BINARY_DOUBLE 4 -#define OCI_FMT_BINARY_FLOAT 5 - -/* sql function codes */ - -#define OCI_SFC_CREATE_TABLE 1 -#define OCI_SFC_SET_ROLE 2 -#define OCI_SFC_INSERT 3 -#define OCI_SFC_SELECT 4 -#define OCI_SFC_UPDATE 5 -#define OCI_SFC_DROP_ROLE 6 -#define OCI_SFC_DROP_VIEW 7 -#define OCI_SFC_DROP_TABLE 8 -#define OCI_SFC_DELETE 9 -#define OCI_SFC_CREATE_VIEW 10 -#define OCI_SFC_DROP_USER 11 -#define OCI_SFC_CREATE_ROLE 12 -#define OCI_SFC_CREATE_SEQUENCE 13 -#define OCI_SFC_ALTER_SEQUENCE 14 - -#define OCI_SFC_DROP_SEQUENCE 16 -#define OCI_SFC_CREATE_SCHEMA 17 -#define OCI_SFC_CREATE_CLUSTER 18 -#define OCI_SFC_CREATE_USER 19 -#define OCI_SFC_CREATE_INDEX 20 -#define OCI_SFC_DROP_INDEX 21 -#define OCI_SFC_DROP_CLUSTER 22 -#define OCI_SFC_VALIDATE_INDEX 23 -#define OCI_SFC_CREATE_PROCEDURE 24 -#define OCI_SFC_ALTER_PROCEDURE 25 -#define OCI_SFC_ALTER_TABLE 26 -#define OCI_SFC_EXPLAIN 27 -#define OCI_SFC_GRANT 28 -#define OCI_SFC_REVOKE 29 -#define OCI_SFC_CREATE_SYNONYM 30 -#define OCI_SFC_DROP_SYNONYM 31 -#define OCI_SFC_ALTER_SYSTEM_SWITCHLOG 32 -#define OCI_SFC_SET_TRANSACTION 33 -#define OCI_SFC_PLSQL_EXECUTE 34 -#define OCI_SFC_LOCK 35 -#define OCI_SFC_NOOP 36 -#define OCI_SFC_RENAME 37 -#define OCI_SFC_COMMENT 38 -#define OCI_SFC_AUDIT 39 -#define OCI_SFC_NO_AUDIT 40 -#define OCI_SFC_ALTER_INDEX 41 -#define OCI_SFC_CREATE_EXTERNAL_DATABASE 42 -#define OCI_SFC_DROP_EXTERNALDATABASE 43 -#define OCI_SFC_CREATE_DATABASE 44 -#define OCI_SFC_ALTER_DATABASE 45 -#define OCI_SFC_CREATE_ROLLBACK_SEGMENT 46 -#define OCI_SFC_ALTER_ROLLBACK_SEGMENT 47 -#define OCI_SFC_DROP_ROLLBACK_SEGMENT 48 -#define OCI_SFC_CREATE_TABLESPACE 49 -#define OCI_SFC_ALTER_TABLESPACE 50 -#define OCI_SFC_DROP_TABLESPACE 51 -#define OCI_SFC_ALTER_SESSION 52 -#define OCI_SFC_ALTER_USER 53 -#define OCI_SFC_COMMIT_WORK 54 -#define OCI_SFC_ROLLBACK 55 -#define OCI_SFC_SAVEPOINT 56 -#define OCI_SFC_CREATE_CONTROL_FILE 57 -#define OCI_SFC_ALTER_TRACING 58 -#define OCI_SFC_CREATE_TRIGGER 59 -#define OCI_SFC_ALTER_TRIGGER 60 -#define OCI_SFC_DROP_TRIGGER 61 -#define OCI_SFC_ANALYZE_TABLE 62 -#define OCI_SFC_ANALYZE_INDEX 63 -#define OCI_SFC_ANALYZE_CLUSTER 64 -#define OCI_SFC_CREATE_PROFILE 65 -#define OCI_SFC_DROP_PROFILE 66 -#define OCI_SFC_ALTER_PROFILE 67 -#define OCI_SFC_DROP_PROCEDURE 68 - -#define OCI_SFC_ALTER_RESOURCE_COST 70 -#define OCI_SFC_CREATE_SNAPSHOT_LOG 71 -#define OCI_SFC_ALTER_SNAPSHOT_LOG 72 -#define OCI_SFC_DROP_SNAPSHOT_LOG 73 -#define OCI_SFC_DROP_SUMMARY 73 -#define OCI_SFC_CREATE_SNAPSHOT 74 -#define OCI_SFC_ALTER_SNAPSHOT 75 -#define OCI_SFC_DROP_SNAPSHOT 76 -#define OCI_SFC_CREATE_TYPE 77 -#define OCI_SFC_DROP_TYPE 78 -#define OCI_SFC_ALTER_ROLE 79 -#define OCI_SFC_ALTER_TYPE 80 -#define OCI_SFC_CREATE_TYPE_BODY 81 -#define OCI_SFC_ALTER_TYPE_BODY 82 -#define OCI_SFC_DROP_TYPE_BODY 83 -#define OCI_SFC_DROP_LIBRARY 84 -#define OCI_SFC_TRUNCATE_TABLE 85 -#define OCI_SFC_TRUNCATE_CLUSTER 86 -#define OCI_SFC_CREATE_BITMAPFILE 87 -#define OCI_SFC_ALTER_VIEW 88 -#define OCI_SFC_DROP_BITMAPFILE 89 -#define OCI_SFC_SET_CONSTRAINTS 90 -#define OCI_SFC_CREATE_FUNCTION 91 -#define OCI_SFC_ALTER_FUNCTION 92 -#define OCI_SFC_DROP_FUNCTION 93 -#define OCI_SFC_CREATE_PACKAGE 94 -#define OCI_SFC_ALTER_PACKAGE 95 -#define OCI_SFC_DROP_PACKAGE 96 -#define OCI_SFC_CREATE_PACKAGE_BODY 97 -#define OCI_SFC_ALTER_PACKAGE_BODY 98 -#define OCI_SFC_DROP_PACKAGE_BODY 99 -#define OCI_SFC_CREATE_DIRECTORY 157 -#define OCI_SFC_DROP_DIRECTORY 158 -#define OCI_SFC_CREATE_LIBRARY 159 -#define OCI_SFC_CREATE_JAVA 160 -#define OCI_SFC_ALTER_JAVA 161 -#define OCI_SFC_DROP_JAVA 162 -#define OCI_SFC_CREATE_OPERATOR 163 -#define OCI_SFC_CREATE_INDEXTYPE 164 -#define OCI_SFC_DROP_INDEXTYPE 165 -#define OCI_SFC_ALTER_INDEXTYPE 166 -#define OCI_SFC_DROP_OPERATOR 167 -#define OCI_SFC_ASSOCIATE_STATISTICS 168 -#define OCI_SFC_DISASSOCIATE_STATISTICS 169 -#define OCI_SFC_CALL_METHOD 170 -#define OCI_SFC_CREATE_SUMMARY 171 -#define OCI_SFC_ALTER_SUMMARY 172 -#define OCI_SFC_CREATE_DIMENSION 174 -#define OCI_SFC_ALTER_DIMENSION 175 -#define OCI_SFC_DROP_DIMENSION 176 -#define OCI_SFC_CREATE_CONTEXT 177 -#define OCI_SFC_DROP_CONTEXT 178 -#define OCI_SFC_ALTER_OUTLINE 179 -#define OCI_SFC_CREATE_OUTLINE 180 -#define OCI_SFC_DROP_OUTLINE 181 -#define OCI_SFC_UPDATE_INDEXES 182 -#define OCI_SFC_ALTER_OPERATOR 183 - -/* size constants */ - -#define OCI_SIZE_FORMAT 64 -#define OCI_SIZE_BUFFER 512 -#define OCI_SIZE_LONG (64*1024)-1 -#define OCI_SIZE_DATE 45 -#define OCI_SIZE_TIMESTAMP 54 -#define OCI_SIZE_FORMAT_TODATE 14 -#define OCI_SIZE_NULL 4 -#define OCI_SIZE_PRECISION 10 -#define OCI_SIZE_ROWID 23 -#define OCI_SIZE_DIRECTORY 30 -#define OCI_SIZE_FILENAME 255 -#define OCI_SIZE_FORMAT_NUMS 40 -#define OCI_SIZE_FORMAT_NUML 65 -#define OCI_SIZE_OBJ_NAME 128 - -#define OCI_HASH_DEFAULT_SIZE 256 - -/* string constants */ - -#define OCILIB_DRIVER_NAME OTEXT("OCILIB") -#define OCI_STRING_NULL OTEXT("NULL") -#define OCI_STRING_EMPTY OTEXT("") -#define OCI_STRING_FORMAT_DATE OTEXT("YYYY-MM-DD") -#define OCI_STRING_FORMAT_TIME OTEXT("HH24:MI:SS") -#define OCI_STRING_FORMAT_DATETIME OTEXT("YYYY-MM-DD HH24:MI:SS") -#define OCI_STRING_FORMAT_TIMESTAMP OTEXT("YYYY-MM-DD HH24:MI:SS.FF") -#define OCI_STRING_DEFAULT_PREC 3 -#define OCI_STRING_FORMAT_NUM \ - OTEXT("FM99999999999999999999999999999999999990.999999999999999999999999") -#define OCI_STRING_FORMAT_NUM_BDOUBLE OTEXT("%lf") -#define OCI_STRING_FORMAT_NUM_BFLOAT OTEXT("%f") -#define OCI_STRING_FORMAT_NUM_SHORT OTEXT("%hd") -#define OCI_STRING_FORMAT_NUM_INT OTEXT("%d") -#define OCI_STRING_TRUE OTEXT("TRUE") -#define OCI_STRING_FALSE OTEXT("FALSE") -#define OCI_STRING_TRUE_SIZE 4 -#define OCI_STRING_FALSE_SIZE 5 - -#ifdef _WINDOWS - #define OCI_CHAR_SLASH '\\' -#else - #define OCI_CHAR_SLASH '/' -#endif - -/** - * @defgroup OcilibCApiInitialization Initializing the library - * @{ - * - * To use OCILIB, it first needs to be initialized through a call to OCI_Initialize(). - * - * Then, the application connects to server, executes queries... - * - * Finally, OCILIB resources must be released by OCI_Cleanup() - * - * @note - * - * The following objects are automatically freed by the library: - * - Connections - * - pools - * - Statements - * - Type info objects - * - Thread keys - * - * @warning - * - * All other standalone object instances (mutexes, threads, dates, lobs, ...) ARE NOT freed. - * - */ - -/** - * @brief - * Initialize the library - * - * @param err_handler - Pointer to error handler procedure (optional) - * @param lib_path - Oracle shared library path (optional) - * @param mode - Environment mode - * - * Possible values for parameter mode: - * - OCI_ENV_DEFAULT : default mode - * - OCI_ENV_THREADED : multi-threading support - * - OCI_ENV_CONTEXT : thread contextual error handling - * - OCI_ENV_EVENTS : enables events for subscription, HA Events, AQ notifications - * - * @note - * This function must be called before any OCILIB library function. - * - * @warning - * - The parameter 'libpath' is only used if OCILIB has been built with the option OCI_IMPORT_RUNTIME - * - If the parameter 'lib_path' is NULL, the Oracle library is loaded from system environment variables - * - * @warning - * OCI_Initialize() should be called ONCE per application - * - * @return - * TRUE on success otherwise FALSE (only with Oracle runtime loading mode - * if the oracle shared libraries can't be loaded or if OCI subsystem cannot be initialized) - * - */ - -OCI_EXPORT boolean OCI_API OCI_Initialize -( - POCI_ERROR err_handler, - const otext *lib_path, - unsigned int mode -); - -/** - * @brief - * Clean up all resources allocated by the library - * - * @note - * * This function must be the last OCILIB library function call. - * - It deallocates objects not explicitly freed by the program (connections, statements, ...) - * - It unloads the Oracle shared library if it has been dynamically loaded - * - * @warning - * OCI_Cleanup() should be called ONCE per application - * - * @return TRUE - */ - -OCI_EXPORT boolean OCI_API OCI_Cleanup -( - void -); - -/** - * @brief - * Return the version of OCI used for compilation - * - * @note - * - with linkage build option, the version is determined from the oci.h header through different ways - * - with runtime loading build option, the version is set to the highest version - * of OCI needed by OCILIB, not necessarily the real OCI version - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetOCICompileVersion -( - void -); - -/** - * @brief - * Return the version of OCI used at runtime - * - * @note - * - with linkage build option, the version is determined from the oci.h header - * through different ways - * - with runtime loading build option, the version determined from the symbols - * dynamically loaded. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetOCIRuntimeVersion -( - void -); - -/** - * @brief - * Return the Oracle shared library import mode - * - * @note - * Possible values are: - * - OCI_IMPORT_MODE_LINKAGE - * - OCI_IMPORT_MODE_RUNTIME - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetImportMode -( - void -); - -/** - * @brief - * Return the OCILIB charset type - * - * @note - * Possible values are: - * - OCI_CHAR_ANSI - * - OCI_CHAR_WIDE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetCharset -( - void -); - -/** -* @brief -* Return the current number of bytes allocated internally in the library -* -* @param mem_type : type of memory to request -* -* @note -* Possible values are: -* - OCI_MEM_ORACLE : bytes allocated by Oracle client library -* - OCI_MEM_OCILIB : bytes allocated by OCILIB library -* - OCI_MEM_ORACLE : bytes allocated by all libraries -* -*/ - -OCI_EXPORT big_uint OCI_API OCI_GetAllocatedBytes -( - unsigned int mem_type -); - -/** - * @brief - * Enable or disable Oracle warning notifications - * - * @param value - enable/disable warnings - * - * @note - * Default value is FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnableWarnings -( - boolean value -); - -/** - * @brief - * Set the global error user handler - * - * @param handler - Pointer to error handler procedure - * - * @note - * Use this call to change or remove the user callback error handler installed by OCI_Initialize() - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetErrorHandler -( - POCI_ERROR handler -); - -/** - * @brief - * Set the High availability (HA) user handler - * - * @param handler - Pointer to HA handler procedure - * - * @note - * See POCI_HA_HANDLER documentation for more details - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * HA events - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetHAHandler -( - POCI_HA_HANDLER handler -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiErrorHandling Error handling - * @{ - * - * OCILIB provides two mechanisms for error handling: - * - * - Global error handling through callbacks. - * - Contextual thread error handling - * - * Exceptions are raised: - * - * - On Oracle OCI API call error - * - On Oracle SQL statement error - * - On Internal OCILIB error (type checking, memory allocations ...) - * - On Oracle warnings (OCI API or SQL) - * - * If an error handler was provided to OCI_Initialize(), when an error occurs, the - * library generates an OCI_Error handle and pass it to the error handler. - * - * In order to use the thread contextual error handling, you must call - * OCI_Initialize() with the flag OCI_ENV_CONTEXT for the mode parameter. When - * activated, error handles are stored per thread and the last error within a - * thread can be retrieved with OCI_GetLastError() - * - * Exception properties are accessible through a set of functions - * - * @note - * The two ways to handle errors are not exclusive and can be mixed. - * - * @note - * Thread contextual error is also available for single thread based applications - * - * @par Oracle Warnings - * - * Oracle warnings are raised through OCI_Error API. - * Such error handles have their error type property (OCI_ErrorGetType()) set to OCI_ERR_WARNING. - * Warning handing is disabled by default. To activate/deactivate it, use OCI_EnableWarnings() - * - * @par Example with callbacks - * @include err.c - * - * @par Example with thread context - * @include err_ctx.c - * - *@par Example of warning handling - * @include err_warning.c - * - */ - -/** - * @brief - * Retrieve the last error or warning occurred within the last OCILIB call - * - * @note - * OCI_GetLastError() is based on thread context and thus OCILIB must be - * initialized with the flag OCI_ENV_CONTEXT - * - * @warning - * OCILIB functions that returns a boolean value to indicate their success : - * - return TRUE if no error occurred OR if a warning occurred - * - return FALSE if an error occurred - * - */ - -OCI_EXPORT OCI_Error * OCI_API OCI_GetLastError -( - void -); - -/** - * @brief - * Retrieve error message from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ErrorGetString -( - OCI_Error *err -); - -/** - * @brief - * Retrieve the type of error from error handle - * - * @param err - Error handle - * - * @note - * Returns one of the following values: - * - * - OCI_ERR_ORACLE - * - OCI_ERR_OCILIB - * - OCI_ERR_WARNING - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ErrorGetType -( - OCI_Error *err -); - -/** - * @brief - * Retrieve Oracle Error code from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT int OCI_API OCI_ErrorGetOCICode -( - OCI_Error *err -); - -/** - * @brief - * Retrieve Internal Error code from error handle - * - * @param err - Error handle - * - */ - -OCI_EXPORT int OCI_API OCI_ErrorGetInternalCode -( - OCI_Error *err -); - -/** - * @brief - * Retrieve connection handle within the error occurred - * - * @param err - Error handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_ErrorGetConnection -( - OCI_Error *err -); - -/** - * @brief - * Retrieve statement handle within the error occurred - * - * @param err - Error handle - * - * @note - * If the error occurred outside of a statement context, it returns NULL - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_ErrorGetStatement -( - OCI_Error *err -); - -/** - * @brief - * Return the row index which caused an error during statement execution - * - * @param err - Error handle - * - * @warning - * Row index start at 1. - * - * @return - * 0 is the error is not related to array DML otherwise the index of the given - * row which caused the error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ErrorGetRow -( - OCI_Error *err -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiConnections Connecting to Database - * @{ - * - * Connecting to a database server is done with one call to OCI_ConnectionCreate(). - * - * OCI_ConnectionFree() closes the established connection. - * - * Connection properties are accessible through a set of functions - * - * @par Example - * @include conn.c - * - */ - -/** - * @brief - * Create a physical connection to an Oracle database server - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param mode - Session mode - * - * Possible values for parameter mode : - * - OCI_SESSION_DEFAULT - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - OCI_SESSION_XA - * - * @note - * External credentials are supported by supplying a null value for the - * 'user' and 'pwd' parameters. - * If the param 'db' is NULL then a connection to the default local DB is done - * - * @note - * For parameter 'mode', the possible values are exclusive and cannot be combined - * - * @par Oracle XA support - * - * OCILIB supports Oracle XA connectivity. In order to get a connection using - * the XA interface : - * - For parameter 'db' : pass the value of the 'DB' parameter of the given - * XA connection string passed to the Transaction Processing Monitor (TPM) - * - Pass NULL to the 'user' and 'pwd' parameters - * - Pass the value OCI_SESSION_XA to parameter 'mode' - * - * @par Oracle XA Connection String - * - * The XA connection string used in a transaction monitor to connect to Oracle must - * be compatible with OCILIB : - * - * - the XA parameter 'Objects' MUST be set to 'true' - * - If OCI_ENV_THREADED is passed to OCI_Initialize(), the XA parameter 'Threads' must - * be set to 'true', otherwise to 'false' - * - If OCI_ENV_EVENTS is passed to OCI_Initialize(), the XA parameter 'Events' must - * be set to 'true', otherwise to 'false' - * - As Oracle does not support Unicode UTF16 character set through the XA interface, - * Only OCI_CHARSET_ANSI builds of OCILIB can be used - * - You still can use UTF8 if the NLS_LANG environment variable is set with a valid - * UTF8 NLS value - * - DO NOT USE OCI_CHARSET_WIDE OCILIB builds with XA connections - * - * @note - * On success, a local transaction is automatically created and started ONLY for regular - * standalone connections and connections retrieved from connection pools. - * No transaction is created for a XA connection or q connection retrieved from session pools. - * - * @return - * Connection handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_ConnectionCreate -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int mode -); - -/** - * @brief - * Close a physical connection to an Oracle database server - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ConnectionFree -( - OCI_Connection *con -); - -/** - * @brief - * Returns TRUE is the given connection is still connected otherwise FALSE - * - * @param con - Connection handle - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsConnected -( - OCI_Connection *con -); - -/** - * @brief - * Return the pointer to user data previously associated with the connection - * - * @param con - Connection handle - * - */ - -OCI_EXPORT void * OCI_API OCI_GetUserData -( - OCI_Connection *con -); - -/** - * @brief - * Associate a pointer to user data to the given connection - * - * @param con - Connection handle - * @param data - User data pointer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetUserData -( - OCI_Connection *con, - void *data -); - -/** - * @brief - * Associate a tag to the given connection/session - * - * @param con - Connection handle - * @param tag - user tag string - * - * @note - * Use this call only for connections retrieved from a session pool - * See OCI_PoolGetConnection() for more details - * - * @note - * To untag a session, call OCI_SetSessionTag() with 'tag' parameter set to NULL - * - * @warning - * No error is raised if the connection is a standalone connection or retrieved from a connection - * pool - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetSessionTag -( - OCI_Connection *con, - const otext *tag -); - -/** - * @brief - * Return the tag associated the given connection - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSessionTag -( - OCI_Connection *con -); - -/** - * @brief - * Return the name of the connected database/service name - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDatabase -( - OCI_Connection *con -); - -/** - * @brief - * Return the current logged user name - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetUserName -( - OCI_Connection *con -); - -/** - * @brief - * Return the current logged user password - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetPassword -( - OCI_Connection *con -); - -/** - * @brief - * Change the password of the logged user - * - * @param con - Connection handle - * @param password - New password - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPassword -( - OCI_Connection *con, - const otext *password -); - -/** - * @brief - * Change the password of the given user on the given database - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param new_pwd - Oracle User New password - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetUserPassword -( - const otext *db, - const otext *user, - const otext *pwd, - const otext *new_pwd -); - -/** - * @brief - * Return the current session mode - * - * @param con - Connection handle - * - * @note - * See OCI_ConnectionCreate() for possible values - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSessionMode -( - OCI_Connection *con -); - -/** - * @brief - * Return the connected database server version - * - * @param con - Connection handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetVersionServer -( - OCI_Connection *con -); - -/** - * @brief - * Return the major version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerMajorVersion -( - OCI_Connection *con -); - -/** - * @brief - * Return the minor version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerMinorVersion -( - OCI_Connection *con -); - -/** - * @brief - * Return the revision version number of the connected database server - * - * @param con - Connection handle - * - * @return - * Version number or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetServerRevisionVersion -( - OCI_Connection *con -); - -/** - * @brief - * Set the format string for implicit string conversions of the given type - * - * @param con - Connection handle (optional) - * @param type - Type of format - * @param format - Format string - * - * Formats can set at 2 levels: - * - Library level: by passing a NULL Connection handle - * - Connection level: by passing a valid Connection handle - * - * When the library needs to perform a string conversion, it search for a valid format using the - * following order: - * - Connection format - * - Library format - * - Default format - * - * @note - * Possible values of parameter 'type' : - * - * - OCI_FMT_DATE : format used to convert DATE to string - * - OCI_FMT_TIMESTAMP : format used to convert TIMESTAMP to string - * - OCI_FMT_NUMERIC : format used to convert numeric types to string - * - OCI_FMT_BINARY_DOUBLE : format used to convert BINARY_DOUBLE to string - * - OCI_FMT_BINARY FLOAT : format used to convert BINARY_FLOAT to string - * - * @note - * Default format values are : - * - OCI_FMT_DATE : constant OCI_STRING_FORMAT_DATE - * - OCI_FMT_TIMESTAMP : constant OCI_STRING_FORMAT_TIMESTAMP - * - OCI_FMT_NUMERIC : constant OCI_STRING_FORMAT_NUMERIC - * - OCI_FMT_BINARY_DOUBLE : constant OCI_STRING_FORMAT_BINARY_DOUBLE - * - OCI_FMT_BINARY FLOAT : constant OCI_STRING_FORMAT_BINARY_FLOAT - * - * @note - * Conversions are performed by Oracle built-in functions whenever possible. - * For DATE, TIMESTAMP and numeric types, see documentation of Oracle SQL to_char() function for more details - * For BINARY_DOUBLE and BINARY_FLOAT, refer to the C Standard Library printf() family documentation - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFormat -( - OCI_Connection *con, - unsigned int type, - const otext *format -); - -/** - * @brief - * Return the format string for implicit string conversions of the given type - * - * @param con - Connection handle - * @param type - Type of format - * - * @note - * See OCI_SetFormat() for possible values - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetFormat -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Return the current transaction of the connection - * - * @param con - Connection handle - * - * @note - * From v3.9.4, no more default transaction object is created for a new connection - * - */ - -OCI_EXPORT OCI_Transaction * OCI_API OCI_GetTransaction -( - OCI_Connection *con -); - -/** - * @brief - * Set a transaction to a connection - * - * @param con - Connection handle - * @param trans - Transaction handle to assign - * - * @note - * The current transaction (if any) is automatically stopped but the newly assigned is not - * started or resumed - * - * @warning - * Do not set transaction object to XA connection or connection retrieved from a session pool - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTransaction -( - OCI_Connection *con, - OCI_Transaction *trans -); - -/** - * @brief - * Return the highest Oracle version is supported by the connection - * - * @param con - connection handle - * - * @note - * The highest supported version is the lower version between client and server: - * - * @note - * Returns one of the following values: - * - * - OCI_UNKNOWN - * - OCI_8_0 - * - OCI_8_1 - * - OCI_9_0 - * - OCI_9_2 - * - OCI_10_1 - * - OCI_10_2 - * - OCI_11_1 - * - OCI_11_2 - * - OCI_12_1 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetVersionConnection -( - OCI_Connection *con -); - -/** - * @brief - * Set tracing information to the session of the given connection - * - * @param con - connection handle - * @param trace - trace type - * @param value - trace content - * - * Store current trace information to the given connection handle. - * These information: - * - * - is stored in the system view V$SESSION - * - can be retrieved from the connection property of an OCI_Error handle - * - * @note - * Possible values of parameter 'trace' : - * - * - OCI_TRC_IDENTITY : Specifies the user defined identifier in the session. - * It's recorded in the column CLIENT_IDENTIFIER of the - * system view V$SESSION - * - OCI_TRC_MODULE : name of the current module in the client application. - * It's recorded in the column MODULE of the - * system view V$SESSION - * - OCI_TRC_ACTION : name of the current action within the current module. - * It's recorded in the column ACTION of the - * system view V$SESSION - * - OCI_TRC_DETAIL : Client application additional information. - * It's recorded in the column CLIENT_INFO of the - * system view V$SESSION - * - * @warning - * The system view V$SESSION is updated on Oracle versions >= 10g - * - * @warning - * Oracle limits the size of these traces content and thus OCILIB will truncate - * the given values if needed : - * - * - OCI_TRC_IDENTITY : 64 bytes - * - OCI_TRC_MODULE : 48 bytes - * - OCI_TRC_ACTION : 32 bytes - * - OCI_TRC_DETAIL : 64 bytes - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTrace -( - OCI_Connection *con, - unsigned int trace, - const otext *value -); - -/** - * @brief - * Get the current trace for the trace type from the given connection. - * - * @param con - connection handle - * @param trace - trace type - * - * @note - * See OCI_SetTrace() for more details. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetTrace -( - OCI_Connection *con, - unsigned int trace -); - -/** - * @brief - * Makes a round trip call to the server to confirm that the connection and the server are active. - * - * @param con - Connection handle - * - * @note - * Returns TRUE is the connection is still alive otherwise FALSE - * - * @warning - * This call is supported from Oracle 10g. - * For previous versions, it returns FALSE without throwing any exception. - * - */ - -OCI_EXPORT boolean OCI_API OCI_Ping -( - OCI_Connection *con -); - -/** - * @brief - * Return the Oracle server database name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDBName -( - OCI_Connection *con -); - -/** - * @brief - * Return the Oracle server Instance name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetInstanceName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server service name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetServiceName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server machine name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetServerName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the Oracle server domain name of the connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetDomainName -( - OCI_Connection *con -); - - -/** - * @brief - * Return the date and time (Timestamp) server instance start of the - * connected database/service name - * - * @param con - Connection handle - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns NULL without throwing any exception. - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetInstanceStartTime -( - OCI_Connection *con -); - -/** - * @brief - * Verify if the given connection support TAF events - * - * @param con - Connection handle - * - * @note - * Returns TRUE is the connection supports TAF event otherwise FALSE - * - * @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsTAFCapable -( - OCI_Connection *con -); - -/** - * @brief - * Set the Transparent Application Failover (TAF) user handler - * - * @param con - Connection handle - * @param handler - Pointer to TAF handler procedure - * - * @note - * See POCI_TAF_HANDLER documentation for more details - * -* @warning - * This call is supported from Oracle 10gR2. - * For previous versions, it returns FALSE without throwing any exception. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetTAFHandler -( - OCI_Connection *con, - POCI_TAF_HANDLER handler -); - -/** - * @brief - * Return the maximum number of statements to keep in the statement cache - * - * @param con - Connection handle - * - * @note - * Default value is 20 (value from Oracle Documentation) - * - * @warning - * Requires Oracle Client 9.2 or above - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetStatementCacheSize -( - OCI_Connection *con -); - -/** - * @brief - * Set the maximum number of statements to keep in the statement cache - * - * @param con - Connection handle - * @param value - maximum number of statements in the cache - * - * @warning - * Requires Oracle Client 9.2 or above - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStatementCacheSize -( - OCI_Connection *con, - unsigned int value -); - -/** - * @brief - * Return the default LOB prefetch buffer size for the connection - * - * @param con - Connection handle - * - * @warning - * Requires Oracle Client AND Server 11gR1 or above - * - * @note - * Prefetch size is: - * - number of bytes for BLOBs and BFILEs - * - number of characters for CLOBs. - * - * @note - * Default is 0 (prefetching disabled) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDefaultLobPrefetchSize -( - OCI_Connection *con -); - -/** - * @brief - * Enable or disable prefetching for all LOBs fetched in the connection - * - * @param con - Connection handle - * @param value - default prefetch buffer size - * - * @note - * If parameter 'value': - * - is == 0, it disables prefetching for all LOBs fetched in the connection. - * - is > 0, it enables prefetching for all LOBs fetched in the connection - * and the given buffer size is used for prefetching LOBs - * - * @note - * LOBs prefetching is disabled by default - * - * @warning - * Requires Oracle Client AND Server 11gR1 or above. - * - * @note - * Prefetch size is: - * - number of bytes for BLOBs and BFILEs - * - number of characters for CLOBs. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetDefaultLobPrefetchSize -( - OCI_Connection *con, - unsigned int value -); - - -/** -* @brief -* Return the maximum number of SQL statements that can be opened in one session -* -* @param con - Connection handle -* -* @warning -* Requires Oracle Client AND Server 12cR1 or above -* -* @note -* the returned value is the same as the db parameter 'open_cursors' from server's parameter file -* -* @note -* Return 0 if the client and server version are < 12cR1 -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_GetMaxCursors -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiPools Oracle Pools - * @{ - * - * OCILIB support the connections and sessions pooling features introduced - * in Oracle 9i. - * - * Let's Oracle talk about this features ! - * - * @par Connection pools (from Oracle Call Interface Programmer's Guide) - * - * Connection pooling is the use of a group (the pool) of reusable physical connections - * by several sessions, in order to balance loads. The management of the pool is done - * by OCI, not the application. Applications that can use connection pooling include - * middle-tier applications for Web application servers and e-mail servers. - * - * @par Session Pools (from Oracle Call Interface Programmer's Guide) - * - * Session pooling means that the application will create and maintain a group of stateless - * sessions to the database. These sessions will be handed over to thin clients as requested. - * If no sessions are available, a new one may be created. When the client is done with - * the session, the client will release it to the pool. Thus, the number of sessions in - * the pool can increase dynamically. - * - * @note - * OCILIB implements homogeneous session pools only. - * - * @par When using Pools (from Oracle Call Interface Programmer's Guide) - * - * If database sessions are not reusable by mid-tier threads (that is, they are stateful) - * and the number of back-end server processes may cause scaling problems on the database, - * use OCI connection pooling. - * - * If database sessions are reusable by mid-tier threads (that is, they are stateless) - * and the number of back-end server processes may cause scaling problems on the database, - * use OCI session pooling. - * - * If database sessions are not reusable by mid-tier threads (that is, they are stateful) - * and the number of back-end server processes will never be large enough to potentially - * cause any scaling issue on the database, there is no need to use any pooling mechanism. - * - * @par Oracle 8i support - * - * Pooling has bee introduced in : - * - 9iR1 for connection pools - * - 9iR2 for session pools - * For Oracle 8i, OCILIB implements its own pooling mechanism in order to remain compatible - * with older versions. But sessions pools then are handled as connection pools - * - * @par Example - * @include pool.c - * - */ - -/** - * @brief - * Create an Oracle pool of connections or sessions - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param type - Type of pool - * @param mode - Session mode - * @param min_con - minimum number of connections/sessions that can be opened. - * @param max_con - maximum number of connections/sessions that can be opened. - * @param incr_con - next increment for connections/sessions to be opened - * - * Possible values for parameter 'type': - * - OCI_POOL_CONNECTION - * - OCI_POOL_SESSION - * - * Possible values for parameter 'mode': - * - OCI_SESSION_DEFAULT - * - OCI_SESSION_SYSDAB - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' - * and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * @return - * Connection or session pool handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Pool * OCI_API OCI_PoolCreate -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int type, - unsigned int mode, - unsigned int min_con, - unsigned int max_con, - unsigned int incr_con -); - -/** - * @brief - * Destroy a pool object - * - * @param pool - Pool handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolFree -( - OCI_Pool *pool -); - -/** - * @brief - * Get a connection from the pool - * - * @param pool - Pool handle - * @param tag - user tag string - * - * @par Session tagging - * - * Session pools have a nice feature that is 'session tagging' - * It's possible to tag a session with a string identifier - * when the session is returned to the pool, it keeps its tags. - * When requesting a connection from the session pool, it's - * possible to request a session that has the given 'tag' parameter - * If one exists, it is returned. If not and if an untagged session - * is available, it is then returned. So check the connection tag - * property with OCI_GetSessionTag() to find out if the returned - * connection is tagged or not. - * - * This features is described in the OCI developer guide as the following : - * - * "The tags provide a way for users to customize sessions in the pool. - * A client may get a default or untagged session from a pool, set certain - * attributes on the session (such as NLS settings), and return the session - * to the pool, labeling it with an appropriate tag. - * The user may request a session with the same tags in order to have a - * session with the same attributes" - * - * @return - * Connection handle otherwise NULL on failure - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_PoolGetConnection -( - OCI_Pool *pool, - const otext *tag -); - -/** - * @brief - * Get the idle timeout for connections/sessions in the pool - * - * @param pool - Pool handle - * - * @note - * Connections/sessions idle for more than this time value (in seconds) is terminated - * - * @note - * Timeout is not available for internal pooling implementation (client < 9i) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetTimeout -( - OCI_Pool *pool -); - -/** - * @brief - * Set the connections/sessions idle timeout - * - * @param pool - Pool handle - * @param value - Timeout value - * - * @note - * connections/sessions idle for more than this time value (in seconds) is terminated - * - * @note - * This call has no effect if pooling is internally implemented (client < 9i) - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetTimeout -( - OCI_Pool *pool, - unsigned int value -); - -/** - * @brief - * Get the waiting mode used when no more connections/sessions are available - * from the pool - * - * @param pool - Pool handle - * - * @return - * - FALSE to wait for an available object if the pool is saturated - * - TRUE to not wait for an available object - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolGetNoWait -( - OCI_Pool *pool -); - -/** - * @brief - * Set the waiting mode used when no more connections/sessions are available - * from the pool - * - * @param pool - Pool handle - * @param value - wait for object - * - * @note - * Pass : - * - FALSE to wait for an available object if the pool is saturated - * - TRUE to not wait for an available object - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetNoWait -( - OCI_Pool *pool, - boolean value -); - -/** - * @brief - * Return the current number of busy connections/sessions - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetBusyCount -( - OCI_Pool *pool -); - -/** - * @brief - * Return the current number of opened connections/sessions - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetOpenedCount -( - OCI_Pool *pool -); - -/** - * @brief - * Return the minimum number of connections/sessions that can be opened to the database - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetMin -( - OCI_Pool *pool -); - -/** - * @brief - * Return the maximum number of connections/sessions that can be opened to the database - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetMax -( - OCI_Pool *pool -); - -/** - * @brief - * Return the increment for connections/sessions to be opened to the database when the pool is - * not full - * - * @param pool - Pool handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetIncrement -( - OCI_Pool *pool -); - -/** - * @brief - * Return the maximum number of statements to keep in the pool statement cache - * - * @param pool - Pool handle - * - * @note - * Default value is 20 (value from Oracle Documentation) - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_PoolGetStatementCacheSize -( - OCI_Pool *pool -); - -/** - * @brief - * Set the maximum number of statements to keep in the pool statement cache - * - * @param pool - Pool handle - * @param value - maximum number of statements in the cache - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_PoolSetStatementCacheSize -( - OCI_Pool *pool, - unsigned int value -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiTransactions Managing transactions - * @{ - * - * OCILIB supports local and global transactions. - * - * Local transactions are implicit within connection objects and there is no - * specific call or programming step for using it. - * - * In order to control changes made in the database: - * - * - OCI_Commit() validates current pending modifications - * - OCI_Rollback() discards current pending modifications - * - * OCILIB supports a feature called 'Auto Commit' that performs an implicit and - * automatic commit call after every execute call - * - * @note - * Those actions are executed within a connection context and not directly to a transaction. - * - * @warning - * Global transactions are optional and are designed for distributed or global - * transaction environments. - * - * OCILIB supports them by : - * - * - Creating/Destroying explicitly a transaction object - * - Starting/Stopping/Resuming explicitly the transaction - * - Preparing the transaction for specific calls - * - */ - -/** - * @brief - * Commit current pending changes - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Commit -( - OCI_Connection *con -); - -/** - * @brief - * Cancel current pending changes - * - * @param con - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Rollback -( - OCI_Connection *con -); - -/** - * @brief - * Enable / disable auto commit mode - * - * The auto commit mode allows commit changes after every executed SQL order - * - * @param con - Connection handle - * @param enable - Enable (TRUE) or disable (FALSE) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetAutoCommit -( - OCI_Connection *con, - boolean enable -); - -/** - * @brief - * Get current auto commit mode status - * - * @param con - Connection handle - * - * @return - * TRUE if auto commit mode is activated otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_GetAutoCommit -( - OCI_Connection *con -); - -/** - * @brief - * Create a new global transaction or a serializable/read-only local transaction - * - * @param con - Connection handle - * @param timeout - Time that a transaction stays inactive after being stopped - * @param mode - Transaction mode - * @param pxid - pointer to a global transaction identifier structure - * - * - * @note - * The parameter 'mode' can be one of the following values : - * - * - Global transactions: - * - OCI_TRS_NEW : By default starts a new, tightly coupled and - * migratable branch. - * - OCI_TRS_TIGHT : explicitly specifies a tightly coupled branch - * - OCI_TRS_LOOSE : specifies a loosely coupled branch - * - * - Global and local transactions : - * - OCI_TRS_READONLY - start a read-only transaction - * - OCI_TRS_READWRITE - start a read-write transaction - * - OCI_TRS_SERIALIZABLE : start a serializable transaction - * - * @note - * For local transaction: - * - pass a NULL value for pxid - * - */ - -OCI_EXPORT OCI_Transaction * OCI_API OCI_TransactionCreate -( - OCI_Connection *con, - unsigned int timeout, - unsigned int mode, - OCI_XID *pxid -); - -/** - * @brief - * Free current transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionFree -( - OCI_Transaction *trans -); - -/** - * @brief - * Start global transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionStart -( - OCI_Transaction *trans -); - -/** - * @brief - * Stop current global transaction - * - * @param trans - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionStop -( - OCI_Transaction *trans -); - -/** - * @brief - * Resume a stopped global transaction - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionResume -( - OCI_Transaction *trans -); - -/** - * @brief - * Prepare a global transaction validation - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionPrepare -( - OCI_Transaction *trans -); - -/** - * @brief - * Cancel the prepared global transaction validation - * - * @param trans - Global transaction handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TransactionForget -( - OCI_Transaction *trans -); - -/** - * @brief - * Return global transaction mode. - * - * @note: - * see OCI_TransactionCreate() for possible values - * - * @param trans - Global transaction handle - * - * @return - * Transaction mode or OCI_UNKNOW if trans is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TransactionGetMode -( - OCI_Transaction *trans -); - -/** - * @brief - * Return global transaction Timeout - * - * @param trans - Global transaction handle - * - * @return - * Transaction timeout or 0 if trans is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TransactionGetTimeout -( - OCI_Transaction *trans -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiStatements Executing statements - * @{ - * - * Executing SQL statements or PL/SQL blocks is really simple with OCILIB. - * - * First, call OCI_StatementCreate() to allocate a statement handle. Then : - * - * - Prepare the SQL with OCI_Prepare() - * - Parse and execute it with OCI_Execute() - * - * These two steps can be done together by calling OCI_ExecuteStmt() that - * prepares and executes in one go. - * - * To find out if the statement has affected any rows, call OCI_GetAffectedRows() - * - * Finally, release the statement and its resources with OCI_StatementFree() - * - * @note - * A statement can be prepared once and executed as many times as needed (see - * Binding variables section) - * - * @note - * An OCI_Statement can be used to prepare and/or execute different SQL and PL/SQL - * statements as many times as needed. - * For example, if the SQL processing of an application is sequential, only - * one statement handle is required - * - * @note - * OCILIB supports nested levels of SQL statement processing. - * An application can loop through the resultset of the statement handle A, - * executing statement B and fetching statement C at every loop, and so on ... - * - * @par Example - * @include exec.c - * - */ - -/** - * @brief - * Create a statement object and return its handle - * - * @param con - Connection handle - * - * @return - * A statement handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_StatementCreate -( - OCI_Connection *con -); - -/** - * @brief - * Free a statement and all resources associated to it (resultsets ...) - * - * @param stmt - Connection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_StatementFree -( - OCI_Statement *stmt -); - -/** - * @brief - * Prepare a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order or PL/SQL block - * - * @note - * Do not call this function for fetched statements (REF cursors) - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_Prepare -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Execute a prepared SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_API OCI_Execute -( - OCI_Statement *stmt -); - -/** - * @brief - * Prepare and Execute a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order - PL/SQL block - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_API OCI_ExecuteStmt -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Parse a SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL order - PL/SQL block - * - * @note - * This call sends the SQL or PL/SQL command to the server for parsing only. - * The command is not executed. - * This call is only useful to check is a command is valid or not. - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to parse its SQL or PL/SQL command. - * OCI_Execute() can be call after OCI_Parse() in order to execute the - * statement, which means that the server will re-parse again the command. - * - * @warning - * Do not use OCI_Parse() unless you're only interested in the parsing result - * because the statement will be parsed again when executed and thus leading to - * unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Parse -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Describe the select list of a SQL select statement. - * - * @param stmt - Statement handle - * @param sql - SELECT sql statement - * - * @note - * This call sends the SELECT SQL order to the server for retrieving the - * description of the select order only. - * The command is not executed. - * This call is only useful to retrieve information on the associated resultset - * Call OCI_GetResultet() after OCI_Describe() to access to SELECT list - * information - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to describe the output SELECT list. - * OCI_Execute() can be called after OCI_Desbribe() in order to execute the - * statement, which means that the server will parse, and describe again the SQL - * order. - * - * @warning - * Do not use OCI_Desbribe() unless you're only interested in the resultset - * information because the statement will be parsed again when executed and thus - * leading to unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_Describe -( - OCI_Statement *stmt, - const otext *sql -); - -/** - * @brief - * Return the last SQL or PL/SQL statement prepared or executed by the statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSql -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the error position (in terms of characters) in the SQL statement - * where the error occurred in case of SQL parsing error - * - * @param stmt - Statement handle - * - * @note - * Positions start at 1. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSqlErrorPos -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the number of rows affected by the SQL statement - * - * @param stmt - Statement handle - * - * The returned value is : - * - For UPDATEs : number of rows updated - * - For INSERTs : number of rows inserted - * - For DELETEs : number of rows deleted - * - * @note - * For SELECTs statements, use OCI_GetRowCount() instead - * - * @note - * For PL/SQL blocks performing "select into :": - * - it returns the number of rows selected from PL/SQL - * - Up to version 4.3.0, OCI_Execute() returned FALSE and generated an error ORA-01403 - "No Data Found" - * - From version 4.3.1, OCI_Execute() returns 0 if no data found, otherwise the number of selected rows - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetAffectedRows -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the Oracle SQL code the command held by the statement handle - * - * @param stmt - Statement handle - * - * @warning - * OCI_GetSQLCommand() must be called after the statement has be executed - * because that's the server engine that computes the SQL command code - * - * @return - * The SQL command code of the statement otherwise OCI_UNKOWN - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetSQLCommand -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the verb of the SQL command held by the statement handle - * - * @param stmt - Statement handle - * - * @warning - * OCI_GetSQLVerb() must be called after the statement has been executed - * because that's the server engine that computes the SQL verb - * - * @note - * The SQL verb list is available in Oracle documentations and guides - * - * @return - * The SQL command verb of the statement otherwise NULL - */ - -OCI_EXPORT const otext * OCI_API OCI_GetSQLVerb -( - OCI_Statement *stmt -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiBinding Binding variables and arrays - * @{ - * - * OCILIB supports OCI data binding APIs - * - * Programs variables can be binded to an Oracle SQL PL/SQL statement in order to : - * - * - Provide input data for SQL statement - * - Provide input/output data for PL/SQL blocks - * - * OCILIB provides a set of binding functions to use with: - * - * - Basic data types: string (char/wchar_t *), int, float, double, raw - * - Object data types: lobs, files,longs, dates, cursors, statements, - * timestamps, intervals, objects - * - * To use binding: - * - * - Prepare a statement with OCI_Prepare() (see Executing statements) - * - Bind variables by calling one if the OCI_Bindxxxxx() function for every - * input variable referenced by the SQL statement - * - Setup up values of the program variables - * - Call OCI_Execute() as many times as needed - * - Each OCI_Execute() call may be preceded by an update of the program - * variables (for INSERTs for example) - * - * Bindings can be: - * - IN (host variable are not used anymore after statement execution) - * - OUT (host variable are set during statement execution) - * - IN/OUT (default) - * Use OCI_BindSetDirectionTo() to change a host variable bind direction mode after the binding call but before statement execution. - * Note that each direction mode may have a little overhead depending on the SQL type as OCILIB may have to do checks/conversions/mappings between host variable and buffers. - * Thus, to maximize performances: - * - set direction mode to OCI_BDM_IN if host variable is not updated by statement execution - * - set direction mode to OCI_BDM_OUT if host variable value does not matter prior to statement execution - * - set direction mode to OCI_BDM_IN_OUT when host variable value is used for execution and updated by statement execution - * - * OCILIB supports the OCI array Interface by binding arrays of C scalar types - * and OCILIB object types. - * - * - all types supported the library can be used for array binding except - * OCI_Statement and OCI_Long - * - Array binding is really fast for massive DML operations - * - For string/RAW arrays, the input array MUST BE a contiguous block of data - * and not an array of pointers. So to bind an array of 10 elements for a - * varchar2(30) column, binded variable must be a like array[10][31] - * - * OCILIB does not pre-parse statements (like other frameworks such as JDBC, ...) - * and lets Oracle recognize input variables embedded within the SQL statements. - * - * Bind variables must be preceded in the SQL code by the character ':'. - * - * Oracle and OCILIB supports two ways of binding: - * - * - by name (default mode in OCILIB): Oracle looks for variables in the SQL - * statement by searching their names provided to the binding function. - * So a variable can be binded once and used many times in the statement - * - by position: Oracle binds variables by position, so every variable is - * binded with a position number - * - * OCILIB Default binding mode is OCI_BIND_BY_NAME. - * - * When using binding by position, provide the position to OCI_BindXXXX() call - * through the name parameter. Within this mode the bind name must be the - * position preceded by a semicolon like ':1', ':2', .... - * - * @par Internal Bind allocation mode - * - * Bind variables or arrays can be internally allocated by OCILIB. - * That means that instead of allocating variables or arrays on the stack/heap - * in the user program, bind contents can be allocated internally and thus : - * - minimize the amount of program variables - * - optimize internal memory management for arrays - * - * To do so : - * - Call OCI_SetBindAllocation() with the mode OCI_BAM_INTERNAL - * - pass a NULL variable or array to OCI_BindXXX() calls - * - Retrieve the bind content allocated by OCILIB with OCI_BindGetData() - * - * Internal Bind allocation mode IS compatible with ALL array binding OCI_BindArrayOfxxx() methods. - * - * Internal Bind allocation mode IS NOT compatible with some single variable bind calls : - * - OCI_BindTimestamp() - * - OCI_BindInterval() - * - OCI_BindLob() - * - OCI_BindFile() - * - OCI_BindObject() - * - OCI_BindColl() - * - OCI_BindRef() - * - OCI_BindStatement() - * - OCI_BindLong() - * - * These methods need to know the data sub type (like OCI_CLOB/OCI_BLOB for lobs) in order - * to internally create variables. As these methods prototypes are not passing the sub type, - * calling them with the statement bind mode set to OCI_BAM_INTERNAL will raise - * an OCILIB error of type OCI_ERR_NULL_POINTER - * - * @note - * Rebinding is disabled by default (see OCI_AllowRebinding()) - * When using rebinding feature, host variable re-binded to a previously allocated - * bind MUST be of the SAME data type ! - * - * @par Basic input bind Example - * @include bind.c - * - * @par Array interface Example - * @include array.c - * - * @par Internal Array interface Example - * @include array_internal.c - * - * */ - -/** - * @brief - * Set the input array size for bulk operations - * - * @param stmt - Statement handle - * @param size - Array size - * - * @warning - * Do not use OCI_BindArraySetSize() for PL/SQL tables binding - * - * @note - * OCI_BindArraySetSize() is used to set the size of input bind array when using - * arrays for DML statements. - * OCI_BindArraySetSize() MUST be called to set the maximum size of the arrays - * to bind to the statement before any of its execution. This initial call must - * be bone AFTER OCI_Prepare() and BEFORE any OCI_BindArrayOfxxx() call. - * - * @note - * OCI_BindArraySetSize() can optionally be called before any later OCI_Execute() - * call in order to notify the statement of the exact number of elements - * populating the input arrays for the next execution. The array size passed to - * later OCI_BindArraySetSize() calls cannot be greater than the initial size - * otherwise an exception will be thrown. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArraySetSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the current input array size for bulk operations - * - * @param stmt - Statement handle - * - * @return - * Array size value or 0 if OCI_BindArraySetSize() has not been called - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindArrayGetSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Allow different host variables to be binded using the same bind name or - * position between executions of a prepared statement - * - * @param stmt - Statement handle - * @param value - Rebinding mode allowed - * - * @note - * Default value is FALSE - * - * @warning - * When using rebinding feature, host variable re-binded to a previously allocated - * bind MUST be of the same data type ! - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_AllowRebinding -( - OCI_Statement *stmt, - boolean value -); - -/** - * @brief - * Indicate if rebinding is allowed on the given statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_AllowRebinding() for more details - * - * @return - * TRUE if allowed otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_IsRebindingAllowed -( - OCI_Statement *stmt -); - -/** -* @brief -* Bind a boolean variable (PL/SQL ONLY) -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Pointer to boolean variable -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @warning -* - OCI_BindBoolean() CAN ONLY BE USED for PL/SQL boolean type when calling PL/SQL procedures/function -* - ONLY supported by Oracle 12c and above ! -* -* @return -* TRUE on success otherwise FALSE -*/ -OCI_EXPORT boolean OCI_API OCI_BindBoolean -( - OCI_Statement *stmt, - const otext *name, - boolean *data -); - -/** -* @brief -* Bind an Number variable -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Pointer to short variable -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @return -* TRUE on success otherwise FALSE -*/ - -OCI_EXPORT boolean OCI_API OCI_BindNumber -( - OCI_Statement *stmt, - const otext *name, - OCI_Number *data -); - -/** -* @brief -* Bind an array of Number -* -* @param stmt - Statement handle -* @param name - Variable name -* @param data - Array of numbers -* @param nbelem - Number of element in the array (PL/SQL table only) -* -* @warning -* Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. -* For regular DML array operations, pass the value 0. -* -* @note -* parameter 'data' can NULL if the statement bind allocation mode -* has been set to OCI_BAM_INTERNAL -* -* @return -* TRUE on success otherwise FALSE -*/ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfNumbers -( - OCI_Statement *stmt, - const otext *name, - OCI_Number **data, - unsigned int nbelem -); - -/** - * @brief - * Bind an short variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to short variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindShort -( - OCI_Statement *stmt, - const otext *name, - short *data -); - -/** - * @brief - * Bind an array of shorts - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of shorts - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfShorts -( - OCI_Statement *stmt, - const otext *name, - short *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned short variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned short variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedShort -( - OCI_Statement *stmt, - const otext *name, - unsigned short *data -); - -/** - * @brief - * Bind an array of unsigned shorts - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned shorts - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedShorts -( - OCI_Statement *stmt, - const otext *name, - unsigned short *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindInt -( - OCI_Statement *stmt, - const otext *name, - int *data -); - -/** - * @brief - * Bind an array of integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfInts -( - OCI_Statement *stmt, - const otext *name, - int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedInt -( - OCI_Statement *stmt, - const otext *name, - unsigned int *data -); - -/** - * @brief - * Bind an array of unsigned integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedInts -( - OCI_Statement *stmt, - const otext *name, - unsigned int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a big integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to big int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindBigInt -( - OCI_Statement *stmt, - const otext *name, - big_int *data -); - -/** - * @brief - * Bind an array of big integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of big int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfBigInts -( - OCI_Statement *stmt, - const otext *name, - big_int *data, - unsigned int nbelem -); - -/** - * @brief - * Bind an unsigned big integer variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to unsigned big int variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindUnsignedBigInt -( - OCI_Statement *stmt, - const otext *name, - big_uint *data -); - -/** - * @brief - * Bind an array of unsigned big integers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of unsigned big int - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfUnsignedBigInts -( - OCI_Statement *stmt, - const otext *name, - big_uint *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a string variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - String to bind - * @param len - Max length of the string (in character without - * the zero null terminal character) - * - * @note - * if len == 0, len is set to the string size - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindString -( - OCI_Statement *stmt, - const otext *name, - otext *data, - unsigned int len -); - -/** - * @brief - * Bind an array of strings - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of string - * @param len - Max length of a single string element (in character without - * the zero null terminal character) - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @warning - * if len <= 0, it returns FALSE - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfStrings -( - OCI_Statement *stmt, - const otext *name, - otext *data, - unsigned int len, - unsigned int nbelem -); - -/** - * @brief - * Bind a raw buffer - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - buffer to bind - * @param len - Max length of the buffer - * - * @note - * if len <= 0, it returns false - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindRaw -( - OCI_Statement *stmt, - const otext *name, - void *data, - unsigned int len -); - -/** - * @brief - * Bind an array of raw buffers - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of buffers - * @param len - Size in bytes on a single RAW array element - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * The buffer must be a contiguous block of data elements - * - * @note - * If len <= 0, it returns FALSE - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfRaws -( - OCI_Statement *stmt, - const otext *name, - void *data, - unsigned int len, - unsigned int nbelem -); - -/** - * @brief - * Bind a double variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to double variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindDouble -( - OCI_Statement *stmt, - const otext *name, - double *data -); - -/** - * @brief - * Bind an array of doubles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of double - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfDoubles -( - OCI_Statement *stmt, - const otext *name, - double *data, - unsigned int nbelem -); - - -/** - * @brief - * Bind a float variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Pointer to float variable - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindFloat -( - OCI_Statement *stmt, - const otext *name, - float *data -); - -/** - * @brief - * Bind an array of floats - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of float - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfFloats -( - OCI_Statement *stmt, - const otext *name, - float *data, - unsigned int nbelem -); - -/** - * @brief - * Bind a date variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Date handle - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindDate -( - OCI_Statement *stmt, - const otext *name, - OCI_Date *data -); - -/** - * @brief - * Bind an array of dates - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of date handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfDates -( - OCI_Statement *stmt, - const otext *name, - OCI_Date **data, - unsigned int nbelem -); - -/** - * @brief - * Bind a timestamp variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Timestamp handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindTimestamp -( - OCI_Statement *stmt, - const otext *name, - OCI_Timestamp *data -); - -/** - * @brief - * Bind an array of timestamp handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Timestamp handle - * @param type - Timestamp type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_TimestampCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfTimestamps -( - OCI_Statement *stmt, - const otext *name, - OCI_Timestamp **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind an interval variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Interval handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindInterval -( - OCI_Statement *stmt, - const otext *name, - OCI_Interval *data -); - -/** - * @brief - * Bind an array of interval handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Interval handle - * @param type - Interval type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_IntervalCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfIntervals -( - OCI_Statement *stmt, - const otext *name, - OCI_Interval **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind a Lob variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Lob handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindLob -( - OCI_Statement *stmt, - const otext *name, - OCI_Lob *data -); - -/** - * @brief - * Bind an array of Lob handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Lob handle - * @param type - Lob type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_LobCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfLobs -( - OCI_Statement *stmt, - const otext *name, - OCI_Lob **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind a File variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - File handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindFile -( - OCI_Statement *stmt, - const otext *name, - OCI_File *data -); - -/** - * @brief - * Bind an array of File handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of File handle - * @param type - File type - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_FileCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfFiles -( - OCI_Statement *stmt, - const otext *name, - OCI_File **data, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Bind an object (named type) variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Object handle - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindObject -( - OCI_Statement *stmt, - const otext *name, - OCI_Object *data -); - -/** - * @brief - * Bind an array of object handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of object handle - * @param typinf - type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfObjects -( - OCI_Statement *stmt, - const otext *name, - OCI_Object **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Collection variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Collection handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindColl -( - OCI_Statement *stmt, - const otext *name, - OCI_Coll *data -); - -/** - * @brief - * Bind an array of Collection handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Collection handle - * @param typinf - Type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * See OCI_CollCreate() for possible values of parameter 'type' - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfColls -( - OCI_Statement *stmt, - const otext *name, - OCI_Coll **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Ref variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Ref handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindRef -( - OCI_Statement *stmt, - const otext *name, - OCI_Ref *data -); - -/** - * @brief - * Bind an array of Ref handles - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Array of Ref handle - * @param typinf - type info handle - * @param nbelem - Number of element in the array (PL/SQL table only) - * - * @warning - * Parameter 'nbelem' SHOULD ONLY be USED for PL/SQL tables. - * For regular DML array operations, pass the value 0. - * - * @note - * parameter 'data' can NULL if the statement bind allocation mode - * has been set to OCI_BAM_INTERNAL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindArrayOfRefs -( - OCI_Statement *stmt, - const otext *name, - OCI_Ref **data, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Bind a Statement variable (PL/SQL Ref Cursor) - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Statement handle to bind - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindStatement -( - OCI_Statement *stmt, - const otext *name, - OCI_Statement *data -); - -/** - * @brief - * Bind a Long variable - * - * @param stmt - Statement handle - * @param name - Variable name - * @param data - Long handle - * @param size - Size of the long buffer in bytes or characters - * - * @note - * Size is expressed in: - * - Bytes for BLONGs - * - Characters for CLONGs - * - * @note - * parameter 'data' CANNOT be NULL whatever the statement bind allocation mode - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindLong -( - OCI_Statement *stmt, - const otext *name, - OCI_Long *data, - unsigned int size -); - -/** - * @brief - * Returns the first or next error that occurred within a DML array statement execution - * - * @param stmt - Statement handle - * - * @return - * The first or next error handle otherwise NULL - */ - -OCI_EXPORT OCI_Error * OCI_API OCI_GetBatchError -( - OCI_Statement *stmt -); - -/** - * @brief - * Returns the number of errors that occurred within the last DML array statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBatchErrorCount -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the number of binds currently associated to a statement - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindCount -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the bind handle at the given index in the internal array of bind - * handle - * - * @param stmt - Statement handle - * @param index - Bind position - * - * @note - * Index starts at 1. - * - * @note - * Bind handle are created sequentially. For example, the third call to a - * OCI_BindXXX() generates a bind handle of index 3. - * - * @return - * The bind handle or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Bind * OCI_API OCI_GetBind -( - OCI_Statement *stmt, - unsigned int index -); - -/** - * @brief - * Return a bind handle from its name - * - * @param stmt - Statement handle - * @param name - Bind variable name - * - * @note - * Bind names must include a semicolon at the beginning. - * - * @return - * The bind handle or NULL if not found - * - */ - -OCI_EXPORT OCI_Bind * OCI_API OCI_GetBind2 -( - OCI_Statement *stmt, - const otext *name -); - -/** -* @brief -* Return the index of the bind from its name belonging to the given statement -* -* @param stmt - Statement handle -* @param name - Bind variable name -* -* @warning -* The bind name is case insensitive -* -* @note -* Bind indexes start with 1 in OCILIB -* -* @return -* Bind index on success or zero if the bind does not exists or if statement is NULL -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindIndex -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Return the name of the given bind - * - * @param bnd - Bind handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_BindGetName -( - OCI_Bind *bnd -); - - -/** - * @brief - * Set the direction mode of a bind handle - * - * @param bnd - Bind handle - * @param direction - direction mode - * - * @note - * Possible values for parameter 'direction' : - * - OCI_BDM_IN : input values (not modified by the server) - * - OCI_BDM_OUT : output values (modified by the server) - * - OCI_BDM_IN_OUT : input and output values - * - * @note - * Default value is OCI_BDM_IN_OUT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDirection -( - OCI_Bind *bnd, - unsigned int direction -); - -/** - * @brief - * Get the direction mode of a bind handle - * - * @param bnd - Bind handle - * - * @note - * see OCI_BindSetDirection() for more details - * - * return the bind direction mode on success otherwise OCI_UNKNWON - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDirection -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the OCILIB type of the given bind - * - * @param bnd - Bind handle - * - * @note - * Possible values are : - * - * - OCI_CDT_NUMERIC : short, int, long long, float, double - * - OCI_CDT_DATETIME : OCI_Date * - * - OCI_CDT_TEXT : otext * - * - OCI_CDT_LONG : OCI_Long * - * - OCI_CDT_CURSOR : OCI_Statement * - * - OCI_CDT_LOB : OCI_Lob * - * - OCI_CDT_FILE : OCI_File * - * - OCI_CDT_TIMESTAMP : OCI_Timestamp * - * - OCI_CDT_INTERVAL : OCI_Interval * - * - OCI_CDT_RAW : void * - * - OCI_CDT_OBJECT : OCI_Object * - * - OCI_CDT_COLLECTION : OCI_Coll * - * - OCI_CDT_REF : OCI_Ref * - * - OCI_CDT_BOOLEAN : boolean - * - * @return - * The column type or OCI_CDT_UNKNOWN on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetType -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the OCILIB object subtype of the given bind - * - * @param bnd - Bind handle - * - * @note - * * This call is valid for the following OCILIB types: - * - OCI_CDT_NUMERIC - * - OCI_CDT_LONG - * - OCI_CDT_LOB - * - OCI_CDT_FILE - * - OCI_CDT_TIMESTAMP - * - OCI_CDT_INTERVAL - * - * For numeric binds the possible values are: - * - OCI_NUM_SHORT - * - OCI_NUM_INT - * - OCI_NUM_BIGINT - * - OCI_NUM_USHORT - * - OCI_NUM_UINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * For OCI_Long type the possible values are: - * - OCI_BLONG - * - OCI_CLONG - * - * For OCI_Lob type the possible values are: - * - OCI_BLOB - * - OCI_CLOB - * - OCI_NCLOB - * - * For OCI_File type the possible values are: - * - OCI_BFILE - * - OCI_CFILE - * - * For OCI_Timestamp type the possible values are: - * - OCI_TIMESTAMP - * - OCI_TIMESTAMP_TZ - * - OCI_TIMESTAMP_LTZ - * - * For OCI_Interval type the possible values are: - * - OCI_INTERVAL_YM - * - OCI_INTERVAL_DS - * - * @note - * For all other OCILIB types, it returns OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetSubtype -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the number of elements of the bind handle - * - * @param bnd - Bind handle - * - * @return - * - For single binds, it returns 1 - * - For array binds, it returns the number of element in the array - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataCount -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the user defined data associated with a bind handle - * - * @param bnd - Bind handle - * - * @return - * - The pointer to variable/array passed to an OCI_BindXXX() or - * OCI_BindArrayOfXXX() call - * - */ - -OCI_EXPORT void * OCI_API OCI_BindGetData -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the statement handle associated with a bind handle - * - * @param bnd - bind handle - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_BindGetStatement -( - OCI_Bind *bnd -); - -/** - * @brief - * Set the actual size of the element held by the given bind handle - * - * @param bnd - bind handle - * @param size - data size - * - * @note - * This call is not mandatory and should ONLY be called for RAWs binds to set - * the real size of the given data if different from the expected column or - * parameter size - * - * @note - * It works as well with string based PL/SQL tables (in or in/out but NOT out) - * even if it's not necessary. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the parameter 'size' is expressed in - * number of characters. - * - * @return - * Data size if the bind type is listed above otherwise 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDataSize -( - OCI_Bind *bnd, - unsigned int size -); - -/** - * @brief - * Set the size of the element at the given position in - * the bind input array - * - * @param bnd - bind handle - * @param position - Position in the array - * @param size - data size - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * Before execution, it returns the max default size for the bind and not the real - * data size, unless a custom size has been set with OCI_BindSetDataSizeXXX() - * After execution, it returns the real data size. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the parameter 'size' is expressed in - * number of characters. - * - * @return - * Data size if the bind type is listed above otherwise 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetDataSizeAtPos -( - OCI_Bind *bnd, - unsigned int position, - unsigned int size -); - -/** - * @brief - * Return the actual size of the element held by the given bind handle - * - * @param bnd - bind handle - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataSize -( - OCI_Bind *bnd -); - -/** - * @brief - * Return the actual size of the element at the given position in - * the bind input array - * - * @param bnd - bind handle - * @param position - Position in the array - * - * @note - * See OCI_BindSetDataSize() for supported data types - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetDataSizeAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the bind variable to null - * - * @param bnd - Bind handle - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Set to null the entry in the bind variable input array - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the bind variable to NOT null - * - * @param bnd - Bind handle - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNotNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Set to NOT null the entry in the bind variable input array - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_BindSetNotNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Check if the current value of the binded variable is marked as NULL - * - * @param bnd - Bind handle - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindIsNull -( - OCI_Bind *bnd -); - -/** - * @brief - * Check if the current entry value at the given index of the binded array - * is marked as NULL - * - * @param bnd - Bind handle - * @param position - Position in the array - * - * @warning - * Position starts with 1 - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_BindIsNullAtPos -( - OCI_Bind *bnd, - unsigned int position -); - -/** - * @brief - * Set the charset form of the given character based bind variable - * - * @param bnd - Bind handle - * @param csfrm - charset form - * - * @note - * Possible values are : - * - * - OCI_CSF_DEFAULT : the column has default charset - * - OCI_CSF_NATIONAL: the column has national charset - * - * @note - * This call has to be made after OCI_Prepare() but before OCI_Execute() - * - * @warning - * This call does nothing : - * - if the csform is out of range - * - if the bind type is not OCI_CFT_TEXT or OCI_CDT_LONG - * - * @return - * TRUE on success otherwise FALSE - * - */ - -boolean OCI_API OCI_BindSetCharsetForm -( - OCI_Bind *bnd, - unsigned int csfrm -); - -/** - * @brief - * Get the allocaton mode of a bind handle - * - * @param bnd - Bind handle - * - * @note - * Possible values are : - * - OCI_BAM_EXTERNAL : bind variable is allocated by user code - * - OCI_BAM_INTERNAL : bind variable is allocated internally - * - * return the allocaton mode on success otherwise OCI_UNKNWON - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_BindGetAllocationMode -( - OCI_Bind *bnd -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFetching Fetching data - * @{ - * - * OCILIB offers a really easy and smart mechanism to fetch data from a SQL Statement. - * It looks like what's found in JDBC and other object oriented databases frameworks. - * - * ONLY the following statements can return resultsets that can be fetched by host programs: - * - Statements executing SQL SELECT - * - Statements executing SQL UPDATE/DELETE using a RETURNING INTO clause - * - Statements binded to PL/SQL OPEN FOR argument - * - Statements binded to PL/SQL procedure OUT variables - * - Statements implicitly returned from PL/SQL procedure or blocks (new feature in Oracle 12cR1) using - * DBMS_SQL.RETURN_RESULT() - * - * These resultsets are encapsulated in OCILIB by OCI_Resultset objects. - * - * Thus, after any successful call to an OCI_Executexxx() function that executed - * a fetchable statement or filled output bind variables, the resultset can be - * retrieved by calling OCI_GetResultset() - * - * The creation of a OCI_Resultset object consists in : - * - * - Describing the output columns of the resultset - * - Allocating memory to hold the content data - * - * OCILIB supports multi-row fetching for increasing performances. Instead of - * fetching data row by row from the server (that induces lots of round-trips - * between the client and the server), the library prefetches data chunk by - * chunks (default is 20 rows). - * So, less network traffic and better performances. - * These mechanisms are completely hidden from the application which fetches the - * resultset row by row. - * - * Once the Resultset handle is retrieved : - * - * - It can be fetched by calling OCI_FetchNext() as long as it returns TRUE. - * - To retrieve the value of a column, call OCI_GetXXXX() where XXXX is the - * type of data you want to fetch. - * - * @note - * In case of a statement that has executed PL/SQL calls or blocks returning implicit resultsets: - * - OCI_GetResultset() return the first available resultset - * - OCI_GetNextResultset() return the next available resultset until no more resultset available - * - * @par Scrollable Resultsets - * - * Oracle 9i introduced scrollable cursors (resultsets in OCILIB) that can be - * fetched: - * - * - Sequentially in both directions: OCI_FetchPrev() and OCI_FetchNext() - * - To a relative position in the resultset: OCI_FetchSeek() with OCI_SFD_RELATIVE - * - To an absolute position in the resultset: OCI_FetchSeek() with OCI_SFD_ABOSLUTE - * - To the first or last row in the resultset: OCI_FetchFirst() and OCI_FetchLast() - * - * Scrollable statements uses more server and client resources and should only - * be used when necessary. - * - * Resultsets are 'forward only' by default. Call OCI_SetFetchMode() with - * OCI_SFM_SCROLLABLE to enable scrollable resultsets for a given statement. - * - * @warning - * Any use of scrollable fetching functions with a resultset that depends on a - * statement with fetch mode set to OCI_SFM_DEFAULT will fail ! - * - * @warning - * If you intend to use OCI_FetchSeek() on a scrollable statement and if any of the - * selected columns is a ref cursor or a nested table, OCILIB will internally set the - * resultset internal array size to 1 and thus ignore any values set using OCI_SetFetchSize() - * This is performed due to an Oracle bug. - * - * @note - * If the column internal data does not match the requested type, OCILIB tries - * to convert the data when it's possible and throws an error if not. - * - * The properties (columns names, types ...) of the resultset are accessible - * through a set of APIs. - * - * @par Implicit conversion to string types - * - * OCI_GetString() performs an implicit conversion from ANY Oracle types: - * - * - Numerics (based on the current connection handle numeric format) - * - Binary doubles and floats (using the standard C Library functions) - * - OCI_Date : uses OCI_DateToText() with current connection date format - * - OCI_Timestamp : uses OCI_TimestampToText() with current connection date format - * - OCI_Interval : uses OCI_IntervalToText() with Oracle default format - * - OCI_Coll : uses OCI_CollToText() - * - OCI_Object : uses OCI_ObjectToText() - * - OCI_Ref : uses OCI_RefToText() - * - OCI_File : returns "$(folder)/$(filename)" - no content returned - * - OCI_Lob : see note above for binary types - * - OCI_Long : see note above for binary types - * - RAWs : see note above for binary types - * - * @note - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * For LONG and CLOBs/NCLOBSs attributes, the whole string content is returned - * - * @note - * The following OCILIB types are not supported for implicit conversion: - * - OCI_Statement - * - * @warning - * For Dates and numerics types, OCILIB uses OCI client calls to perform - * the conversion. - * For binary double and binary floats data types, OCI client functions cannot - * handle the full double range of values. Thus, OCILIB is using the - * standard C library to convert theses data types to string - * - * @par Fetching rows into user structures - * - * It is possible to fetch a complete row into a user defined structure. - * Each column of the resultset is mapped to a structure member. - * The mapping rules are : - * - LOBs (CLOB, NCLOB, BLOB) : OCI_Lob * - * - DATE : OCI_Date * - * - TIMESTAMPS : OCI_Timestamp * - * - INTERVALS : OCI_Interval * - * - LONG, LONG RAW : OCI_Long * - * - REFs : OCI_Ref * - * - CURSOR, RESULSET : OCI_Statement * - * - OBJECTS, UDT : OCI_Object * - * - Character columns (CHAR,VARCHAR, etc..) : otext * - * - All NUMERIC types : - * - default : big_int - * - user defined (see OCI_SetStructNumericType()) - * - * See OCI_GetStruct() and OCI_SetStructNumericType() for more details - * - * @par Fetch Example - * @include fetch.c - * - * @par Fetch Rows into user structures Example - * @include fetch_struct.c - * - * @par Meta data Example - * @include meta.c - * - * @par Ref cursor Example - * @include cursor.c - * - * @par Implicit resultset Example - * @include implicit_resultset.c - * - * @par Scrollable resultset Example - * @include scroll.c - * - */ - -/** - * @brief - * Retrieve the resultset handle from an executed statement - * - * @param stmt - Statement handle - * - * @note - * See @ref OcilibCApiFetching for more details about what statements can return resultsets - * - * @warning - * If the statement has not been prepared and executed, no resultset will be returned - * - * @return - * A resultset handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Resultset * OCI_API OCI_GetResultset -( - OCI_Statement *stmt -); - -/** - * @brief - * Free the statement resultsets - * - * @param stmt - Statement handle - * - * @note - * This call is optional. Resultsets are automatically freed when the - * statement is destroyed or when it's reused. - * - * @note - * This function has been introduced for releasing big resultsets when the - * application wants to keep the statement alive and doesn't know when it - * will be destroyed. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ReleaseResultsets -( - OCI_Statement *stmt -); - -/** - * @brief - * Fetch the next row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchNext() works for normal and scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - Last row already fetched - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchNext -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the previous row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchPrev() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - First row already fetched - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchPrev -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the first row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchFirst() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if : - * - Empty resultset - * - An error occurred - *f - */ - -OCI_EXPORT boolean OCI_API OCI_FetchFirst -( - OCI_Resultset *rs -); - -/** - * @brief - * Fetch the last row of the resultset - * - * @param rs - Resultset handle - * - * @note - * OCI_FetchLast() works ONLY for scrollable resultsets - * - * @return - * TRUE on success otherwise FALSE if: - * - Empty resultset - * - An error occurred - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchLast -( - OCI_Resultset *rs -); - -/** - * @brief - * Custom Fetch of the resultset - * - * @param rs - Resultset handle - * @param mode - Fetch direction - * @param offset - Fetch offset - * - * @note - * Possible values for 'direction' parameter are: - * - OCI_SFD_ABSOLUTE - * - OCI_SFD_RELATIVE - * - * @note - * OCI_FetchSeek() works ONLY for scrollable resultsets - * - * @warning - * If you intend to use OCI_FetchSeek() on a scrollable statement and if any of the - * selected columns is a ref cursor or a nested table, you must set the fetching size - * to 1 using OCI_SetFetchSize() before calling OCI_GetResultset() - * Otherwise OCI_FetchSeek() will fails with a OCI-10002 error - * - * @return - * TRUE on success otherwise FALSE if: - * - Empty resultset - * - An error occurred - * - OCI_SetFetchMode() has not been called with OCI_SFM_SCROLLABLE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FetchSeek -( - OCI_Resultset *rs, - unsigned int mode, - int offset -); - -/** - * @brief - * Retrieve the number of rows fetched so far - * - * @param rs - Resultset handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRowCount -( - OCI_Resultset *rs -); - -/** - * @brief - * Retrieve the current row number - * - * @param rs - Resultset handle - * - * @note - * - OCI_GetCurrentRow() returns the current row number starting from 1 - * - If the resultset has not been fetched or if the resultset is empty, it returns 0 - * - If the resultset has been fully fetched, it returns the last fetched row number - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetCurrentRow -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the number of columns in the resultset - * - * @param rs - Resultset handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetColumnCount -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the column object handle at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @return - * - Column handle on success - * - NULL if index is out of bounds or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_GetColumn -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the column object handle from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * - Column handle on success or - * - NULL if no column found with the given name or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_GetColumn2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the index of the column in the result from its name - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @note - * Column indexes start with 1 in OCILIB - * - * @return - * Column index on success or zero on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetColumnIndex -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the name of the given column - * - * @param col - Column handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ColumnGetName -( - OCI_Column *col -); - -/** - * @brief - * Return the type of the given column - * - * @param col - Column handle - * - * @note - * Possible values are : - * - * - OCI_CDT_NUMERIC : short, int, long long, float, double - * - OCI_CDT_DATETIME : OCI_Date * - * - OCI_CDT_TEXT : otext * - * - OCI_CDT_LONG : OCI_Long * - * - OCI_CDT_CURSOR : OCI_Statement * - * - OCI_CDT_LOB : OCI_Lob * - * - OCI_CDT_FILE : OCI_File * - * - OCI_CDT_TIMESTAMP : OCI_Timestamp * - * - OCI_CDT_INTERVAL : OCI_Interval * - * - OCI_CDT_RAW : void * - * - OCI_CDT_OBJECT : OCI_Object * - * - OCI_CDT_COLLECTION : OCI_Coll * - * - OCI_CDT_REF : OCI_Ref * - * - OCI_CDT_BOOLEAN : boolean - * - * @return - * The column type or OCI_CDT_UNKNOWN if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetType -( - OCI_Column *col -); - -/** - * @brief - * Return the charset form of the given column - * - * @param col - Column handle - * - * @note - * Possible values are : - * - OCI_CSF_NONE : the column is not an character or lob column - * - OCI_CSF_DEFAULT : the column has server default charset - * - OCI_CSF_NATIONAL : the column has national server charset - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetCharsetForm -( - OCI_Column *col -); - -/** - * @brief - * Return the Oracle SQL type name of the column data type - * - * @param col - Column handle - * - * @note - * For possible values, consults Oracle Documentation - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ColumnGetSQLType -( - OCI_Column *col -); - -/** - * @brief - * Return the Oracle SQL Full name including precision and size of the - * column data type - * - * @param col - Column handle - * @param buffer - buffer to store the full column type name and size - * @param len - max size of the buffer in characters - * - * @note - * This function returns a description that matches the one given by SQL*Plus - * - * @note - * Return the number of characters written into the buffer - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetFullSQLType -( - OCI_Column *col, - otext *buffer, - unsigned int len -); - -/** - * @brief - * Return the size of the column - * - * @note - * For all types, the size is expressed is bytes, excepted for character - * based columns that were created with a character based size or of type NCHAR/NVARCHAR - * - * @param col - Column handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetSize -( - OCI_Column *col -); - -/** - * @brief - * Return the scale of the column for numeric columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetScale -( - OCI_Column *col -); - -/** - * @brief - * Return the precision of the column for numeric columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the fractional precision of the column for timestamp and interval columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetFractionalPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the leading precision of the column for interval columns - * - * @param col - Column handle - * - */ - -OCI_EXPORT int OCI_API OCI_ColumnGetLeadingPrecision -( - OCI_Column *col -); - -/** - * @brief - * Return the nullable attribute of the column - * - * @param col - Column handle - * - * @return - * Return TRUE if the column is nullable otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ColumnGetNullable -( - OCI_Column *col -); - -/** - * @brief - * Return TRUE if the length of the column is character-length or FALSE if - * it is byte-length - * - * @param col - Column handle - * - * @note - * This was introduced in Oracle 9i. So for version that are not supporting this - * property, it always return FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ColumnGetCharUsed -( - OCI_Column *col -); - -/** - * @brief - * Return the column property flags - * - * @param col - Column handle - * - * For flags are: - * - OCI_CPF_NONE : The column has no flags or the OCI client does not support this call - * - OCI_CPF_IS_IDENTITY : - * - If Set, the column is an IDENTITY column - * - Otherwise, it is not an IDENTITY column - * - OCI_CPF_IS_GEN_ALWAYS (only if OCI_CPF_IS_IDENTITY is set) : - * - If set, means that the value is "ALWAYS GENERATED" - * - Otherwise mens that the value is "GENERATED BY" - * - OCI_CPF_IS_GEN_BY_DEFAULT_ON_NULL (only if OCI_CPF_IS_IDENTITY is set): - * - If set, means that the value is generated by default on NULL - * - * @note - * This was introduced in Oracle 12cR1. - * It is currently used for identifying Identity columns. - * For earlier versions, it always return OCI_CPF_NONE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetPropertyFlags -( - OCI_Column *col -); - -/** -* @brief -* Return the column collation ID -* -* @param col - Column handle -* -* Possible values: -* - OCI_CCI_NONE -* - OCI_CCI_NLS_COMP -* - OCI_CCI_NLS_SORT -* - OCI_CCI_NLS_SORT_CI -* - OCI_CCI_NLS_SORT_AI -* - OCI_CCI_NLS_SORT_CS -* - OCI_CCI_NLS_SORT_VAR1 -* - OCI_CCI_NLS_SORT_VAR1_CI -* - OCI_CCI_NLS_SORT_VAR1_AI -* - OCI_CCI_NLS_SORT_VAR1_CS -* - OCI_CCI_BINARY -* - OCI_CCI_BINARY_CI -* - OCI_CCI_BINARY_AI -* -* @note -* This was introduced in Oracle 12cR2. -* For earlier versions, it always return OCI_CCI_NONE -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetCollationID -( - OCI_Column *col -); - -/** - * @brief - * Return the type information object associated to the column - * - * @param col - Column handle - * - * @note - * This call is used only for Named Object typed and collection columns. - * It returns NULL if the column is not a Named Object or a collection. - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_ColumnGetTypeInfo -( - OCI_Column *col -); - -/** - * @brief - * Return the OCILIB object subtype of a column - * - * @param col - Column handle - * - * @note - * This call is valid for the following OCILIB types: - * - * - OCI_CDT_LONG - * - OCI_CDT_LOB - * - OCI_CDT_FILE - * - OCI_CDT_TIMESTAMP - * - OCI_CDT_INTERVAL - * - OCI_CDT_NUMERIC - * - * For OCI_Long type the possible values are: - * - OCI_BLONG - * - OCI_CLONG - * - * For OCI_Lob type the possible values are: - * - OCI_BLOB - * - OCI_CLOB - * - OCI_NCLOB - * - * For OCI_File type the possible values are: - * - OCI_BFILE - * - OCI_CFILE - * - * For OCI_Timestamp type the possible values are: - * - OCI_TIMESTAMP - * - OCI_TIMESTAMP_TZ - * - OCI_TIMESTAMP_LTZ - * - * For OCI_Interval type the possible values are: - * - OCI_INTERVAL_YM - * - OCI_INTERVAL_DS - * - * For numeric columns the possible values are: - * - OCI_NUM_SHORT - * - OCI_NUM_INT - * - OCI_NUM_BIGINT - * - OCI_NUM_USHORT - * - OCI_NUM_UINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @warning - * For numeric columns, the value may be not accurate at all! - * OCI does not allow to find out the real SQL precise type of an numeric column (int, real, ...). - * OCI based libraries can only 'guess' some types in some situations : float, binary_float, binary_float, number. - * For example: - * - with the statement 'select 101 from dual', OCI would report numeric type NUMBER. - * - if a column is declared as "INT", OCI would report also NUMBER. - * - * - * @note - * For all other OCILIB types, it returns OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ColumnGetSubType -( - OCI_Column *col -); - -/** - * @brief - * set the numeric data type of the given structure member (identified from position in the - * resultset) to retrieve when calling OCI_GetStruct() - * - * @param rs - Resultset handle - * @param index - Column position - * @param type - Numeric type - * - * @note - * Possible values for parameter 'type' : - * - OCI_NUM_SHORT - * - OCI_NUM_USHORT - * - OCI_NUM_INT - * - OCI_NUM_UINT - * - OCI_NUM_BIGINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStructNumericType -( - OCI_Resultset *rs, - unsigned int index, - unsigned int type -); - -/** - * @brief - * set the numeric data type of the given structure member (identified from column name in the - * resultset) to retrieve when calling OCI_GetStruct() - * - * @param rs - Resultset handle - * @param name - Column name - * @param type - Numeric type - * - * @note - * Possible values for parameter 'type' : - * - OCI_NUM_SHORT - * - OCI_NUM_USHORT - * - OCI_NUM_INT - * - OCI_NUM_UINT - * - OCI_NUM_BIGINT - * - OCI_NUM_BIGUINT - * - OCI_NUM_DOUBLE - * - OCI_NUM_FLOAT - * - OCI_NUM_NUMBER - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetStructNumericType2 -( - OCI_Resultset *rs, - const otext *name, - unsigned int type -); - -/** - * @brief - * Return the row columns values into a single structure - * - * @param rs - Resultset handle - * @param row_struct - pointer to user row structure - * @param row_struct_ind - pointer to user indicator structure - * - * @note - * Structure members values are contextual to the current row. - * The returned values can get out of scope when the current row - * changes when calling any OCI_FecthXXX() calls - * - * @par User row structure - * - * The user structure must have the same members than the resultset. - * Each column in the resultset must have its equivalent in the structure. - * Fields must be in the same order. - * - * The mapping rules are : - * - * - LOBs (CLOB, NCLOB, BLOB) : OCI_Lob * - * - DATE : OCI_Date * - * - TIMESTAMPS : OCI_Timestamp * - * - INTERVALS : OCI_Interval * - * - LONG, LONG RAW : OCI_Long * - * - REFs : OCI_Ref * - * - CURSOR, RESULSET : OCI_Statement * - * - OBJECTS, UDT : OCI_Object * - * - Character columns (CHAR,VARCHAR, etc..) : otext * - * - All NUMERIC types : - * - default : big_int - * - user defined (see OCI_SetStructNumericType()) - * - * The user structure pointer is not mandatory - * - * @par User row indicator structure - - * This structure must have one boolean field per column in - * the resultset and respect in the same member order. - * - * If the value of the given member is TRUE, it means the value in - * the user row structure is NOT NULL, otherwise its NULL - * - * The user indicator structure pointer is mandatory - * - * @return - * Return TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_GetStruct -( - OCI_Resultset *rs, - void *row_struct, - void *row_struct_ind -); - -/** -* @brief -* Return the current Number value of the column at the given index in the resultset -* -* @param rs - Resultset handle -* @param index - Column position -* -* @note -* Column position starts at 1. -* -* @return -* The column current row value or 0 if index is out of bounds -* -*/ -OCI_EXPORT OCI_Number * OCI_API OCI_GetNumber -( - OCI_Resultset *rs, - unsigned int index -); - -/** -* @brief -* Return the current number value of the column from its name in the resultset -* -* @param rs - Resultset handle -* @param name - Column name -* -* @note -* The column name is case insensitive -* -* @return -* The column current row value or 0 if no column found with the given name -* -*/ - -OCI_EXPORT OCI_Number * OCI_API OCI_GetNumber2 -( - OCI_Resultset *rs, - const otext *name -); - - -/** - * @brief - * Return the current short value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT short OCI_API OCI_GetShort -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current short value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT short OCI_API OCI_GetShort2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned short value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_GetUnsignedShort -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned short value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_GetUnsignedShort2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT int OCI_API OCI_GetInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT int OCI_API OCI_GetInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetUnsignedInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetUnsignedInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current big integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT big_int OCI_API OCI_GetBigInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current big integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT big_int OCI_API OCI_GetBigInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current unsigned big integer value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0 if index is out of bounds - * - */ - -OCI_EXPORT big_uint OCI_API OCI_GetUnsignedBigInt -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current unsigned big integer value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0 if no column found with the given name - * - */ - -OCI_EXPORT big_uint OCI_API OCI_GetUnsignedBigInt2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current string value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @note - * OCI_GetString() performs an implicit conversion from the - * following data types: - * - * - Numerics (based on the current connection handle numeric format) - * - Binary doubles and floats (using the standard C Library functions) - * - OCI_Number (based on the current connection handle numeric format) - * - OCI_Date (based on the current connection handle date format) - * - OCI_Timestamp (based on the current connection handle date format) - * - OCI_Interval (based on Oracle default conversion) - * - OCI_Lob (for BLOBs, output is expressed in hexadecimal) - * - OCI_Long (for BLONGs, output is expressed in hexadecimal) - * - OCI_File ("[directory]/[name]" will be output) - * - OCI_Object (Textual SQL string representation) - * - OCI_Coll (Textual SQL string representation) - * - RAW buffer (expressed in hexadecimal) - * - OCI_Statement (SQL statement string or cursor name) - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetString -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current string value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT const otext * OCI_API OCI_GetString2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Copy the current raw value of the column at the given index into the specified buffer - * - * @param rs - Resultset handle - * @param index - Column position - * @param buffer - Buffer that receive the raw value - * @param len - Max size of the input buffer in bytes - * - * @note - * Column position starts at 1. - * - * @return - * Number of bytes copied into the buffer on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRaw -( - OCI_Resultset *rs, - unsigned int index, - void *buffer, - unsigned int len -); - -/** - * @brief - * Copy the current raw value of the column from its name into the specified buffer - * - * @param rs - Resultset handle - * @param name - Column name - * @param buffer - Buffer that receive the raw value - * @param len - Max size of the input buffer - * - * @note - * The column name is case insensitive - * - * @return - * Number of bytes copied into the buffer on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetRaw2 -( - OCI_Resultset *rs, - const otext *name, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the current double value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0.O if index is out of bounds - * - */ - -OCI_EXPORT double OCI_API OCI_GetDouble -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current double value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0.0 if no column found with the given name - * - */ - -OCI_EXPORT double OCI_API OCI_GetDouble2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current float value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or 0.O if index is out of bounds - * - */ - -OCI_EXPORT float OCI_API OCI_GetFloat -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current float value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @note - * The column name is case insensitive - * - * @return - * The column current row value or 0.0 if no column found with the given name - * - */ - -OCI_EXPORT float OCI_API OCI_GetFloat2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current date value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_GetDate -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current date value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_GetDate2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current timestamp value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetTimestamp -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current timestamp value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_GetTimestamp2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current interval value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_GetInterval -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current interval value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_GetInterval2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current cursor value (Nested table) of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_GetStatement -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current cursor value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_GetStatement2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current lob value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_GetLob -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current lob value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_GetLob2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current File value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_GetFile -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current File value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_GetFile2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Object value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_GetObject -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Object value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_GetObject2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Collection value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_GetColl -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Collection value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_GetColl2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Ref value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_GetRef -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Ref value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_GetRef2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the current Long value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row value or NULL if index is out of bounds - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_GetLong -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the current Long value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * The column current row value or NULL if no column found with the given name - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_GetLong2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Check if the current row value is null for the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsNull -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the size of the value of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - * @return value size of 0 if the value is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataSize -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @brief - * Return the size of the value of the column from its name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @warning - * For binds of type OCI_CDT_TEXT (strings), the returned value is expressed in - * number of characters. - * - * @return value size of 0 if the value is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataSize2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Check if the current row value is null for the column of the given name in the resultset - * - * @param rs - Resultset handle - * @param name - Column name - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IsNull2 -( - OCI_Resultset *rs, - const otext *name -); - -/** - * @brief - * Return the statement handle associated with a resultset handle - * - * @param rs - resultset handle - * - */ - -OCI_EXPORT OCI_Statement * OCI_API OCI_ResultsetGetStatement -( - OCI_Resultset *rs -); - -/** - * @brief - * Return the current row data length of the column at the given index in the resultset - * - * @param rs - Resultset handle - * @param index - Column position - * - * @note - * Column position starts at 1. - * - * @return - * The column current row data length or 0 if index is out of bounds - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetDataLength -( - OCI_Resultset *rs, - unsigned int index -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiPlSql PL/SQL Support - * @{ - * - * OCILIB has a strong PL/SQL support : - * - * - Blocks, procedures and function can be used with OCILIB statements. - * - Ref cursors - * - Nested tables - * - Tables (indexed by integer types) - * - Access to the server side output generated by the DBMS_OUTPUT package - * - * Stored procedures/functions calls, blocks declarations are done like regular - * SQL calls using OCI_Prepare(), OCI_Execute(), OCI_ExecuteStmt() and - * OCI_ExecuteStmtFmt() functions. - * - * All PL/SQL statements must: - * - * - start with a 'begin' or 'declare' keyword - * - end with a 'end;' keyword - * - * Binding Host arrays to PL/SQL tables is done with OCI_BindArrayXXX() calls - * - * @par Using a PL/SQL block with OCILIB - * @include plsql_block.c - * - * @par Binding host arrays to PL/SQL tables parameters of a stored procedure - * @include plsql_table.c - * - * @par Retrieve the output generated by the dbms_output package on the server - * @include output.c - * - */ - -/** - * @brief - * Enable the server output - * - * @param con - Connection handle - * @param bufsize - server buffer max size (server side) - * @param arrsize - number of lines to retrieve per server round-trip - * @param lnsize - maximum size of one line - * - * @note - * This call is equivalent to the command 'set serveroutput on' in SQL*PLUS - * - * @note - * 'bufsize' minimum value is 2000, maximum 1000000 with Oracle < 10.2g and can be unlimited above - * - * @note - * 'lnsize' maximum value is 255 with Oracle < 10g R2 and 32767 above - * - * @warning - * If OCI_ServerEnableOutput() is not called, OCI_ServerGetOutput() will return NULL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ServerEnableOutput -( - OCI_Connection *con, - unsigned int bufsize, - unsigned int arrsize, - unsigned int lnsize -); - -/** - * @brief - * Disable the server output - * - * @param con - Connection handle - * - * @note - * After this call, OCI_ServerGetOutput() will return NULL. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ServerDisableOutput -( - OCI_Connection *con -); - -/** - * @brief - * Retrieve one line of the server buffer - * - * @param con - Connection handle - * - * @note - * Internally, OCILIB gets the server buffer through an array of lines in - * order to minimize round-trips with the server - * - * @return - * return a server output buffer line or NULL if the server buffer is empty - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ServerGetOutput -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiCollections Oracle collections (VARRAYS and Nested Tables) - * @{ - * - * OCILIB supports all Oracle collections: - * - * - PL/SQL Tables: only available in PL/SQL, unbounded, sparse arrays of - homogeneous elements. - * - VARRAYS : available in SQL and PL/SQL, they are bounded arrays of - * homogeneous elements - * - Nested Tables: available in SQL and PL/SQL, they are unbounded arrays of - * homogeneous elements and can become sparse through deletions - * - * PL/SQL tables are implemented by binding regular C arrays with the array - * interface (using OCI_BindArrayOfXXX() calls) - * - * VARRAYS and Nested tables are implemented in OCILIB with the type OCI_Coll. - * It's possible to bind and fetch VARRAYS and Nested tables using OCI_Coll handle. - * - * It's also possible to declare local collections based on some database type without using queries - * - * OCI (and thus OCILIB) offers the possibility to access collection elements : - * - * - directly by index (OCI_CollGetElem() and OCI_CollSetElem()) - * - using an iterator (OCI_Iter) to iterate through the collection - * (OCI_IterGetNext(), OCI_IterGetPrev()) - * - * Collection Items are implemented through the type OCI_Elem and use the series - * of calls OCI_ElemGetXXX() and OCI_ElemSetXXX() to manipulate elements - * content values - * - * @par Example - * @include coll.c - * - */ - -/** - * @brief - * Create a local collection instance - * - * @param typinf - Type info handle of the collection type descriptor - * - * @return - * Return the collection object handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_CollCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local collection - * - * @param coll - Collection handle - * - * @warning - * Only collection created with OCI_CollCreate() should be freed - * by OCI_CollFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollFree -( - OCI_Coll *coll -); - -/** - * @brief - * Create an array of Collection object - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_ObjectCreate() for more details - * - * @return - * Return the Collection handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Coll ** OCI_API OCI_CollArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Collection objects - * - * @param colls - Array of Collection objects - * - * @warning - * Only arrays of Collection created with OCI_CollArrayCreate() - * should be freed by OCI_CollArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollArrayFree -( - OCI_Coll **colls -); - -/** - * @brief - * Assign a collection to another one - * - * @param coll - Destination Collection handle - * @param coll_src - Source Collection handle - * - * @note - * Oracle proceeds to a deep copy of the collection content - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollAssign -( - OCI_Coll *coll, - OCI_Coll *coll_src -); - -/** - * @brief - * Return the type info object associated to the collection - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_CollGetTypeInfo -( - OCI_Coll *coll -); - -/** - * @brief - * Return the collection type - * - * @param coll - Collection handle - * - * @note - * Current collection types are: - * - * - OCI_COLL_VARRAY: Oracle VARRAY - * - OCI_COLL_NESTED_TABLE: Oracle Nested Table - * - * @return - * Collection type or OCI_UNKNOWN if the collection handle is null - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetType -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the maximum number of elements of the given collection. - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetMax -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the total number of elements of the given collection. - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetSize -( - OCI_Coll *coll -); - -/** - * @brief - * Returns the current number of elements of the given collection. - * - * @note - * - For VARRAYs, it returns the same value than OCI_CollGetSize() as VARRAYs cannot contains holes - * - For Nested Tables that are spare collections that can have holes, it returns the total number - * of elements minus the total of deleted elements - * - * @param coll - Collection handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_CollGetCount -( - OCI_Coll *coll -); - -/** - * @brief - * Trims the given number of elements from the end of the collection - * - * @param coll - Collection handle - * @param nb_elem - Number of elements to trim - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollTrim -( - OCI_Coll *coll, - unsigned int nb_elem -); - -/** - * @brief - * clear all items of the given collection - * - * @param coll - Collection handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollClear -( - OCI_Coll *coll -); - -/** - * @brief - * Return the element at the given position in the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * - * @note - * Collection indexes start at position 1. - * - * @return - * Element handle on success otherwise FALSE - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_CollGetElem -( - OCI_Coll *coll, - unsigned int index -); - -/** - * @brief - * Return the element at the given position in the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * @param elem - Element handle to hold the collection item data - * - * @note - * Collection indexes start at position 1. - * - * @return - * Element handle on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollGetElem2 -( - OCI_Coll *coll, - unsigned int index, - OCI_Elem *elem -); - -/** - * @brief - * Assign the given element value to the element at the given position in - * the collection - * - * @param coll - Collection handle - * @param index - Index of the destination element - * @param elem - Source element handle to assign - * - * @note - * Collection indexes start at position 1. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollSetElem -( - OCI_Coll *coll, - unsigned int index, - OCI_Elem *elem -); - -/** - * @brief - * Append the given element at the end of the collection - * - * @param coll - Collection handle - * @param elem - Element handle to add - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollAppend -( - OCI_Coll *coll, - OCI_Elem *elem -); - -/** - * @brief - * Convert a collection handle value to a string - * - * @param coll - Collection handle - * @param size - Destination string length pointer in characters - * @param str - Destination string - * - * @note - * In order to compute the needed string length, call the method with a NULL string - * Then call the method again with a valid buffer - * - * @note - * The resulting string is similar to the SQL*PLUS output for collections - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * - * @warning - * This convenient method shall not be used when performance matters. It is usually called twice (buffer length - * computation) and must also care about quotes within strings. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollToText -( - OCI_Coll *coll, - unsigned int *size, - otext *str -); - -/** - * @brief - * Delete the element at the given position in the Nested Table Collection - * - * @param coll - Collection handle - * @param index - Index of the element to delete - * - * @note - * Collection indexes start at position 1. - * - * @warning - * OCI_CollDeleteElem() is only valid for nested tables. - * - * @return - * - if the input collection is a nested table, it returns TRUE if the element - * is successfully deleted otherwise FALSE on error - * - if the input collection is a VARRAY, it always returns FALSE without spawning an exception - * - */ - -OCI_EXPORT boolean OCI_API OCI_CollDeleteElem -( - OCI_Coll *coll, - unsigned int index -); - -/** - * @brief - * Create an iterator handle to iterate through a collection - * - * @param coll - Collection handle - * - * @return - * Return the iterator handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Iter * OCI_API OCI_IterCreate -( - OCI_Coll *coll -); - -/** - * @brief - * Free an iterator handle - * - * @param iter - Iterator handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IterFree -( - OCI_Iter *iter -); - -/** - * @brief - * Get the next element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetNext -( - OCI_Iter *iter -); - -/** - * @brief - * Get the previous element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetPrev -( - OCI_Iter *iter -); - -/** - * @brief - * Get the current element in the collection - * - * @param iter - Iterator handle - * - * @return - * Element handle on success otherwise NULL if: - * - Empty collection - * - Iterator already positioned on the last collection element - * - An error occurred - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_IterGetCurrent -( - OCI_Iter *iter -); - -/** - * @brief - * Create a local collection element instance based on a collection type - * descriptor - * - * @param typinf - Type info handle - * - * @return - * Return the collection element handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Elem * OCI_API OCI_ElemCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local collection element - * - * @param elem - Element handle - * - * @warning - * Only element created with OCI_ElemCreate() should be freed - * by OCI_ElemFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemFree -( - OCI_Elem *elem -); - -/** -* @brief -* Return the boolean value of the given collection element -* -* @param elem - Element handle -* -* @warning -* OCI_ElemGetBoolean() returns a valid value only for collection elements of PL/SQL boolean type -* -* @return -* boolean value or FALSE on failure -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemGetBoolean -( - OCI_Elem *elem -); - -/** -* @brief -* Return the number value of the given collection element -* -* @param elem - Element handle -* -* @return -* number handle or NULL on failure -* -*/ - -OCI_EXPORT OCI_Number* OCI_API OCI_ElemGetNumber -( - OCI_Elem *elem -); - -/** - * @brief - * Return the short value of the given collection element - * - * @param elem - Element handle - * - * @return - * Short value or 0 on failure - * - */ - -OCI_EXPORT short OCI_API OCI_ElemGetShort -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned short value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned short value or 0 on failure - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_ElemGetUnsignedShort -( - OCI_Elem *elem -); - -/** - * @brief - * Return the int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Int value or 0 on failure - * - */ - -OCI_EXPORT int OCI_API OCI_ElemGetInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned int value or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetUnsignedInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the big int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Big int value or 0 on failure - * - */ - -OCI_EXPORT big_int OCI_API OCI_ElemGetBigInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the unsigned big int value of the given collection element - * - * @param elem - Element handle - * - * @return - * Unsigned big int value or 0 on failure - * - */ - -OCI_EXPORT big_uint OCI_API OCI_ElemGetUnsignedBigInt -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Double value of the given collection element - * - * @param elem - Element handle - * - * @return - * Double value or 0 on failure - * - */ - -OCI_EXPORT double OCI_API OCI_ElemGetDouble -( - OCI_Elem *elem -); - -/** - * @brief - * Return the float value of the given collection element - * - * @param elem - Element handle - * - * @return - * Double value or 0 on failure - * - */ - -OCI_EXPORT float OCI_API OCI_ElemGetFloat -( - OCI_Elem *elem -); - -/** - * @brief - * Return the String value of the given collection element - * - * @param elem - Element handle - * - * @return - * String value or NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ElemGetString -( - OCI_Elem *elem -); - -/** - * @brief - * Read the RAW value of the collection element into the given buffer - * - * @param elem - Element handle - * @param value - Buffer to store the RAW value - * @param len - Size of the buffer - * - * @return - * Number of bytes read from the RAW value or 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetRaw -( - OCI_Elem *elem, - void *value, - unsigned int len -); - -/** -* @brief -* Return the raw attribute value size of the given element handle -* -* @param elem - Element handle -* -* @return -* size in bytes of the RAW value or 0 on failure or wrong attribute type -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ElemGetRawSize -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Date value of the given collection element - * - * @param elem - Element handle - * - * @return - * Date handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_ElemGetDate -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Timestamp value of the given collection element - * - * @param elem - Element handle - * - * @return - * Timestamp handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_ElemGetTimestamp -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Interval value of the given collection element - * - * @param elem - Element handle - * - * @return - * Interval handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_ElemGetInterval -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Lob value of the given collection element - * - * @param elem - Element handle - * - * @return - * Lob handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_ElemGetLob -( - OCI_Elem *elem -); - -/** - * @brief - * Return the File value of the given collection element - * - * @param elem - Element handle - * - * @return - * File handle or NULL on failure - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_ElemGetFile -( - OCI_Elem *elem -); - -/** - * @brief - * Return the object value of the given collection element - * - * @param elem - Element handle - * - * @return - * Object handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ElemGetObject -( - OCI_Elem *elem -); - -/** - * @brief - * Return the collection value of the given collection element - * - * @param elem - Element handle - * - * @return - * Collection handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_ElemGetColl -( - OCI_Elem *elem -); - -/** - * @brief - * Return the Ref value of the given collection element - * - * @param elem - Element handle - * - * @return - * Ref handle or NULL on failure - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_ElemGetRef -( - OCI_Elem *elem -); - -/** -* @brief -* Set a boolean value to a collection element -* -* @param elem - Element handle -* @param value - Short value -* -*@warning -* OCI_ElemSetBoolean() is only valid value only for collection elements of PL / SQL boolean type -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemSetBoolean -( - OCI_Elem *elem, - boolean value -); - -/** -* @brief -* Set a number value to a collection element -* -* @param elem - Element handle -* @param value - number value -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ElemSetNumber -( - OCI_Elem *elem, - OCI_Number *value -); - -/** - * @brief - * Set a short value to a collection element - * - * @param elem - Element handle - * @param value - Short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetShort -( - OCI_Elem *elem, - short value -); - -/** - * @brief - * Set a unsigned short value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedShort -( - OCI_Elem *elem, - unsigned short value -); - -/** - * @brief - * Set a int value to a collection element - * - * @param elem - Element handle - * @param value - Int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetInt -( - OCI_Elem *elem, - int value -); - -/** - * @brief - * Set a unsigned int value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedInt -( - OCI_Elem *elem, - unsigned int value -); - -/** - * @brief - * Set a big int value to a collection element - * - * @param elem - Element handle - * @param value - big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetBigInt -( - OCI_Elem *elem, - big_int value -); - -/** - * @brief - * Set a unsigned big_int value to a collection element - * - * @param elem - Element handle - * @param value - Unsigned big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetUnsignedBigInt -( - OCI_Elem *elem, - big_uint value -); - -/** - * @brief - * Set a double value to a collection element - * - * @param elem - Element handle - * @param value - Double value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetDouble -( - OCI_Elem *elem, - double value -); - -/** - * @brief - * Set a float value to a collection element - * - * @param elem - Element handle - * @param value - float value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetFloat -( - OCI_Elem *elem, - float value -); - -/** - * @brief - * Set a string value to a collection element - * - * @param elem - Element handle - * @param value - String value - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetString -( - OCI_Elem *elem, - const otext *value -); - -/** - * @brief - * Set a RAW value to a collection element - * - * @param elem - Element handle - * @param value - Raw value - * @param len - Size of the raw value - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetRaw -( - OCI_Elem *elem, - void *value, - unsigned int len -); - -/** - * @brief - * Assign a Date handle to a collection element - * - * @param elem - Element handle - * @param value - Date Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetDate -( - OCI_Elem *elem, - OCI_Date *value -); - -/** - * @brief - * Assign a Timestamp handle to a collection element - * - * @param elem - Element handle - * @param value - Timestamp Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetTimestamp -( - OCI_Elem *elem, - OCI_Timestamp *value -); - -/** - * @brief - * Assign an Interval handle to a collection element - * - * @param elem - Element handle - * @param value - Interval Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetInterval -( - OCI_Elem *elem, - OCI_Interval *value -); - -/** - * @brief - * Assign a Collection handle to a collection element - * - * @param elem - Element handle - * @param value - Collection Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetColl -( - OCI_Elem *elem, - OCI_Coll *value -); - -/** - * @brief - * Assign an Object handle to a collection element - * - * @param elem - Element handle - * @param value - Object Handle - * - * @warning - * This function assigns a copy of the object to the given attribute. - * Any further modifications of the object passed as the parameter 'value' - * will not be reflected to object 's attribute set with this call - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetObject -( - OCI_Elem *elem, - OCI_Object *value -); - -/** - * @brief - * Assign a Lob handle to a collection element - * - * @param elem - Element handle - * @param value - Lob Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetLob -( - OCI_Elem *elem, - OCI_Lob *value -); - -/** - * @brief - * Assign a File handle to a collection element - * - * @param elem - Element handle - * @param value - File Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetFile -( - OCI_Elem *elem, - OCI_File *value -); - -/** - * @brief - * Assign a Ref handle to a collection element - * - * @param elem - Element handle - * @param value - Ref Handle - * - * @note - * passing a null pointer for value calls OCI_ElemSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetRef -( - OCI_Elem *elem, - OCI_Ref *value -); - -/** - * @brief - * Check if the collection element value is null - * - * @param elem - Element handle - * - * @return - * TRUE if it's null otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemIsNull -( - OCI_Elem *elem -); - -/** - * @brief - * Set a collection element value to null - * - * @param elem - Element handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ElemSetNull -( - OCI_Elem *elem -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFeatureReturningInto Oracle Returning feature - * @{ - * - * OCILIB supports the Oracle feature 'Returning into' for DML statements. - * - * Let's Oracle talk about this features: - * - * @par - * 'Using the RETURNING clause with a DML statement allows you to essentially - * combine two SQL statements into one, possibly saving you a server round-trip. - * This is accomplished by adding an extra clause to the traditional UPDATE, - * INSERT, and DELETE statements. The extra clause effectively adds a query to - * the DML statement. In the OCI, the values are returned to the application - * through the use of OUT bind variables.' - * - * OCILIB implements this features by providing a set of functions that allows - * to register output placeholders for the returned values. - * Once the DML is executed with OCI_Execute(), the output returned data is - * available through a regular resultset object that can be fetched. - * - * @note - * Array binding interface is also supported with 'returning into' DML statement. - * Every iteration (or row of given arrays) generates an resultset object. - * Once a resultset is fetched, the next on can be retrieved with OCI_GetNextResultset() - * - * @par - * - * @note - * OCI_Long are not supported for 'returning into' clause .This is a limitation imposed by Oracle. - * - * @note - * OCI_Column objects retrieved from output OCI_Resultset have the following - * particularities: - * - * - their names are the provided bind names to the DML statement - * (by example, ':out1'). So any call to the functions OCI_GetXXX2() - * should be aware of it - * - The columns detailed SQL attributes might be not all set or accurate. By - * example, the scale and precision are not set, the SQL type is the one - * chosen by OCILIB regarding the OCILIB object data type and might be - * slightly different from the real one. - * - * @par Example - * @include returning.c - * - */ - -/** - * @brief - * Retrieve the next available resultset - * - * @param stmt - Statement handle - * - * @note - * it is only valid for the following statements: - * - Statements executing SQL UPDATE/DELETE using a RETURNING INTO clause - * - Statements implicitly returned from PL/SQL procedure or blocks (new feature in Oracle 12cR1) using - * DBMS_SQL.RETURN_RESULT() - * - * @note - * SQL statements with a 'returning' clause can return multiple resultsets. - * When arrays of program variables are binded to the statement, Oracle will - * execute the statement for every row (iteration). - * Each iteration generates a resultset that can be fetched like regular ones. - * - * @note - * Starting withOracle 12cR1, PL/SQ procedure and blocks ca return multiple implicit resultsets - * Refer to Oracle documentation for more information. - * - * @return - * A resultset handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Resultset * OCI_API OCI_GetNextResultset -( - OCI_Statement *stmt -); - -/** -* @brief -* Register a register output bind placeholder -* -* @param stmt - Statement handle -* @param name - Output bind name -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_RegisterNumber -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a short output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterShort -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned short output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedShort -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a big integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterBigInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register an unsigned big integer output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterUnsignedBigInt -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a string output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param len - Max length of single string (in characters) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterString -( - OCI_Statement *stmt, - const otext *name, - unsigned int len -); - -/** - * @brief - * Register an raw output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param len - Max length of the buffer (in bytes) - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterRaw -( - OCI_Statement *stmt, - const otext *name, - unsigned int len -); - -/** - * @brief - * Register a double output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterDouble -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a float output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterFloat -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a date output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterDate -( - OCI_Statement *stmt, - const otext *name -); - -/** - * @brief - * Register a timestamp output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Timestamp type - * - * @note - * See OCI_TimestampCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterTimestamp -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register an interval output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Interval type - * - * @note - * See OCI_IntervalCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterInterval -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register an object output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param typinf - Type info handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterObject -( - OCI_Statement *stmt, - const otext *name, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Register a lob output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - Lob type - * - * @note - * See OCI_LobCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterLob -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register a file output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param type - File type - * - * @note - * See OCI_FileCreate() for possible values of parameter 'type' - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterFile -( - OCI_Statement *stmt, - const otext *name, - unsigned int type -); - -/** - * @brief - * Register a Ref output bind placeholder - * - * @param stmt - Statement handle - * @param name - Output bind name - * @param typinf - Type info handle - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RegisterRef -( - OCI_Statement *stmt, - const otext *name, - OCI_TypeInfo *typinf -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiRowIds Oracle Rowids - * @{ - * - * OCILIB supports the Oracle ROWID type through C scalar string types (otext). - * - * - ROWIDs can be retrieved from resultset with OCI_GetString() - * - ROWIDs can be binded to statements with OCI_BindString() - * - * The maximum size of an ROWID buffer is defined by the constant OCI_SIZE_ROWID - * - * @par Example - * @include rowid.c - * - * @} - */ - -/** - * @defgroup OcilibCApiStatementControl Statements control - * @{ - * - * Those functions give extra information about OCILIB statements and can modify their behavior. - * - */ - -/** - * @brief - * Return the type of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * Possible values are : - * - * - OCI_CST_SELECT : select statement - * - OCI_CST_UPDATE : update statement - * - OCI_CST_DELETE : delete statement - * - OCI_CST_INSERT : insert statement - * - OCI_CST_CREATE : create statement - * - OCI_CST_DROP : drop statement - * - OCI_CST_ALTER : alter statement - * - OCI_CST_BEGIN : begin (pl/sql) statement - * - OCI_CST_DECLARE : declare (pl/sql) statement - * - OCI_CST_CALL : kpu call - * - * @return - * The statement type on success or OCI_UNKOWN on error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetStatementType -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the fetch mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - fetch mode value - * - * @warning - * OCI_SetFetchMode() MUST be called before any OCI_ExecuteXXX() call - * - * @note - * Possible values are : - * - OCI_SFM_DEFAULT - * - OCI_SFM_SCROLLABLE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFetchMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the fetch mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetFetchMode() for possible values - * Default value is OCI_SFM_DEFAULT - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetFetchMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the binding mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - binding mode value - * - * @note - * Possible values are : - * - OCI_BIND_BY_POS : position binding - * - OCI_BIND_BY_NAME : name binding - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetBindMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the binding mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetBindMode() for possible values - * Default value is OCI_BIND_BY_NAME - * - * @note - * if stmt is NULL, the return value is OCI_UNKNOWN - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetBindMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the current bind allocation mode that will be used for subsequent binding calls - * - * @param stmt - Statement handle - * @param mode - bind allocation mode value - * - * @note - * Possible values are : - * - OCI_BAM_EXTERNAL : bind variable are allocated by user code - * - OCI_BAM_INTERNAL : bind variable are allocated internally - * - * @warning - * This call has to be made after preparing a statement as OCI_Prepare() reset it by default to OCI_BAM_EXTERNAL. - * When calling an OCI_BindXXXX() call, this value is used and stored in the OCI_Bind object created during the bind call. - * Each bind can have is own allocation mode that is returned by OCI_BindGetAllocationMode() - * OCI_SetBindAllocation() can be called before each binding call if needed, resulting having some bind allocated externally and other ones internally. - * - * @note - * Refer to the section "Binding variables and arrays" of the documention about allocation mode as OCI_BAM_INTERNAL is not compatible with all bind calls - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetBindAllocation -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the current bind allocation mode used for subsequent binding calls - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetBindAllocation() for possible values - * Default value is OCI_BAM_EXTERNAL - * - * @warning - * Each OCI_Bind object has its own allocation mode that may differ from the one returned by OCI_GetBindAllocation() - * The return value of OCI_GetBindAllocation() is the mode that will be used for any subsequent OCI_BindXXXX() calls - * - * @note - * if stmt is NULL, the return value is OCI_UNKNOWN - * - */ -OCI_EXPORT unsigned int OCI_API OCI_GetBindAllocation -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the number of rows fetched per internal server fetch call - * - * @param stmt - Statement handle - * @param size - number of rows to fetch - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetFetchSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the number of rows fetched per internal server fetch call - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_FETCH_SIZE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetFetchSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the number of rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * @param size - number of rows to pre-fetch - * - * @note - * To turn off pre-fetching, set both attributes (size and memory) to 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPrefetchSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the number of rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_PREFETCH_SIZE - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetPrefetchSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the amount of memory pre-fetched by OCI Client - * - * @param stmt - Statement handle - * @param size - amount of memory to fetch - * - * @note - * Default value is 0 and the pre-fetch size attribute is used instead. - * When both attributes are set (pre-fetch size and memory) and pre-fetch memory - * value can hold more rows than specified by pre-fetch size, OCI uses pre-fetch - * size instead. - * - * @note - * OCILIB set pre-fetch attribute to OCI_PREFETCH_SIZE when a statement is created. - * To setup a big value for OCI_SetPrefetchMemory(), you must call - * OCI_SetPrefetchSize() to 0 to make OCI consider this attribute. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetPrefetchMemory -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the amount of memory used to retrieve rows pre-fetched by OCI Client - * - * @param stmt - Statement handle - * - * @note - * Default value is 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetPrefetchMemory -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the LONG data type piece buffer size - * - * @param stmt - Statement handle - * @param size - maximum size for long buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SetLongMaxSize -( - OCI_Statement *stmt, - unsigned int size -); - -/** - * @brief - * Return the LONG data type piece buffer size - * - * @param stmt - Statement handle - * - * @note - * Default value is set to constant OCI_SIZE_LONG - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetLongMaxSize -( - OCI_Statement *stmt -); - -/** - * @brief - * Set the long data type handling mode of a SQL statement - * - * @param stmt - Statement handle - * @param mode - long mode value - * - * @note - * Possible values are : - * - * - OCI_LONG_EXPLICIT : LONGs are explicitly handled by OCI_Long type - * - OCI_LONG_IMPLICIT : LONGs are implicitly mapped to string type in the - * limits of VARCHAR2 size capacity - * - * LONG RAWs can't be handled with OCI_LONG_IMPLICIT - */ - -OCI_EXPORT boolean OCI_API OCI_SetLongMode -( - OCI_Statement *stmt, - unsigned int mode -); - -/** - * @brief - * Return the long data type handling mode of a SQL statement - * - * @param stmt - Statement handle - * - * @note - * See OCI_SetLongMode() for possible values - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_GetLongMode -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the connection handle associated with a statement handle - * - * @param stmt - Statement handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_StatementGetConnection -( - OCI_Statement *stmt -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiLobs Internal Large Objects (LOBs) - * @{ - * - * Large Objects (LOBs) were introduced with Oracle 8i to replace LONGs - * - * Oracle OCI supplies a set APIs to manipulate this data type. - * - * OCILIB encapsulates this API by supplying: - * - * - An OCI_Lob C type - * - A set of really easy APIs to manipulate OCI_Lob objects - * - * OCILIB currently supports 3 types of Lobs : - * - * - BLOB : Binary LOBs (replacement for LONG RAW data type) - * - CLOB : Character LOBs (replacement for LONG data type) - * - NCLOB : National Character LOBs - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statements - * - Manipulated (copy, append, ...) - * - * @par Lobs > 4 Go - * - * Oracle 10g extended lobs by increasing maximum size from 4Go to 128 To. - * - * OCILIB, with version 2.1.0, supports now this new limit. - * For handling sizes and offsets up to 128 To, 64 bit integers are requested. - * - * So, A new scalar integer type has been introduced: big_uint (elderly lobsize_t). - * This type can be a 32 bits or 64 bits integer depending on : - * - Compiler support for 64 bits integers (C99 compiler, MS compilers) - * - Oracle client version - * - * big_uint will be a 64 bits integer : - * - if the compiler supports it - * - if OCILIB is build with option OCI_IMPORT_LINKAGE and the Oracle version is >= 10.1 - * - or OCILIB is build with option OCI_IMPORT_RUNTIME (oracle version is not known at - * compilation stage) - * - * @par Example - * @include lob.c - * - */ - -/** - * @brief - * Create a local temporary Lob instance - * - * @param con - Connection handle - * @param type - Lob type - * - * Supported lob types : - * - * - OCI_BLOB : Binary Lob - * - OCI_CLOB : Character Lob - * - OCI_NCLOB ! National Character Lob - * - * @return - * Return the lob handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_LobCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free a local temporary lob - * - * @param lob - Lob handle - * - * @warning - * Only lobs created with OCI_LobCreate() should be freed by OCI_LobFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobFree -( - OCI_Lob *lob -); - -/** - * @brief - * Create an array of lob object - * - * @param con - Connection handle - * @param type - Lob type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_LobCreate() for more details - * - * @return - * Return the lob handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Lob ** OCI_API OCI_LobArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** -* @brief -* Free an array of lob objects -* -* @param lobs - Array of lob objects -* -* @warning -* Only arrays of lobs created with OCI_LobArrayCreate() should be freed -* by OCI_LobArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_LobArrayFree -( - OCI_Lob **lobs -); - -/** - * @brief - * Return the type of the given Lob object - * - * @param lob - Lob handle - * - * @note - * For possible values, see OCI_LobCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobGetType -( - OCI_Lob *lob -); - -/** - * @brief - * Perform a seek operation on the OCI_lob content buffer - * - * @param lob - Lob handle - * @param offset - Offset from current position (bytes or characters) - * @param mode - Seek mode - * - * Parameter 'mode' can be one of the following value : - * - * - OCI_SEEK_SET : set the lob current offset to the given absolute offset - * - OCI_SEEK_END : set the lob current offset to the end of the lob - * - OCI_SEEK_CUR : move the lob current offset to the number of bytes or - * characters given by parameter 'offset' - * - * @note - * - For CLOB and CLOB, offset in characters - * - For BLOB and BFILE, offset is in bytes - * - * @note - * Position in the Lob buffer starts at 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobSeek -( - OCI_Lob *lob, - big_uint offset, - unsigned int mode -); - -/** - * @brief - * Return the current position in the Lob content buffer - * - * @param lob - Lob handle - * - * @return - * Lob position (starting with 0) or 0 on failure - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetOffset -( - OCI_Lob *lob -); - -/** - * @brief - * [OBSOLETE] Read a portion of a lob into the given buffer - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBS - * - * @warning - * This call is obsolete ! Use OCI_LobRead2() instead. - * - * @return - * Number of bytes/characters read on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobRead -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Read a portion of a lob into the given buffer - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to read into the buffer - * In output, 'char_count' and 'byte_count' are values read into the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobRead2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * [OBSOLETE] Write a buffer into a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBs - * - * @warning - * This call is obsolete ! Use OCI_LobWrite2() instead. - * - * @return - * Number of bytes / characters written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobWrite -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Write a buffer into a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to write from the buffer - * In output, 'char_count' and 'byte_count' are values written from the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobWrite2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * Truncate the given lob to a shorter length - * - * @param lob - Lob handle - * @param size - New length (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs/NCLOBs - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobTruncate -( - OCI_Lob *lob, - big_uint size -); - -/** - * @brief - * Return the actual length of a lob - * - * @param lob - Lob handle - * - * @note - * The returned value is in bytes for BLOBS and characters for CLOBS/NCLOBs - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetLength -( - OCI_Lob *lob -); - -/** - * @brief - * Returns the chunk size of a LOB - * - * @param lob - Lob handle - * - * @note - * This chunk size corresponds to the chunk size used by the LOB data layer - * when accessing and modifying the LOB value. According to Oracle - * documentation, performance will be improved if the application issues - * read or write requests using a multiple of this chunk size - * - * @note - * The returned value is in bytes for BLOBS and characters for CLOBS/NCLOBs - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobGetChunkSize -( - OCI_Lob *lob -); - -/** - * @brief - * Erase a portion of the lob at a given position - * - * @param lob - Lob handle - * @param offset - Absolute position in source lob - * @param len - Number of bytes or characters to erase - * - * @note - * Absolute position starts at 0. - * Erasing means that spaces overwrite the existing LOB value. - * - * @return - * Number of bytes (BLOB) or characters (CLOB/NCLOB) erased on success - * otherwise 0 on failure - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobErase -( - OCI_Lob *lob, - big_uint offset, - big_uint len -); - -/** - * @brief - * Append a buffer at the end of a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer (in bytes or characters) - * - * @note - * Length is expressed in : - * - Bytes for BLOBs - * - Characters for CLOBs - * - * @return - * Number of bytes / characters written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LobAppend -( - OCI_Lob *lob, - void *buffer, - unsigned int len -); - -/** - * @brief - * Append a buffer at the end of a LOB - * - * @param lob - Lob handle - * @param buffer - Pointer to a buffer - * @param char_count - [in/out] Pointer to maximum number of characters - * @param byte_count - [in/out] Pointer to maximum number of bytes - * - * @note - * In input, 'char_count' and 'byte_count' are values to write from the buffer - * In output, 'char_count' and 'byte_count' are values written from the buffer - * - * @note - * For BLOBs, only the parameter 'byte_count' is used - * For CLOBs, both parameters can be used : - * In input : - * - if 'byte_count' is set to zero, it is computed from 'char_count' - * - if 'char_count' is set to zero, it is computed from 'byte_count' - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAppend2 -( - OCI_Lob *lob, - void *buffer, - unsigned int *char_count, - unsigned int *byte_count -); - -/** - * @brief - * Append a source LOB at the end of a destination LOB - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAppendLob -( - OCI_Lob *lob, - OCI_Lob *lob_src -); - -/** - * @brief - * Check if the given lob is a temporary lob - * - * @param lob - Lob handle - * - * @return - * TRUE if it's a temporary lob otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobIsTemporary -( - OCI_Lob *lob -); - -/** - * @brief - * Copy a portion of a source LOB into a destination LOB - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * @param offset_dst - Absolute position in destination lob - * @param offset_src - Absolute position in source lob - * @param count - Number of bytes or character to copy - * - * @note - * For character LOB (CLOB/NCLOBS) the parameters count, offset_dst and - * offset_src are expressed in characters and not in bytes. - * - * @note - * Absolute position starts at 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobCopy -( - OCI_Lob *lob, - OCI_Lob *lob_src, - big_uint offset_dst, - big_uint offset_src, - big_uint count -); - -/** - * @brief - * Copy a portion of a source FILE into a destination LOB - * - * @param lob - Destination Lob handle - * @param file - Source File handle - * @param offset_dst - Absolute position in destination lob - * @param offset_src - Absolute position in source file - * @param count - Number of bytes to copy - * - * @note - * - For character LOB (CLOB/NCLOB) the parameter offset_src are expressed in - * characters and not in bytes. - * - Offset_src is always in bytes - * - * @note - * Absolute position starts at 0. - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobCopyFromFile -( - OCI_Lob *lob, - OCI_File *file, - big_uint offset_dst, - big_uint offset_src, - big_uint count -); - -/** - * @brief - * Open explicitly a Lob - * - * @param lob - Lob handle - * @param mode - open mode - * - * Possible values for mode are : - * - * - OCI_LOB_READONLY : read only access - * - OCI_LOB_READWRITE : read/write access - * - * @note - * - A call to OCI_LobOpen is not necessary to manipulate a Lob. - * - If a lob hasn't been opened explicitly, triggers are fired and - * indexes updated at every read/write/append operation - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobOpen -( - OCI_Lob *lob, - unsigned int mode -); - -/** - * @brief - * Close explicitly a Lob - * - * @param lob - Lob handle - * - * @note - * - A call to OCI_LobClose is not necessary to manipulate a Lob. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobClose -( - OCI_Lob *lob -); - -/** - * @brief - * Compare two lob handles for equality - * - * @param lob - Lob handle - * @param lob2 - Lob2 handle - * - * @return - * TRUE is the lobs are not null and equal otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobIsEqual -( - OCI_Lob *lob, - OCI_Lob *lob2 -); - -/** - * @brief - * Assign a lob to another one - * - * @param lob - Destination Lob handle - * @param lob_src - Source Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobAssign -( - OCI_Lob *lob, - OCI_Lob *lob_src -); - -/** - * @brief - * Return the maximum size that the lob can contain - * - * @param lob - Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT big_uint OCI_API OCI_LobGetMaxSize -( - OCI_Lob *lob -); - -/** - * @brief - * Flush Lob content to the server - * - * @param lob - Lob handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobFlush -( - OCI_Lob *lob -); - -/** - * @brief - * Enable / disable buffering mode on the given lob handle - * - * @param lob - Lob handle - * @param value - Enable/disable buffering mode - * - * @note - * Oracle "LOB Buffering Subsystem" allows client applications - * to speedup read/write of small buffers on Lobs Objects. - * Check Oracle Documentation for more details on "LOB Buffering Subsystem". - * This reduces the number of network round trips and LOB versions, thereby - * improving LOB performance significantly. - * - * @warning - * According to Oracle documentation the following operations are not permitted - * on Lobs when buffering is on : OCI_LobCopy(), OCI_LobAppend, OCI_LobErase(), - * OCI_LobGetLength(), OCI_LobTruncate() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LobEnableBuffering -( - OCI_Lob *lob, - boolean value -); - -/** -* @brief -* Retrieve connection handle from the lob handle -* -* @param lob - lob handle -* -*/ - -OCI_EXPORT OCI_Connection * OCI_API OCI_LobGetConnection -( - OCI_Lob *lob -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFiles External Large Objects (FILEs) - * @{ - * - * External Large Objects (FILEs) were introduced with Oracle 8i - * - * Oracle OCI supplies a set APIs to manipulate this data type. - * - * OCILIB encapsulates this API by supplying: - * - * - An OCI_File C type - * - A set of really easy APIs to manipulate OCI_File objects - * - * OCILIB currently supports 2 types of Lobs : - * - * - BFILE : Binary files - * - CFILE : Character files - * - * @warning - * FILEs are read-only. - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statements - * - Used for reading server files content - * - * @par Files > 4 Go - * - * - New maximum file size limit (128 To) applies to OCI_Files objects. - * - See Internal Large Objects (LOBs) section for Files > 4 Go information - * - * @par Example - * @include file.c - * - */ - -/** - * @brief - * Create a file object instance - * - * @param con - Connection handle - * @param type - File type - * - * Supported file types : - * - * - OCI_BFILE : Binary file - * - OCI_CFILE : Character file - * - * @return - * Return the lob handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_FileCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free a local File object - * - * @param file - File handle - * - * @warning - * Only Files created with OCI_FileCreate() should be freed by OCI_FileFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileFree -( - OCI_File *file -); - -/** - * @brief - * Create an array of file object - * - * @param con - Connection handle - * @param type - File type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_FileCreate() for more details - * - * @return - * Return the file handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_File ** OCI_API OCI_FileArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** -* @brief -* Free an array of file objects -* -* @param files - Array of file objects -* -* @warning -* Only arrays of lobs created with OCI_FileArrayCreate() should be freed by OCI_FileArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_FileArrayFree -( - OCI_File **files -); - -/** - * @brief - * Return the type of the given File object - * - * @param file - File handle - * - * @note - * For possible values, see OCI_FileCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_FileGetType -( - OCI_File *file -); - -/** - * @brief - * Perform a seek operation on the OCI_File content buffer - * - * @param file - File handle - * @param offset - Offset from current position - * @param mode - Seek mode - * - * Mode parameter can be one of the following value : - * - * - OCI_SEEK_SET : set the file current offset to the given absolute offset - * - OCI_SEEK_END : set the file current offset to the end of the lob - * - OCI_SEEK_CUR : move the file current offset to the number of bytes given by - * parameter 'offset' - * - * @note - * Position in the File buffer starts at 0. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileSeek -( - OCI_File *file, - big_uint offset, - unsigned int mode -); - -/** - * @brief - * Return the current position in the file - * - * @param file - File handle - * - * @return - * File position (starting with 0) or 0 on failure - */ - -OCI_EXPORT big_uint OCI_API OCI_FileGetOffset -( - OCI_File *file -); - -/** - * @brief - * Read a portion of a file into the given buffer - * - * @param file - File handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer in bytes - * - * @return - * Number of bytes read on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_FileRead -( - OCI_File *file, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the size in bytes of a file - * - * @param file - File handle - * - */ - -OCI_EXPORT big_uint OCI_API OCI_FileGetSize -( - OCI_File *file -); - -/** - * @brief - * Check if the given file exists on server - * - * @param file - File handle - * - * @note - * For local FILEs object, OCI_LobFileSetName() must be called before to set the filename to check - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileExists -( - OCI_File *file -); - -/** - * @brief - * Set the directory and file name of FILE handle - * - * @param file - File handle - * @param dir - File directory - * @param name - File name - *in - * @note - * - For local FILEs only - * - Files fetched from resultset can't be assigned a new directory and name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileSetName -( - OCI_File *file, - const otext *dir, - const otext *name -); - -/** - * @brief - * Return the directory of the given file - * - * @param file - File handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_FileGetDirectory -( - OCI_File *file -); - -/** - * @brief - * Return the name of the given file - * - * @param file - File handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_FileGetName -( - OCI_File *file -); - -/** - * @brief - * Open a file for reading - * - * @param file - File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileOpen -( - OCI_File *file -); - -/** - * @brief - * Check if the specified file is opened within the file handle - * - * @param file - File handle - * - * @return - * TRUE if the file was opened with this handle otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileIsOpen -( - OCI_File *file -); - -/** - * @brief - * Close a file - * - * @param file - File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileClose -( - OCI_File *file -); - -/** - * @brief - * Compare two file handle for equality - * - * @param file - File handle - * @param file2 - File2 handle - * - * @return - * TRUE is the lobs are not null and equal otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileIsEqual -( - OCI_File *file, - OCI_File *file2 -); - -/** - * @brief - * Assign a file to another one - * - * @param file - Destination File handle - * @param file_src - Source File handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_FileAssign -( - OCI_File *file, - OCI_File *file_src -); - -/** -* @brief -* Retrieve connection handle from the file handle -* -* @param file - file handle -* -*/ - -OCI_EXPORT OCI_Connection * OCI_API OCI_FileGetConnection -( - OCI_File *file -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiLongs Long objects - * @{ - * - * Long Objects encapsulate Oracle LONGs data types and were used to store large - * buffers in Oracle database. - * - * They're still supported but are depreciated. Oracle now provides a - * newer and better way to deal with data that needs large storage : LOBs - * - * OCILIB supports this data type because it was and still is widely used - * - * OCILIB provides a set of API for manipulating LONGs that is really close to - * the one provided for LOBs. - * - * OCILIB currently supports 3 types of Long Objects: - * - * - OCI_BLONG : LONG RAW columns - * - OCI_CLONG : LONG columns - * - * OCI_Lob objects can be : - * - * - Created as standalone instances - * - Used for in/out binding - * - Retrieved from select statement - * - * @par Example - * @include long.c - * - */ - -/** - * @brief - * Create a local temporary Long instance - * - * @param stmt - Statement handle - * @param type - Long type - * - * Supported lob types : - * - * - OCI_BLONG : Binary Long - * - OCI_CLONG : Character Long - * - * @return - * Return the long handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Long * OCI_API OCI_LongCreate -( - OCI_Statement *stmt, - unsigned int type -); - -/** - * @brief - * Free a local temporary long - * - * @param lg - Long handle - * - * @warning - * Only lobs created with OCI_LongCreate() should be freed by OCI_LongFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_LongFree -( - OCI_Long *lg -); - -/** - * @brief - * Return the type of the given Long object - * - * @param lg - Long handle - * - * @note - * For possible values, see OCI_LobCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongGetType -( - OCI_Long *lg -); - -/** - * @brief - * Read a portion of a long into the given buffer [Obsolete] - * - * @param lg - Long handle - * @param buffer - Pointer to a buffer - * @param len - Length of the buffer in bytes / characters - * - * @note - * - From version 2.0.0, this function is obsolete because OCILIB fetches now - * all data during OCIFetchNext() call - * - So, this call reads now the internal OCI_Long object allocated buffer - * - The internal buffer can be directly accessed with OCI_LongGetBuffer() - * - * @note - * - For OCI_CLONG, parameter 'len' and returned value are expressed in characters - * - For OCI_BLONG, parameter 'len' and returned value are expressed in bytes - * - * @return - * - Number of bytes/characters read on success - * - 0 if there is nothing more to read - * - 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongRead -( - OCI_Long *lg, - void *buffer, - unsigned int len -); - -/** - * @brief - * Write a buffer into a Long - * - * @param lg - Long handle - * @param buffer - the pointer to a buffer - * @param len - the length of the buffer in bytes (OCI_BLONG) or - * character (OCI_CLONG) - * - * @return - * Number of bytes (OCI_BLONG) / character (OCI_CLONG) written on success otherwise 0 on failure - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongWrite -( - OCI_Long *lg, - void *buffer, - unsigned int len -); - -/** - * @brief - * Return the buffer size of a long object in bytes (OCI_BLONG) or character (OCI_CLONG) - * - * @param lg - Long handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_LongGetSize -( - OCI_Long *lg -); - -/** - * @brief - * Return the internal buffer of an OCI_Long object read from a fetch sequence - * - * @param lg - Long handle - * - */ - -OCI_EXPORT void * OCI_API OCI_LongGetBuffer -( - OCI_Long *lg -); - -/** -* @} -*/ - -/** -* @defgroup OcilibCApiOracleNumber Oracle NUMBER manipulation (optional) -* @{ -* -* OCILIB encapsulates Oracle SQL all Numeric types using C native data types. -* But it also provides an optional OCI_Number handle for manipulating and accessing Oracle NUMBER type. -* OCI_Number provides management for some special value that cannot be addressed in C such as positive -* and negative infinity. -* -* @par Example -* @include number.c -* -*/ - -/** -* @brief -* Create a local number object -* -* @param con - Connection handle -* -* @note -* Parameter 'con' can be NULL in order to manipulate numbers -* independently from database connections -* -* @return -* Return the number handle on success otherwise NULL on failure -* -*/ - -OCI_EXPORT OCI_Number * OCI_API OCI_NumberCreate -( - OCI_Connection *con -); - -/** -* @brief -* Free a number object -* -* @param number - Number handle -* -* @warning -* Only Numbers created with OCI_NumberCreate() should be freed by OCI_NumberFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberFree -( - OCI_Number *number -); - -/** -* @brief -* Create an array of number object -* -* @param con - Connection handle -* @param nbelem - number of elements in the array -* -* @note -* see OCI_NumberCreate() for more details -* -* @return -* Return the number handle array on success otherwise NULL on failure -* -*/ - -OCI_EXPORT OCI_Number ** OCI_API OCI_NumberArrayCreate -( - OCI_Connection *con, - unsigned int nbelem -); - -/** -* @brief -* Free an array of number objects -* -* @param numbers - Array of number objects -* -* @warning -* Only arrays of numbers created with OCI_NumberArrayCreate() should be freed by OCI_NumberArrayFree() -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberArrayFree -( - OCI_Number **numbers -); - -/** -* @brief -* Assign the value of a number handle to another one -* -* @param number - Destination number handle -* @param number_src - Source number handle -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT int OCI_API OCI_NumberAssign -( - OCI_Number *number, - OCI_Number *number_src -); - -/** -* @brief -* Convert a number value from the given number handle to a string -* -* @param number - source number handle -* @param fmt - Number format -* @param size - Destination string size in characters -* @param str - Destination date string -* -* @note -* Output string can be one the following 'magic strings': -* - '~' for positive infinity -* - '-~' for negative infinity -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberToText -( - OCI_Number *number, - const otext *fmt, - int size, - otext *str -); - -/** -* @brief -* Convert a string to a number and store it in the given number handle -* -* @param number - Destination number handle -* @param str - Source number string -* @param fmt - Number format -* -* @note -* Input string can be one the following 'magic strings': -* - '~' for positive infinity -* - '-~' for negative infinity -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberFromText -( - OCI_Number *number, - const otext *str, - const otext *fmt -); - -/** -* @brief -* Return the number value content -* -* @param number - number handle -* -* @note -* Returned content is a buffer of 22 bytes corresponding to Oracle C native -* representation of NUMBER values -* See oracle Documentation of its layout -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT unsigned char * OCI_API OCI_NumberGetContent -( - OCI_Number *number -); - -/** -* @brief -* Assign the number value content -* -* @param number - number handle -* @param content - raw number content -* -* @note -* See OCI_NumberSetContent() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSetContent -( - OCI_Number *number, - unsigned char *content -); - -/** -* @brief -* Assign the number value with the value of a native C numeric type -* -* @param number - number handle -* @param type - native C type to assign -* @param value - pointer to value to set -* -* @note -* Argument @param type can be : -* -* - OCI_NUM_SHORT : value is a pointer to a signed short -* - OCI_NUM_USHORT : value is a pointer to an unsigned short -* - OCI_NUM_INT : value is a pointer to a signed int -* - OCI_NUM_UINT : value is a pointer to an unsigned short -* - OCI_NUM_BIGINT : value is a pointer to a signed big_int -* - OCI_NUM_BIGUINT : value is a pointer to an unsigned big_uint -* - OCI_NUM_FLOAT : value is a pointer to an float -* - OCI_NUM_DOUBLE : value is a pointer to a double -* - OCI_NUM_NUMBER : value is a pointer to a OCI_Number -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSetValue -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Assign the number value to a native C numeric type -* -* @param number - number handle -* @param type - native C type to assign -* @param value - pointer to a native C variable -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberGetValue -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Add the value of a native C numeric type to the given number -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to add -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberAdd -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Subtract the value of a native C numeric type to the given number -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to subtract -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberSub -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Multiply the given number with the value of a native C numeric -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to multiply by -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberMultiply -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** -* @brief -* Divide the given number with the value of a native C numeric -* -* @param number - number handle -* @param type - native C type of the variable -* @param value - pointer to a native C variable to divide by -* -* @note -* See OCI_NumberSetValue() for more information -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_NumberDivide -( - OCI_Number *number, - unsigned int type, - void *value -); - -/** - * @brief - * Compares two number handles - * - * @param number1 - number1 handle - * @param number2 - number2 handle - * - * @return - * - -1 if number1 is smaller than number2, - * - 0 if they are equal - * - 1 if number1 is greater than number2. - * - */ - -OCI_EXPORT int OCI_API OCI_NumberCompare -( - OCI_Number *number1, - OCI_Number *number2 -); - -/** -* @} -*/ - -/** - * @} - */ - -/** - * @defgroup OcilibCApiDatetimes Date/time manipulation - * @{ - * - * OCILIB encapsulates Oracle SQL Date data type within OCI_Date structure - * - * Basically, the OCI_Date routines are wrappers around the Oracle OCIDate APIs - * - * @par Example - * @include date.c - * - */ - -/** - * @brief - * Create a local date object - * - * @param con - Connection handle - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate dates - * independently from database connections - * - * @return - * Return the date handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_DateCreate -( - OCI_Connection *con -); - -/** - * @brief - * Free a date object - * - * @param date - Date handle - * - * @warning - * Only dates created with OCI_DateCreate() should be freed by OCI_DateFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFree -( - OCI_Date *date -); - -/** - * @brief - * Create an array of date object - * - * @param con - Connection handle - * @param nbelem - number of elements in the array - * - * @note - * see OCI_DateCreate() for more details - * - * @return - * Return the date handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Date ** OCI_API OCI_DateArrayCreate -( - OCI_Connection *con, - unsigned int nbelem -); - -/** - * @brief - * Free an array of date objects - * - * @param dates - Array of date objects - * - * @warning - * Only arrays of dates created with OCI_DateArrayCreate() should be freed by OCI_DateArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateArrayFree -( - OCI_Date **dates -); - -/** - * @brief - * Add or subtract days to a date handle - * - * @param date - Date handle - * @param nb - Number of days to add/remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateAddDays -( - OCI_Date *date, - int nb -); - -/** - * @brief - * Add or subtract months to a date handle - * - * @param date - Date handle - * @param nb - Number of months to add/remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateAddMonths -( - OCI_Date *date, - int nb -); - -/** - * @brief - * Assign the value of a date handle to another one - * - * @param date - Destination Date handle - * @param date_src - Source Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT int OCI_API OCI_DateAssign -( - OCI_Date *date, - OCI_Date *date_src -); - -/** - * @brief - * Check if the given date is valid - * - * @param date - Date handle - * - * @return - * - Zero if date is valid - * - Any other value means the date is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_DateCheck -( - OCI_Date *date -); - -/** - * @brief - * Compares two date handles - * - * @param date - Date1 handle - * @param date2 - Date2 handle - * - * @return - * - -1 if date1 is smaller than date2, - * - 0 if they are equal - * - 1 if date1 is greater than date2. - * - */ - -OCI_EXPORT int OCI_API OCI_DateCompare -( - OCI_Date *date, - OCI_Date *date2 -); - -/** - * @brief - * Return the number of days betWeen two dates - * - * @param date - Date1 handle - * @param date2 - Date2 handle - * - * @return - * Number of days on success otherwise OCI_ERROR on failure - * - */ - -OCI_EXPORT int OCI_API OCI_DateDaysBetween -( - OCI_Date *date, - OCI_Date *date2 -); - -/** - * @brief - * Convert a string to a date and store it in the given date handle - * - * @param date - Destination Date handle - * @param str - Source date string - * @param fmt - Date format - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFromText -( - OCI_Date *date, - const otext *str, - const otext *fmt -); - -/** - * @brief - * Convert a Date value from the given date handle to a string - * - * @param date - source Date handle - * @param fmt - Date format - * @param size - Destination string size in characters - * @param str - Destination date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateToText -( - OCI_Date *date, - const otext *fmt, - int size, - otext *str -); - -/** - * @brief - * Extract the date part from a date handle - * - * @param date - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetDate -( - OCI_Date *date, - int *year, - int *month, - int *day -); - -/** - * @brief - * Extract the time part from a date handle - * - * @param date - Date handle - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetTime -( - OCI_Date *date, - int *hour, - int *min, - int *sec -); - -/** - * @brief - * Extract the date and time parts from a date handle - * - * @param date - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateGetDateTime -( - OCI_Date *date, - int *year, - int *month, - int *day, - int *hour, - int *min, - int *sec -); - -/** - * @brief - * Set the date portion if the given date handle - * - * @param date - Date handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetDate -( - OCI_Date *date, - int year, - int month, - int day -); - -/** - * @brief - * Set the time portion if the given date handle - * - * @param date - Date handle - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetTime -( - OCI_Date *date, - int hour, - int min, - int sec -); - -/** - * @brief - * Set the date and time portions if the given date handle - * - * @param date - Date handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSetDateTime -( - OCI_Date *date, - int year, - int month, - int day, - int hour, - int min, - int sec -); - -/** - * @brief - * Place the last day of month (from the given date) into the given date - * - * @param date - Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateLastDay -( - OCI_Date *date -); - -/** - * @brief - * Gets the date of next day of the week, after a given date - * - * @param date - Date handle - * @param day - Day of the week - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateNextDay -( - OCI_Date *date, - const otext *day -); - -/** - * @brief - * Return the current system date/time into the date handle - * - * @param date - Date handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateSysDate -( - OCI_Date *date -); - -/** - * @brief - * Convert a date from one zone to another zone - * - * @param date - Date handle - * @param zone1 - Source zone - * @param zone2 - Destination zone - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateZoneToZone -( - OCI_Date *date, - const otext *zone1, - const otext *zone2 -); - -/** - * @brief - * Affect an OCI_Date handle value to ISO C time data types - * - * @param date - Date handle - * @param ptm - Pointer to a structure tm to receive date/time values - * @param pt - Pointer to a time_t to hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateToCTime -( - OCI_Date *date, - struct tm *ptm, - time_t *pt -); - -/** - * @brief - * Affect ISO C time data types values to an OCI_Date handle - * - * @param date - Date handle - * @param ptm - Pointer to a structure tm that hold the date/time value - * @param t - Value (time_t) that hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * If 'ptm' is not null, its value is affected to the OCI_Timestamp handle, - * otherwise the value of 't' is used. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DateFromCTime -( - OCI_Date *date, - struct tm *ptm, - time_t t -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiTimestamps Timestamps and intervals manipulation - * @{ - * - * OCILIB encapsulates Oracle : - * - * - SQL timestamp data type within OCI_Timestamp structure - * - SQL interval data type within OCI_Interval structure - * - * Basically, the OCI_Timestamp and OCI_Interval routines are wrappers around - * the Oracle OCIDatetime and OCIInterval APIs - * - * @par Examples - * @include timestamp.c - * - */ - -/** - * @brief - * Create a local Timestamp instance - * - * @param con - Connection handle - * @param type - Timestamp type - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate - * timestamps independently from database connections - * - * @note - * Timestamp type can be : - * - * - OCI_TIMESTAMP : timestamp - * - OCI_TIMESTAMP_TZ : timestamp with time zone - * - OCI_TIMESTAMP_LTZ : timestamp with local time zone - * - * @return - * Return the Timestamp handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_TimestampCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free an OCI_Timestamp handle - * - * @param tmsp - Timestamp handle - * - * @warning - * Only Timestamp created with OCI_TimestampCreate() should be freed by OCI_IntervalFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFree -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Create an array of timestamp object - * - * @param con - Connection handle - * @param type - Timestamp type - * @param nbelem - number of elements in the array - * - * @note - * see OCI_TimestampCreate() for more details - * - * @return - * Return the timestamp handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Timestamp ** OCI_API OCI_TimestampArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Free an array of timestamp objects - * - * @param tmsps - Array of timestamp objects - * - * @warning - * Only arrays of timestamp created with OCI_TimestampArrayCreate() - * should be freed by OCI_TimestampArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampArrayFree -( - OCI_Timestamp **tmsps -); - -/** - * @brief - * Return the type of the given Timestamp object - * - * @param tmsp - Timestamp handle - * - * @note - * For possible values, see OCI_TimestampCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TimestampGetType -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Assign the value of a timestamp handle to another one - * - * @param tmsp - Destination Timestamp handle - * @param tmsp_src - Source Timestamp handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampAssign -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp_src -); - -/** - * @brief - * Check if the given timestamp is valid - * - * @param tmsp - Timestamp handle - * - * @return - * - Zero if the timestamp value is valid - * - Any other value means the timestamp value is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_TimestampCheck -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Compares two timestamp handles - * - * @param tmsp - Timestamp1 handle - * @param tmsp2 - Timestamp2 handle - * - * @return - * - -1 if Timestamp1 is smaller than Timestamp2, - * - 0 if they are equal - * - 1 if Timestamp1 is greater than Timestamp2. - * - */ - -OCI_EXPORT int OCI_API OCI_TimestampCompare -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp2 -); - -/** - * @brief - * Set a timestamp handle value - * - * @param tmsp - Timestamp handle - * @param year - Year value - * @param month - Month value - * @param day - Day value - * @param hour - hour value - * @param min - minutes value - * @param sec - seconds value - * @param fsec - fractional part of seconds value - * @param time_zone - name of a time zone to use [optional] - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampConstruct -( - OCI_Timestamp *tmsp, - int year, - int month, - int day, - int hour, - int min, - int sec, - int fsec, - const otext *time_zone -); - -/** - * @brief - * Convert one timestamp value from one type to another. - * - * @param tmsp - Timestamp handle to convert - * @param tmsp_src - Timestamp handle to use for the type conversion - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampConvert -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp_src -); - -/** - * @brief - * Convert a string to a timestamp and store it in the given timestamp handle - * - * @param tmsp - Destination Timestamp handle - * @param str - Source date string - * @param fmt - Date format - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFromText -( - OCI_Timestamp *tmsp, - const otext *str, - const otext *fmt -); - -/** - * @brief - * Convert a timestamp value from the given timestamp handle to a string - * - * @param tmsp - source Timestamp handle - * @param fmt - Timestamp format - * @param size - Destination string size in characters - * @param str - Destination date string - * @param precision - Precision for fractional part of the seconds - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampToText -( - OCI_Timestamp *tmsp, - const otext *fmt, - int size, - otext *str, - int precision -); - -/** - * @brief - * Extract the date part from a timestamp handle - * - * @param tmsp - Timestamp handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetDate -( - OCI_Timestamp *tmsp, - int *year, - int *month, - int *day -); - -/** - * @brief - * Extract the time portion from a timestamp handle - * - * @param tmsp - Timestamp handle - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * @param fsec - Place holder for fractional part of second value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTime -( - OCI_Timestamp *tmsp, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Extract the date and time parts from a date handle - * - * @param tmsp - Date handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * @param day - Place holder for day value - * @param hour - Place holder for hour value - * @param min - Place holder for minute value - * @param sec - Place holder for second value - * @param fsec - Place holder for fractional part of seconds value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetDateTime -( - OCI_Timestamp *tmsp, - int *year, - int *month, - int *day, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Return the time zone name of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param size - Destination string size in characters - * @param str - Destination zone name string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTimeZoneName -( - OCI_Timestamp *tmsp, - int size, - otext *str -); - -/** - * @brief - * Return the time zone (hour, minute) portion of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param hour - Place holder for hour value - * @param min - Place holder for min value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampGetTimeZoneOffset -( - OCI_Timestamp *tmsp, - int *hour, - int *min -); - -/** - * @brief - * Add an interval value to a timestamp value of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param itv - Interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampIntervalAdd -( - OCI_Timestamp *tmsp, - OCI_Interval *itv -); - -/** - * @brief - * Subtract an interval value from a timestamp value of a timestamp handle - * - * @param tmsp - Timestamp handle - * @param itv - Interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampIntervalSub -( - OCI_Timestamp *tmsp, - OCI_Interval *itv -); - -/** - * @brief - * Store the difference of two timestamp handles into an interval handle - * - * @param tmsp - Timestamp handle (subtrahend) - * @param tmsp2 - Timestamp2 handle (minuend) - * @param itv - Interval handle - * - * @note - * The function acts like tmsp - tmsp2 = itv - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampSubtract -( - OCI_Timestamp *tmsp, - OCI_Timestamp *tmsp2, - OCI_Interval *itv -); - -/** - * @brief - * Stores the system current date and time as a timestamp value with time zone - * into the timestamp handle. - * - * @param tmsp - Timestamp handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampSysTimestamp -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Affect an OCI_Timestamp handle value to ISO C time data types - * - * @param tmsp - Timestamp handle - * @param ptm - Pointer to a structure tm to receive date/time values - * @param pt - Pointer to a time_t to hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampToCTime -( - OCI_Timestamp *tmsp, - struct tm *ptm, - time_t *pt -); - -/** - * @brief - * Affect ISO C time data types values to an OCI_Timestamp handle - * - * @param tmsp - Timestamp handle - * @param ptm - Pointer to a structure tm that hold the date/time value - * @param t - Value (time_t) that hold the date/time in the time_t format - * - * @note - * Both parameters 'ptm' and 'p' are optional but one of them has to be provided. - * If 'ptm' is not null, its value is affected to the OCI_Timestamp handle, - * otherwise the value of 't' is used. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TimestampFromCTime -( - OCI_Timestamp *tmsp, - struct tm *ptm, - time_t t -); - -/** - * @brief - * Create a local interval object - * - * @param con - Connection handle - * @param type - Type of Interval - * - * @note - * From version 2.5.0, parameter 'con' can be NULL in order to manipulate - * intervals independently from database connections - * - * @note - * Interval type can be : - * - OCI_INTERVAL_YM : year / month interval - * - OCI_INTERVAL_DS : date/ time interval - * - * @return - * Return the Interval handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_IntervalCreate -( - OCI_Connection *con, - unsigned int type -); - -/** - * @brief - * Free an OCI_Interval handle - * - * @param itv - Interval handle - * - * @warning - * Only Intervals created with OCI_IntervalCreate() should be freed by - * OCI_IntervalFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFree -( - OCI_Interval *itv -); - -/** - * @brief - * Create an array of Interval object - * - * @param con - Connection handle - * @param type - Type of Interval - * @param nbelem - number of elements in the array - * - * @note - * see OCI_IntervalCreate() for more details - * - * @return - * Return the Interval handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Interval ** OCI_API OCI_IntervalArrayCreate -( - OCI_Connection *con, - unsigned int type, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Interval objects - * - * @param itvs - Array of Interval objects - * - * @warning - * Only arrays of Interval created with OCI_IntervalArrayCreate() should be freed by - * OCI_IntervalArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalArrayFree -( - OCI_Interval **itvs -); - -/** - * @brief - * Return the type of the given Interval object - * - * @param itv - Interval handle - * - * @note - * For possible values, see OCI_IntervalCreate() - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_IntervalGetType -( - OCI_Interval *itv -); - -/** - * @brief - * Assign the value of a interval handle to another one - * - * @param itv - Destination interval handle - * @param itv_src - Source interval handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalAssign -( - OCI_Interval *itv, - OCI_Interval *itv_src -); - -/** - * @brief - * Check if the given interval is valid - * - * @param itv - Interval handle - * - * @return - * - Zero if the interval value is valid - * - Any other value means the interval value is invalid - * - */ - -OCI_EXPORT int OCI_API OCI_IntervalCheck -( - OCI_Interval *itv -); - -/** - * @brief - * Compares two interval handles - * - * @param itv - Interval1 handle - * @param itv2 - Interval2 handle - * - * @return - * - -1 if interval1 is smaller than interval2, - * - 0 if they are equal - * - 1 if interval1 is greater than interval2. - * - */ - -OCI_EXPORT int OCI_API OCI_IntervalCompare -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @brief - * Convert a string to an interval and store it in the given interval handle - * - * @param itv - Destination interval handle - * @param str - Source date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFromText -( - OCI_Interval *itv, - const otext *str -); - -/** - * @brief - * Convert an interval value from the given interval handle to a string - * - * @param itv - source Interval handle - * @param leading_prec - Precision of the leading part - * @param fraction_prec - Precision of the fractional part - * @param size - Destination string size in characters - * @param str - Destination date string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalToText -( - OCI_Interval *itv, - int leading_prec, - int fraction_prec, - int size, - otext *str -); - -/** - * @brief - * Correct an interval handle value with the given time zone - * - * @param itv - Interval handle - * @param str - Time zone name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalFromTimeZone -( - OCI_Interval *itv, - const otext *str -); - -/** - * @brief - * Return the day / time portion of an interval handle - * - * @param itv - Interval handle - * @param day - Place holder for day value - * @param hour - Place holder for hours value - * @param min - Place holder for minutes value - * @param sec - Place holder for seconds value - * @param fsec - Place holder for fractional part of seconds value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalGetDaySecond -( - OCI_Interval *itv, - int *day, - int *hour, - int *min, - int *sec, - int *fsec -); - -/** - * @brief - * Return the year / month portion of an interval handle - * - * @param itv - Interval handle - * @param year - Place holder for year value - * @param month - Place holder for month value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalGetYearMonth -( - OCI_Interval *itv, - int *year, - int *month -); - -/** - * @brief - * Set the day / time portion if the given interval handle - * - * @param itv - Interval handle - * @param day - day value - * @param hour - Hour value - * @param min - Minute value - * @param sec - Second value - * @param fsec - Fractional part of the seconds - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSetDaySecond -( - OCI_Interval *itv, - int day, - int hour, - int min, - int sec, - int fsec -); - -/** - * @brief - * Set the year / month portion if the given Interval handle - * - * @param itv - Interval handle - * @param year - Year value - * @param month - Month value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSetYearMonth -( - OCI_Interval *itv, - int year, - int month -); - -/** - * @brief - * Adds an interval handle value to another - * - * @param itv - Interval handle from witch to add - * @param itv2 - Interval handle to add - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalAdd -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @brief - * Subtract an interval handle value from another - * - * @param itv - Interval handle from witch to remove - * @param itv2 - Interval handle to remove - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_IntervalSubtract -( - OCI_Interval *itv, - OCI_Interval *itv2 -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiUserTypes Oracle Named Types (Oracle OBJECTs) - * @{ - * - * OCILIB implements Oracle Named types (user types and built-in types) through - * the OCI_Object type. - * - * OTT and C structures are not required to use objects in OCILIB. - * - * In order to manipulate objects attributes, OCILIB proposes a set of functions - * to get/set properties for various supported types. - * - * Objects can be: - * - Created as standalone instances (transient objects) - * - Used for binding (persistent / transient objects) - * - Retrieved from select statements (persistent / embedded objects) - * - * References (Oracle type REF) are identifiers (smart pointers) to objects and - * are implemented in OCILIB with the type OCI_Ref. - * - * OCILIB implements Oracle REFs as strong typed Reference (underlying OCI REFs - * are weaker in terms of typing). - * It means it's mandatory to provide type information to: - * - create a local OCI_Ref handle. - * - register an OCI_Ref handle for a 'returning into' clause. - * - * @note - * See Oracle Database SQL Language Reference for more details about REF data type - * - * @warning - * Prior to v3.5.0, OCILIB relied on some OCI routines to set/get objects - * attributes. these OCI calls had known bugs in Unicode mode that has been fixed in Oracle 11gR2. - * From v3.5.0, OCILIB directly sets objects attributes and thus OCILIB objects - * can now be used in Unicode mode. - * - * @par Example : Inserting a local object into a table - * @include object.c - * - * @par Example : Using Object References - * @include ref.c - * - */ - -/** - * @brief - * Create a local object instance - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * - * @return - * Return the object handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ObjectCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local object - * - * @param obj - Object handle - * - * @warning - * Only object created with OCI_ObjectCreate() should be freed - * by OCI_ObjectFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectFree -( - OCI_Object *obj -); - -/** - * @brief - * Create an array of Object objects - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_ObjectCreate() for more details - * - * @return - * Return the Object handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Object ** OCI_API OCI_ObjectArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Object objects - * - * @param objs - Array of Object objects - * - * @warning - * Only arrays of Object created with OCI_ObjectArrayCreate() - * should be freed by OCI_ObjectArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectArrayFree -( - OCI_Object **objs -); - -/** - * @brief - * Assign an object to another one - * - * @param obj - Destination Object handle - * @param obj_src - Source Object handle - * - * @note - * Oracle proceeds to a deep copy of the object content - * - * @note - * The two object handles must have the same type otherwise an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectAssign -( - OCI_Object *obj, - OCI_Object *obj_src -); - -/** - * @brief - * Return the type of an object instance - * - * @param obj - Object handle - * - * @note - * Possibles values are : - * - * - OCI_OBJ_PERSISTENT: persistent object from the DB - * - OCI_OBJ_TRANSIENT : local temporary object - * - OCI_OBJ_VALUE : embedded object - * - * @return - * Instance type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetType -( - OCI_Object *obj -); - -/** - * @brief - * Retrieve an Oracle Ref handle from an object and assign it to the given - * OCILIB OCI_Ref handle - * - * @param obj - Object handle - * @param ref - Ref handle - * - * @note - * The type information of the object and the ref must be the same, otherwise - * an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetSelfRef -( - OCI_Object *obj, - OCI_Ref *ref -); - -/** - * @brief - * Return the type info object associated to the object - * - * @param obj - Object handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_ObjectGetTypeInfo -( - OCI_Object *obj -); - -/** - * @brief - * Return the boolean value of the given object attribute (ONLY for PL/SQL records) - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetBoolean() returns a valid value only for PL/SQL boolean based attributes - * - * @warning - * - ONLY supported by Oracle 12c and above ! - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetBoolean -( - OCI_Object *obj, - const otext *attr -); - -/** -* @brief -* Return the number value of the given object attribute -* -* @param obj - Object handle -* @param attr - Attribute name -* -* @note -* If the attribute is found in the object descriptor attributes list, then a -* data type check is performed for integrity. -* OCI_ObjectGetNumber() returns a valid value only for number based attributes -* -* @return -* Attribute value or NULL on failure or wrong attribute type -* -*/ - -OCI_EXPORT OCI_Number* OCI_API OCI_ObjectGetNumber -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the short value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetShort() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT short OCI_API OCI_ObjectGetShort -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned short value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedShort() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT unsigned short OCI_API OCI_ObjectGetUnsignedShort -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT int OCI_API OCI_ObjectGetInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetUnsignedInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the big integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetBigInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT big_int OCI_API OCI_ObjectGetBigInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the unsigned big integer value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetUnsignedBigInt() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT big_uint OCI_API OCI_ObjectGetUnsignedBigInt -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the double value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetDouble() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0.0 on failure or wrong attribute type - * - */ - -OCI_EXPORT double OCI_API OCI_ObjectGetDouble -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the float value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetFloat() returns a valid value only for integer and number based attributes - * - * @return - * Attribute value or 0.0 on failure or wrong attribute type - * - */ - -OCI_EXPORT float OCI_API OCI_ObjectGetFloat -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the string value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * The method can return a string value for any attributes types. - * It performs implicit string conversions using the same - * mechanisms than OCI_GetString(). See its documentation for more details. - * - * @return - * Attribute value or NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_ObjectGetString -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the raw attribute value of the given object attribute into the - * given buffer - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Destination buffer - * @param len - Max size to write into buffer - - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetRaw() copies data into the buffer only for raw based attributes - * - * @return - * Number of bytes written to the buffer or 0 on failure or wrong attribute type - * - */ - -OCI_EXPORT int OCI_API OCI_ObjectGetRaw -( - OCI_Object *obj, - const otext *attr, - void *value, - unsigned int len -); - -/** -* @brief -* Return the raw attribute value size of the given object attribute into the -* given buffer -* -* @param obj - Object handle -* @param attr - Attribute name -* -* @note -* If the attribute is found in the object descriptor attributes list, then a -* data type check is performed for integrity. -* -* @return -* size in bytes of the RAW value or 0 on failure or wrong attribute type -* -*/ - -OCI_EXPORT unsigned int OCI_API OCI_ObjectGetRawSize -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the date value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetDate() returns a valid value only for date based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_ObjectGetDate -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the timestamp value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetTimestamp() returns a valid value only for timestamps based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Timestamp * OCI_API OCI_ObjectGetTimestamp -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the interval value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetInterval() returns a valid value only for intervals based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Interval * OCI_API OCI_ObjectGetInterval -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the collection value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetColl() returns a valid value only for intervals based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Coll * OCI_API OCI_ObjectGetColl -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the Ref value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetRef() returns a valid value only for Refs based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_ObjectGetRef -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the object value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetObject() returns a valid value only for object based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_ObjectGetObject -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the lob value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetLob() returns a valid value only for lobs based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_Lob * OCI_API OCI_ObjectGetLob -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Return the file value of the given object attribute - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @note - * If the attribute is found in the object descriptor attributes list, then a - * data type check is performed for integrity. - * OCI_ObjectGetFile() returns a valid value only for files based attributes - * - * @return - * Attribute value or NULL on failure or wrong attribute type - * - */ - -OCI_EXPORT OCI_File * OCI_API OCI_ObjectGetFile -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Set an object attribute of type boolean (ONLY for PL/SQL records) - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - boolean value - * - * @warning - * - ONLY supported by Oracle 12c and above ! - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetBoolean -( - OCI_Object *obj, - const otext *attr, - boolean value -); - -/** -* @brief -* Set an object attribute of type number -* -* @param obj - Object handle -* @param attr - Attribute name -* @param value - number value -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetNumber -( - OCI_Object *obj, - const otext *attr, - OCI_Number *value -); - -/** - * @brief - * Set an object attribute of type short - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetShort -( - OCI_Object *obj, - const otext *attr, - short value -); - -/** - * @brief - * Set an object attribute of type unsigned short - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned short value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedShort -( - OCI_Object *obj, - const otext *attr, - unsigned short value -); - -/** - * @brief - * Set an object attribute of type int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetInt -( - OCI_Object *obj, - const otext *attr, - int value -); - -/** - * @brief - * Set an object attribute of type unsigned int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedInt -( - OCI_Object *obj, - const otext *attr, - unsigned int value -); - -/** - * @brief - * Set an object attribute of type big int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetBigInt -( - OCI_Object *obj, - const otext *attr, - big_int value -); - -/** - * @brief - * Set an object attribute of type unsigned big int - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Unsigned big int value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetUnsignedBigInt -( - OCI_Object *obj, - const otext *attr, - big_uint value -); - -/** - * @brief - * Set an object attribute of type double - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Double value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetDouble -( - OCI_Object *obj, - const otext *attr, - double value -); - -/** - * @brief - * Set an object attribute of type float - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Float value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetFloat -( - OCI_Object *obj, - const otext *attr, - float value -); - -/** - * @brief - * Set an object attribute of type string - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - String value - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetString -( - OCI_Object *obj, - const otext *attr, - const otext *value -); - -/** - * @brief - * Set an object attribute of type RAW - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Raw value - * @param len - Size of the raw value - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetRaw -( - OCI_Object *obj, - const otext *attr, - void *value, - unsigned int len -); - -/** - * @brief - * Set an object attribute of type Date - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Date Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetDate -( - OCI_Object *obj, - const otext *attr, - OCI_Date *value -); - -/** - * @brief - * Set an object attribute of type Timestamp - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Timestamp Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetTimestamp -( - OCI_Object *obj, - const otext *attr, - OCI_Timestamp *value -); - -/** - * @brief - * Set an object attribute of type Interval - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Interval Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetInterval -( - OCI_Object *obj, - const otext *attr, - OCI_Interval *value -); - -/** - * @brief - * Set an object attribute of type Collection - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Collection Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetColl -( - OCI_Object *obj, - const otext *attr, - OCI_Coll *value -); - -/** - * @brief - * Set an object attribute of type Object - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Object Handle - * - * @warning - * This function assigns a copy of the object to the given attribute. - * Any further modifications of the object passed as the parameter 'value' - * will not be reflected to object 's attribute set with this call - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetObject -( - OCI_Object *obj, - const otext *attr, - OCI_Object *value -); - -/** - * @brief - * Set an object attribute of type Lob - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Lob Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetLob -( - OCI_Object *obj, - const otext *attr, - OCI_Lob *value -); - -/** - * @brief - * Set an object attribute of type File - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - File Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetFile -( - OCI_Object *obj, - const otext *attr, - OCI_File *value -); - -/** - * @brief - * Set an object attribute of type Ref - * - * @param obj - Object handle - * @param attr - Attribute name - * @param value - Ref Handle - * - * @note - * passing a null pointer for value calls OCI_ObjectSetNull() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetRef -( - OCI_Object *obj, - const otext *attr, - OCI_Ref *value -); - -/** - * @brief - * Check if an object attribute is null - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @return - * FALSE if the attribute is not null otherwise TRUE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectIsNull -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Set an object attribute to null - * - * @param obj - Object handle - * @param attr - Attribute name - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectSetNull -( - OCI_Object *obj, - const otext *attr -); - -/** - * @brief - * Retrieve the underlying C (OTT/OCI style) structure of an OCI_Object handle - * - * @param obj - Object handle - * @param pp_struct - Address of a pointer that retrieve the C structure of data - * @param pp_ind - Address of a pointer that retrieve the C structure of indicators - * - * @note - * See Oracle OCI programming guide for more details about OTT structures. - * The members of these structures are OCI data types like OCINumber, OCIString - * that requires mixing OCILIB code and raw OCI code. - * OCI Object API headers have to be included to handle this data types using OCI object functions - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectGetStruct -( - OCI_Object *obj, - void **pp_struct, - void **pp_ind -); - -/** - * @brief - * Convert an object handle value to a string - * - * @param obj - Object handle - * @param size - Destination string length pointer in characters - * @param str - Destination string - * - * @note - * In order to compute the needed string length, call the method with a NULL string - * Then call the method again with a valid buffer - * - * @note - * The resulting string is similar to the SQL*PLUS output for UDTs (user types and objects) - * For RAWs and BLOBs attributes, their binary values are converted to hexadecimal strings - * - * @warning - * This convenient method shall not be used when performance matters. It is usually called twice (buffer length - * computation) and must also care about quotes within strings. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ObjectToText -( - OCI_Object *obj, - unsigned int *size, - otext *str -); - -/** - * @brief - * Create a local Ref instance - * - * @param con - Connection handle - * @param typinf - Ref type - * - * @return - * Return the Ref handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Ref * OCI_API OCI_RefCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a local Ref - * - * @param ref - Ref handle - * - * @warning - * Only Refs created with OCI_RefCreate() should be freed - * by OCI_RefFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefFree -( - OCI_Ref *ref -); - -/** - * @brief - * Create an array of Ref object - * - * @param con - Connection handle - * @param typinf - Object type (type info handle) - * @param nbelem - number of elements in the array - * - * @note - * see OCI_RefCreate() for more details - * - * @return - * Return the Ref handle array on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Ref ** OCI_API OCI_RefArrayCreate -( - OCI_Connection *con, - OCI_TypeInfo *typinf, - unsigned int nbelem -); - -/** - * @brief - * Free an array of Ref objects - * - * @param refs - Array of Ref objects - * - * @warning - * Only arrays of Ref created with OCI_RefArrayCreate() - * should be freed by OCI_RefArrayFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefArrayFree -( - OCI_Ref **refs -); - -/** - * @brief - * Assign a Ref to another one - * - * @param ref - Destination Ref handle - * @param ref_src - Source Ref handle - * - * @note - * The two Ref handles must have the same type otherwise an exception is thrown - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefAssign -( - OCI_Ref *ref, - OCI_Ref *ref_src -); - -/** - * @brief - * Return the type info object associated to the Ref - * - * @param ref - Ref handle - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_RefGetTypeInfo -( - OCI_Ref *ref -); - -/** - * @brief - * Returns the object pointed by the Ref handle. - * - * @param ref - Ref handle - * - * @return - * The object handle is the ref is not null otherwise NULL - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_RefGetObject -( - OCI_Ref *ref -); - -/** - * @brief - * Check if the Ref points to an object or not. - * - * @param ref - Ref handle - * - * @return - * TRUE if it does not point to a valid object otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefIsNull -( - OCI_Ref *ref -); - -/** - * @brief - * Nullify the given Ref handle - * - * @param ref - Ref handle - * - * @note - * this call clears the reference to object pointed by the Ref handle. - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_RefSetNull -( - OCI_Ref *ref -); - -/** - * @brief - * Returns the size of the hex representation of the given Ref handle - * - * @param ref - Ref handle - * - * @note - * the returned size is the number of character needed to store the - * hex representation of the Ref that can be retrieved with OCI_RefToText() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_RefGetHexSize -( - OCI_Ref *ref -); - -/** - * @brief - * Converts a Ref handle value to a hexadecimal string. - * - * @param ref - Ref handle - * @param size - Destination string size in characters - * @param str - Destination string - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_RefToText -( - OCI_Ref *ref, - unsigned int size, - otext *str -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiAbort Aborting long operations - * @{ - * - * The Oracle OCI provides the ability to establish a server connection in : - * - * - blocking mode: each call to an OCI function returns control to the - * application when the call completes - * - non-blocking mode (based on polling paradigm) : the application have to - * call each function until its has completed its job - * - * OCILIB implements OCI in blocking mode. The application has to wait for OCI - * calls to complete to continue. - * - * Some operations can be long to be processed by the server. - * - * In order to cancel the current pending call, OCILIB provides OCI_Break() that - * cancel the last internal OCI Call and then raise an OCI abortion error code. - * - * @note - * Any call to OCI_Break() has to be done from a separate thread because the - * thread that has executed a long OCI call is waiting for its OCI call to complete. - * - * @par Example - * @include abort.c - * - */ - -/** - * @brief - * Perform an immediate abort of any currently Oracle OCI call - * - * @param con - connection handle - * - * @note - * The current call will abort and generate an error - * - * @return - * Returns FALSE if connection handle is NULL otherwise TRUE - */ - -OCI_EXPORT boolean OCI_API OCI_Break -( - OCI_Connection *con -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiMetadata Describing Schema Meta data and Objects - * @{ - * - * - * @par Example - * @include desc.c - * - */ - -/** - * @brief - * Retrieve the available type info information - * - * @param con - Connection handle - * @param name - Table/view name to query for - * @param type - Type of object - * - * @note - * Possible values for parameter type are : - * - * - OCI_UNKNOWN - * - OCI_TIF_TABLE - * - OCI_TIF_VIEW - * - OCI_TIF_TYPE - * - * @return - * - Type info handle on success - = - NULL if the object does not exist - * - NULL on failure - * - */ - -OCI_EXPORT OCI_TypeInfo * OCI_API OCI_TypeInfoGet -( - OCI_Connection *con, - const otext *name, - unsigned int type -); - -/** - * @brief - * Return the type of the type info object - * - * @param typinf - Type info handle - * - * @note - * Possible values for parameter type are : - * - * - OCI_UNKNOWM - * - OCI_TIF_TABLE - * - OCI_TIF_VIEW - * - OCI_TIF_TYPE - * - * @return - * Object type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TypeInfoGetType -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Retrieve connection handle from the type info handle - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_TypeInfoGetConnection -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a type info object - * - * @param typinf - Type info handle - * - * @note - * this call is optional. - * OCI_TypeInfo object are internally tracked and - * automatically freed when their related connection is freed - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_TypeInfoFree -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Return the number of columns of a table/view/object - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_TypeInfoGetColumnCount -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Return the column object handle at the given index in the table - * - * @param typinf - Type info handle - * @param index - Column position - * - * @return - * - Column handle on success - * - NULL if index is out of bounds or on error - * - */ - -OCI_EXPORT OCI_Column * OCI_API OCI_TypeInfoGetColumn -( - OCI_TypeInfo *typinf, - unsigned int index -); - -/** - * @brief - * Return the name described by the type info object - * - * @param typinf - Type info handle - * - */ - -OCI_EXPORT const otext * OCI_API OCI_TypeInfoGetName -( - OCI_TypeInfo *typinf -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiFormatting Formatted functions - * @{ - * - * OCILIB offers some smart routines that takes a variable number of arguments - * in order to minimize OCILIB function calls and reduce the amount of code lines - * - * On Windows platforms, the target programming language must support the __cdecl - * calling convention - * - * @note - * OCI_Immediate() and OCI_ImmediateFmt() support all OCILIB supported types - * for output result, except : - * - OCI_Long - * - OCI_Statement - * If a query output result contains one of these unsupported types, the function returns FALSE - * - * @note - * In the parameter list, every output placeholder MUST be preceded by - * an integer parameter that indicates the type of the placeholder - * in order to handle correctly the given pointer. - * - * Possible values for indicating placeholders type : - * - * - OCI_ARG_SHORT ------> short * - * - OCI_ARG_USHORT -----> unsigned short * - * - OCI_ARG_INT --------> int * - * - OCI_ARG_UINT -------> unsigned int* - * - OCI_ARG_BIGINT -----> big_int * - * - OCI_ARG_BIGUINT ----> unsigned big_int * - * - OCI_ARG_DOUBLE ----> double * - * - OCI_ARG_FLOAT ------> float * - * - OCI_ARG_NUMBER -----> OCI_Number * - * - OCI_ARG_TEXT -------> otext * - * - OCI_ARG_RAW --------> void * - * - OCI_ARG_DATETIME ---> OCI_Date * - * - OCI_ARG_LOB --------> OCI_Lob * - * - OCI_ARG_FILE -------> OCI_File * - * - OCI_ARG_TIMESTAMP --> OCI_Timestamp * - * - OCI_ARG_INTERVAL ---> OCI_Interval * - * - OCI_ARG_OBJECT -----> OCI_Object * - * - OCI_ARG_COLLECTION -> OCI_Coll * - * - OCI_ARG_REF --------> OCI_Ref * - * - * @note - * For output strings and Raws, returned data is copied to the given buffer - * instead of returning a pointer the real data. - * So these buffers must be big enough to hold the column content. No size check is performed. - * - * - For strings, only the real string is copied. - * - For Raws, the number of bytes copied is the column size - * - * @warning - * Input parameters for formatted function only support a restricted set of data types ! - * - * Supported input identifiers : - * - * - '%s' : (otext *) ----------> input string (quotes are added) - * - '%m' : (otext *) ----------> meta data string (no quotes added) - * - '%t' : (OCI_Date *) -------> Date - * - '%p' : (OCI_Timestamp *) --> timestamp - * - '%v' : (OCI_Interval *) ---> Interval - * - '%i' : (int) --------------> signed 32 bits integer - * - '%u' : (unsigned int) -----> unsigned 32 bits integer - * - '%li' : (big_int) ----------> signed 64 bits integer - * - '%lu' : (big_uint) ---------> unsigned 64 bits integer - * - '%hi' : (short) ------------> signed 16 bits integer - * - '%hu' : (unsigned short) ---> unsigned 16 bits integer - * - '%g' : (double, float ) ---> Numerics - * - '%n' : (OCI_Number *) -----> Number - * - '%r' : (OCI_Ref *) --------> Reference - * - '%o' : (OCI_Object *) -----> Object (not implemented yet) - * - '%c' : (OCI_Coll *) -------> collection (not implemented yet) - * - * @par Example - * @include format.c - * - */ - -/** - * @brief - * Perform 3 calls (prepare+execute+fetch) in 1 call - * - * @param con - Connection handle - * @param sql - SQL statement - * @param ... - List of program variables address to store the result of fetch operation - * - * @note - * Every output parameter MUST be preceded by an integer parameter that indicates the type - * of the placeholder in order to handle correctly the given pointer. - * - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_Immediate -( - OCI_Connection *con, - const otext *sql, - ... -); - -/** - * @brief - * Performs 4 call (prepare+bind+execute+fetch) in 1 call - * - * @param con - Connection handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL followed by the - * output variables addresses for the fetch operation - * - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_ImmediateFmt -( - OCI_Connection *con, - const otext *sql, - ... -); - -/** - * @brief - * Prepare a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_PrepareFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Execute a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @return - * TRUE on success otherwise FALSE - * - * @warning - * If a SQL warning occurs: - * - the function returns TRUE - * - the SQL warning triggers the global error handler with an OCI_Error having its OCI_ErrorGetType() - * attribute set to OCI_ERR_WARNING - * - If OCILIB is initialized with the OCI_ENV_CONTEXT mode, OCI_GetLastError() will return the OCI_Error - * object corresponding to the warning - * - */ - -OCI_EXPORT boolean OCI_ExecuteStmtFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Parse a formatted SQL statement or PL/SQL block. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @note - * This call sends the SQL or PL/SQL command to the server for parsing only. - * The command is not executed. - * This call is only useful to check is a command is valid or not. - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to parse its SQL or PL/SQL command. - * OCI_Execute() can be call after OCI_ParseFmt() in order to execute the - * statement, which means that the server will re-parse again the command. - * - * @warning - * Do not use OCI_ParseFmt() unless you're only interested in the parsing result - * because the statement will be parsed again when executed and thus leading to - * unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_ParseFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @brief - * Describe the select list of a formatted SQL select statement. - * - * @param stmt - Statement handle - * @param sql - SQL statement - * @param ... - List of program values to format the SQL - * - * @note - * This call sends the SELECT SQL order to the server for retrieving the - * description of the select order only. - * The command is not executed. - * This call is only useful to retrieve information on the associated resultset - * Call OCI_GetResultet() after OCI_Describe() to access to SELECT list - * information - * - * @note - * This call prepares the statement (internal call to OCI_Prepare()) and ask - * the Oracle server to describe the output SELECT list. - * OCI_Execute() can be call after OCI_Desbribe() in order to execute the - * statement, which means that the server will parse, and describe again the SQL - * order. - * - * @warning - * Do not use OCI_Desbribe() unless you're only interested in the resultset - * information because the statement will be parsed again when executed and thus - * leading to unnecessary server round-trips and less performance - * - * @return - * TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_DescribeFmt -( - OCI_Statement *stmt, - const otext *sql, - ... -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiHashTables Hash tables - * @{ - * - * OCILIB uses hash tables internally for index/name columns mapping. - * - * OCILIB makes public its hash tables implementation public for general purpose - * uses. - * - * OCI_HashTable objects manage string keys / values that can be : - * - * - integers - * - strings - * - pointers - * - * This hash table implementation : - * - * - handle collisions - * - allows multiple values per key - * - * @par Internal conception - * - * - The hash table is composed of an array of slots. - * - Each slot can hold a linked list of entries (one per key) - * - Each entry can hold a linked list of values - * - * @note - * - The internal hash function computes the index in the array where the entry - * has to be inserted/looked up. - * - * - * @note - * Collisions are handled by chaining method. - * - * @include hash.c - * - */ - -/** - * @brief - * Create a hash table - * - * @param size - size of the hash table - * @param type - type of the hash table - * - * @note - * Parameter can be one of the following values : - * - * - OCI_HASH_STRING : string values - * - OCI_HASH_INTEGER : integer values - * - OCI_HASH_POINTER : pointer values - * - * @return - * Hash handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_HashTable * OCI_API OCI_HashCreate -( - unsigned int size, - unsigned int type -); - -/** - * @brief - * Destroy a hash table - * - * @param table - Table handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashFree -( - OCI_HashTable *table -); - -/** - * @brief - * Return the size of the hash table - * - * @param table - Table handle - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_HashGetSize -( - OCI_HashTable *table -); - -/** - * @brief - * Return the type of the hash table - * - * @param table - Table handle - * - * @note - * the return value can be one of the following values : - * - * - OCI_HASH_STRING : string values - * - OCI_HASH_INTEGER : integer values - * - OCI_HASH_POINTER : pointer values - * - * @return - * Hash table data type or OCI_UNKNOWN the input handle is NULL - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_HashGetType -( - OCI_HashTable *table -); - -/** - * @brief - * Add a pair string key / string value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - string value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddString -( - OCI_HashTable *table, - const otext *key, - const otext *value -); - -/** - * @brief - * Return the string value associated to the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored string associated with the key otherwise NULL - * - */ - -OCI_EXPORT const otext * OCI_API OCI_HashGetString -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Adds a pair string key / integer value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - Integer value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddInt -( - OCI_HashTable *table, - const otext *key, - int value -); - -/** - * @brief - * Return the integer value associated to the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored integer associated with the key otherwise 0 - * - */ - -OCI_EXPORT int OCI_API OCI_HashGetInt -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Adds a pair string key / pointer value to the hash table - * - * @param table - Table handle - * @param key - String key - * @param value - Pointer value - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_HashAddPointer -( - OCI_HashTable *table, - const otext *key, - void *value -); - -/** - * @brief - * Return a pointer associated with the given key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Stored pointer associated with the key otherwise NULL - * - */ - -OCI_EXPORT void * OCI_API OCI_HashGetPointer -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Lookup for an entry matching the key in the table - * - * @param table - Table handle - * @param key - String key - * @param create - Do create the entry if not exists - * - * @return - * Entry handle if key found/added otherwise NULL - * - */ - -OCI_EXPORT OCI_HashEntry * OCI_API OCI_HashLookup -( - OCI_HashTable *table, - const otext *key, - boolean create -); - -/** - * @brief - * Return the first hash slot that matches the key - * - * @param table - Table handle - * @param key - String key - * - * @return - * Slot handle if key found otherwise NULL - * - */ - -OCI_EXPORT OCI_HashValue * OCI_API OCI_HashGetValue -( - OCI_HashTable *table, - const otext *key -); - -/** - * @brief - * Return the entry slot of the hash table internal list at the given position - * - * @param table - Table handle - * @param index - index - * - * @warning - * Index start at at - * - * @return - * Slot handle otherwise NULL - * - */ - -OCI_EXPORT OCI_HashEntry * OCI_API OCI_HashGetEntry -( - OCI_HashTable *table, - unsigned int index -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiThreading Threads and mutexes - * @{ - * - * Oracle proposes a portable implementation of Mutex and Thread objects - * - * OCILIB implements these OCI features for portable multi-threading support. - * - * Mutexes are designed for mutual exclusion between thread in order to lock resources temporarily - * - * Thread keys can be seen as process-wide variables that have a thread-specific - * values. It allows to create a unique key identified by a name (string) that - * can store values specific to each thread. - * - * OCILIB exposes the types OCI_Mutex, OCI_Thread - * - * @warning - * OCILIB MUST be initialized with OCI_ENV_THREADED to enable threads support - * - * @warning - * OCI_Thread relies on Oracle API which uses natives threading capabilities of - * the supported platform - * - * @warning - * Using OCI_Mutex : - * - On Microsoft Windows, a thread can call OCI_MutexAcquire() more than once - * without any blocking. Just be sure that there is an OCI_MutexRelease() for - * every OCI_MutexAcquire() call - * - On Unix systems, a thread MUST call OCI_MutexRelease() after every call to - * OCI_MutexAcquire() in order to be able to call OCI_MutexAcquire() again. If - * not, it will be blocked... - * - * @par Example - * @include thread.c - * - */ - -/** - * @brief - * Create a Mutex object - * - * @return - * Mutex handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Mutex * OCI_API OCI_MutexCreate -( - void -); - -/** - * @brief - * Destroy a mutex object - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexFree -( - OCI_Mutex *mutex -); - -/** - * @brief - * Acquire a mutex lock - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexAcquire -( - OCI_Mutex *mutex -); - -/** - * @brief - * Release a mutex lock - * - * @param mutex - Mutex handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MutexRelease -( - OCI_Mutex *mutex -); - -/** - * @brief - * Create a Thread object - * - * @return - * Thread handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Thread * OCI_API OCI_ThreadCreate -( - void -); - -/** - * @brief - * Destroy a thread object - * - * @param thread - Thread handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadFree -( - OCI_Thread *thread -); - -/** - * @brief - * Execute the given routine within the given thread object - * - * @param thread - Thread handle - * @param proc - routine to execute - * @param arg - parameter to pass to the routine - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadRun -( - OCI_Thread *thread, - POCI_THREAD proc, - void *arg -); - -/** - * @brief - * Join the given thread - * - * @param thread - Thread handle - * - * @note - * This function waits for the given thread to finish - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadJoin -( - OCI_Thread *thread -); - -/** - * @brief - * Create a thread key object - * - * @param name - Thread key name - * @param destfunc - Thread key value destructor function - * - * @note - * Parameter proc is optional. It's called when the thread terminates to allow - * the program to deal with the thread specific value of the key - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadKeyCreate -( - const otext *name, - POCI_THREADKEYDEST destfunc -); - -/** - * @brief - * Set a thread key value - * - * @param name - Thread key name - * @param value - user value to set - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_ThreadKeySetValue -( - const otext *name, - void *value -); - -/** - * @brief - * Get a thread key value - * - * @param name - Thread key name - * - * @return - * Thread key value on success otherwise FALSE - * - */ - -OCI_EXPORT void * OCI_API OCI_ThreadKeyGetValue -( - const otext *name -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApidirectPath Direct Path loading - * @{ - * - * OCILIB (from version 3.2.0) support the OCI direct Path API. - * - * Actual implementation of direct path API does not support the following - * elements : - * - Objects data types (User Defined Types and Object References) - * - Object tables - * - Nested tables - * - SQL String functions - * - * All scalar data types (numerics, characters and date/time), including LOBs - * and LONG types are supported - * - * @par Oracle direct API features (from Oracle Documentation) - * - * The direct path load interface allows an application to access the direct path - * load engine of the Oracle database server to perform the functions of the - * Oracle SQL*Loader utility. - * This functionality provides the ability to load data from external files - * into Oracle database objects, either a table or a partition of a partitioned - * table. - * The OCI direct path load interface has the ability to load multiple rows by - * loading a direct path stream which contains data for multiple rows. - * - * @par Oracle direct API limitation (from Oracle Documentation) - * The direct path load interface has the following limitations which are the - * same as SQL*Loader: - * - triggers are not supported - * - check constraints are not supported - * - referential integrity constraints are not supported - * - clustered tables are not supported - * - loading of remote objects is not supported - * - user-defined types are not supported - * - LOBs must be specified after all scalar columns - * - LONGs must be specified last - * - * @warning - * - * Its recommended to use direct path interface with an Oracle client that is - * the same version than the database. With version < 10g, it is mandatory - * regarding that it causes segmentation faults and it's known from Oracle that - * advices to use the same version for client and server (see metalink KB) - * - * @par How to use direct path - * - * - 1 : Create a direct path handle with OCI_DirPathCreate() - * - 2 : Set (optional) some direct path load attributes - * - 3 : Describe the columns to load with OCI_DirPathSetColumn() - * - 4 : Populate data with OCI_DirPathSetEntry() - * - 5 : Convert the data with OCI_DirPathConvert() - * - 6 : Load the data into the database with OCI_DirPathLoad() - * - 7 : Repeat step 4,5,6 + reset the stream with OCI_DirPathReset() until all - * rows has been loaded - * - 8 : Commit the load with OCI_DirPathFinish() - * - 9 : Free the direct path handle with OCI_DirPathFree() - * - * @par Example - * @include dirpath.c - * - */ - -/** - * @brief - * Create a direct path object - * - * @param typinf - Table type info handle - * @param partition - Partition name - * @param nb_cols - Number of columns to load - * @param nb_rows - Maximum of rows to handle per load operation - * - * @note - * Retrieve the table type info handle with OCI_TypeInfoGet(). - * The partition name is not mandatory - * - * @note - * Parameter 'nb_rows' is ignored for Oracle 8i. Prior to Oracle 9i, it's the - * OCI client that decides of the number of rows to process per convert/load calls. - * From Oracle 9i, OCI allows application to specify this value. Note that, the - * OCI client might not accept the input value. After OCI_DirPathPrepare() has - * been successfully called, OCI_DirPathGetMaxRows() returns the final number - * of rows used for the given direct path operation. - * - * @return - * Return the direct path handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_DirPath * OCI_API OCI_DirPathCreate -( - OCI_TypeInfo *typinf, - const otext *partition, - unsigned int nb_cols, - unsigned int nb_rows -); - -/** - * @brief - * Free an OCI_DirPath handle - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ -OCI_EXPORT boolean OCI_API OCI_DirPathFree -( - OCI_DirPath *dp -); - -/** - * @brief - * Describe a column to load into the given table - * - * @param dp - Direct path Handle - * @param index - Column index - * @param name - Column name - * @param maxsize - Maximum input value size for a column entry - * @param format - Date or numeric format to use - * - * @note - * An error is thrown if : - * - If the column specified by the 'name' parameter is not found in the table - * referenced by the type info handle passed to OCI_DirPathCreate() - * - the index is out of bounds (= 0 or >= number of columns) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetColumn -( - OCI_DirPath *dp, - unsigned int index, - const otext *name, - unsigned int maxsize, - const otext *format -); - -/** - * @brief - * Prepares the OCI direct path load interface before any rows can be converted - * or loaded - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathPrepare -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the value of the given row/column array entry - * - * @param dp - Direct path Handle - * @param row - Row index - * @param index - Column index - * @param value - Value to set - * @param size - Size of the input value - * @param complete - Is the entry content fully provided ? - * - * @note - * Rows and columns indexes start at 1. - * - * @note - * The 'size' parameter is expressed in number of : - * - bytes for binary columns - * - characters for other columns - * - * @note - * Direct path support piece loading for LONGs and LOBs columns. When filling - * these columns, it's possible to provide input buffer piece by piece. In order - * to do so : - * - set the 'complete' parameter to FALSE - * - set the 'size' parameter to the piece size - * - Repeat calls to OCI_DirPathSetEntry() until the data is totally provided - * - The last call that set the last piece or an entry must specify the value - * TRUE for the 'complete' parameter - * - * @warning - * Current Direct Path OCILIB implementation DOES NOT support setting entry - * content piece by piece as mentioned above. It was planned in the original design - * but not supported yet. So, always set the complete parameter to TRUE. - * Setting entries content piece by piece may be supported in future releases - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetEntry -( - OCI_DirPath *dp, - unsigned int row, - unsigned int index, - void *value, - unsigned size, - boolean complete -); - -/** - * @brief - * Convert provided user data to the direct path stream format - * - * @param dp - Direct path Handle - * - * @return - * Possible return values : - * - OCI_DPR_COMPLETE : load has been successful - * - OCI_DPR_ERROR : an error happened while loading data - * - OCI_DPR_FULL : the internal stream is full - * - OCI_DPR_PARTIAL : a column hasn't been fully filled yet - * - OCI_DPR_EMPTY : no data was found to convert - * - * @note - * - When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() stops when - * any error is encountered and returns OCI_DPR_ERROR - * - When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() does not stop - * on errors. Instead it discards any erred rows and returns OCI_DPR_COMPLETE once - * all rows are processed. - * - * @note - * List of faulted rows and columns can be retrieved using OCI_DirPathGetErrorRow() and - * OCI_DirPathGetErrorColumn() - * - * @note - * OCI_DirPathGetAffectedRows() returns the number of rows converted in the last call. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathConvert -( - OCI_DirPath *dp -); - -/** - * @brief - * Loads the data converted to direct path stream format - * - * @param dp - Direct path Handle - * - * @return - * Possible return values : - * - OCI_DPR_COMPLETE : conversion has been successful - * - OCI_DPR_ERROR : an error happened while converting data - * - OCI_DPR_FULL : the internal stream is full - * - OCI_DPR_PARTIAL : a column hasn't been fully filled yet - * - OCI_DPR_EMPTY : no data was found to load - * - * @note - * List of faulted rows can be retrieved using OCI_DirPathGetErrorRow() - * - * @note - * OCI_DirPathGetAffectedRows() returns the number of rows successfully loaded in the last call. - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathLoad -( - OCI_DirPath *dp -); - -/** - * @brief - * Reset internal arrays and streams to prepare another load - * - * @param dp - Direct path Handle - * - * @note - * Once some data have been converted or loaded, OCI_DirPathReset() resets - * internal OCI structures in order to prepare another load operation - * (set entries, convert and load) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathReset -( - OCI_DirPath *dp -); - -/** - * @brief - * Terminate a direct path operation and commit changes into the database - * - * @param dp - Direct path Handle - * - * @warning - * The direct path handle cannot be used anymore after this call for any more - * loading operations and must be freed with OCI_DirPathFree(). - * - * @note - * Some properties functions of the direct path handle, such as - * OCI_DirPathGetRowCount() can be called on a terminated direct path handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathFinish -( - OCI_DirPath *dp -); - -/** - * @brief - * Terminate a direct path operation without committing changes - * - * @param dp - Direct path Handle - * - * @note - * Any pending loaded data are canceled. - * Any load completion operations, such as index maintenance operations, are not performed. - * - * @warning - * The direct path handle cannot be used anymore after this call for any more - * loading operations and must be freed with OCI_DirPathFree(). - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathAbort -( - OCI_DirPath *dp -); - -/** - * @brief - * Execute a data save-point (server side) - * - * @param dp - Direct path Handle - * - * @note - * Executing a data save-point is not allowed for LOBs - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSave -( - OCI_DirPath *dp -); - -/** - * @brief - * Flushes a partially loaded row from server - * - * @param dp - Direct path Handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathFlushRow -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the current number of rows to convert and load - * - * @param dp - Direct path Handle - * @param nb_rows - Number of row to process - * - * @warning - * An OCILIB error will be thrown if the value exceeds the maximum number of - * rows in the internals arrays - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetCurrentRows -( - OCI_DirPath *dp, - unsigned int nb_rows -); - -/** - * @brief - * Return the current number of rows used in the OCILIB internal - * arrays of rows - * - * @param dp - Direct path Handle - * - * @return - * Internal current array size on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetCurrentRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the maximum number of rows allocated in the OCI and OCILIB - * internal arrays of rows - * - * @param dp - Direct path Handle - * - * @return - * Internal maximum array size on SUCCESS otherwise 0 - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetMaxRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Set the default date format string for input conversion - * - * @param dp - Direct path Handle - * @param format - date format - * - * @note - * For string to date conversion, Oracle uses : - * - Column date format - * - Default date format (modified by this call) - * - Default global support environment setting - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetDateFormat -( - OCI_DirPath *dp, - const otext *format -); - -/** - * @brief - * Set the parallel loading mode - * - * @param dp - Direct path Handle - * @param value - enable/disable parallel mode - * - * @note - * Default value is FALSE. - * - * @note - * Setting the value to TRUE allows multiple load sessions to load the same - * segment concurrently - * - * @par Parallel loading mode (From Oracle documentation) - * - * A direct load operation requires that the object being loaded is locked to - * prevent DML on the object. - * Note that queries are lock-free and are allowed while the object is being loaded. - * - For a table load, if the option is set to: - * - FALSE, then the table DML X-Lock is acquired. - * - TRUE, then the table DML S-Lock is acquired. - * - For a partition load, if the option is set to: - * - FALSE, then the table DML SX-Lock and partition DML X-Lock is acquired. - * - TRUE, then the table DML SS-Lock and partition DML S-Lock is acquired. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetParallel -( - OCI_DirPath *dp, - boolean value -); - -/** - * @brief - * Set the logging mode for the loading operation - * - * @param dp - Direct path Handle - * @param value - enable/disable logging - * - * @par Logging mode (from Oracle Documentation) - * - * The NOLOG attribute of each segment determines whether image redo or - * invalidation redo is generated: - * - FALSE : Use the attribute of the segment being loaded. - * - TRUE : No logging. Overrides DDL statement, if necessary. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetNoLog -( - OCI_DirPath *dp, - boolean value -); - -/** - * @brief - * Set number of elements in the date cache - * - * @param dp - Direct path Handle - * @param size - Buffer size - * - * @note - * Default value is 0. - * - * @note - * Setting the value to 0 disables the cache - * - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetCacheSize -( - OCI_DirPath *dp, - unsigned int size -); - -/** - * @brief - * Set the size of the internal stream transfer buffer - * - * @param dp - Direct path Handle - * @param size - Buffer size - * - * @note - * Default value is 64KB. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetBufferSize -( - OCI_DirPath *dp, - unsigned int size -); - -/** - * @brief - * Set the direct path conversion mode - * - * @param dp - Direct path Handle - * @param mode - Conversion mode - * - * @note - * Possible values for parameter 'mode' : - * - OCI_DCM_DEFAULT : conversion fails on error - * - OCI_DCM_FORCE : conversion does not fail on error - * - * @note - * See OCI_DirPathConvert() for conversion mode details - * - * @note - * Default value is OCI_DCM_DEFAULT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DirPathSetConvertMode -( - OCI_DirPath *dp, - unsigned int mode -); - -/** - * @brief - * Return the number of rows successfully loaded into the database so far - * - * @param dp - Direct path Handle - * - * @note - * Insertions are committed with OCI_DirPathFinish() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetRowCount -( - OCI_DirPath *dp -); - -/** - * @brief - * return the number of rows successfully processed during in the last - * conversion or loading call - * - * @param dp - Direct path Handle - * - * @note - * This function called after : - * - * - OCI_DirPathConvert(), returns the number of converted rows - * - OCI_DirPathload(), returns the number of loaded rows - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetAffectedRows -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the index of a column which caused an error during data conversion - * - * @param dp - Direct path Handle - * - * @warning - * Direct path column indexes start at 1. - * - * @note - * Errors may happen while data is converted to direct path stream format - * using OCI_DirPathConvert(). - * When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() returns - * OCI_DPR_ERROR on error. OCI_DirPathGetErrorColumn() returns the column index - * that caused the error - * When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() returns - * OCI_DPR_COMPLETE even on errors. In order to retrieve the list of all column - * indexes that have erred, the application can call OCI_DirPathGetErrorColumn() - * repeatedly until it returns 0. - * - * @note - * The internal value is reset to 0 when calling OCI_DirPathConvert() - * - * @return - * 0 is no error occurs otherwise the index of the given column which caused an - * error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetErrorColumn -( - OCI_DirPath *dp -); - -/** - * @brief - * Return the index of a row which caused an error during data conversion - * - * @param dp - Direct path Handle - * - * @warning - * Direct path row indexes start at 1. - * - * @note - * Errors may happen : - * - while data is converted to direct path stream format using OCI_DirPathConvert() - * - while data is loaded to database using OCI_DirPathLoad() - * - * @note - * When using conversion mode OCI_DCM_DEFAULT, OCI_DirPathConvert() returns - * OCI_DPR_ERROR on error. OCI_DirPathGetErrorRow() returns the row index that - * caused the error. - * When using conversion mode OCI_DCM_FORCE, OCI_DirPathConvert() returns - * OCI_DPR_COMPLETE even on errors. In order to retrieve the list of all row - * indexes that have erred, the application can call OCI_DirPathGetErrorRow() - * repeatedly until it returns 0. - * - * @note - * After a call to OCI_DirPathLoad(), in order to retrieve the list of all faulted rows - * indexes, the application can call OCI_DirPathGetErrorRow() repeatedly until it returns 0. - * - * @note - * The internal value is reset to 0 when calling OCI_DirPathConvert(), - * OCI_DirPathReset() or OCI_DirPathLoad() - * - * @return - * 0 is no error occurs otherwise the index of the given row which caused an - * error - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DirPathGetErrorRow -( - OCI_DirPath *dp -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiAdvancedQueuing Oracle Advanced Queuing (A/Q) - * @{ - * - * OCILIB supports Oracle Advanced Queues features - * - * Let's Oracle talk about this features ! - * - * @par Oracle Queues (from Oracle Streams - Advanced Queuing User's Guide) - * - * Oracle Streams AQ provides database-integrated message queuing functionality. - * It is built on top of Oracle Streams and leverages the functions of Oracle - * Database so that messages can be stored persistently, propagated between - * queues on different computers and databases, and transmitted using Oracle - * Net Services and HTTP(S). - * Because Oracle Streams AQ is implemented in database tables, all operational - * benefits of high availability, scalability, and reliability are also - * applicable to queue data. Standard database features such as recovery, - * restart, and security are supported by Oracle Streams AQ. You can use - * database development and management tools such as Oracle Enterprise Manager - * to monitor queues. Like other database tables, queue tables can be imported - * and exported. - * - * @par OCILIB implementation - * - * OCILIB provides a (nearly) full C implementation of Advanced Queues available in - * Oracle OCI and proposes the following data types : - * - OCI_Msg : Implementation of message to enqueue/dequeue from/to queues - * - OCI_Enqueue : Implementation of enqueuing process - * - OCI_Dequeue : Implementation of dequeuing process - * - OCI_Agent : Implementation of Advanced queues Agents - * - * OCILIB support AQ messages notification with Oracle Client 10gR2 or above - * - * Note that the only AQ features not supported yet by OCILIB are : - * - Payloads of type AnyData - * - Enqueuing/dequeuing arrays of messages - * - Optional delivery mode introduced in 10gR2 - * - * OCILIB provides as well a C API to administrate queues and queue tables initially - * reserved to PL/SQL and Java (wrappers around PL/SQL calls). - * This API, based on internal PL/SQL calls wrapping the DBMS_AQADM packages procedures, allow the - * following actions : - * - create, alter, drop and purge queue tables (OCI_QueueTableXXX calls) - * - create, alter, drop, start, stop queues (OCI_QueueXXX calls) - * - * Note that the user connected to the database needs particular privileges to manipulate or - * administrate queues (See Oracle Streams - Advanced Queuing User's Guide for more informations - * on these privileges) - * - *@par Example - * @include queue.c - * - */ - -/** - * @brief - * Create a message object based on the given payload type - * - * @param typinf - Type info handle - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @warning - * Newly created Message handles have NULL payloads. - * For Message handling Objects payloads, OCI_MsgGetObject() returns NULL until an object handle is - * assigned to the message. - * - * @note - * When a local OCI_Msg handle is enqueued, it keeps its attributes. If it's enqueued again, another - * identical message is posted into the queue. - * To reset a message and empty all its properties, call OCI_MsgReset() - * Note that OCI_MsgReset() clears the message payload. - * - * @return - * Return the message handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Msg * OCI_API OCI_MsgCreate -( - OCI_TypeInfo *typinf -); - -/** - * @brief - * Free a message object - * - * @param msg - Message handle - * - * @warning - * Only message handles created with OCI_MsgCreate() should be freed by OCI_MsgFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgFree -( - OCI_Msg *msg -); - -/** - * @brief - * Reset all attributes of a message object - * - * @param msg - Message handle - * - * @note - * This function calls OCI_MsgSetxxx() with default or NULL attributes - * - * @warning - * OCI_MsgReset() clears the message payload and set it to NULL - * For messages handling objects payloads, OCI_MsgSetObject() must be called again to assign a - * payload. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgReset -( - OCI_Msg *msg -); - -/** - * @brief - * Get the object payload of the given message - * - * @param msg - Message handle - * - * @return - * Return the object handle on success otherwise NULL on failure or if payload is NULL - * - */ - -OCI_EXPORT OCI_Object * OCI_API OCI_MsgGetObject -( - OCI_Msg *msg -); - -/** - * @brief - * Set the object payload of the given message - * - * @param msg - Message handle - * @param obj - Object handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetObject -( - OCI_Msg *msg, - OCI_Object *obj -); - -/** - * @brief - * Get the RAW payload of the given message - * - * @param msg - Message handle - * @param raw - Input buffer - * @param size - Input buffer maximum size - * - * @note - * On output, parameter 'size' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE on failure or if payload is object based. - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetRaw -( - OCI_Msg *msg, - void *raw, - unsigned int *size -); - -/** - * @brief - * Set the RAW payload of the given message - * - * @param msg - Message handle - * @param raw - Raw data - * @param size - Raw data size - * - * @return - * TRUE on success otherwise FALSE on failure or if payload is object based. - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetRaw -( - OCI_Msg *msg, - const void *raw, - unsigned int size -); - -/** - * @brief - * Return the number of attempts that have been made to dequeue the message - * - * @param msg - Message handle - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetAttemptCount -( - OCI_Msg *msg -); - -/** - * @brief - * Return the number of seconds that a message is delayed for dequeuing - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetEnqueueDelay() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetEnqueueDelay -( - OCI_Msg *msg -); - -/** - * @brief - * set the number of seconds to delay the enqueued message - * - * @param msg - Message handle - * @param value - Delay in seconds - * - * @note - * The delay represents the number of seconds after which a message is available for dequeuing. - * When the message is enqueued, its state is set to OCI_AMS_WAITING. - * When the delay expires, its state is set to OCI_AMS_READY. - * - * @note - * If parameter 'value' is set to zero (default value), the message will be immediately available - * for dequeuing - * - * @warning - * Dequeuing by Message ID overrides the delay specification. - * - * @warning - * Delaying processing requires the queue monitor to be started. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetEnqueueDelay -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * return the time the message was enqueued - * - * @param msg - Message handle - * - * @note - * Only use this function for message dequeued from queues - * - */ - -OCI_EXPORT OCI_Date * OCI_API OCI_MsgGetEnqueueTime -( - OCI_Msg *msg -); - -/** - * @brief - * Return the duration that the message is available for dequeuing - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetExpiration() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetExpiration -( - OCI_Msg *msg -); - -/** - * @brief - * set the duration that the message is available for dequeuing - * - * @param msg - Message handle - * @param value - duration in seconds - * - * @note - * This parameter is an offset from the delay (see OCI_MsgSetEnqueueDelay()) - * While waiting for expiration, the message state is set to OCI_AMS_READY. - * If the message is not dequeued before it expires, it will be moved to the exception queue - * with the state OCI_AMS_EXPIRED. - * - * @note - * If parameter 'value' is set to -1 (default value), the message will not expire - * - * @warning - * Expiration processing requires the queue monitor to be started. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetExpiration -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * Return the state of the message at the time of the dequeue - * - * @param msg - Message handle - * - * @return - * - OCI_UNKNOWN : the function has failed to get the message state - * - OCI_AMS_READY : the message is ready to be processed - * - OCI_AMS_WAITING : the message delay has not yet completed - * - OCI_AMS_PROCESSED : the message has been processed - * - OCI_AMS_EXPIRED : the message has moved to exception queue - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_MsgGetState -( - OCI_Msg *msg -); - -/** - * @brief - * Return the priority of the message - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetPriority() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_MsgGetPriority -( - OCI_Msg *msg -); - -/** - * @brief - * Set the priority of the message - * - * @param msg - Message handle - * @param value - Message priority - * - * @note - * - The priority can be any number, including negative numbers. - * - A smaller number indicates higher priority. - * - Default value is zero. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetPriority -( - OCI_Msg *msg, - int value -); - -/** - * @brief - * Return the ID of the message - * - * @param msg - Message handle - * @param id - Input buffer - * @param len - Input buffer maximum size - * - * @note - * The message ID is : - * - generated when the message is enqueued in the queue - * - retrieved when the message is dequeued from the queue - * - * @note - * On output, parameter 'len' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetID -( - OCI_Msg *msg, - void *id, - unsigned int *len -); - -/** - * @brief - * Return the original ID of the message in the last queue that generated this message - * - * @param msg - Message handle - * @param id - Input buffer - * @param len - Input buffer maximum size - * - * @warning - * When a message is propagated from/to different queues, this ID is the one generated for the - * message in the previous queue. - * - * @note - * On output, parameter 'len' holds the number of bytes copied into the given buffer - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgGetOriginalID -( - OCI_Msg *msg, - void *id, - unsigned int *len -); - -/** - * @brief - * Set the original ID of the message in the last queue that generated this message - * - * @param msg - Message handle - * @param id - Message ID - * @param len - Message ID size - * - * @warning - * When a message is propagated from/to different queues, this ID is the one generated for the - * message in the previous queue. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetOriginalID -( - OCI_Msg *msg, - const void *id, - unsigned int len -); - -/** - * @brief - * Return the original sender of a message - * - * @param msg - Message handle - * - * @return - * Sender Handle (OCI_Agent *) on success (if set at enqueue time) otherwise NULL - * - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_MsgGetSender -( - OCI_Msg *msg -); - -/** - * @brief - * Set the original sender of a message - * - * @param msg - Message handle - * @param sender - Message sender - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetSender -( - OCI_Msg *msg, - OCI_Agent *sender -); - -/** - * @brief - * Set the recipient list of a message to enqueue - * - * @param msg - Message handle - * @param consumers - Recipients list (array of agent handles) - * @param count - Number of recipients - * - * @warning - * This function should only be used for queues which allow multiple consumers. - * The default recipients are the queue subscribers. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetConsumers -( - OCI_Msg *msg, - OCI_Agent **consumers, - unsigned int count -); - -/** - * @brief - * Get the correlation identifier of the message - * - * @param msg - Message handle - * - * @note - * see OCI_MsgSetCorrelation() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_MsgGetCorrelation -( - OCI_Msg *msg -); - -/** - * @brief - * set the correlation identifier of the message - * - * @param msg - Message handle - * @param correlation - Message correlation text - * - * @note - * see OCI_DequeueSetCorrelation() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetCorrelation -( - OCI_Msg *msg, - const otext *correlation -); - -/** - * @brief - * Get the Exception queue name of the message - * - * @param msg - Message handle - * - * @warning - * When calling this function on a message retrieved with OCI_DequeueGet(), the returned value is - * NULL if the default exception queue associated with the current queue is used (e.g. no user - * defined specified at enqueue time for the message) - * - * @note - * see OCI_MsgSetExceptionQueue() for more details - * - */ -OCI_EXPORT const otext * OCI_API OCI_MsgGetExceptionQueue -( - OCI_Msg *msg -); - -/** - * @brief - * Set the name of the queue to which the message is moved to if it cannot be - * processed successfully - * - * @param msg - Message handle - * @param queue - Exception queue name - * - * @warning - * From Oracle Documentation : - * - * "Messages are moved into exception queues in two cases : - * - If the number of unsuccessful dequeue attempts has exceeded the attribute 'max_retries' of - * given queue - * - if the message has expired. - * - * All messages in the exception queue are in the EXPIRED state. - * - * The default is the exception queue associated with the queue table. - * - * If the exception queue specified does not exist at the time of the move the message will be - * moved to the default exception queue associated with the queue table and a warning will be - * logged in the alert file. - * - * This attribute must refer to a valid queue name." - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_MsgSetExceptionQueue -( - OCI_Msg *msg, - const otext *queue -); - -/** - * @brief - * Create a Enqueue object for the given queue - * - * @param typinf - Type info handle - * @param name - Queue name - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload to enqueue to the given queue : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @return - * Return the Enqueue handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Enqueue * OCI_API OCI_EnqueueCreate -( - OCI_TypeInfo *typinf, - const otext *name -); - -/** - * @brief - * Free a Enqueue object - * - * @param enqueue - Enqueue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueFree -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Enqueue a message on the queue associated to the Enqueue object - * - * @param enqueue - Enqueue handle - * @param msg - Message handle to enqueue - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueuePut -( - OCI_Enqueue *enqueue, - OCI_Msg *msg -); - -/** -* @brief -* Set the enqueuing sequence of messages to put in the queue -* -* @param enqueue - Enqueue handle -* @param sequence - enqueuing sequence -* -* @note -* Possible values for parameter 'sequence' : -* - OCI_ASD_BEFORE : enqueue message before another message -* - OCI_ASD_TOP : enqueue message before all messages -* -* @note -* Default value is OCI_ASD_TOP -* -* @note -* if the parameter 'sequence' is set to OCI_ASD_BEFORE, the application must -* call OCI_EnqueueSetRelativeMsgID() before enqueuing the next message in the queue. -* -* @note -* In order to stop enqueuing message using a sequence deviation, call -* OCI_EnqueueSetSequenceDeviation() with the value OCI_ASD_TOP -* -* @return -* TRUE on success otherwise FALSE -* -*/ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetSequenceDeviation -( - OCI_Enqueue *enqueue, - unsigned int sequence -); - -/** - * @brief - * Return the sequence deviation of messages to enqueue to the queue - * - * @param enqueue - Enqueue handle - * - * @note - * see OCI_EnqueueSetSequenceDeviation() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EnqueueGetSequenceDeviation -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Set whether the new message is enqueued as part of the current transaction - * - * @param enqueue - Enqueue handle - * @param visibility - Enqueuing visibility - * - * @note - * Possible values for parameter 'visibility' : - * - OCI_AMV_IMMEDIATE : enqueue is an independent transaction - * - OCI_AMV_ON_COMMIT : enqueue is part of current transaction - * - * @note - * Default value is OCI_AMV_ON_COMMIT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetVisibility -( - OCI_Enqueue *enqueue, - unsigned int visibility -); - -/** - * @brief - * Get the enqueuing/locking behavior - * - * @param enqueue - Enqueue handle - * - * @note - * see OCI_EnqueueSetVisibility() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EnqueueGetVisibility -( - OCI_Enqueue *enqueue -); - -/** - * @brief - * Set a message identifier to use for enqueuing messages using a sequence deviation - * - * @param enqueue - Enqueue handle - * @param id - message identifier - * @param len - pointer to message identifier length - * - * @note - * This call is only valid if OCI_EnqueueSetSequenceDeviation() has been called - * with the value OCI_ASD_BEFORE - * - * @warning - * if the function cannot assign the message id, the content of the parameter 'len' is set to zero. - * - * @note - * see OCI_EnqueueSetSequenceDeviation() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueSetRelativeMsgID -( - OCI_Enqueue *enqueue, - const void *id, - unsigned int len -); - -/** - * @brief - * Get the current associated message identifier used for enqueuing messages - * using a sequence deviation - * - * @param enqueue - Enqueue handle - * @param id - buffer to receive the message identifier - * @param len - pointer to buffer max length - * - * @warning - * When the function returns, parameter 'len' hold the number of bytes assigned to parameter 'id' - * - * @note - * see OCI_EnqueueGetRelativeMsgID() for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_EnqueueGetRelativeMsgID -( - OCI_Enqueue *enqueue, - void *id, - unsigned int *len -); - -/** - * @brief - * Create a Dequeue object for the given queue - * - * @param typinf - Type info handle - * @param name - Queue name - * - * @note - * OCILIB supports 2 type of message payload : - * - Oracle types (UDT) - * - RAW data - * - * @note - * Oracle Type AnyData is not supported in the current version of OCILIB - * - * @note - * the parameter 'typinf' indicates the type of payload to dequeue from the given queue : - * - For object payload, retrieve the object type information handle with - * OCI_TypeInfoGet() using the object type name - * - For RAW payload, you MUST pass the object type information retrieved with - * OCI_TypeInfoGet() using "SYS.RAW" as object type name - * - * @return - * Return the Dequeue handle on success otherwise NULL on failure - * - */ - -OCI_EXPORT OCI_Dequeue * OCI_API OCI_DequeueCreate -( - OCI_TypeInfo *typinf, - const otext *name -); - -/** - * @brief - * Free a Dequeue object - * - * @param dequeue - Dequeue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueFree -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Dequeue messages from the given queue - * - * @param dequeue - Dequeue handle - * - * @warning - * The returned message is handled by the dequeue object. - * Do not release it with OCI_MsgFree() - * - * @warning - * When dequeuing from a multiple consumer queue, you need - * to set the navigation mode to OCI_ADN_FIRST_MSG using - * OCI_DequeueSetNavigation() - * - * @return - * Message handle on success otherwise NULL on failure or on timeout - * - */ - -OCI_EXPORT OCI_Msg * OCI_API OCI_DequeueGet -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Subscribe for asynchronous messages notifications - * - * @param dequeue - Dequeue handle - * @param port - Port to use for notifications - * @param timeout - notification timeout - * @param callback - User handler callback fired when messages are ready to be dequeued - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * asynchronous messages notifications - * - * @note - * Requires Oracle Client 10gR2 or above - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSubscribe -( - OCI_Dequeue *dequeue, - unsigned int port, - unsigned int timeout, - POCI_NOTIFY_AQ callback -); - -/** - * @brief - * Unsubscribe for asynchronous messages notifications - * - * @param dequeue - Dequeue handle - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueUnsubscribe -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the current consumer name to retrieve message for. - * - * @param dequeue - Dequeue handle - * @param consumer - consumer name - * - * @warning - * If a queue is not set up for multiple consumers, OCI_DequeueSetConsumer() - * should not be called or called with parameter 'consumer' set to NULL - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetConsumer -( - OCI_Dequeue *dequeue, - const otext *consumer -); - -/** - * @brief - * Get the current consumer name associated with the dequeuing process. - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetConsumer() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_DequeueGetConsumer -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * set the correlation identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param pattern - correlation identifier - * - * @note - * Special pattern matching characters, such as "%" or "_" can be used. - * If more than one message satisfies the pattern, the order of dequeuing is undetermined. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetCorrelation -( - OCI_Dequeue *dequeue, - const otext *pattern -); - -/** - * @brief - * Get the correlation identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetCorrelation() for more details - * - */ - -OCI_EXPORT const otext * OCI_API OCI_DequeueGetCorrelation -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the message identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param id - message identifier - * @param len - size of the message identifier - * - * @warning - * if the function cannot assign the message id, the content of the parameter 'len' is set to zero. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetRelativeMsgID -( - OCI_Dequeue *dequeue, - const void *id, - unsigned int len -); - -/** - * @brief - * Get the message identifier of the message to be dequeued - * - * @param dequeue - Dequeue handle - * @param id - message identifier - * @param len - size of the message identifier - * - * @warning - * When the function returns, parameter 'len' hold the number of bytes assigned to parameter 'id' - * - * @note - * see OCI_DequeueSetRelativeMsgID() for more details - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueGetRelativeMsgID -( - OCI_Dequeue *dequeue, - void *id, - unsigned int *len -); - -/** - * @brief - * Set whether the new message is dequeued as part of the current transaction - * - * @param dequeue - Dequeue handle - * @param visibility - dequeuing mode - * - * @warning - * The visibility parameter is ignored when using the OCI_ADM_BROWSE dequeuing - * mode (see OCI_DequeueSetMode()) - * - * @note - * Possible values for parameter 'mode' : - * - OCI_AMV_IMMEDIATE : dequeue is an independent transaction - * - OCI_AMV_ON_COMMIT : dequeue is part of current transaction - * - * @note - * Default value is OCI_AMV_ON_COMMIT - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetVisibility -( - OCI_Dequeue *dequeue, - unsigned int visibility -); - -/** - * @brief - * Get the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetVisibility() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetVisibility -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * @param mode - dequeuing mode - * - * @note - * Possible values for parameter 'mode' : - * - OCI_ADM_BROWSE : read message without acquiring a lock - * - OCI_ADM_LOCKED : read and obtain write lock on message - * - OCI_ADM_REMOVE : read the message and delete it - * - OCI_ADM_REMOVE_NODATA : confirm receipt of the message, but do not - * deliver the actual message content - * - * @note - * Default value is OCI_ADM_REMOVE - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetMode -( - OCI_Dequeue *dequeue, - unsigned int mode -); - -/** - * @brief - * Get the dequeuing/locking behavior - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetMode() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetMode -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the position of messages to be retrieved. - * - * @param dequeue - Dequeue handle - * @param position - navigation position - * - * @note - * The dequeuing uses the following sequence : - * - find messages using the navigation position - * - apply search criteria (message correlation) - * - get message - * - * @note - * Possible values for parameter 'position' : - * - OCI_ADN_FIRST_MSG : retrieves the first message which is available - * - OCI_ADN_NEXT_MSG : retrieves the next message which is available - * - OCI_ADN_NEXT_TRANSACTION : skips the remainder of the current transaction - * group (if any) and retrieves the first message - * of the next transaction group. - * - * @note - * Default value is OCI_ADN_NEXT_MSG - * - * @warning - * OCI_ADN_NEXT_TRANSACTION can only be used if message grouping is enabled for the given queue. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetNavigation -( - OCI_Dequeue *dequeue, - unsigned int position -); - -/** - * @brief - * Return the navigation position of messages to retrieve from the queue - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetNavigation() for more details - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_DequeueGetNavigation -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * set the time that OCIDequeueGet() waits for messages if no messages are - * currently available - * - * @param dequeue - Dequeue handle - * @param timeout - timeout in seconds - * - *@note - * - Any positive values in seconds are valid. - * - The value 0 is accepted and means OCIDequeueGet() does not wait for - * messages and returns immediately if no messages are available - * - The value -1 is accepted and means OCIDequeueGet() waits for ever (until - * a message is available in the queue) - * - * @note - * Default value is -1 (wait for ever) - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetWaitTime -( - OCI_Dequeue *dequeue, - int timeout -); - -/** - * @brief - * Return the time that OCIDequeueGet() waits for messages if no messages are currently available - * - * @param dequeue - Dequeue handle - * - * @note - * see OCI_DequeueSetWaitTime() for more details - * - */ - -OCI_EXPORT int OCI_API OCI_DequeueGetWaitTime -( - OCI_Dequeue *dequeue -); - -/** - * @brief - * Set the Agent list to listen to message for - * - * @param dequeue - Dequeue handle - * @param consumers - Agent handle array - * @param count - Number of agents the array - * - * @return - * return TRUE on success otherwise FALSE - */ - -OCI_EXPORT boolean OCI_API OCI_DequeueSetAgentList -( - OCI_Dequeue *dequeue, - OCI_Agent **consumers, - unsigned int count -); - -/** - * @brief - * Listen for messages that match any recipient of the associated Agent list - * - * @param dequeue - Dequeue handle - * @param timeout - Timeout in second - * - * @note - * If an Agent handle is returned, messages are available for this agent. - * In order to retrieve its messages : - * - call OCI_DequeueSetConsumer() with the name of agent using OCI_AgentGetName() - * - call OCI_DequeueGet() to dequeue it's pending messages - * - * @warning - * The return value is valid only until: - * - OCIDequeueListen() is called again - * - OCI_DequeueFree( is called to free the Dequeue object - * So Do not store the handle value across calls to OCIDequeueListen() - * - * @return - * An Agent handle for who messages are available on success otherwise NULL - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_DequeueListen -( - OCI_Dequeue *dequeue, - int timeout -); - -/** - * @brief - * Create an AQ agent object - * - * @param con - Connection handle - * @param name - Agent name - * @param address - Agent address - * - * @note - * An AQ agent object is : - * - used as recipient information when enqueuing a message - * - used as sender information when dequeuing a message - * - used for listening message only from identified senders - * - * @note - * the AQ agent address can be any Oracle identifier, up to 128 bytes. - * the AQ agent name can be any Oracle identifier, up to 30 bytes. - * - * @return - * AQ agent handle on success otherwise NULL - * - */ - -OCI_EXPORT OCI_Agent * OCI_API OCI_AgentCreate -( - OCI_Connection *con, - const otext *name, - const otext *address -); - -/** - * @brief - * Free an AQ agent object - * - * @param agent - AQ agent handle - * - * @warning - * Only AQ agent handle created with OCI_AgentCreate() should be freed by OCI_AgentFree() - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentFree -( - OCI_Agent *agent -); - -/** - * @brief - * Set the given AQ agent name - * - * @param agent - AQ agent handle - * @param name - AQ agent name - * - * @note - * the AQ agent name is used to identified an message send or recipient when enqueuing/dequeuing - * a message - * - * @note - * the AQ agent name can be any Oracle identifier, up to 30 bytes. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentSetName -( - OCI_Agent *agent, - const otext *name -); - -/** - * @brief - * Get the given AQ agent name - * - * @param agent - AQ agent handle - * - * @return - * AQ agent name on success otherwise NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_AgentGetName -( - OCI_Agent *agent -); - -/** - * @brief - * Set the given AQ agent address - * - * @param agent - AQ agent handle - * @param address - AQ agent address - * - * @note - * the parameter 'address' must be of the form : [schema.]queue_name[\@dblink] - * - * @note - * the AQ agent address can be any Oracle identifier, up to 128 bytes. - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_AgentSetAddress -( - OCI_Agent *agent, - const otext *address -); - -/** - * @brief - * Get the given AQ agent address - * - * @param agent - AQ agent handle - * - * @note - * See OCI_AgentSetAddress() - * - * @return - * AQ agent address on success otherwise NULL on failure - * - */ - -OCI_EXPORT const otext * OCI_API OCI_AgentGetAddress -( - OCI_Agent *agent -); - -/** - * @brief - * Create a queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param queue_table - Queue table name - * @param queue_type - Queue type - * @param max_retries - Maximum number of attempts to dequeue a message - * @param retry_delay - Number of seconds between attempts to dequeue a message - * @param retention_time - number of seconds a message is retained in the queue table after - * being dequeued from the queue - * @param dependency_tracking - Parameter reserved for future use by Oracle (MUST be set to FALSE) - * @param comment - Description of the queue - * - * @note - * Parameter 'queue_name' can specify the schema where to create to queue ([schema.]queue_name) - * Queue names cannot be longer than 24 characters (Oracle limit for user queues) - * - * @note - * Possible values for parameter 'queue_type' : - * - OCI_AQT_NORMAL : Normal queue - * - OCI_AQT_EXCEPTION : Exception queue - * - OCI_AQT_NON_PERSISTENT : Non persistent queue - * - * To set default values, pass : - * - queue_type : OCI_AQT_NORMAL - * - max_retries : 0 - * - retry_delay : 0 - * - retention_time : 0 - * - comment : NULL - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.CREATE_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueCreate -( - OCI_Connection *con, - const otext *queue_name, - const otext *queue_table, - unsigned int queue_type, - unsigned int max_retries, - unsigned int retry_delay, - unsigned int retention_time, - boolean dependency_tracking, - const otext *comment -); - -/** - * @brief - * Alter the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param max_retries - Maximum number of attempts to dequeue a message - * @param retry_delay - Number of seconds between attempts to dequeue a message - * @param retention_time - number of seconds a message is retained in the queue table after - * being dequeued from the queue - * @param comment - Description of the queue - * - * @note - * See OCI_QueueCreate() for more details - * - * @warning - * This function updates all attributes handled in the parameter list ! - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.ALTER_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueAlter -( - OCI_Connection *con, - const otext *queue_name, - unsigned int max_retries, - unsigned int retry_delay, - unsigned int retention_time, - const otext *comment -); - -/** - * @brief - * Drop the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * - * @warning - * A queue can be dropped only if it has been stopped before. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.DROP_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueDrop -( - OCI_Connection *con, - const otext *queue_name -); - -/** - * @brief - * Start the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param enqueue - Enable enqueue - * @param dequeue - Enable dequeue - * - * @warning - * For exception queues, only enqueuing is allowed - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.START_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueStart -( - OCI_Connection *con, - const otext *queue_name, - boolean enqueue, - boolean dequeue -); - -/** - * @brief - * Stop enqueuing or dequeuing or both on the given queue - * - * @param con - Connection handle - * @param queue_name - Queue name - * @param enqueue - Disable enqueue - * @param dequeue - Disable dequeue - * @param wait - Wait for current pending enqueues/dequeues - * - * @warning - * A queue cannot be stopped if there are pending transactions against the queue. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.STOP_QUEUE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueStop -( - OCI_Connection *con, - const otext *queue_name, - boolean enqueue, - boolean dequeue, - boolean wait -); - -/** - * @brief - * Create a queue table for messages of the given type - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param queue_payload_type - Message type name - * @param storage_clause - Additional clauses for the table storage - * @param sort_list - Additional columns name to use for sorting - * @param multiple_consumers - Enable multiple consumers for each messages - * @param message_grouping - Specifies if messages are grouped within a transaction - * @param comment - Description of the queue table - * @param primary_instance - primary owner (instance) of the queue table - * @param secondary_instance - Owner of the queue table if the primary instance is not available - * @param compatible - lowest database version with which the queue table is compatible - * - * @note - * Parameter 'queue_table' can specify the schema where to create to queue table ([schema.]queue_table) - * Queue table names cannot be longer than 24 characters (Oracle limit for user queue tables) - * - * @note - * Possible values for parameter 'queue_payload_type' : - * - For Oracle types (UDT) : use the type name ([schema.].type_name) - * - For RAW data : use "SYS.RAW" or "RAW" - * - * @note - * Possible values for parameter 'message_grouping' : - * - OCI_AGM_NONE : each message is treated individually - * - OCI_AGM_TRANSACTIONNAL : all messages enqueued in one transaction are considered part of - * the same group and can be dequeued as a group of related messages. - * - * @note - * Possible values for parameter 'compatible' : - * - "8.0", "8.1", "10.0" - * - * To set default values, pass : - * - storage_clause : NULL - * - sort_list : NULL - * - message_grouping : OCI_AGM_NONE - * - comment : NULL - * - primary_instance : 0 - * - primary_instance : 0 - * - compatible : NULL - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.CREATE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableCreate -( - OCI_Connection *con, - const otext *queue_table, - const otext *queue_payload_type, - const otext *storage_clause, - const otext *sort_list, - boolean multiple_consumers, - unsigned int message_grouping, - const otext *comment, - unsigned int primary_instance, - unsigned int secondary_instance, - const otext *compatible -); - -/** - * @brief - * Alter the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param comment - Description of the queue table - * @param primary_instance - primary owner (instance) of the queue table - * @param secondary_instance - Owner of the queue table if the primary instance is not available - * - * @note - * See OCI_QueueTableCreate() from more details - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.ALTER_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableAlter -( - OCI_Connection *con, - const otext *queue_table, - const otext *comment, - unsigned int primary_instance, - unsigned int secondary_instance -); - -/** - * @brief - * Drop the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param force - Force the deletion of objects related to the queue table - * - * @note - * Possible values for 'force' : - * - TRUE : all queues using the queue table and their associated propagation schedules are - * dropped automatically - * - FALSE : All the queues using the given queue table must be stopped and dropped before the - * queue table can be dropped. - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.DROP_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableDrop -( - OCI_Connection *con, - const otext *queue_table, - boolean force -); - -/** - * @brief - * Purge messages from the given queue table - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param purge_condition - Optional SQL based conditions (see notes) - * @param block - Lock all queues using the queue table while doing the purge - * @param delivery_mode - Type of message to purge - * - * @note - * Possible values for parameter 'delivery_mode' : - * - OCI_APM_BUFFERED : purge only buffered messages - * - OCI_APM_PERSISTENT : purge only persistent messages - * - OCI_APM_ALL : purge all messages - * - * @note - * For more information about the SQL purge conditions, refer to - * Oracle Streams - Advanced Queuing User's Guide for more details - * - * @warning - * This feature is only available from ORacle 10gR2. - * This function does nothing and returns TRUE is the server version is < Oracle 10gR2 - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.PURGE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTablePurge -( - OCI_Connection *con, - const otext *queue_table, - const otext *purge_condition, - boolean block, - unsigned int delivery_mode -); - -/** - * @brief - * Migrate a queue table from one version to another - * - * @param con - Connection handle - * @param queue_table - Queue table name - * @param compatible - Database version with witch the queue table has to migrate - * - * @note - * Possible values for parameter 'compatible' : - * - "8.0", "8.1", "10.0" - * - * @note - * this call wraps the PL/SQL procedure DBMS_AQADM.MIGRATE_QUEUE_TABLE(). - * Refer to Oracle Streams - Advanced Queuing User's Guide for more details - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_QueueTableMigrate -( - OCI_Connection *con, - const otext *queue_table, - const otext *compatible -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiSubscriptions Database Change notifications (DCN or CQN) - * @{ - * - * OCILIB supports Oracle 10gR2 feature Database Change Notifications (DCN) - * also named Continuous Query Notifications (CQN) - * - * This features allows a client application to register notifications - * when some changes are made in a database : - * - Database status changes : startup and shutdown - * - Database objects changes : - * - DDL changes : alter or drop actions - * - DML changes : insert, delete, update actions - * - * This feature can be really useful in applications that hold - * a cache of data. Instead of refreshing data periodically by - * connecting to the server, the application could only refresh - * modified data when necessary or perform specific tasks depending on - * the events. It saves application time, network traffic and can help - * the design of the application logic. - * - * The database status change notification is also interesting to be - * informed of instance startup / shutdown - * - * Check Oracle documentation for more details about this feature - * - * @note - * No active database connection is required to receive the - * notifications as they are handled by the Oracle client using a - * dedicated socket connection to the server - * - * @par Database changes - * - * The client application can be notified of any database status - * change (single DB or multiple DB in a RAC environment). - * - * @par Object changes - * - * The notifications of object changes are based on the registration - * of a query ('select' SQL statement). - * - * Oracle server will notify of any changes of any object that is - * part of the statement result set. - * - * Registering a statement will notify about any changes on its - * result set rows performed after the registration of the query. - * - * The query can be a simple 'select * from table' or a complex - * query involving many tables and/or criteria in the where clause. - * - * For Object changes, the notification can be at : - * - At Object level : only the object name (schema + object) is given - * - At row level : same that object level + RowID of the altered row - * - * @warning - * Trying to use this features with a client/server version < 10gR2 will raise an error - * - * @par Example - * @include notification.c - * - */ - -/** - * @brief - * Register a notification against the given database - * - * @param con - Connection handle - * @param name - Notification name - * @param type - Subscription type - * @param handler - User handler callback - * @param port - Port to use for notifications - * @param timeout - notification timeout - * - * @note - * Parameter 'type' can be one of the following values : - * - * - OCI_CNT_OBJECTS : request for changes at objects (e.g. tables) level (DDL / DML) - * - OCI_CNT_ROWS : request for changes at rows level (DML) - * - OCI_CNT_DATABASES : request for changes at database level (startup, shutdown) - * - OCI_CNT_ALL : request for all changes - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * Requires Oracle Client 10gR2 or above - * - * @note - * Subscription handles are automatically managed by the library - * - * @return - * Subscription handle on success or NULL on failure - * - */ - -OCI_EXPORT OCI_Subscription * OCI_API OCI_SubscriptionRegister -( - OCI_Connection *con, - const otext *name, - unsigned int type, - POCI_NOTIFY handler, - unsigned int port, - unsigned int timeout -); - -/** - * @brief - * Unregister a previously registered notification - * - * @param sub - Subscription handle - * - * @note - * OCI_Cleanup() will automatically unregister any registered subscriptions - * - * @note - * If the database connection passed to OCI_SubscriptionRegister() - * has been closed by the time that the application calls - * OCI_SubscriptionUnregister, the library internally reconnects - * to the given database, performs the unregistration and then disconnects - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SubscriptionUnregister -( - OCI_Subscription *sub -); - -/** - * @brief - * Add a statement to the notification to monitor - * - * @param sub - Subscription handle - * @param stmt - Statement handle - * - * @note - * The given statement must be prepared but not executed before being passed to this function. - * OCI_SubscriptionAddStatement() executes the statement and register it for notifications - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * The given statement must hold a 'SELECT' SQL statement - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_SubscriptionAddStatement -( - OCI_Subscription *sub, - OCI_Statement *stmt -); - -/** - * @brief - * Return the name of the given registered subscription - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_SubscriptionGetName -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the port used by the notification - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_SubscriptionGetPort -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the timeout of the given registered subscription - * - * @param sub - Subscription handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_SubscriptionGetTimeout -( - OCI_Subscription *sub -); - -/** - * @brief - * Return the connection handle associated with a subscription handle - * - * @param sub - Subscription handle - * - * @note - * It may return a NULL handle if the connection used in OCI_SubscriptionRegister has been closed. - * - */ - -OCI_EXPORT OCI_Connection * OCI_API OCI_SubscriptionGetConnection -( -OCI_Subscription *sub -); - -/** - * @brief - * Return the type of event reported by a notification - * - * @param event - Event handle - * - * @note - * The returned value can be one of the following values : - * - * - OCI_ENT_STARTUP : a database has been started up - * - OCI_ENT_SHUTDOWN : a database has been shut down - * - OCI_ENT_SHUTDOWN_ANY : a database has been shut down (RAC) - * - OCI_ENT_DROP_DATABASE : a database has been dropped - * - OCI_ENT_DEREGISTER : the notification is timed out - * - OCI_ENT_OBJECT_CHANGED : a database object has been modified - * - * @note - * OCI_EventGetDatabase() returns the affected database - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * OCI_EventGetObject() returns the affected object - * ('schema_name'.'object_name') - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EventGetType -( - OCI_Event *event -); - -/** - * @brief - * Return the type of operation reported by a notification - * - * @param event - Event handle - * - * @note - * This call is only valid when OCI_EventGetType() reports the - * event type OCI_ENT_OBJECT_CHANGED - * - * @note - * The returned value can be one of the following values : - * - * - OCI_ONT_INSERT : an insert has been performed - * - OCI_ONT_UPDATE : an update has been performed - * - OCI_ONT_DELETE : a delete has been performed - * - OCI_ONT_ALTER : an alter has been performed - * - OCI_ONT_DROP : a drop has been performed - * - OCI_ONT_GENERIC : generic undefined action - * - * @note - * OCI_EventGetDatabase() returns the affected database - * - * @note - * OCI_EventGetObject() returns the affected object ('schema_name'.'object_name') - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - * @note - * if OCI_CNT_ROWS is passed to OCI_SubscriptionRegister(), - * the rowid of the altered row can be retrieved with OCI_EventGetRowid() - * - */ - -OCI_EXPORT unsigned int OCI_API OCI_EventGetOperation -( - OCI_Event *event -); - -/** - * @brief - * Return the name of the database that generated the event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetDatabase -( - OCI_Event *event -); - -/** - * @brief - * Return the name of the object that generated the event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetObject -( - OCI_Event *event -); - -/** - * @brief - * Return the rowid of the altered database object row - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT const otext * OCI_API OCI_EventGetRowid -( - OCI_Event *event -); - -/** - * @brief - * Return the subscription handle that generated this event - * - * @param event - Event handle - * - * @note - * OCI_ENV_EVENTS flag must be passed to OCI_Initialize() to be able to use - * subscriptions - * - */ - -OCI_EXPORT OCI_Subscription * OCI_API OCI_EventGetSubscription -( - OCI_Event *event -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiInstancesManagement Remote Instance startup/shutdown - * @{ - * - * OCILIB supports Oracle 11g client features for manipulating remote Oracle instances. - * - * Oracle instances (on the same computer or on a remote server) can be : - * - * - started with OCI_DatabaseStartup() - * - shutdown with OCI_DatabaseShutdown() - * - * Several options are handled for this actions - * - * @par Example - * @include instance.c - * - */ - -/** - * @brief - * Start a database instance - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param sess_mode - Session mode - * @param start_mode - Start mode - * @param start_flag - Start flags - * @param spfile - Client-side spfile to start up the database (optional) - * - * Possible values for parameter sess_mode : - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * Possible (combined) values for parameter start_mode : - * - OCI_DB_SPM_START : start the instance - * - OCI_DB_SPM_MOUNT : mount the instance - * - OCI_DB_SPM_OPEN : open the instance - * - OCI_DB_SPM_FULL : start, mount and open the instance - * - * Possible (combined) values for parameter start_flag : - * - OCI_DB_SPF_DEFAULT : default startup - * - OCI_DB_SPF_FORCE : shuts down a running instance (if needed) using - * ABORT command and starts a new instance - * - OCI_DB_SPF_RESTRICT : allows database access only to users with both - * CREATE SESSION and RESTRICTED SESSION privileges - * - * @note - * If the client side spfile is not provided, the database is started with its server-side spfile - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DatabaseStartup -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int sess_mode, - unsigned int start_mode, - unsigned int start_flag, - const otext *spfile -); - -/** - * @brief - * Shutdown a database instance - * - * @param db - Oracle Service Name - * @param user - Oracle User name - * @param pwd - Oracle User password - * @param sess_mode - Session mode - * @param shut_mode - Shutdown mode - * @param shut_flag - Shutdown flag - * - * - * @warning - * Possible values for parameter sess_mode : - * - OCI_SESSION_SYSDBA - * - OCI_SESSION_SYSOPER - * - * @note - * External credentials are supported by supplying a null value for the 'user' and 'pwd' parameters - * If the param 'db' is NULL then a connection to the default local DB is done - * - * Possible (combined) values for parameter shut_mode : - * - OCI_DB_SDM_SHUTDOWN : shutdown the instance - * - OCI_DB_SDM_CLOSE : close the instance - * - OCI_DB_SDM_DISMOUNT : dismount the instance - * - OCI_DB_SDM_FULL : shutdown, close and dismount the instance - * - * Possible (exclusive) value for parameter shut_flag (from Oracle documentation) : - * - OCI_DB_SDF_DEFAULT : - * - Further connects are prohibited. - * - Waits for users to disconnect from the database - * - OCI_DB_SDF_TRANS : - * - Further connects are prohibited - * - No new transactions are allowed. - * - Waits for active transactions to complete - * - OCI_DB_SDF_TRANS_LOCAL : - * - Further connects are prohibited - * - No new transactions are allowed. - * - Waits only for local transactions to complete - * - OCI_DB_SDF_IMMEDIATE : - * - Does not wait for current calls to complete or users to disconnect from the database. - * - All uncommitted transactions are terminated and rolled back - * - OCI_DB_SDF_ABORT : - * - Does not wait for current calls to complete or users to disconnect from the database. - * - All uncommitted transactions are terminated and are not rolled back. - * - This is the fastest possible way to shut down the database, but the next - * database startup may require instance recovery. - * - Therefore, this option should be used only in unusual circumstances - * - * @return - * TRUE on success otherwise FALSE - * - */ - -OCI_EXPORT boolean OCI_API OCI_DatabaseShutdown -( - const otext *db, - const otext *user, - const otext *pwd, - unsigned int sess_mode, - unsigned int shut_mode, - unsigned int shut_flag -); - -/** - * @} - */ - -/** - * @defgroup OcilibCApiRawHandles Using OCI Handles directly - * @{ - * - * OCILIB conception was focused on a full but closed encapsulation of OCI. - * - * All OCI headers, data types, prototypes are imported internally - * (linkage or runtime import). - * - * OCILIB public interface exposes only ISO C scalar types and OCILIB objects - * - * OCI is a wide and rich API that can deals with hundreds of options ! - * - * OCILIB tries to implements most of it. But, sometimes in really specific - * contexts, it might be necessary to directly call OCI APIs in order to use - * uncovered OCI functionalities or options - * - * OCILIB proposes now a set of functions to retrieve its internal OCI handles - * - * @warning - * - * The OCILIB author strongly advises against the use of internal handles, - * unless there is no other way to accomplish the task - * - * @warning - * - * Using these handles for direct application calls to OCI might lead - * to OCILIB instability or crash if handles are incorrectly used ! - * - */ - -/** - * @brief - * Return the OCI Environment Handle (OCIEnv *) of OCILIB library - * - * @return - * OCI Environment handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetEnvironment -( - void -); - -/** - * @brief - * Return the OCI Context Handle (OCISvcCtx *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Context handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetContext -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Server Handle (OCIServer *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Server handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetServer -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Error Handle (OCIError *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Error handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetError -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Session Handle (OCISession *) of an OCILIB OCI_Connection object - * - * @param con - Connection handle - * - * @return - * OCI Session handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetSession -( - OCI_Connection *con -); - -/** - * @brief - * Return the OCI Transaction Handle (OCITrans *) of an OCILIB OCI_Transaction object - * - * @param trans - Transaction handle - * - * @return - * OCI Transaction handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetTransaction -( - OCI_Transaction *trans -); - -/** - * @brief - * Return the OCI Statement Handle (OCIStmt *) of an OCILIB OCI_Statement object - * - * @param stmt - Statement handle - * - * @return - * OCI Statement handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetStatement -( - OCI_Statement *stmt -); - -/** - * @brief - * Return the OCI LobLocator Handle (OCILobLocator *) of an OCILIB OCI_Lob object - * - * @param lob - Lob handle - * - * @return - * OCI LobLocator handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetLob -( - OCI_Lob *lob -); - -/** - * @brief - * Return the OCI LobLocator Handle (OCILobLocator *) of an OCILIB OCI_File object - * - * @param file - File handle - * - * @return - * OCI LobLocator handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetFile -( - OCI_File *file -); - -/** - * @brief - * Return the OCI Date Handle (OCIDate *) of an OCILIB OCI_Date object - * - * @param date - Date handle - * - * @return - * OCI Date handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDate -( - OCI_Date *date -); - -/** - * @brief - * Return the OCI Date time Handle (OCIDatetime *) of an OCILIB OCI_Timestamp object - * - * @param tmsp - Timestamp handle - * - * @return - * OCI Date time handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetTimestamp -( - OCI_Timestamp *tmsp -); - -/** - * @brief - * Return OCI Interval Handle (OCIInterval *) of an OCILIB OCI_Interval object - * - * @param itv - Interval handle - * - * @return - * OCI Interval handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetInterval -( - OCI_Interval *itv -); - -/** - * @brief - * Return OCI Object Handle (void *) of an OCILIB OCI_Object object - * - * @param obj - Object handle - * - * @return - * OCI Object handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetObject -( - OCI_Object *obj -); - -/** - * @brief - * Return OCI Collection Handle (OCIColl *) of an OCILIB OCI_Coll object - * - * @param coll - Collection handle - * - * @return - * OCI Collection handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetColl -( - OCI_Coll *coll -); - -/** - * @brief - * Return OCI Ref Handle (OCIRef *) of an OCILIB OCI_Ref object - * - * @param ref - Ref handle - * - * @return - * OCI Ref handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetRef -( - OCI_Ref *ref -); - -/** - * @brief - * Return OCI Mutex handle (OCIThreadMutex *) of an OCILIB OCI_Mutex object - * - * @param mutex - Mutex handle - * - * @return - * OCI Mutex handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetMutex -( - OCI_Mutex *mutex -); - -/** - * @brief - * Return OCI Thread ID (OCIThreadId *) of an OCILIB OCI_Thread object - * - * @param thread - Thread handle - * - * @return - * OCI Thread ID otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetThreadID -( - OCI_Thread *thread -); - -/** - * @brief - * Return OCI Thread handle (OCIThreadHandle *) of an OCILIB OCI_Thread object - * - * @param thread - Thread handle - * - * @return - * OCI Thread handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetThread -( - OCI_Thread *thread -); - -/** - * @brief - * Return OCI DirectPath Context handle (OCIDirPathCtx *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Context handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathCtx -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI DirectPath Column array handle (OCIDirPathColArray *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Column array handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathColArray -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI DirectPath Stream handle (OCIDirPathStream *) of an OCILIB OCI_DirPath object - * - * @param dp - DirectPath handle - * - * @return - * OCI DirectPath Stream handle otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetDirPathStream -( - OCI_DirPath *dp -); - -/** - * @brief - * Return OCI Subscription handle (OCISubscription *) of an OCILIB OCI_Subscription object - * - * @param sub - Subscription handle - * - * @return - * OCI Subscription otherwise NULL - * - */ - -OCI_EXPORT const void * OCI_API OCI_HandleGetSubscription -( - OCI_Subscription *sub -); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -/** -* @defgroup OcilibCApiEnvironmentVariables Environment Variables -* @{ -* -* Some environment variables can be defined in order to activate specific features -* They must have one of the following values (case insensitive) for being enabled : "TRUE", "1" -* -* - "OCILIB_WORKAROUND_UTF16_COLUMN_NAME": This variable enables an experimental workaround for the Oracle bug 9838993: -* - When calling OCI_GetResultset(), OCILIB queries column names against the Oracle Client -* - Unicode builds of OCILIB initialize Oracle client into UTF16 mode -* - In such environments, a memory leak occurs when statements are re-executed multiple times followed by OCI_GetResultset() -* - This workaround retrieves column names using direct access to undocumented Oracle structures instead of using buggy Oracle calls -* - As Oracle undocumented structures may change upon versions, this workaround is provided as-is in case the Oracle bug represents an real issue for applications -* - This workaround has been tested with 32bit and 64bit Oracle 12g clients and Unicode OCILIB builds -*/ - -#define VAR_OCILIB_WORKAROUND_UTF16_COLUMN_NAME "OCILIB_WORKAROUND_UTF16_COLUMN_NAME" - -/** -* @} -*/ - -/** - * @defgroup OcilibCApiDemoApplication OCILIB main demo application code - * @{ - * - * Portable Main demo application header - * @include ocilib_demo.h - * - * Portable Main demo application source - * @include ocilib_demo.c - * - * @} - */ - -/* Compatibility with sources built with older versions of OCILIB */ - -/* macros added in version 2.3.0 */ - -#define OCI_CreateConnection OCI_ConnectionCreate -#define OCI_FreeConnection OCI_ConnectionFree -#define OCI_CreateStatement OCI_StatementCreate -#define OCI_FreeStatement OCI_StatementFree - -/* macros added in version 2.4.0 */ - -#define OCI_CreateTransaction OCI_TransactionCreate -#define OCI_FreeTransaction OCI_TransactionFree -#define OCI_CreateHashTable OCI_HashCreate -#define OCI_FreeHashTable OCI_HashFree - -/* macros added in version 3.0.0 */ - -#define OCI_GetColumnName OCI_ColumnGetName -#define OCI_GetColumnType OCI_ColumnGetType -#define OCI_GetColumnCharsetForm OCI_ColumnGetCharsetForm -#define OCI_GetColumnSQLType OCI_ColumnGetSQLType -#define OCI_GetColumnFullSQLType OCI_ColumnGetFullSQLType -#define OCI_GetColumnSize OCI_ColumnGetSize -#define OCI_GetColumnScale OCI_ColumnGetScale -#define OCI_GetColumnPrecision OCI_ColumnGetPrecision -#define OCI_GetColumnFractionnalPrecision OCI_ColumnGetFractionnalPrecision -#define OCI_GetColumnLeadingPrecision OCI_ColumnGetLeadingPrecision -#define OCI_GetColumnNullable OCI_ColumnGetNullable -#define OCI_GetColumnCharUsed OCI_ColumnGetCharUsed - -#define OCI_GetFormatDate(s) OCI_GetDefaultFormatDate(OCI_StatementGetConnection(s)) -#define OCI_SetFormatDate(s, f) OCI_SetDefaultFormatDate(OCI_StatementGetConnection(s), f) - -#define OCI_ERR_API OCI_ERR_ORACLE - -/* macros added in version 3.2.0 */ - -#define OCI_ERR_NOT_SUPPORTED OCI_ERR_DATATYPE_NOT_SUPPORTED -#define OCI_SCHEMA_TABLE OCI_TIF_TABLE -#define OCI_SCHEMA_VIEW OCI_TIF_VIEW -#define OCI_SCHEMA_TYPE OCI_TIF_TYPE - -#define OCI_Schema OCI_TypeInfo - -#define OCI_SchemaGet OCI_TypeInfoGet -#define OCI_SchemaFree OCI_TypeInfoFree -#define OCI_SchemaGetColumnCount OCI_TypeInfoGetColumnCount -#define OCI_SchemaGetColumn OCI_TypeInfoGetColumn -#define OCI_SchemaGetName OCI_TypeInfoGetName - -#define OCI_ColumnGetFractionnalPrecision OCI_ColumnGetFractionalPrecision - -/* macro added in version 3.3.0 */ - -/** - * @brief - * [OBSOLETE] Set the bind variable at the given index to null - * - * @param stmt - Statement handle - * @param index - Index of the bind variable - * - * @warning - * This call is obsolete ! Use OCI_BindSetNull() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Index starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -#define OCI_SetNull(stmt, index) \ - OCI_BindSetNull(OCI_GetBind(stmt, index)) - -/** - * @brief - * [OBSOLETE] Set the bind variable of the given name to null - * - * @param stmt - Statement handle - * @param name - Bind variable name - * - * @warning - * This call is obsolete ! Use OCI_BindSetNull() instead. - * - * @note - * There is no notion of null value in C. - * it's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - */ - -#define OCI_SetNull2(stmt, name) \ - OCI_BindSetNull(OCI_GetBind2(stmt, name)) - -/** - * @brief - * [OBSOLETE] Set to null the bind variable at the given position in an input array - * - * @param stmt - Statement handle - * @param index - Index of the bind variable - * @param position - Position in the array - * - * @warning - * This call is obsolete ! Use OCI_BindSetNullAtPos() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Index and Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - * - */ - -#define OCI_SetNullAtPos(stmt, index, position) \ - OCI_BindSetNullAtPos(OCI_GetBind(stmt, index), position) - -/** - * @brief - * [OBSOLETE] Set to null the bind variable of the given name in an input array - * - * @param stmt - Statement handle - * @param name - Bind variable name - * @param position - Position in the array - * - * @warning - * This call is obsolete ! Use OCI_BindSetNullAtPos() instead. - * - * @note - * There is no notion of null value in C. - * It's necessary to explicitly tell Oracle that the bind has a null value. - * It must be done before an OCI_Execute() call - * - * @warning - * Position starts with 1 - * - * @note - * For handled based data types (non scalar types), OCILIB performs an extra - * check on handles and set the bind status to null is the handle is null - * - * @return - * TRUE on success otherwise FALSE - * - */ - -#define OCI_SetNullAtPos2(stmt, name, position) \ - OCI_BindSetNullAtPos(OCI_GetBind2(stmt, name), position) - -/* macro added in version 3.4.0 */ - -#define OCI_8 OCI_8_1 -#define OCI_9 OCI_9_0 -#define OCI_10 OCI_10_1 -#define OCI_11 OCI_11_1 - -/* macro added in version 3.6.0 */ - -#define OCI_CHAR_UNICODE OCI_CHAR_WIDE -#define OCI_CSF_CHARSET OCI_CSF_DEFAULT - -/* macro added in version 3.7.0 */ - -#define OCI_ConnPool OCI_Pool - -#define OCI_ConnPoolCreate(db, us, pw, mo, mi, ma, in) \ - OCI_PoolCreate(db, us, pw, OCI_POOL_CONNECTION, mo, mi, ma, in) - -#define OCI_ConnPoolGetConnection(p) \ - OCI_PoolGetConnection(p, NULL) - -#define OCI_ConnPoolFree OCI_PoolFree -#define OCI_ConnPoolGetTimeout OCI_PoolGetConnection -#define OCI_ConnPoolSetTimeout OCI_PoolSetTimeout -#define OCI_ConnPoolGetNoWait OCI_PoolGetNoWait -#define OCI_ConnPoolSetNoWait OCI_PoolSetNoWait -#define OCI_ConnPoolGetBusyCount OCI_PoolGetBusyCount -#define OCI_ConnPoolGetOpenedCount OCI_PoolGetOpenedCount -#define OCI_ConnPoolGetMin OCI_PoolGetMin -#define OCI_ConnPoolGetMax OCI_PoolGetMax -#define OCI_ConnPoolGetIncrement OCI_PoolGetIncrement - -/* macro added in version 3.8.0 */ - -#define OCI_ObjectGetTimeStamp OCI_ObjectGetTimestamp -#define OCI_ElemGetTimeStamp OCI_ElemGetTimestamp -#define OCI_TimestampSysTimeStamp OCI_TimestampSysTimestamp - -/* macro added in version 4.0.0 */ - -#define OCI_CollSetAt OCI_CollSetElem -#define OCI_CollGetAt OCI_CollGetElem -#define OCI_CollGetAt2 OCI_CollGetElem2 - -#define OCI_GetCharsetMetaData OCI_GetCharset -#define OCI_GetCharsetUserData OCI_GetCharset -#define OCI_SIZE_TRACE_INF0 OCI_SIZE_TRACE_INFO - -#define MT(x) OTEXT(x) -#define mtext otext -#define DT(x) OTEXT(x) -#define dtext otext - -#define mtsdup ostrdup -#define mtscpy ostrcpy -#define mtsncpy ostrncpy -#define mtscat ostrcat -#define mtsncat ostrncat -#define mtslen ostrlen -#define mtscmp ostrcmp -#define mtscasecmp ostrcasecmp -#define mtsprintf osprintf -#define mtstol ostrtol -#define mtsscanf osscanf - -#define dtsdup ostrdup -#define dtscpy ostrcpy -#define dtsncpy ostrncpy -#define dtscat ostrcat -#define dtsncat ostrncat -#define dtslen ostrlen -#define dtscmp ostrcmp -#define dtscasecmp ostrcasecmp -#define dtsprintf osprintf -#define dtstol ostrtol -#define dtsscanf osscanf - -/* macro added in version 4.1.0 */ - -#define OCI_SetDefaultFormatDate(con, fmt) OCI_SetFormat(con, OCI_FMT_DATE, fmt) -#define OCI_SetDefaultFormatNumeric(con, fmt) OCI_SetFormat(con, OCI_FMT_NUMERIC, fmt) - -#define OCI_GetDefaultFormatDate(con) OCI_GetFormat(con, OCI_FMT_DATE) -#define OCI_GetDefaultFormatNumeric(con) OCI_GetFormat(con, OCI_FMT_NUMERIC) - -#define OCI_STRING_FORMAT_NUM_BIN OCI_STRING_FORMAT_NUM_BDOUBLE - -/** - * @} - */ - -#endif /* OCILIB_H_INCLUDED */ - diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qgrow.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qgrow.h deleted file mode 100755 index bad9828..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qgrow.h +++ /dev/null @@ -1,99 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Grow container that handles growable objects. - * - * @file qgrow.h - */ - -#ifndef QGROW_H -#define QGROW_H - -#include -#include -#include -#include "qlist.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qgrow_s qgrow_t; - -/* public functions */ -enum { - QGROW_THREADSAFE = (QLIST_THREADSAFE) /*!< make it thread-safe */ -}; - -extern qgrow_t *qgrow(int options); - -extern bool qgrow_add(qgrow_t *grow, const void *object, size_t size); -extern bool qgrow_addstr(qgrow_t *grow, const char *str); -extern bool qgrow_addstrf(qgrow_t *grow, const char *format, ...); - -extern size_t qgrow_size(qgrow_t *grow); -extern size_t qgrow_datasize(qgrow_t *grow); - -extern void *qgrow_toarray(qgrow_t *grow, size_t *size); -extern char *qgrow_tostring(qgrow_t *grow); - -extern void qgrow_clear(qgrow_t *grow); -extern bool qgrow_debug(qgrow_t *grow, FILE *out); -extern void qgrow_free(qgrow_t *grow); - -/** - * qgrow container object - */ -struct qgrow_s { - /* capsulated member functions */ - bool (*add) (qgrow_t *grow, const void *data, size_t size); - bool (*addstr) (qgrow_t *grow, const char *str); - bool (*addstrf) (qgrow_t *grow, const char *format, ...); - - size_t (*size) (qgrow_t *grow); - size_t (*datasize) (qgrow_t *grow); - - void *(*toarray) (qgrow_t *grow, size_t *size); - char *(*tostring) (qgrow_t *grow); - - void (*clear) (qgrow_t *grow); - bool (*debug) (qgrow_t *grow, FILE *out); - - void (*free) (qgrow_t *grow); - - /* private variables - do not access directly */ - qlist_t *list; /*!< data container */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QGROW_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhasharr.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhasharr.h deleted file mode 100755 index 9a6278f..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhasharr.h +++ /dev/null @@ -1,174 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Static Hash Table container that works in preallocated fixed size memory. - * - * @file qhasharr.h - */ - -#ifndef QHASHARR_H -#define QHASHARR_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* tunable knobs */ -#define Q_HASHARR_NAMESIZE (16) /*!< knob for maximum key size. */ -#define Q_HASHARR_DATASIZE (32) /*!< knob for maximum data size in a slot. */ - -/* types */ -typedef struct qhasharr_s qhasharr_t; -typedef struct qhasharr_slot_s qhasharr_slot_t; -typedef struct qhasharr_data_s qhasharr_data_t; -typedef struct qhasharr_obj_s qhasharr_obj_t; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->put(tbl, ...); // easier to switch the container type to other kinds. - * - qhasharr_put(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qhasharr_t *qhasharr(void *memory, size_t memsize); -extern size_t qhasharr_calculate_memsize(int max); - -extern bool qhasharr_put(qhasharr_t *tbl, const char *key, const void *value, - size_t size); -extern bool qhasharr_putstr(qhasharr_t *tbl, const char *key, const char *str); -extern bool qhasharr_putstrf(qhasharr_t *tbl, const char *key, const char *format, ...); -extern bool qhasharr_put_by_obj(qhasharr_t *tbl, const void *name, size_t namesize, - const void *data, size_t datasize); - -extern void *qhasharr_get(qhasharr_t *tbl, const char *key, size_t *size); -extern char *qhasharr_getstr(qhasharr_t *tbl, const char *key); -extern void *qhasharr_get_by_obj(qhasharr_t *tbl, const void *name, size_t namesize, - size_t *datasize); - -extern bool qhasharr_remove(qhasharr_t *tbl, const char *key); -extern bool qhasharr_remove_by_obj(qhasharr_t *tbl, const char *name, size_t namesize); -extern bool qhasharr_remove_by_idx(qhasharr_t *tbl, int idx); - -extern bool qhasharr_getnext(qhasharr_t *tbl, qhasharr_obj_t *obj, int *idx); - -extern int qhasharr_size(qhasharr_t *tbl, int *maxslots, int *usedslots); -extern void qhasharr_clear(qhasharr_t *tbl); -extern bool qhasharr_debug(qhasharr_t *tbl, FILE *out); - -extern void qhasharr_free(qhasharr_t *tbl); - - -/** - * qhasharr container object - */ -struct qhasharr_s { - /* encapsulated member functions */ - bool (*put) (qhasharr_t *tbl, const char *key, const void *value, - size_t size); - bool (*putstr) (qhasharr_t *tbl, const char *key, const char *str); - bool (*putstrf) (qhasharr_t *tbl, const char *key, const char *format, ...); - bool (*put_by_obj) (qhasharr_t *tbl, const void *name, size_t namesize, - const void *data, size_t datasize); - - void *(*get) (qhasharr_t *tbl, const char *key, size_t *size); - char *(*getstr) (qhasharr_t *tbl, const char *key); - void *(*get_by_obj) (qhasharr_t *tbl, const void *name, size_t namesize, - size_t *datasize); - - bool (*remove) (qhasharr_t *tbl, const char *key); - bool (*remove_by_obj) (qhasharr_t *tbl, const char *name, size_t namesize); - bool (*remove_by_idx) (qhasharr_t *tbl, int idx); - - bool (*getnext) (qhasharr_t *tbl, qhasharr_obj_t *obj, int *idx); - - int (*size) (qhasharr_t *tbl, int *maxslots, int *usedslots); - void (*clear) (qhasharr_t *tbl); - bool (*debug) (qhasharr_t *tbl, FILE *out); - - void (*free) (qhasharr_t *tbl); - - /* private variables */ - qhasharr_data_t *data; -}; - -/** - * qhasharr internal data slot structure - */ -struct qhasharr_slot_s { - short count; /*!< hash collision counter. 0 indicates empty slot, - -1 is used for collision resolution, -2 is used for - indicating linked block */ - uint32_t hash; /*!< key hash */ - uint8_t datasize; /*!< value size in this slot*/ - int link; /*!< next link */ - - union { - /*!< key/value data */ - struct Q_HASHARR_SLOT_KEYVAL { - uint8_t data[Q_HASHARR_DATASIZE]; /*!< value */ - uint8_t name[Q_HASHARR_NAMESIZE]; /*!< key string, can be cut */ - uint16_t namesize; /*!< original key length */ - uint8_t namemd5[16]; /*!< md5 hash of the key */ - } pair; - - /*!< extended data block, used only when the count value is -2 */ - struct Q_HASHARR_SLOT_EXT { - uint8_t data[sizeof(struct Q_HASHARR_SLOT_KEYVAL)]; - } ext; - } data; -}; - -/** - * qhasharr memory structure - */ -struct qhasharr_data_s { - int maxslots; /*!< number of maximum slots */ - int usedslots; /*!< number of used slots */ - int num; /*!< number of stored keys */ -}; - -/** - * qhasharr named-object data structure for user return - */ -struct qhasharr_obj_s { - void *name; /*!< name */ - size_t namesize; /*!< name size */ - void *data; /*!< data */ - size_t datasize; /*!< data size */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QHASHARR_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhashtbl.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhashtbl.h deleted file mode 100755 index ac86029..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qhashtbl.h +++ /dev/null @@ -1,135 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Hash Table container. - * - * @file qhashtbl.h - */ - -#ifndef QHASHTBL_H -#define QHASHTBL_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qhashtbl_s qhashtbl_t; -typedef struct qhashtbl_obj_s qhashtbl_obj_t; - -enum { - QHASHTBL_THREADSAFE = (0x01) /*!< make it thread-safe */ -}; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->put(tbl, ...); // easier to switch the container type to other kinds. - * - qhashtbl_put(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qhashtbl_t *qhashtbl(size_t range, int options); /*!< qhashtbl constructor */ - -extern bool qhashtbl_put(qhashtbl_t *tbl, const char *name, const void *data, size_t size); -extern bool qhashtbl_putstr(qhashtbl_t *tbl, const char *name, const char *str); -extern bool qhashtbl_putstrf(qhashtbl_t *tbl, const char *name, const char *format, ...); -extern bool qhashtbl_putint(qhashtbl_t *tbl, const char *name, int64_t num); - -extern void *qhashtbl_get(qhashtbl_t *tbl, const char *name, size_t *size, bool newmem); -extern char *qhashtbl_getstr(qhashtbl_t *tbl, const char *name, bool newmem); -extern int64_t qhashtbl_getint(qhashtbl_t *tbl, const char *name); - -extern bool qhashtbl_remove(qhashtbl_t *tbl, const char *name); - -extern bool qhashtbl_getnext(qhashtbl_t *tbl, qhashtbl_obj_t *obj, bool newmem); - -extern size_t qhashtbl_size(qhashtbl_t *tbl); -extern void qhashtbl_clear(qhashtbl_t *tbl); -extern bool qhashtbl_debug(qhashtbl_t *tbl, FILE *out); - -extern void qhashtbl_lock(qhashtbl_t *tbl); -extern void qhashtbl_unlock(qhashtbl_t *tbl); - -extern void qhashtbl_free(qhashtbl_t *tbl); - -/** - * qhashtbl container object structure - */ -struct qhashtbl_s { - /* encapsulated member functions */ - bool (*put) (qhashtbl_t *tbl, const char *name, const void *data, size_t size); - bool (*putstr) (qhashtbl_t *tbl, const char *name, const char *str); - bool (*putstrf) (qhashtbl_t *tbl, const char *name, const char *format, ...); - bool (*putint) (qhashtbl_t *tbl, const char *name, const int64_t num); - - void *(*get) (qhashtbl_t *tbl, const char *name, size_t *size, bool newmem); - char *(*getstr) (qhashtbl_t *tbl, const char *name, bool newmem); - int64_t (*getint) (qhashtbl_t *tbl, const char *name); - - bool (*remove) (qhashtbl_t *tbl, const char *name); - - bool (*getnext) (qhashtbl_t *tbl, qhashtbl_obj_t *obj, bool newmem); - - size_t (*size) (qhashtbl_t *tbl); - void (*clear) (qhashtbl_t *tbl); - bool (*debug) (qhashtbl_t *tbl, FILE *out); - - void (*lock) (qhashtbl_t *tbl); - void (*unlock) (qhashtbl_t *tbl); - - void (*free) (qhashtbl_t *tbl); - - /* private variables - do not access directly */ - void *qmutex; /*!< initialized when QHASHTBL_THREADSAFE is given */ - size_t num; /*!< number of objects in this table */ - size_t range; /*!< hash range, vertical number of slots */ - qhashtbl_obj_t **slots; /*!< slot pointer container */ -}; - -/** - * qhashtbl object data structure - */ -struct qhashtbl_obj_s { - uint32_t hash; /*!< 32bit-hash value of object name */ - char *name; /*!< object name */ - void *data; /*!< data */ - size_t size; /*!< data size */ - - qhashtbl_obj_t *next; /*!< for chaining next collision object */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QHASHTBL_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlist.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlist.h deleted file mode 100755 index acf40e5..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlist.h +++ /dev/null @@ -1,161 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Doubly Linked-list container. - * - * @file qlist.h - */ - -#ifndef QLIST_H -#define QLIST_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - QLIST_THREADSAFE = (0x01) /*!< make it thread-safe */ -}; - -/* types */ -typedef struct qlist_s qlist_t; -typedef struct qlist_obj_s qlist_obj_t; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->addlast(tbl, ...); // easier to switch the container type to other kinds. - * - qlist_addlast(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qlist_t *qlist(int options); /*!< qlist constructor */ -extern size_t qlist_setsize(qlist_t *list, size_t max); - -extern bool qlist_addfirst(qlist_t *list, const void *data, size_t size); -extern bool qlist_addlast(qlist_t *list, const void *data, size_t size); -extern bool qlist_addat(qlist_t *list, int index, const void *data, size_t size); - -extern void *qlist_getfirst(qlist_t *list, size_t *size, bool newmem); -extern void *qlist_getlast(qlist_t *list, size_t *size, bool newmem); -extern void *qlist_getat(qlist_t *list, int index, size_t *size, bool newmem); - -extern void *qlist_popfirst(qlist_t *list, size_t *size); -extern void *qlist_poplast(qlist_t *list, size_t *size); -extern void *qlist_popat(qlist_t *list, int index, size_t *size); - -extern bool qlist_removefirst(qlist_t *list); -extern bool qlist_removelast(qlist_t *list); -extern bool qlist_removeat(qlist_t *list, int index); - -extern bool qlist_getnext(qlist_t *list, qlist_obj_t *obj, bool newmem); - -extern size_t qlist_size(qlist_t *list); -extern size_t qlist_datasize(qlist_t *list); -extern void qlist_reverse(qlist_t *list); -extern void qlist_clear(qlist_t *list); - -extern void *qlist_toarray(qlist_t *list, size_t *size); -extern char *qlist_tostring(qlist_t *list); -extern bool qlist_debug(qlist_t *list, FILE *out); - -extern void qlist_lock(qlist_t *list); -extern void qlist_unlock(qlist_t *list); - -extern void qlist_free(qlist_t *list); - -/** - * qlist container object - */ -struct qlist_s { - /* encapsulated member functions */ - size_t (*setsize)(qlist_t *list, size_t max); - - bool (*addfirst)(qlist_t *list, const void *data, size_t size); - bool (*addlast)(qlist_t *list, const void *data, size_t size); - bool (*addat)(qlist_t *list, int index, const void *data, size_t size); - - void *(*getfirst)(qlist_t *list, size_t *size, bool newmem); - void *(*getlast)(qlist_t *list, size_t *size, bool newmem); - void *(*getat)(qlist_t *list, int index, size_t *size, bool newmem); - - void *(*popfirst)(qlist_t *list, size_t *size); - void *(*poplast)(qlist_t *list, size_t *size); - void *(*popat)(qlist_t *list, int index, size_t *size); - - bool (*removefirst)(qlist_t *list); - bool (*removelast)(qlist_t *list); - bool (*removeat)(qlist_t *list, int index); - - bool (*getnext)(qlist_t *list, qlist_obj_t *obj, bool newmem); - - void (*reverse)(qlist_t *list); - void (*clear)(qlist_t *list); - - size_t (*size)(qlist_t *list); - size_t (*datasize)(qlist_t *list); - - void *(*toarray)(qlist_t *list, size_t *size); - char *(*tostring)(qlist_t *list); - bool (*debug)(qlist_t *list, FILE *out); - - void (*lock)(qlist_t *list); - void (*unlock)(qlist_t *list); - - void (*free)(qlist_t *list); - - /* private variables - do not access directly */ - void *qmutex; /*!< initialized when QLIST_OPT_THREADSAFE is given */ - size_t num; /*!< number of elements */ - size_t max; /*!< maximum number of elements. 0 means no limit */ - size_t datasum; /*!< total sum of data size, does not include name size */ - - qlist_obj_t *first; /*!< first object pointer */ - qlist_obj_t *last; /*!< last object pointer */ -}; - -/** - * qlist node data structure. - */ -struct qlist_obj_s { - void *data; /*!< data */ - size_t size; /*!< data size */ - - qlist_obj_t *prev; /*!< previous link */ - qlist_obj_t *next; /*!< next link */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QLIST_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlisttbl.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlisttbl.h deleted file mode 100755 index fc39474..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qlisttbl.h +++ /dev/null @@ -1,180 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * List container with key/value pair in doubly linked data structure. - * - * @file qlisttbl.h - */ - -#ifndef QLISTTBL_H -#define QLISTTBL_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qlisttbl_s qlisttbl_t; -typedef struct qlisttbl_obj_s qlisttbl_obj_t; -typedef struct qlisttbl_data_s qlisttbl_data_t; - -enum { - QLISTTBL_THREADSAFE = (0x01), /*!< make it thread-safe */ - QLISTTBL_UNIQUE = (0x01 << 1), /*!< keys are unique */ - QLISTTBL_CASEINSENSITIVE = (0x01 << 2), /*!< keys are case insensitive */ - QLISTTBL_INSERTTOP = (0x01 << 3), /*!< insert new key at the top */ - QLISTTBL_LOOKUPFORWARD = (0x01 << 4), /*!< find key from the top (default: backward) */ -}; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->put(tbl, ...); // easier to switch the container type to other kinds. - * - qlisttbl_put(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qlisttbl_t *qlisttbl(int options); /*!< qlisttbl constructor */ - -extern bool qlisttbl_put(qlisttbl_t *tbl, const char *name, const void *data, size_t size); -extern bool qlisttbl_putstr(qlisttbl_t *tbl, const char *name, const char *str); -extern bool qlisttbl_putstrf(qlisttbl_t *tbl, const char *name, const char *format, ...); -extern bool qlisttbl_putint(qlisttbl_t *tbl, const char *name, int64_t num); - -extern void *qlisttbl_get(qlisttbl_t *tbl, const char *name, size_t *size, bool newmem); -extern char *qlisttbl_getstr(qlisttbl_t *tbl, const char *name, bool newmem); -extern int64_t qlisttbl_getint(qlisttbl_t *tbl, const char *name); - -extern qlisttbl_data_t *qlisttbl_getmulti(qlisttbl_t *tbl, const char *name, bool newmem, size_t *numobjs); -extern void qlisttbl_freemulti(qlisttbl_data_t *objs); - -extern size_t qlisttbl_remove(qlisttbl_t *tbl, const char *name); -extern bool qlisttbl_removeobj(qlisttbl_t *tbl, const qlisttbl_obj_t *obj); - -extern bool qlisttbl_getnext(qlisttbl_t *tbl, qlisttbl_obj_t *obj, const char *name, bool newmem); - -extern size_t qlisttbl_size(qlisttbl_t *tbl); -extern void qlisttbl_sort(qlisttbl_t *tbl, const bool reverse); -extern void qlisttbl_clear(qlisttbl_t *tbl); -extern bool qlisttbl_save(qlisttbl_t *tbl, const char *filepath, char sepchar, bool encode); -extern ssize_t qlisttbl_load(qlisttbl_t *tbl, const char *filepath, char sepchar, bool decode); - -extern bool qlisttbl_debug(qlisttbl_t *tbl, FILE *out); - -extern void qlisttbl_lock(qlisttbl_t *tbl); -extern void qlisttbl_unlock(qlisttbl_t *tbl); - -extern void qlisttbl_free(qlisttbl_t *tbl); - - - -/** - * qlisttbl container structure - */ -struct qlisttbl_s { - /* capsulated member functions */ - bool (*put) (qlisttbl_t *tbl, const char *name, const void *data, size_t size); - bool (*putstr) (qlisttbl_t *tbl, const char *name, const char *str); - bool (*putstrf) (qlisttbl_t *tbl, const char *name, const char *format, ...); - bool (*putint) (qlisttbl_t *tbl, const char *name, int64_t num); - - void *(*get) (qlisttbl_t *tbl, const char *name, size_t *size, bool newmem); - char *(*getstr) (qlisttbl_t *tbl, const char *name, bool newmem); - int64_t (*getint) (qlisttbl_t *tbl, const char *name); - - qlisttbl_data_t *(*getmulti) (qlisttbl_t *tbl, const char *name, bool newmem, size_t *numobjs); - void (*freemulti) (qlisttbl_data_t *objs); - - size_t (*remove) (qlisttbl_t *tbl, const char *name); - bool (*removeobj) (qlisttbl_t *tbl, const qlisttbl_obj_t *obj); - - bool (*getnext) (qlisttbl_t *tbl, qlisttbl_obj_t *obj, const char *name, bool newmem); - - size_t (*size) (qlisttbl_t *tbl); - void (*sort) (qlisttbl_t *tbl, const bool reverse); - void (*clear) (qlisttbl_t *tbl); - - bool (*save) (qlisttbl_t *tbl, const char *filepath, char sepchar, - bool encode); - ssize_t (*load) (qlisttbl_t *tbl, const char *filepath, char sepchar, - bool decode); - bool (*debug) (qlisttbl_t *tbl, FILE *out); - - void (*lock) (qlisttbl_t *tbl); - void (*unlock) (qlisttbl_t *tbl); - - void (*free) (qlisttbl_t *tbl); - - /* private methods */ - bool (*namematch) (qlisttbl_obj_t *obj, const char *name, uint32_t hash); - int (*namecmp) (const char *s1, const char *s2); - - /* private variables - do not access directly */ - bool unique; /*!< keys are unique */ - bool caseinsensitive; /*!< case insensitive key comparison */ - bool keepsorted; /*!< keep table in sorted (default: insertion order) */ - bool inserttop; /*!< add new key at the top. (default: bottom) */ - bool lookupforward; /*!< find keys from the top. (default: backward) */ - - void *qmutex; /*!< initialized when QLISTTBL_OPT_THREADSAFE is given */ - size_t num; /*!< number of elements */ - qlisttbl_obj_t *first; /*!< first object pointer */ - qlisttbl_obj_t *last; /*!< last object pointer */ -}; - -/** - * qlisttbl node object data structure - */ -struct qlisttbl_obj_s { - uint32_t hash; /*!< 32bit-hash value of object name */ - char *name; /*!< object name */ - void *data; /*!< data */ - size_t size; /*!< data size */ - - qlisttbl_obj_t *prev; /*!< previous link */ - qlisttbl_obj_t *next; /*!< next link */ -}; - -/** - * qlisttbl value data structure for user return - */ -struct qlisttbl_data_s { - void *data; /*!< data */ - size_t size; /*!< data size */ - uint8_t type; /*!< data type, internal use */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QLISTTBL_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qqueue.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qqueue.h deleted file mode 100755 index 40e14f0..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qqueue.h +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Queue container. - * - * @file qqueue.h - */ - -#ifndef QQUEUE_H -#define QQUEUE_H - -#include -#include -#include -#include "qlist.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qqueue_s qqueue_t; - -enum { - QQUEUE_THREADSAFE = (QLIST_THREADSAFE) /*!< make it thread-safe */ -}; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->push(tbl, ...); // easier to switch the container type to other kinds. - * - qqueue_push(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qqueue_t *qqueue(int options); -extern size_t qqueue_setsize(qqueue_t *queue, size_t max); - -extern bool qqueue_push(qqueue_t *queue, const void *data, size_t size); -extern bool qqueue_pushstr(qqueue_t *queue, const char *str); -extern bool qqueue_pushint(qqueue_t *queue, int64_t num); - -extern void *qqueue_pop(qqueue_t *queue, size_t *size); -extern char *qqueue_popstr(qqueue_t *queue); -extern int64_t qqueue_popint(qqueue_t *queue); -extern void *qqueue_popat(qqueue_t *queue, int index, size_t *size); - -extern void *qqueue_get(qqueue_t *queue, size_t *size, bool newmem); -extern char *qqueue_getstr(qqueue_t *queue); -extern int64_t qqueue_getint(qqueue_t *queue); -extern void *qqueue_getat(qqueue_t *queue, int index, size_t *size, bool newmem); - -extern size_t qqueue_size(qqueue_t *queue); -extern void qqueue_clear(qqueue_t *queue); -extern bool qqueue_debug(qqueue_t *queue, FILE *out); -extern void qqueue_free(qqueue_t *queue); - -/** - * qqueue container object structure - */ -struct qqueue_s { - /* encapsulated member functions */ - size_t (*setsize) (qqueue_t *stack, size_t max); - - bool (*push) (qqueue_t *stack, const void *data, size_t size); - bool (*pushstr) (qqueue_t *stack, const char *str); - bool (*pushint) (qqueue_t *stack, int64_t num); - - void *(*pop) (qqueue_t *stack, size_t *size); - char *(*popstr) (qqueue_t *stack); - int64_t (*popint) (qqueue_t *stack); - void *(*popat) (qqueue_t *stack, int index, size_t *size); - - void *(*get) (qqueue_t *stack, size_t *size, bool newmem); - char *(*getstr) (qqueue_t *stack); - int64_t (*getint) (qqueue_t *stack); - void *(*getat) (qqueue_t *stack, int index, size_t *size, bool newmem); - - size_t (*size) (qqueue_t *stack); - void (*clear) (qqueue_t *stack); - bool (*debug) (qqueue_t *stack, FILE *out); - void (*free) (qqueue_t *stack); - - /* private variables - do not access directly */ - qlist_t *list; /*!< data container */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QQUEUE_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qstack.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qstack.h deleted file mode 100755 index e18eaff..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qstack.h +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * LIFO Stack container. - * - * @file qstack.h - */ - -#ifndef QSTACK_H -#define QSTACK_H - -#include -#include -#include -#include "qlist.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qstack_s qstack_t; - -enum { - QSTACK_THREADSAFE = (QLIST_THREADSAFE) /*!< make it thread-safe */ -}; - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->push(tbl, ...); // easier to switch the container type to other kinds. - * - qstack_push(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern qstack_t *qstack(int options); -extern size_t qstack_setsize(qstack_t *stack, size_t max); - -extern bool qstack_push(qstack_t *stack, const void *data, size_t size); -extern bool qstack_pushstr(qstack_t *stack, const char *str); -extern bool qstack_pushint(qstack_t *stack, int64_t num); - -extern void *qstack_pop(qstack_t *stack, size_t *size); -extern char *qstack_popstr(qstack_t *stack); -extern int64_t qstack_popint(qstack_t *stack); -extern void *qstack_popat(qstack_t *stack, int index, size_t *size); - -extern void *qstack_get(qstack_t *stack, size_t *size, bool newmem); -extern char *qstack_getstr(qstack_t *stack); -extern int64_t qstack_getint(qstack_t *stack); -extern void *qstack_getat(qstack_t *stack, int index, size_t *size, bool newmem); - -extern size_t qstack_size(qstack_t *stack); -extern void qstack_clear(qstack_t *stack); -extern bool qstack_debug(qstack_t *stack, FILE *out); -extern void qstack_free(qstack_t *stack); - -/** - * qstack container object structure - */ -struct qstack_s { - /* encapsulated member functions */ - size_t (*setsize) (qstack_t *stack, size_t max); - - bool (*push) (qstack_t *stack, const void *data, size_t size); - bool (*pushstr) (qstack_t *stack, const char *str); - bool (*pushint) (qstack_t *stack, int64_t num); - - void *(*pop) (qstack_t *stack, size_t *size); - char *(*popstr) (qstack_t *stack); - int64_t (*popint) (qstack_t *stack); - void *(*popat) (qstack_t *stack, int index, size_t *size); - - void *(*get) (qstack_t *stack, size_t *size, bool newmem); - char *(*getstr) (qstack_t *stack); - int64_t (*getint) (qstack_t *stack); - void *(*getat) (qstack_t *stack, int index, size_t *size, bool newmem); - - size_t (*size) (qstack_t *stack); - void (*clear) (qstack_t *stack); - bool (*debug) (qstack_t *stack, FILE *out); - void (*free) (qstack_t *stack); - - /* private variables - do not access directly */ - qlist_t *list; /*!< data container */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QSTACK_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qtreetbl.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qtreetbl.h deleted file mode 100755 index 95f4969..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qtreetbl.h +++ /dev/null @@ -1,182 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * Tree Table container that implements "Left-Leaning Red-Black" Binary Search Tree algorithm. - * - * @file qtreetbl.h - */ - -#ifndef QTREETBL_H -#define QTREETBL_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qtreetbl_s qtreetbl_t; -typedef struct qtreetbl_obj_s qtreetbl_obj_t; - -/* public functions */ -enum { - QTREETBL_THREADSAFE = (0x01) /*!< make it thread-safe */ -}; - -extern qtreetbl_t *qtreetbl(int options); /*!< qtreetbl constructor */ - -/* member functions - * - * All the member functions can be accessed in both ways: - * - tbl->put(tbl, ...); // easier to switch the container type to other kinds. - * - qtreetbl_put(tbl, ...); // where avoiding pointer overhead is preferred. - */ -extern void qtreetbl_set_compare( - qtreetbl_t *tbl, - int (*cmp)(const void *name1, size_t namesize1, const void *name2, - size_t namesize2)); - -extern bool qtreetbl_put(qtreetbl_t *tbl, const char *name, const void *data, - size_t datasize); -extern bool qtreetbl_putstr(qtreetbl_t *tbl, const char *name, const char *str); -extern bool qtreetbl_putstrf(qtreetbl_t *tbl, const char *name, - const char *format, ...); -extern bool qtreetbl_put_by_obj(qtreetbl_t *tbl, const void *name, - size_t namesize, const void *data, - size_t datasize); - -extern void *qtreetbl_get(qtreetbl_t *tbl, const char *name, size_t *datasize, -bool newmem); -extern char *qtreetbl_getstr(qtreetbl_t *tbl, const char *name, - const bool newmem); -extern void *qtreetbl_get_by_obj(qtreetbl_t *tbl, const char *name, - size_t namesize, size_t *datasize, bool newmem); - -extern bool qtreetbl_remove(qtreetbl_t *tbl, const char *name); -extern bool qtreetbl_remove_by_obj(qtreetbl_t *tbl, const void *name, - size_t namesize); - -extern bool qtreetbl_getnext(qtreetbl_t *tbl, qtreetbl_obj_t *obj, - const bool newmem); - -extern void *qtreetbl_find_min(qtreetbl_t *tbl, size_t *namesize); -extern void *qtreetbl_find_max(qtreetbl_t *tbl, size_t *namesize); -extern qtreetbl_obj_t qtreetbl_find_nearest(qtreetbl_t *tbl, const void *name, - size_t namesize, bool newmem); - -extern size_t qtreetbl_size(qtreetbl_t *tbl); -extern void qtreetbl_clear(qtreetbl_t *tbl); - -extern void qtreetbl_lock(qtreetbl_t *tbl); -extern void qtreetbl_unlock(qtreetbl_t *tbl); - -extern void qtreetbl_free(qtreetbl_t *tbl); - -extern int qtreetbl_byte_cmp(const void *name1, size_t namesize1, - const void *name2, size_t namesize2); -extern bool qtreetbl_debug(qtreetbl_t *tbl, FILE *out); - -/** - * qtreetbl container object - */ -struct qtreetbl_s { - /* encapsulated member functions */ - void (*set_compare)( - qtreetbl_t *tbl, - int (*cmp)(const void *name1, size_t namesize1, const void *name2, - size_t namesize2)); - bool (*put)(qtreetbl_t *tbl, const char *name, const void *data, - size_t size); - bool (*putstr)(qtreetbl_t *tbl, const char *name, const char *str); - bool (*putstrf)(qtreetbl_t *tbl, const char *name, const char *format, ...); - bool (*put_by_obj)(qtreetbl_t *tbl, const void *name, size_t namesize, - const void *data, size_t datasize); - - void *(*get)(qtreetbl_t *tbl, const char *name, size_t *datasize, - bool newmem); - char *(*getstr)(qtreetbl_t *tbl, const char *name, bool newmem); - void *(*get_by_obj)(qtreetbl_t *tbl, const char *name, size_t namesize, - size_t *datasize, bool newmem); - - bool (*remove)(qtreetbl_t *tbl, const char *name); - bool (*remove_by_obj)(qtreetbl_t *tbl, const void *name, size_t namesize); - - bool (*getnext)(qtreetbl_t *tbl, qtreetbl_obj_t *obj, const bool newmem); - - void *(*find_min)(qtreetbl_t *tbl, size_t *namesize); - void *(*find_max)(qtreetbl_t *tbl, size_t *namesize); - qtreetbl_obj_t (*find_nearest)(qtreetbl_t *tbl, const void *name, - size_t namesize, bool newmem); - - size_t (*size)(qtreetbl_t *tbl); - void (*clear)(qtreetbl_t *tbl); - bool (*debug)(qtreetbl_t *tbl, FILE *out); - - void (*lock)(qtreetbl_t *tbl); - void (*unlock)(qtreetbl_t *tbl); - - void (*free)(qtreetbl_t *tbl); - - /* private member functions */ - int (*compare)(const void *name1, size_t namesize1, const void *name2, - size_t namesize2); - - /* private variables - do not access directly */ - void *qmutex; /*!< initialized when QTREETBL_THREADSAFE is given */ - qtreetbl_obj_t *root; /*!< root node */ - size_t num; /*!< number of objects */ - uint8_t tid; /*!< travel id sequencer */ -}; - -/** - * qtreetbl object data structure - */ -struct qtreetbl_obj_s { - void *name; /*!< name of key */ - size_t namesize; /*!< name size */ - void *data; /*!< data */ - size_t datasize; /*!< data size */ - - bool red; /*!< true if upper link is red */ - qtreetbl_obj_t *left; /*!< left node */ - qtreetbl_obj_t *right; /*!< right node */ - - qtreetbl_obj_t *next; /*!< temporary use for tree traversal */ - uint8_t tid; /*!< temporary use for tree traversal */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QTREETBL_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qvector.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qvector.h deleted file mode 100755 index f60e383..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/containers/qvector.h +++ /dev/null @@ -1,160 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ -/* This code is written and updated by following people and released under - * the same license as above qLibc license. - * Copyright (c) 2015 Zhenjiang Xie - https://github.com/Charles0429 - *****************************************************************************/ - -/** - * Vector container. - * - * @file qvector.h - */ - -#ifndef QVECTOR_H -#define QVECTOR_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qvector_s qvector_t; -typedef struct qvector_obj_s qvector_obj_t; - -/* public functions */ -enum { - QVECTOR_THREADSAFE = (0x01), /*!< make it thread-safe */ - QVECTOR_RESIZE_DOUBLE = (0x02), /*!< double the size when vector is full*/ - QVECTOR_RESIZE_LINEAR = (0x04), /*!< add the size with initial num when vector is full*/ - QVECTOR_RESIZE_EXACT = (0x08) /*!< add up as much as needed*/ -}; - -extern qvector_t *qvector(size_t max, size_t objsize, int options); - -extern bool qvector_addfirst(qvector_t *vector, const void *data); -extern bool qvector_addlast(qvector_t *vector, const void *data); -extern bool qvector_addat(qvector_t *vector, int index, const void *data); - -extern void *qvector_getfirst(qvector_t *vector, bool newmem); -extern void *qvector_getlast(qvector_t *vector, bool newmem); -extern void *qvector_getat(qvector_t *vector, int index, bool newmem); - -extern bool qvector_setfirst(qvector_t *vector, const void *data); -extern bool qvector_setlast(qvector_t *vector, const void *data); -extern bool qvector_setat(qvector_t *vector, int index, const void *data); - -extern void *qvector_popfirst(qvector_t *vector); -extern void *qvector_poplast(qvector_t *vector); -extern void *qvector_popat(qvector_t *vector, int index); - -extern bool qvector_removefirst(qvector_t *vector); -extern bool qvector_removelast(qvector_t *vector); -extern bool qvector_removeat(qvector_t *vector, int index); - -extern size_t qvector_size(qvector_t *vector); -extern bool qvector_resize(qvector_t *vector, size_t newmax); - -extern void *qvector_toarray(qvector_t *vector, size_t *size); - -extern void qvector_lock(qvector_t *vector); -extern void qvector_unlock(qvector_t *vector); - -extern void qvector_clear(qvector_t *vector); -extern bool qvector_debug(qvector_t *vector, FILE *out); -extern void qvector_free(qvector_t *vector); - -extern void qvector_reverse(qvector_t *vector); -extern bool qvector_getnext(qvector_t *vector, qvector_obj_t *obj, bool newmem); - -/** - * qvector container object - */ -struct qvector_s { - /* capsulated member functions */ - - bool (*addfirst)(qvector_t *vector, const void *object); - bool (*addlast)(qvector_t *vector, const void *data); - bool (*addat)(qvector_t *vector, int index, const void *data); - - void *(*getfirst)(qvector_t *vector, bool newmem); - void *(*getlast)(qvector_t *vector, bool newmem); - void *(*getat)(qvector_t *vector, int index, bool newmem); - - bool (*setfirst)(qvector_t *vector, const void *data); - bool (*setlast)(qvector_t *vector, const void *data); - bool (*setat)(qvector_t *vector, int index, const void *data); - - void *(*popfirst)(qvector_t *vector); - void *(*poplast)(qvector_t *vector); - void *(*popat)(qvector_t *vector, int index); - - bool (*removefirst)(qvector_t *vector); - bool (*removelast)(qvector_t *vector); - bool (*removeat)(qvector_t *vector, int index); - - size_t (*size)(qvector_t *vector); - bool (*resize)(qvector_t *vector, size_t newmax); - - void *(*toarray)(qvector_t *vector, size_t *size); - - void (*lock)(qvector_t *vector); - void (*unlock)(qvector_t *vector); - - void (*clear)(qvector_t *vector); - bool (*debug)(qvector_t *vector, FILE *out); - void (*free)(qvector_t *vector); - - void (*reverse)(qvector_t *vector); - bool (*getnext)(qvector_t *vector, qvector_obj_t *obj, bool newmem); - - /* private variables - do not access directly */ - void *qmutex; - void *data; - size_t num; /*number of elements*/ - size_t objsize; /*the size of each element*/ - size_t max; /*allocated number of elements*/ - int options; - size_t initnum; -}; - -struct qvector_obj_s { - void *data; - int index; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QVECTOR_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qaconf.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qaconf.h deleted file mode 100755 index e61962f..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qaconf.h +++ /dev/null @@ -1,229 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * Apache-style Configuration File Parser. - * - * This is a qLibc extension implementing Apache-style configuration file - * parser. - * - * @file qaconf.h - */ - -#ifndef QACONF_H -#define QACONF_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qaconf_s qaconf_t; -typedef struct qaconf_option_s qaconf_option_t; -typedef struct qaconf_cbdata_s qaconf_cbdata_t; -typedef char *(qaconf_cb_t) (qaconf_cbdata_t *data, void *userdata); - -/* public functions */ -extern qaconf_t *qaconf(void); - -/* user's callback function prototype */ -#define QAC_CB(func) char *func(qaconf_cbdata_t *data, void *userdata) -#define QAC_TAKEn(n) (n) - -/* parser option flags */ -enum { - QAC_CASEINSENSITIVE = (1), - QAC_IGNOREUNKNOWN = (2), // Ignore unknown option directives. -}; - -/** - * Argument type check - * - * uint32_t type 32bit variable is used for passing argument types. - * notused bool float int #arg - * ---- ---====== ---- --== ==== ---- ---- - * rrrr rrBb bbbb Ffff ffIi iiii aaaa aaaa (32bit mask) - * (6bit) (6bit) (6bit) (6bit) (8bit) - * - * r : Not Used - * B : Consider all arguments as BOOL type unless individually specified. - * b : Flaged argument(1~5) must be bool type. - * F : Consider all arguments as FLOAT type unless individually specified. - * f : Flaged argument(1~5) must be float type. - * I : Consider all arguments as INTEGER type unless individually specified. - * i : Flaged argument(1~5) must be integer type. - * a : Number of arguments (0~254). - * Value 255 means take any number of arguments. - * - * An option takes 1 argument. - * QAC_TAKE_STR <= String(any) type - * QAC_TAKE_INT <= Integer type - * QAC_TAKE_FLOAT <= Float type - * QAC_TAKE_BOOL <= Bool type - * - * QAC_TAKE1 <= equivalent to QAC_TAKE_STR - * QAC_TAKE1 | QAC_A1_BOOL <= equivalent to QAC_TAKE_BOOL - * - * An option takes 2 arguments, bool and float. - * QAC_TAKE2 | QAC_A1_BOOL | QAC_A2_FLOAT - * - * An option takes any number of arguments in any type. - * QAC_TAKEALL - * - * An option takes any number of arguments but 1st one must be bool and - * 2nd one must be integer and rest of them must be float. - * QAC_TAKEALL | QAC_A1_BOOL | QAC_A2_INT | QAC_AA_FLOAT - */ -enum qaconf_take { - // Define string(any) type argument. - QAC_A1_STR = 0, - QAC_A2_STR = 0, - QAC_A3_STR = 0, - QAC_A4_STR = 0, - QAC_A5_STR = 0, - QAC_AA_STR = 0, // All string unless individually specified. - - // Define integer type argument. - QAC_A1_INT = (1 << 8), - QAC_A2_INT = (QAC_A1_INT << 1), - QAC_A3_INT = (QAC_A1_INT << 2), - QAC_A4_INT = (QAC_A1_INT << 3), - QAC_A5_INT = (QAC_A1_INT << 4), - QAC_AA_INT = (QAC_A1_INT << 5), // All integer unless specified. - - // Define floating point type argument. - QAC_A1_FLOAT = (1 << 16), - QAC_A2_FLOAT = (QAC_A1_FLOAT << 1), - QAC_A3_FLOAT = (QAC_A1_FLOAT << 2), - QAC_A4_FLOAT = (QAC_A1_FLOAT << 3), - QAC_A5_FLOAT = (QAC_A1_FLOAT << 4), - QAC_AA_FLOAT = (QAC_A1_FLOAT << 5), // All float unless specified. - - // Define bool(true/false, yes/no, on/off, 1/0) type argument. - QAC_A1_BOOL = (1 << 24), - QAC_A2_BOOL = (QAC_A1_BOOL << 1), - QAC_A3_BOOL = (QAC_A1_BOOL << 2), - QAC_A4_BOOL = (QAC_A1_BOOL << 3), - QAC_A5_BOOL = (QAC_A1_BOOL << 4), - QAC_AA_BOOL = (QAC_A1_BOOL << 5), // All bool unless specified. - - // Number of arguments to take - QAC_TAKENONE = QAC_TAKEn(0), - QAC_TAKE0 = QAC_TAKENONE, - QAC_TAKE1 = QAC_TAKEn(1), - QAC_TAKE2 = QAC_TAKEn(2), - QAC_TAKE3 = QAC_TAKEn(3), - QAC_TAKE4 = QAC_TAKEn(4), - QAC_TAKE5 = QAC_TAKEn(5), - // use QAC_TAKEn(N) macro for 6~254 arguments. - QAC_TAKEALL = 0xFF, // Take any number of elements. (0 ~ INT_MAX) - - // Convenient synonyms - QAC_TAKE_STR = (QAC_TAKE1 | QAC_A1_STR), - QAC_TAKE_INT = (QAC_TAKE1 | QAC_A1_INT), - QAC_TAKE_FLOAT = (QAC_TAKE1 | QAC_A1_FLOAT), - QAC_TAKE_BOOL = (QAC_TAKE1 | QAC_A1_BOOL), -}; -#define QAC_TAKEn(n) (n) - -/* pre-defined sections */ -enum qaconf_section { - QAC_SECTION_ALL = (0), /* pre-defined */ - QAC_SECTION_ROOT = (1) /* pre-defined */ -}; - -/* option type */ -enum qaconf_otype { - QAC_OTYPE_OPTION = 0, /* general option */ - QAC_OTYPE_SECTIONOPEN = 1, /* section open */ - QAC_OTYPE_SECTIONCLOSE = 2 /* section close */ -}; - -/** - * qaconf_t object. - */ -struct qaconf_s { - /* capsulated member functions */ - int (*addoptions) (qaconf_t *qaconf, const qaconf_option_t *options); - void (*setdefhandler) (qaconf_t *qaconf, qaconf_cb_t *callback); - void (*setuserdata) (qaconf_t *qaconf, const void *userdata); - int (*parse) (qaconf_t *qaconf, const char *filepath, uint8_t flags); - const char *(*errmsg) (qaconf_t *qaconf); - void (*reseterror) (qaconf_t *qaconf); - void (*free) (qaconf_t *qaconf); - - /* private variables - do not access directly */ - int numoptions; /*!< a number of user defined options */ - qaconf_option_t *options; /*!< option data */ - - qaconf_cb_t *defcb; /*!< default callback for unregistered option */ - void *userdata; /*!< userdata */ - - char *filepath; /*!< current processing file's path */ - int lineno; /*!< current processing line number */ - - char *errstr; /*!< last error string */ -}; - -/** - * structure for user option definition. - */ -struct qaconf_option_s { - char *name; /*!< name of option. */ - uint32_t take; /*!< number of arguments and type checking */ - qaconf_cb_t *cb; /*!< callback function */ - uint64_t sectionid; /*!< sectionid if this is a section */ - uint64_t sections; /*!< ORed sectionid(s) where this option is allowed */ -}; -#define QAC_OPTION_END {NULL, 0, NULL, 0, 0} - -/** - * callback data structure. - */ -struct qaconf_cbdata_s { - enum qaconf_otype otype; /*!< option type */ - uint64_t section; /*!< current section where this option is located */ - uint64_t sections; /*!< ORed all parent's sectionid(s) including current sections */ - uint8_t level; /*!< number of parents(level), root level is 0 */ - qaconf_cbdata_t *parent; /*!< upper parent link */ - - int argc; /*!< number arguments. always equal or greater than 1. */ - char **argv; /*!< argument pointers. argv[0] is option name. */ - - void *data; /*!< where actual data is stored */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QACONF_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qconfig.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qconfig.h deleted file mode 100755 index 233571f..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qconfig.h +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * INI-style Configuration File Parser. - * - * This is a qLibc extension implementing INI-style configuration file parser. - * - * @file qconfig.h - */ - -#ifndef QCONFIG_H -#define QCONFIG_H - -#include -#include -#include -#include "../containers/qlisttbl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* public functions */ -extern qlisttbl_t *qconfig_parse_file(qlisttbl_t *tbl, const char *filepath, char sepchar); -extern qlisttbl_t *qconfig_parse_str(qlisttbl_t *tbl, const char *str, char sepchar); - -#ifdef __cplusplus -} -#endif - -#endif /* QCONFIG_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qdatabase.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qdatabase.h deleted file mode 100755 index c3db52d..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qdatabase.h +++ /dev/null @@ -1,140 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * Generic database interface. - * - * This is a qLibc extension implementing generic database interface. - * For now, it supports only MySQL database. - * - * @file qdatabase.h - */ - -#ifndef QDATABASE_H -#define QDATABASE_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* database header files should be included before this header file. */ -#ifdef _mysql_h -#define Q_ENABLE_MYSQL (1) -#endif /* _mysql_h */ - -/* types */ -typedef struct qdbresult_s qdbresult_t; -typedef struct qdb_s qdb_t; - -/* public functions */ -extern qdb_t *qdb(const char *dbtype, - const char *addr, int port, const char *database, - const char *username, const char *password, bool autocommit); - -/** - * qdbresult object structure - */ -struct qdbresult_s { - /* encapsulated member functions */ - const char *(*getstr) (qdbresult_t *result, const char *field); - const char *(*get_str_at) (qdbresult_t *result, int idx); - int (*getint) (qdbresult_t *result, const char *field); - int (*get_int_at) (qdbresult_t *result, int idx); - bool (*getnext) (qdbresult_t *result); - - int (*get_cols) (qdbresult_t *result); - int (*get_rows) (qdbresult_t *result); - int (*get_row) (qdbresult_t *result); - - void (*free) (qdbresult_t *result); - -#ifdef Q_ENABLE_MYSQL - /* private variables for mysql database - do not access directly */ - bool fetchtype; - MYSQL_RES *rs; - MYSQL_FIELD *fields; - MYSQL_ROW row; - int cols; - int cursor; -#endif -}; - -/* qdb object structure */ -struct qdb_s { - /* encapsulated member functions */ - bool (*open) (qdb_t *db); - bool (*close) (qdb_t *db); - - int (*execute_update) (qdb_t *db, const char *query); - int (*execute_updatef) (qdb_t *db, const char *format, ...); - - qdbresult_t *(*execute_query) (qdb_t *db, const char *query); - qdbresult_t *(*execute_queryf) (qdb_t *db, const char *format, ...); - - bool (*begin_tran) (qdb_t *db); - bool (*end_tran) (qdb_t *db, bool commit); - bool (*commit) (qdb_t *db); - bool (*rollback) (qdb_t *db); - - bool (*set_fetchtype) (qdb_t *db, bool fromdb); - bool (*get_conn_status) (qdb_t *db); - bool (*ping) (qdb_t *db); - const char *(*get_error) (qdb_t *db, unsigned int *errorno); - void (*free) (qdb_t *db); - - /* private variables - do not access directly */ - void *qmutex; - - bool connected; /*!< if opened true, if closed false */ - - struct { - char *dbtype; - char *addr; - int port; - char *username; - char *password; - char *database; - bool autocommit; - bool fetchtype; - } info; /*!< database connection information */ - -#ifdef Q_ENABLE_MYSQL - /* private variables for mysql database - do not access directly */ - MYSQL *mysql; -#endif -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QDATABASE_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qhttpclient.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qhttpclient.h deleted file mode 100755 index 1f7869c..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qhttpclient.h +++ /dev/null @@ -1,127 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * HTTP client. - * - * This is a qLibc extension implementing HTTP client. - * - * @file qhttpclient.h - */ - -#ifndef QHTTPCLIENT_H -#define QHTTPCLIENT_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qhttpclient_s qhttpclient_t; - -/* constants */ -#define QHTTPCLIENT_NAME "qLibc" - -/* public functions */ -extern qhttpclient_t *qhttpclient(const char *hostname, int port); - -/** - * qhttpclient object structure - */ -struct qhttpclient_s { - /* encapsulated member functions */ - bool (*setssl) (qhttpclient_t *client); - void (*settimeout) (qhttpclient_t *client, int timeoutms); - void (*setkeepalive) (qhttpclient_t *client, bool keepalive); - void (*setuseragent) (qhttpclient_t *client, const char *useragent); - - bool (*open) (qhttpclient_t *client); - - bool (*head) (qhttpclient_t *client, const char *uri, int *rescode, - qlisttbl_t *reqheaders, qlisttbl_t *resheaders); - bool (*get) (qhttpclient_t *client, const char *uri, int fd, - off_t *savesize, int *rescode, - qlisttbl_t *reqheaders, qlisttbl_t *resheaders, - bool (*callback) (void *userdata, off_t recvbytes), - void *userdata); - bool (*put) (qhttpclient_t *client, const char *uri, int fd, - off_t length, int *retcode, qlisttbl_t *userheaders, - qlisttbl_t *resheaders, - bool (*callback) (void *userdata, off_t sentbytes), - void *userdata); - void *(*cmd) (qhttpclient_t *client, - const char *method, const char *uri, - void *data, size_t size, int *rescode, - size_t *contentslength, - qlisttbl_t *reqheaders, qlisttbl_t *resheaders); - - char *(*json) (qhttpclient_t *client, - const char *method, const char *uri, - char *data, size_t size, int *rescode, - size_t *contentslength, - qlisttbl_t *reqheaders, qlisttbl_t *resheaders); - - bool (*sendrequest) (qhttpclient_t *client, const char *method, - const char *uri, qlisttbl_t *reqheaders); - int (*readresponse) (qhttpclient_t *client, qlisttbl_t *resheaders, - off_t *contentlength); - - ssize_t (*gets) (qhttpclient_t *client, char *buf, size_t bufsize); - ssize_t (*read) (qhttpclient_t *client, void *buf, size_t nbytes); - ssize_t (*write) (qhttpclient_t *client, const void *buf, - size_t nbytes); - off_t (*recvfile) (qhttpclient_t *client, int fd, off_t nbytes); - off_t (*sendfile) (qhttpclient_t *client, int fd, off_t nbytes); - - bool (*close) (qhttpclient_t *client); - void (*free) (qhttpclient_t *client); - - /* private variables - do not access directly */ - int socket; /*!< socket descriptor */ - void *ssl; /*!< will be used if SSL has been enabled at compile time */ - - struct sockaddr_in addr; - char *hostname; - int port; - - int timeoutms; /*< wait timeout milliseconds*/ - bool keepalive; /*< keep-alive flag */ - char *useragent; /*< user-agent name */ - - bool connclose; /*< response keep-alive flag for a last request */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QHTTPCLIENT_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qlog.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qlog.h deleted file mode 100755 index 5cc0e9f..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qlog.h +++ /dev/null @@ -1,91 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * Rotating file logger. - * - * This is a qLibc extension implementing application level auto-rotating file - * logger. - * - * @file qlog.h - */ - -#ifndef QLOG_H -#define QLOG_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* types */ -typedef struct qlog_s qlog_t; - -/* constants */ -#define QLOG_OPT_THREADSAFE (0x01) -#define QLOG_OPT_FLUSH (0x01 << 1) - -/* public functions */ -extern qlog_t *qlog(const char *filepathfmt, mode_t mode, int rotateinterval, int options); - -/** - * qlog structure object structure - */ -struct qlog_s { - /* encapsulated member functions */ - bool (*write) (qlog_t *log, const char *str); - bool (*writef) (qlog_t *log, const char *format, ...); - bool (*duplicate) (qlog_t *log, FILE *outfp, bool flush); - bool (*flush) (qlog_t *log); - void (*free) (qlog_t *log); - - /* private variables - do not access directly */ - void *qmutex; /*!< activated if compiled with --enable-threadsafe */ - - char filepathfmt[PATH_MAX]; /*!< file file naming format like - /somepath/daily-%Y%m%d.log */ - char filepath[PATH_MAX]; /*!< generated system path of log file */ - FILE *fp; /*!< file pointer of logpath */ - mode_t mode; /*!< file mode */ - int rotateinterval; /*!< log file will be rotate in this interval seconds */ - int nextrotate; /*!< next rotate universal time, seconds */ - bool logflush; /*!< flag for immediate flushing */ - - FILE *outfp; /*!< stream pointer for duplication */ - bool outflush; /*!< flag for immediate flushing for duplicated stream */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QLOG_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qtokenbucket.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qtokenbucket.h deleted file mode 100755 index c3db52d..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/extensions/qtokenbucket.h +++ /dev/null @@ -1,140 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -/** - * Generic database interface. - * - * This is a qLibc extension implementing generic database interface. - * For now, it supports only MySQL database. - * - * @file qdatabase.h - */ - -#ifndef QDATABASE_H -#define QDATABASE_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* database header files should be included before this header file. */ -#ifdef _mysql_h -#define Q_ENABLE_MYSQL (1) -#endif /* _mysql_h */ - -/* types */ -typedef struct qdbresult_s qdbresult_t; -typedef struct qdb_s qdb_t; - -/* public functions */ -extern qdb_t *qdb(const char *dbtype, - const char *addr, int port, const char *database, - const char *username, const char *password, bool autocommit); - -/** - * qdbresult object structure - */ -struct qdbresult_s { - /* encapsulated member functions */ - const char *(*getstr) (qdbresult_t *result, const char *field); - const char *(*get_str_at) (qdbresult_t *result, int idx); - int (*getint) (qdbresult_t *result, const char *field); - int (*get_int_at) (qdbresult_t *result, int idx); - bool (*getnext) (qdbresult_t *result); - - int (*get_cols) (qdbresult_t *result); - int (*get_rows) (qdbresult_t *result); - int (*get_row) (qdbresult_t *result); - - void (*free) (qdbresult_t *result); - -#ifdef Q_ENABLE_MYSQL - /* private variables for mysql database - do not access directly */ - bool fetchtype; - MYSQL_RES *rs; - MYSQL_FIELD *fields; - MYSQL_ROW row; - int cols; - int cursor; -#endif -}; - -/* qdb object structure */ -struct qdb_s { - /* encapsulated member functions */ - bool (*open) (qdb_t *db); - bool (*close) (qdb_t *db); - - int (*execute_update) (qdb_t *db, const char *query); - int (*execute_updatef) (qdb_t *db, const char *format, ...); - - qdbresult_t *(*execute_query) (qdb_t *db, const char *query); - qdbresult_t *(*execute_queryf) (qdb_t *db, const char *format, ...); - - bool (*begin_tran) (qdb_t *db); - bool (*end_tran) (qdb_t *db, bool commit); - bool (*commit) (qdb_t *db); - bool (*rollback) (qdb_t *db); - - bool (*set_fetchtype) (qdb_t *db, bool fromdb); - bool (*get_conn_status) (qdb_t *db); - bool (*ping) (qdb_t *db); - const char *(*get_error) (qdb_t *db, unsigned int *errorno); - void (*free) (qdb_t *db); - - /* private variables - do not access directly */ - void *qmutex; - - bool connected; /*!< if opened true, if closed false */ - - struct { - char *dbtype; - char *addr; - int port; - char *username; - char *password; - char *database; - bool autocommit; - bool fetchtype; - } info; /*!< database connection information */ - -#ifdef Q_ENABLE_MYSQL - /* private variables for mysql database - do not access directly */ - MYSQL *mysql; -#endif -}; - -#ifdef __cplusplus -} -#endif - -#endif /* QDATABASE_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qsem.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qsem.h deleted file mode 100755 index 400973d..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qsem.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qsem header file. - * - * @file qsem.h - */ - -#ifndef QSEM_H -#define QSEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern int qsem_init(const char *keyfile, int keyid, int nsems, bool recreate); -extern int qsem_getid(const char *keyfile, int keyid); -extern bool qsem_enter(int semid, int semno); -extern bool qsem_enter_nowait(int semid, int semno); -extern bool qsem_enter_force(int semid, int semno, int maxwaitms, - bool *forceflag); -extern bool qsem_leave(int semid, int semno); -extern bool qsem_check(int semid, int semno); -extern bool qsem_free(int semid); - -#ifdef __cplusplus -} -#endif - -#endif /* QSEM_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qshm.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qshm.h deleted file mode 100755 index 2697779..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/ipc/qshm.h +++ /dev/null @@ -1,52 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qshm header file. - * - * @file qshm.h - */ - -#ifndef QSHM_H -#define QSHM_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern int qshm_init(const char *keyfile, int keyid, size_t size, - bool recreate); -extern int qshm_getid(const char *keyfile, int keyid); -extern void *qshm_get(int shmid); -extern bool qshm_free(int shmid); - -#ifdef __cplusplus -} -#endif - -#endif /* QSHM_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibc.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibc.h deleted file mode 100755 index 3a82875..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibc.h +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qlibc header file. - * - * @file qlibc.h - */ - -#ifndef QLIBC_H -#define QLIBC_H - -/* containers */ -#include "containers/qtreetbl.h" -#include "containers/qhashtbl.h" -#include "containers/qhasharr.h" -#include "containers/qlisttbl.h" -#include "containers/qlist.h" -#include "containers/qvector.h" -#include "containers/qqueue.h" -#include "containers/qstack.h" -#include "containers/qgrow.h" - -/* utilities */ -#include "utilities/qcount.h" -#include "utilities/qencode.h" -#include "utilities/qfile.h" -#include "utilities/qhash.h" -#include "utilities/qio.h" -#include "utilities/qsocket.h" -#include "utilities/qstring.h" -#include "utilities/qsystem.h" -#include "utilities/qtime.h" - -/* ipc */ -#include "ipc/qsem.h" -#include "ipc/qshm.h" - -#endif /* QLIBC_H */ - diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibcext.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibcext.h deleted file mode 100755 index a6dd091..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/qlibcext.h +++ /dev/null @@ -1,45 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qlibc extension header file. - * - * @file qlibcext.h - */ - -#ifndef QLIBCEXT_H -#define QLIBCEXT_H - -#include "extensions/qconfig.h" -#include "extensions/qaconf.h" -#include "extensions/qlog.h" -#include "extensions/qhttpclient.h" -#include "extensions/qdatabase.h" -#include "extensions/qtokenbucket.h" - -#endif /* QLIBCEXT_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qcount.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qcount.h deleted file mode 100755 index ce634f7..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qcount.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qcount header file. - * - * @file qcount.h - */ - -#ifndef QCOUNT_H -#define QCOUNT_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern int64_t qcount_read(const char *filepath); -extern bool qcount_save(const char *filepath, int64_t number); -extern int64_t qcount_update(const char *filepath, int64_t number); - -#ifdef __cplusplus -} -#endif - -#endif /* QCOUNT_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qencode.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qencode.h deleted file mode 100755 index 93c5351..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qencode.h +++ /dev/null @@ -1,59 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qencode header file. - * - * @file qencode.h - */ - -#ifndef QENCODE_H -#define QENCODE_H - -#include -#include -#include "../containers/qlisttbl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern qlisttbl_t *qparse_queries(qlisttbl_t *tbl, const char *query, - char equalchar, char sepchar, int *count); -extern char *qurl_encode(const void *bin, size_t size); -extern size_t qurl_decode(char *str); -extern char *qbase64_encode(const void *bin, size_t size); -extern size_t qbase64_decode(char *str); -extern char *qhex_encode(const void *bin, size_t size); -extern size_t qhex_decode(char *str); - -#ifdef __cplusplus -} -#endif - -#endif /* QENCODE_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qfile.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qfile.h deleted file mode 100755 index 76b4261..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qfile.h +++ /dev/null @@ -1,69 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qfile header file. - * - * @file qfile.h - */ - -#ifndef QFILE_H -#define QFILE_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bool qfile_lock(int fd); -extern bool qfile_unlock(int fd); -extern bool qfile_exist(const char *filepath); -extern void *qfile_load(const char *filepath, size_t *nbytes); -extern void *qfile_read(FILE *fp, size_t *nbytes); -extern ssize_t qfile_save(const char *filepath, const void *buf, size_t size, - bool append); -extern bool qfile_mkdir(const char *dirpath, mode_t mode, bool recursive); - -extern char *qfile_get_name(const char *filepath); -extern char *qfile_get_dir(const char *filepath); -extern char *qfile_get_ext(const char *filepath); -extern off_t qfile_get_size(const char *filepath); - -extern bool qfile_check_path(const char *path); -extern char *qfile_correct_path(char *path); -extern char *qfile_abspath(char *buf, size_t bufsize, const char *path); - -#ifdef __cplusplus -} -#endif - -#endif /* QFILE_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qhash.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qhash.h deleted file mode 100755 index d26a9f0..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qhash.h +++ /dev/null @@ -1,61 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qhash header file. - * - * @file qhash.h - */ - -#ifndef QHASH_H -#define QHASH_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bool qhashmd5(const void *data, size_t nbytes, void *retbuf); -extern bool qhashmd5_file(const char *filepath, off_t offset, ssize_t nbytes, - void *retbuf); - -extern uint32_t qhashfnv1_32(const void *data, size_t nbytes); -extern uint64_t qhashfnv1_64(const void *data, size_t nbytes); - -extern uint32_t qhashmurmur3_32(const void *data, size_t nbytes); -extern bool qhashmurmur3_128(const void *data, size_t nbytes, void *retbuf); - -#ifdef __cplusplus -} -#endif - -#endif /* QHASH_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qio.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qio.h deleted file mode 100755 index e8c9e6e..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qio.h +++ /dev/null @@ -1,60 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qio header file. - * - * @file qio.h - */ - -#ifndef QIO_H -#define QIO_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern int qio_wait_readable(int fd, int timeoutms); -extern int qio_wait_writable(int fd, int timeoutms); -extern ssize_t qio_read(int fd, void *buf, size_t nbytes, int timeoutms); -extern ssize_t qio_write(int fd, const void *data, size_t nbytes, - int timeoutms); -extern off_t qio_send(int outfd, int infd, off_t nbytes, int timeoutms); -extern ssize_t qio_gets(int fd, char *buf, size_t bufsize, int timeoutms); -extern ssize_t qio_puts(int fd, const char *str, int timeoutms); -extern ssize_t qio_printf(int fd, int timeoutms, const char *format, ...); - -#ifdef __cplusplus -} -#endif - -#endif /* QIO_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsocket.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsocket.h deleted file mode 100755 index 1caca9f..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsocket.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qsocket header file. - * - * @file qsocket.h - */ - -#ifndef QSOCKET_H -#define QSOCKET_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern int qsocket_open(const char *hostname, int port, int timeoutms); -extern bool qsocket_close(int sockfd, int timeoutms); -extern bool qsocket_get_addr(struct sockaddr_in *addr, const char *hostname, - int port); -extern char *qsocket_get_localaddr(char *buf, size_t bufsize); - -#ifdef __cplusplus -} -#endif - -#endif /* QSOCKET_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qstring.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qstring.h deleted file mode 100755 index 75c6163..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qstring.h +++ /dev/null @@ -1,78 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qstring header file. - * - * @file qstring.h - */ - -#ifndef QSTRING_H -#define QSTRING_H - -#include -#include -#include "../containers/qlist.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern char *qstrtrim(char *str); -extern char *qstrtrim_head(char *str); -extern char *qstrtrim_tail(char *str); -extern char *qstrunchar(char *str, char head, char tail); -extern char *qstrreplace(const char *mode, char *srcstr, const char *tokstr, - const char *word); -extern char *qstrcpy(char *dst, size_t size, const char *src); -extern char *qstrncpy(char *dst, size_t size, const char *src, size_t nbytes); -extern char *qstrdupf(const char *format, ...); -extern char *qstrdup_between(const char *str, const char *start, - const char *end); -extern void *qmemdup(const void *data, size_t size); -extern char *qstrcatf(char *str, const char *format, ...); -extern char *qstrgets(char *buf, size_t size, char **offset); -extern char *qstrrev(char *str); -extern char *qstrupper(char *str); -extern char *qstrlower(char *str); -extern char *qstrtok(char *str, const char *delimiters, char *retstop, - int *offset); -extern qlist_t *qstrtokenizer(const char *str, const char *delimiters); -extern char *qstrunique(const char *seed); -extern char *qstr_comma_number(int number); -extern bool qstrtest(int (*testfunc)(int), const char *str); -extern bool qstr_is_email(const char *email); -extern bool qstr_is_ip4addr(const char *str); -extern char *qstr_conv_encoding(const char *fromstr, const char *fromcode, - const char *tocode, float mag); - -#ifdef __cplusplus -} -#endif - -#endif /* QSTRING_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsystem.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsystem.h deleted file mode 100755 index 885bfb3..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qsystem.h +++ /dev/null @@ -1,49 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qsystem header file. - * - * @file qsystem.h - */ - -#ifndef QSYSTEM_H -#define QSYSTEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern const char *qgetenv(const char *envname, const char *nullstr); -extern char *qsyscmd(const char *cmd); - -#ifdef __cplusplus -} -#endif - -#endif /* QSYSTEM_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qtime.h b/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qtime.h deleted file mode 100755 index c752f2e..0000000 --- a/qlibc/0.0.0/AIX-00FB437F4C00/include/qlibc/utilities/qtime.h +++ /dev/null @@ -1,67 +0,0 @@ -/****************************************************************************** - * qLibc - * - * Copyright (c) 2010-2015 Seungyoung Kim. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -/** - * qtime header file. - * - * @file qtime.h - */ - -#ifndef QTIME_H -#define QTIME_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern void qtime_timespec_diff(struct timespec t1, struct timespec t2, - struct timespec *diff); -extern void qtime_timeval_diff(struct timeval t1, struct timeval t2, - struct timeval *diff); - -extern long qtime_current_milli(void); - -extern char *qtime_localtime_strf(char *buf, int size, time_t utctime, - const char *format); -extern char *qtime_localtime_str(time_t utctime); -extern const char *qtime_localtime_staticstr(time_t utctime); -extern char *qtime_gmt_strf(char *buf, int size, time_t utctime, - const char *format); -extern char *qtime_gmt_str(time_t utctime); -extern const char *qtime_gmt_staticstr(time_t utctime); -extern time_t qtime_parse_gmtstr(const char *gmtstr); - -#ifdef __cplusplus -} -#endif - -#endif /* QTIME_H */ diff --git a/qlibc/0.0.0/AIX-00FB437F4C00/libqlibc.a.1 b/qlibc/0.0.0/AIX-00FB437F4C00/libqlibc.a.1 deleted file mode 100755 index ee29d08ad05d17b6f8fb5de248e36b0d8682d08d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1449054 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
CbEWSq(2Rrpqb) z#X|XIR-ybduZDdZu42sjzs%2=%X?Y1CJ$)xkR}gnxK+b#8g6I&8d;vpqKxrQ0V>~R zamKqDCm3JOIK{Y@ahmZJj7J$4Gah4n8RK!rf5AAz81JAE=}$1ep7A7OoHG>iDaHgT zztfDjFrH!D#CVo*fbpDm{XAp5>qW$uWsG-U2)w}f^^6x8zd_>5Eyg!7_A-7WV;|!; zF|J}9VeDrdWn9fT#yG&ZgK>y)C*v^VF2=2lyBW7J?qS@{_%P!rW1QEd@?IWijCail zoM8NB#wo^l$B~ey8TTHa$PB5Nee2DQR<5w}BVvKj^i1?-% zznbw3<4YLNGR8YLg#H}kFync~bTFREpJhyt@B-uQj29VuB;IK;rUwh5zthVY=SKzh zF)m?T#dsHEKjYPms~Hod_yQUZF@6Qh!;H^i+{zf|b;b2*pBPvwWWMKE_$bS2JE<>}9;jc#p)pEXIwDy^Q^geT)w>u43HG*v~k~ zxSH`1#sS7dj6;m^t`{obt}x?a#;uG;7`HJ#%DA2JF~(8GDaLWecxR7@Kf(Adj8lx? z$~evVIO9>qw=y1M{5Hnpj88DmFita`V0;_nNyfJ`o?`rV#?y@NU_8V49gJrgdl=7Y zcwWO<#^Va9WeGmPgMe}r+C@kbdi zF#Z_hMaK6@yvJhvw~W1vKhD_4`0p53F}|0vpYa6aYQ~>n9ANzSj6;n7fpM7eCmFXg z{zt}bjQ@#oJ7a>d&z>mbNyc%;pJJR~{4b1CjQ^E!n(?O@k23xY<1xmcWjxOKbBr^L zrx;H#{ygJJ#$RAO#rU5YPc!}^;~B>HGoEGq0OL8vUt&DZ_{)s5jHekdFn*BnBIAc7 z4p@vIX6$AB2xA}PM;TW!{t9D1s-sIO7E4S;i^GUuT?V`~>4s#@}E(#`sCboAD&$ zImT0rzr%Q%@pl=|F#aCnS;kK>o@4xd#`BDSz&OkJhm02(&of?R{3D5LEXF@(>}C8D z#y-YBWn9JhXN>)ff6lm?@qaQ7FwQa#F+RmO%=o_;w=#a3aU0`bFm7l3OU6;g|A%p$ z@qaT;FkWDsV*Cu_G~-_}9%cM%#$$}1WjxOKH;glkf6I7+@$VQ)mc$x8n#2$j^e>IDY1>v`X7ULo*4|*A|V(epF%(#m2 zS&aRRS2M0=T*5fO*vmM?cn#w)=8_}yn^v4;|+|*7;j`e&bX3shVdrG6O7MhJjwVR##4-|7*8|a%y@?Jxr}ESpT~HP z@fODOjL&DBWqbkS1;!ULUS#Z-xYlC4m9dxcHpV{27cs74d@*A`@hdpKQN{-tk1;;TcwAzO`)gf> zF#=KE3C7AElZ;7B_L!2`b3Nl}#;;^N!}tcqvy9sq&oTZB#`BC{#W>6O)r=PyA7Z@7 z_(qBAEyk~5?3LJJ`_}sy^Y~m}#hC3=?`O>8d409Sp4W1G0mki&LyTX?IL!F3<2NymOKkD{P@iDT^GSV*G0!LUX}&(f*N-xeG9F_bV?55dV^3FX zI99V~a46Q<*S)8!`)GIHU}Dd{p_{MXfAyZe-j1d{gNfliJwx5y$6`a>#OyiT*|{e% zc&vLU(YdR)qkmVdH??Q&` zjE@X=4IUf7i?ASx4_CtyN3y_hYYBH@MyOZl4{}> zLM8pNzP`aueCgybUKCnVXHmsLf|R-kj#9>khx)pa_F01o3cNjuq27Vv9(?OfcJ&^n z@{>+y9OXMJHaysiAURBBS{>^c9HQ{pQ139undt3;e7KkLza}}L;#!a7h#c(ciroT9 zBoa#|yT!#l99d82fUw+1vah>4ftTMM&0Sv7!%3V)m4~b$Lj$mj{3i3Zx+gI*j54o{ zM0&a+iNQWp!)oN0LMlMl2-H{iAR|zs2ofDbsJgWCxa4p@f9bzjet`{QeFG!? z!WyD5(sZ52kPC_x|L_GhA#ziaPz@s?t$Ef^Yyg^TI%3IgS*dGqMGr@gHj^V0l02(t zco5n0b`A~Ah+yedB z@bFLsjdu8!1e%0FX2*BV%IjnX&W}XsO9Z1z1YH<|O{6mwg9*A*)H=_Ly!_w|SM56( ziR`_XG!saIvxt^9G(CrZj(w$MY}E=|U|V{FP4)B+bVd4mF*fR4 zEQKMfP;USYAEOx=TIEtTe}(OuQG{&L<@Nh#02VsA$Mg z@fduBks%b;8Q7>un9LLW++R0J#ba8PSvSDDFv$ zLA)wg6pN~sf`r8-6?VdQeU#f2+b>7hEmx%@4VsHKXFsJO?YBn7iRn~)?eD_URN4iD z68AA_1;Tk&V3=ox93vVsrNoro%yKd1S%Q?5!7D{Bn6WRD1tC^h>>OK9Yse-+Zx@=W zv?#}{rUaG80*jJPfklas_Bzi_7XD4=NFSz4@)%_UmllMwX!~%?B5-}k*`%SncQB&- zw$dXbLw%9%fzH7$j1udP^z`<1N916%<_Od=_`^3UMN93E-Q0a_a0sK6yr!#LUb9Ax zsc^o;S1R67cs7GWk=*p^%cIncnNy<4%f1Na=Q+>52$Xgan1YKivD-5<#|x@JB{$pJ z@j^w$Ycuu)UZyh4b8@A^vW_{ijfJd?%r1#krA(|>dTRLLJYsYb?uebfJ^$KQsPTxe z$n_p3>;a51w-)<)*;woZZ0EpcU`p8py_`v!hmMSNk96nUrBWsmBguG9Oh_~-rB8$y zGS(@5@=?ojKxpS-9+G5gY-x2Z@|C+5px|2If@^`v&MKeMs_QvnHj#pCA*Cw~R3de$ za9FQ&-ke`{NvN{t5SKkiaM_uVWw!z6-^QGO8&m$*apGKdDa)1J#s$~fWtU=Ac8Tn= zOK6u}LREHwu-rIucxdn#bz5q(>N{sV4`NJRC&j8g3t_%DDG0kYmrLz@Z&E05?n1|wPtMy^y43&QdvaD6*;Xmf-zgYQG#SOjz; zaW5gUIu_lwFtm?_75@M}Go(gNqvN4cFtB`t~@ouzEtP?~>6yr4-Kt!$`%cKqw zV!wjp=G}`tDKA6p%Vj-o-X1RC$>%2;@gdE=r#C$ZSOz~ zi*Y$+WA=_v^wg4QYU>#|S|i+^JV<*PaxPSUQB4rr%NuBhIu^r^TADcK(q%R@o3GFj_%=O-Lx$u8dPVD_GQFZ znQ762Fl1BLq?i&3YGr~Iy9hG9!JE4WFpWUM>Gh(OlgV%iEdlyt5o~dEkb<}%(wmHQ z_lpdQj1cZk)X5@k+Rr!)?*I-zIT)QIXf^1T z{k?sCSZiS+LaZ>B_=d~~Uu-3fZG)A{vEklMTtXdHT*3ZJE(%H5Y8$1R?B$S&YhjP> zesbt&*Gd9pkqiOjKq5e7V2~P{Qow4N)@EoFwnER~5cOvnf#`suLLire6ef(nV|iTVKn`w;hL6k5?`8!YMKMVfa_0lpk}Y@kGMhdN|mO6 zWFXmlc%ZwhX*j474>kvy1GTOr+$&<-6uB0T<8W=TX}Gp!Xje^h9b%zfSr%Y_c(_go zLM%92U6E=Ut}l?B6WQP0*^6CHimjm_Hd{pT?Jc-!v${%{G9+X*4V>8KNaXOqNN40| z44XvB;ilonmYP7zWxIlu#c~?|A|PvOT6WRe3@f9g%>}`UyKLoRpIGSCw(OErPhv1B zm^!6ZK@=tyimskX&(>?NJ9rIso5EIZrWA5v#zFLC+vnz#E~T01u?Zq&1Pzvf;BC%p&+#v}HqPX{}mRiA-&_gkVt)(6%xfccC9!=3nJMUE$7@B`pwAH6ck^*&%c&X}(VT zV$7Q2VpQQE#nu>TX%Kx2WALDitFfjfq=w}|8B=4BoA-K5OX4zWN7NQp=+ zIG%bH4=9dDb(1n!Yd~D5GVUWY^Mz^%EXUnSreJ$nLvRHpRTEIQ_d!j@UlUM0AJN&I z%6tVSp%iP`Hogc=<AU#qf}+1lMf+csAOfutI?O$xi;WQ z$eby4#VcoGV^1jY@Udgig;7-)k)x(v>8XgHZ?Fu0Vc)Iak1raB(n3E66OWBll zaKh{0h3Dlkbfz4_Rn5y_1>(bAhp=m%vdfh{Nnw;jHE=AFp`)?BrkZ-`C_6RHKuxpA zH@s+(Paj8tg+s6f(NM9kCQjrW5eo-I#(erlkC;W4X)!6H-e5>BOitS# z_llKCU}t>|H=jc)Vlsuy4Vq8`nowN`L;X<|?-^QAJ;z%c;_9~J9USPCgDkwA8hAI! zy}?LiaDd~5Z*#i*)&x|3_wqWbUFA2K=oJS+M4tDeNx}U|24Rb2LdAWCW)$SOvDTFB z=(Q?tt~MDp8r0qfm?IF0bPTDe_ntP}fjVW5U_eIw8Wpu{GBV~6Vs1otLd-+QIA(ZF zr!@$Am1z78bsY1iVH|er#)%TS2&;jQC7al0DS*3#QIdzWkZMmGrBKnz<2pD08ad(( z*M#bL*nSzdm}6ZS14A@8iLM%IIBj-m5TMaT4FY8%0z|pD1(DDYP<~WRlW@u8AinWv zKRlo=+^wT#9>RPo`f~+o@(2mnOzLh@x=NrNG~dm3#PHA>L=2VS@?vhRZJ}LSY?zTM z51@_Y9mrX6C^4W&drqyuETl+sn5AaIo+uk_Z^uWGiUo8{V~A&a6ro3T?Z!r)qL6xG zh*|85F^kJ>PB{zEj32XEluD)!)+SMrf-F0l5c7TzjvIR#C=MAk7^r8)m!RWRf})~G z-#>XQ9vfzs$|7AE+{+V#Lok4%NGg_4YPQ3Z=wb?P8)qYtlyQm8C$e=#0{78+#Izl( z39_qHk<24&nM7$L{RvF8ltVaevK9D72H31Y+JO><^(Awh@&qc6_7A|lvvrlPQ+~6u z40fpG<>fak)6}T>4i%-UGzj-iS`h8BpEiAk8yU1+xN;nL6l7XA=%d&r5gY@ntYE?WB$?{ z)>4ji5RM(LBx}DW)`eReVgN>DAsT$eS;{6X>P4@VQ3r#Kr|rfydz;Y@DLH%I*qDoX zI0!!wu~UMtWm**UP!JnR$%c?jGE^(G&q=}=JncZYw;30}&#_b7lpi(HgljLm-{q0( zUlrMR=+LVohhEoqO%qbBYw5l!*0m2qVpCw}YkG%<_hEt9RI^if3uhN-BO>ft)QWLn zgd#e)@2YDK+A%eVn6Af8NMPr+IDJIlYIa`NcJS(}nu0rDb^X4B2XDB#sdi`E^^w+V z_O&(D?R?dteXo|^>vtZy`kKh0eOF<3v|;CUH$-0Dw(sg|n)dE&z47JOMB4Vf{FEikv*kp*WR5qb#=5G3auXOn8Ni0)es;G_w&1lj$+R= z2*3DrHAiDUwp90ujaFgtbB^}+B@X9C-XMHvv?ppWuMn9*4>%NrE1ksn2j?IW!%ZHf zQ+wKUYL#z*4Dwu9p<=_9YF!Irq$J94Lr`=vxYV*EW8fQ-gLn}BvYajDT9>v*g7BXu z$7@|lVzL%F_T4zpdo^~!NKuV^8*V&wZEcWQc*t@TC=>f0(1WKO5(8B^4iRA6gD5rh zt*2cNA~5WUNvce2dJvVr$iO^;YINCc?n@=iNnO!m_^PF)Y`FZQ+Q@ zQEr=Dj-Wo_ismmv3RXeqk;hIt7~j-tBF{}2p}VV60i_Jq^D_Oj9G> z1fZ1=5r?G$nmrS#rXV)mPS;dxL{n`<~x}-YYDH?81dTUA(pM-V4mQk>ik2qs8wP^%5fU*0p&%h?d4jbBrQHeE z5rk1yL)>IXDf5Z$wO5R78{|wTS$julqqsZ8{WG_*SV_%~{)9ShF3QpWY}qh#60~92 zJh7O^Nqu&GgSPAI>+2otkggDR8fB-WEXw=iGInwTg(=VOz6G~`W5b>C8nG!8gzGD3 zx|}4)5)37xW^0+r+S0Ea)mKc9(X&a9m9FzvVy{2LKDE3x5oA#2sgM|YiZPql^ z)CvzowJLQPwkL5RT$>PI7i^GzhPn<|HdRrOI!+CPIxa&$x6=#mEldyB$u=#nYoY7j zGC0uPbf^|iI#PQJoz=w?3CUwPD?=t1do-ZClHz$0tro8A72B1fptabGMUO|5!{Cou z6@^FH5dm#!fCWJlASk*&YVUI#z{4Tr`5^}wF+%9GJ=oal=p9Zr)do&CbkO}vwQj7h zujQq*kE0u|#UcSwQo|7DNhV-!BqAzxWo-;lZBRAmwU512IGjtsU1*U%F>p9ss#Rp} zQt33-2G9x&l_`=ftjv&|su(ViWwZlRg{o`wD)eeuA9;C3V<@bX+5k1Bf;u6ppiZvJ zi-z-$)eka}U%4ofY+H8S5|d}XYw}{@qF}|eB0Dq$YuS;v(CsGjawW*?mG%5ulyAxkc*>QoFkCCVS8nC)WK`T$%4H2xR2+>SJ2Bh zkU&l$wY1KYqh?4(NL{}cOFdLlUW{a0y5mp9k~vi86{!DvVnZXz*kS7ZSPv%QCJ&87 zM#w^WJr`8crc^5diRgxs@TJjZ_y_~YUYnzH43sjsE~STkG{q$qN9PHo9tNJCK8!ht z5X&P)#@=j`aK5GHK=N2D!JXAkWuQYGtDwvG22?tOBYA9tol^2}a)8cB)a(qQt#I$G zZ;~bzZ65m*bOH;BzaX1Z-N|D*R6x7gk_lxU=bCL^^R}C9u6ZlFBEnqz?$0&bTm#QF z+g$s$O^eIx?FMe!7A*EeIY-L4AagAoq-wT%?FKGRh{gJ3v&}VewlA&^~lY=1ixoELhuiY-J*ImSZamGG{t@Qz_X*v_3cxw{mchY~J9| z#&(vY18#i$|D(f5B-eaj%;;ckLcP%Qxc$B4w_$ryZK>8lAYD~#L5_ryy#V4|ALc62 z$s|L27s~S$ouL@lVR91ZCu*?|SxcLa4TufOJANBHC*4+h8kheyzR?NJ^aZG_^`pgKedrUUmA#3aOB43zY-YlTB8 zN`yN{y=vFX9;k5w0(U%W&#*rlz^x=XjyJMz{azF|);ZieH~^0U+oQOfmW<)lArZCM z6&=CNwd6=dF4Ey3VK?-$T5M_d&^bqy9gG-uEVbCwghqXyMl;t$3=T%}X55ReCCj0N z%}9#3?@$mJf+vHb-}NVl>BK$diFRJ<8xlByjnwy2+~iYXK)?CT{fUl|9a((ht z+nwsfnFSmwqUxiXK|Xu2IVI*uk(d6YL~_9E6o5y%J^^@y>%>kkba+}wbqmCUTK^Fe z@mPlA76QpJtS6C_aq{rhljt6y{L`2pYVN@u#vU};;Lb*PNra(|JB+nBBwCL~3C}Ck zESd*)W7WP5?a(yB}HW{ z0t86Bm~67mKakJ&d(L^@_g+@9%Pbx#|CmDR5Q=-nITwI{<;C_@O(kI+7i@bZs%=tg*cg~lm_=LZYNfQ|4G_sp+Ecz$!1@b5r)DVBYN zAM%wIgrCCRJmbXo?~Xj-hU1^%1_sBstc}PbS~&jQG04au5`ni&qyBCDm?}U1rVEe4u_W<;KS3{yA{;^3{VpbHqQZsCLd#eF#5iWzi#K6Q(KW*j1s7dNfSCyOOFkV0LvrFp$K4aL zQcQhTNDh1>*{w-4GH`EtDLwgqe`8VD$J%&=Tp1|KsbfQQ93WnD3sj0eNT0iiqIP>F049-ve|Y%jI?aWLa5;{2RNX!-}uvcGLM$=qo;-bgI` zU^csY@+|$ETX?3n@I+yr0ldA13+kqAlrSv2n1}us?yP-ncMFHrf<*$%8sezBsW*^< z?=!RE2CAG<4te}pQB|ma$T;2rHF@buT7@8KWzd(cb_tfckGmeIYd|bWDURIbVJT|# zW(+vVn1i^*@2cv^=Jl8+h9!AS*?%G2-V>gJ z=CEng62!ch)Hp4*?WpK+nn(8~uCIJ8mA4CY19y`r_J`gD^_vIIWxjAH4N;9O?`(un z?Z^_{E~QG4-5t5jJoV+1LSw05G!t1ZQ7*WXYfTuCNK3i}d9lO@+>S#_lHX@I4;4G+ zH!w$4jMq2%8|6*JkH~fjC;qqD4CZ&Re8vXKktj4IjZ}E=MHs9w@nz`ZMr5(qK+@b~ zNf2){H!BDuS}3qn>Vdby*b|#CHscl0Shlw&NF!7zEdlI_4^()-){Ra~BwQ%36Am9J zs8c+zH39g@qZ2#};u$IWP0-x=h#AJr5h3B`{O#E+k1EVu8r@{f?}pD}GhlFIGQU&J ztpdum$@o`Z80x;-kWU8>Jkg1;xS&=SV*4x}*d4*1&jaghH5sk3z^@fv#U!E8iM?b0 z$7SLhaE2f@%niHQa~LtM7lylj6m-*T+?clYJ+=}mL|ODo@j!v{+gmtTZ}T~{zA*Et zcO?%%{l0_pCl=0erFMq)n`+MyY%2t0J?SP8DvCF-QF1PU3@^#_& zTQ$&BA@JGq2|f8=>y7lg5U02piy3~_;#j{o*3z6{m3-Z>=^jMP7J8Y9CK4PC^ zGj_KKz(i19(-?bFI3%f|IT;xN#f5wnGqUB(AX!lPd<2$kTL%M1O6C9z}Ht#9@b^5 ztvl@N9q;SG?8A4JiAo6yWR1f|z9pBqqMF?t;{^d(DA&?55|0$16#%71lYL1-kU<85 z=gA@Wz+?Ph^qGV6xdIz}rDhBF`Ida)oC9XZoSFEtzCv6y+V$R27xuN~O`TCdgz^gr z*z_4C!Rv(a*8j!*WN=T9w-+6t>sp-0k2^(+8V1CHM!}nFLYxi zt)>!688L>87S%y_64pnH2mOGiD}x30>}c))n>JP!ui7=V2iDrvFptj2ri#T)yImvY z$Rk`gtk42jcX%qa5b&A8F2c<0Edi#S3xwk&SqNCo z^S13p6vARS8>j}*Rs*23ff{Hn0Up9~bS-N=US``~`H$LApAdTk*YLeS&L|8QhNU|y z>-%=oaOq@av^9pdakX69p+ucm9=9=Y$Bz^{c9jf?@)#;cL-#^nb_nfr;cD(!n7&`1 z`;+!Lcw_J{VmO9`Ui_7&JHKe?);6bozc%K1)BTUz_lXkNi(42&f;@)A+y9kD5U-=Y z5-QNcke3<6=l=6kzqbnyM0{@!kR!^OL2g{RoNz&Sdq_Bp>s7b=7KfyhsDOC#FI{50 zf3)hVa2A)@;?pPl=iFYyi4lrzTK#S!hMryfdh#1R>klF26PYuJ z^0^}Qn2hHPAW8D<@DZ6_`tZ=8nJ76`_6|sQL?&Z|iKM#CwCg~hH)jV6Qr{gO9FmmQ zZP{Z^oLU(r`13UY!%+>UJ7?FLqlycBt+_43bi<%o{RQ;HIG|xSUIC&sOm|KXx!j?| zoM+2pZjEr9yi>lHIWb4qpJ7-4^EFwHZmUz!!Jc?HKUyEx)Jvgf*QPRs8OCeZr=wG6 z>#{$3DfI27l?PrJ^UbgH38I3;-v~@y4v8}YTcw}>40*sVpnYNi!p(L-*dBR@kB(5y zLVE*3Dy@Ws{s!nk9#@($Z8;ABC~{U1W(358cr!aU+a?x?Pe}3kZOI_;NO-9fQhZwx zG}GxRd10Dj7+(j3F7im4hfLJ!TA-kIW!uuGg$7AGv@r`z5wX-rWDl(ih&_wsEOZmp zl)Y-{qQ?Jr07L--- zM%0p*T9sOeni@33Uw@nPMNe&dE}a8RJT+)QOCT+n_=I7EuK!m}!^vIM1+L*= zb62m)(A?8&JCi%wmz{mZ=#5OVfJ@|^VFdsGm%>EOoP=L38s8&~;;%jC>ePxt*e^ci z6TxT<41PzZkPfyoSmK~!anYQ%WWB%j?=sj>xNC7ysIU(G^=Jn4dt!|!SM_20og*aX zUbbmidXA5qDAgvlnZ12V8>mGRLHt|Z+_nyoyxKhV&)CV|JU?$5Hi^s8K%XZK|j?_b(=%v|pd(D|;^X2*S z$wTxKxI1Qf54rndnFj{^BJv1($4Y#n1GU&EvESL9;>vO{` zn{NLvpCo#Am?4Xco0}cmko{>}?jyns$J3ny{7{QhJrYxZm4HNO;{HyQ>A?}4f(Pmd zPRg=}C!P2lVW!j;xqI{?r<_aokH(9>ygkI}etU@P{Mllr0mrs)6OxFQ%j__=P}!t{ z-!^5mHB@J(1|6`^wGzYrv@z!$KMYj^_xcd`I-imKEte&pyU^38&w=mi4Ge%ZW1!k9 zmfRbqK>^Yp={_Ld+jovE*)$H#jnDENL+p_2fAP_nnoNv(SO_GN``lmZNdh zv>SFZ&dstni3AVN5z~ny&k@s!BXoWJFx4@X>xZe-;q+c#Af%7*nwUJU&LBx^7? zM(Vs+Xg)uD*n_5X^Lgj47F7GZgIA$_hjd?I(4D>{@97ok@6+Il$@t(~)0 zPM{n&WC5+S)`~u)XQo$mx_)@`L#;}Dab>wS<#nnq*PdAMvRE0f;CPQR2{9NFB@jf? zh@eNBTnq0}M?ToqJ4Kts72L*ywo03j;u>JJ$W zB0S#=aZQCvI_y(S5@3IylkQeITN2#rE+@Hp`OMd9xc$|G;d9Y8R&VvW`PxtV)9luc zz~JO-#2v79nJl#U+GniYf2U5HfefGe5SRD@hg+_kL^F%AgVuKVjK~1QeXh;fc>!`| zXoAwB7P&5Gstn`bq2lzHE*E5V>5}=ZE?sgSFWv99(e~C2Z#|C1TsKc87YBa)%13K& zaGs9@H?-LvlGX3_aPn8ewp;(FdTa(?9Ogr(wV9SEwzr(Pw5CAj@-$^JSEr{wCd#cghdJZQy$J&tvjZRQ1LYIJm=|$04 z*p{SRgpN7Hd4A(iHq{GP++Z|>$C0(kNJDsoXqca~QeBDGwq_t$TdgfTjcQ0iuCmyv zJA`w+-di|0poO@4XzRPBGhzzwR7}20ywY=&5TY-hql6Hk&?zCtIPZ23<8bN^anuK; z_8yu{jd6Y8uG$uj;*ba9{%SP(Lt)(0LrWi>GjZJy<)q)-V1saH-?$ru!N}EFH}iMY zmyAx4{1FE{ec3lkb`y-c+AA+9Kc7BY(!UKV_4>Vh9re{pDh_Jg^_m^N)@tvs@jE`V zJ(Odb53TTQGqc6zKF3XFglBpv2lH@a`N;j~G{}oLUB)FAaVSg+&Mx+F>z$fh`K9n6 z5Ah546lJ-iA-A1_b8>o<>5GIOqCQkxPN2#up$XfXup!V>ly#J2Y+)H>n=lkUEgMjtb<2W-7G$l zkrNu18ZLWRr-uJ^Rqn7;rg|Iu!#3mC4usdXYJq!P*1Nd|-_;w5_9HyUOd(?dUQ#qo zyqmHkp7|6z!u34TjqS~Gop3^f*R2hf4F7}+!S zSbNDYy{?l_0?^9p0fm*i=$irDmz8t75bCQp?SaZaq3SHo{Rk!ULGQ>ecG) z>BsBuZ11Xd+fkGa7B-m0%kAi`KkFY1Ig-H^;kBu0`1$~v27X817a8Fhyos|x#1ahf zdK~2gy%rvX5#Gex^7#+-kK}-k{0?H^97hPRe7cy(3{R8%@D7J?QFy^^$Yp^dLMfr8 z(QXgN5j zsV=_Vd(y)p+^L+4rD=U~tpU0gN9IBpT%Wf^LP4{6>gL1xws1Vp*(*|Fpg#GUB6+&J zM+AJmGs2-6h`aJw68P5Ny7m^RD+lOsgT~tp+<%ygrft6P1?%=F(=Cz)n5S7#T!E22F*;_`uZgtH7oN$xVa$DzFx7bJ_? z9?8q41&eKu=VmcB{edU@1(e$s z&hk}qMwPlo&Pw)kot(GgMq|ve$XQnDI9l7`gXfG0BR00>$Y zAfoWZx#ATYR%jtk9FV8^js$wPNl5Ztx}nBVn`^!WDl|=d;Q?z(sGE~!%;xsD?l>A?1)5?30%zg9!9o5?l&ax zYZvqL1I&yR4wc-*4;GDoV?pNbl($@^Kc~u@0~|-nyzVPs-{`f-Uh!8&md3yR^OGg% z!|d@=XemJ>XAdcIs84W4i4NXgoIJU3*ZI^K_ml{@%biatFh3ot^Rx{#4ef#+mK z_M9D^+MfIE-4SjmWOz2FE$hkZ=Z&KZcfo*l>2P#JGr6z3m=~0q$RnzpKta)7^uPCz z9M~R4eMaGi>t8XaR~%N%1wqegfT&DvfReCqr0btsl!4)~uFcG`ZYU$+_6YCTC1dsn z_+{%b29Wx#Gn}@+#y}IH3Da_4Dk2IONHT9{+>#bOm8|B+ERdIs_~t>ga-+ zf!iYt_BYrB$hWUcf9x(SJb2LGzv+`PMwVn^9`Q#nXseOw^mu1H_drLVWsKk28QH|k z{f}gYU%wv{^>!{t7~<(t8}x=CF%A-$d(Ym#B7ROsv)vJfW)?)h6))FvhYFxHtzchZ zvH(^KfWQlqiGThd16MCHKW}WPk-DWYA{q_CuapqjSd)fst@Lu zz7djFJ@|?UiQaTV)0-|HNy--TO32vb&XlxOZPK7e8$;YihdX^xVnl7EVMITMs7>DP zxPnMk15k}P#rUldFaqWM4*E`*-jr&hcKgx2K|X5=)N7YkW0Y~^o+B{RWSo%M!I5(e z%2ep@9$lVd+9J+_FK3ztHi3Ac)2mbN5k^3VTN1cT+)A`X{{a=I%=X!nN1kn}K1}W6 z^3mmXb<`}=^;Fv)PJ;0hn!alJ@Thh3(}RZIU0j5G4}J(={pbiAEDMnFE&7W zRI;g_o>L74!xvxFZQqy}CwE@r@v)v=XuJ{n2Q;@b zWK2Poz9YIh=9aP?sl?SD7;Pw@($uNX{}NT`3<6w;98mztIrCz2^o(s{fDDo#1w)5J z$2AFwA_1jtZBS4Uz|^h*7Fh`xHjNeHEecsB-n{bCC*C5H6{2i}5=6;2L?{|yQl$)` zX%6R-pQ(~Y>EkW3RHL+s7g^FMHFp}BF4aiL>)9t=(n@%0P!T4uGKP1gX?twOAQf#I zmO&aFaT?lCtx+eOu<%s`TjW_sa^}{fPoK$*5q$!6Tt(msbWE*S?v$*eVbLhY*!)jH*Ya)c#4_TP4%NyK8is$%wAesWK9IZ0mG7j*|uiv__{&MdUZu>2y*kx=yDG z@bOkXhfbB|$i)cQVRkcYZ=R*`f`|M zMry7()*aE8d#Ul%G49Zpe5W|>*qN`NgO1Xb*3e$MQu1Szx|jWux%F5#Ctq$hjhBy= z)cWP#Nquar%aJelMo$imm9F~b-s-fuvF=8`+)F)G5C7rIzSS2nV_k!MxsUb5&scuE zmwT-zoW{<3{UR3L6INrKV}<(H*u$EVIrgQr7j?QSug3D14YO_9{3IQaI?K!XKA8m% z&>F|SYW5t&z0R)JW#w2&iC=DA#0M=d$J`5h@noC$Bv;D~&DO-}nAE2)n5fMw-$d;_ zIp5wLt0dF(iod|5`pd))P+3xXh^C;&kct=#)oz z(eSG4CY|5uD0IX2@V5;x10`QsV<9EJ4B2$i3czk4O z_QM~BrpIr&bCl*&Z>B=;G#);bZtC)1DD-NlmTIm%+?5xB{h1(UUEjGdl_ z`ttWL2o+>{yeORr<2sjdT7DJT+U-ciUui@KkTj?>gczWE{=*AS_L!gNpQbJhHflKojZRNMe*!jyYxWhQ)BPk4cM9=i8l#p9vePy*z;`W>_xkjTF4-b#_ zE-4J4?*#gKbQrJ4z0{C=C~Vaj#$pm%8lJDKjpZ7^{9l85UgE?Ja^yJ};H`X3To0$f zSeH@a$(sjcUJ+$@&9TZyMTeg$os3c%FfG=c;7fiT9vu-T0|HYNB9R8@$=NY{B(5?8 zkJ+gC#o?S96EgP$PEO^Wcs;siC{?HRZ9zN=6J?AA$BHY}eN7KLxXNLP_5RHP(WDqw zoEPtif$9nj%xQ0aaD1|4pj7PB3D`(!Qk@H7gsYU^V?RU*cpW+Yz}mIxNgYWKwf`z_4Hd#IJE` z9YdOB*)&@>x>312mEm)bQj<6^V^lIe!OC9nG;N%^s~4Wj<3mkQ{b$nZ>J3hCKus(9 z@x;oYgf^x-neC$)XYMv>U|L+9qDGZNMyryRO}SLlv1n-6t2;-l_Z8-7x==RG9z9cb z*?S9-@hPehvqYXu*jQamfV#u!ssfF|FD@Ps zQe8lWB7yH*JtIRL9-_?&n}VD22-a0e9r(7)SK!;#9Ory?2UHQ6K!q!_bxuWOjuSAB z<8kXu@KEF)o}(a8cuUFe0m3`*yx_b!IKRxTNE4Tt?=w7$=Igi)7hIv>S6K@sz!gk| z0bDWBY;sCe&52lpTu<4@$%Hh1#^EFU-fWqpkxIbd zYhwX&(^x{BxC?qkVF(xDKO^uVif3XCAG<_03G_}GvK^$DYGaa)h!D_JsDBEMNnUW< z?F?V)ZL#W*Zyr~^4m7WsB-Aep8n#Lg@~v)2mTq`F8JM)2Hy)ll_hK0Wa>BXCcsy@fc4Yo0QQ)povU3*iu#tHPK>fj@cI>^)b3mxYY*nhk zNO>_{6cM3n^aE>YFxlXB20-pNnAoUblw@i!uc?5b=EDvuej;e|y(^ufNf;jFs-Vmf z@-ms~Qcj@Gul1J13y9N~h0$t#=V(EgZGXKubWS#=9C!)jxa;YTZ+7c$sBW%rdT3}G zY0gs38gyqo=EiQW6b7#Cx&HT z=*RqRuMprf!u$dOoU^hi?{BZHQ7j;*-|$NRWq<8ZjA2qrx2XdK8nwU8?|A`|4M1T9 zVbHKI+C<1@1^elxf~2z-5O#%&u4|Im-}LJ8M9rTcmMEi6U>o>I5W zWO&mg<2ZY{S+sP4KW{QeJ@eFYdXFd8E&riS75NNOlOvlu_B}jg`a(i%c#WU>su&YC zVSl6FL-Y=2MitqA74uLbz%d4YPWaPDi#mg0^S=ae=}bA7vdzfAACQ{=XB2JU8hQSX zC)=T;I5A`0zs={$dFA*Qv0xfhzpmIAd|5odG3c+=fMX)?C|BLQ^|MPPyAEK!iM263 znB#~fNm6Rp`dPRT*a4&ffgAu91qn?GNJF5+4nVR}CE{f?0KkgmO}!dO;#CXo1+=JE z(2vj&P(wAbHZThi%8HRs`QHOlQ)c~jLd)f#X|gg-XcYztP{s^+qkyIU%x8x^ATk+7 zM$7#Um}NTvUPN)fQdx{aU)I`s!EuYQ!s2N^^@7iaTdcWUANZWkdA+~r{#{ENt1eJM zV%Y^*TX%uh7hbUID=%m*YA(G%>uWFA`r-?=zWVO25q7uKf?r>2L9Z{ipx0Mh(Cf=B z==0Y5O|SQGE0!E$b*0tMlQvlUpa3$~T+|9#9L%3}sBKOtNUd?3fqZCC{UsM zvy~+d2d8>#OB_cCf3m?sUlgoc;?Nca%O!5dNOzY@jHl`bA%(VT-XY4ckn(3U;&0~b z2ILJfU)K|p4W&S;rjH@&_l#|W zN{O(^qnLoeP97o?aIf7kFG+ILZ)bRht9Y314OjDLzDIxodv24LzE~>CY@o5I9Bc3u zo|GyE6kSCU+v9HPmM>YEzx2A)y)q}n! zhMpKIoBHpoW2nZVx9P!(N(TOi_NFIN^~bm#Z(3s2;~>mpQ(9UlI*NLNtPmYhd-%AK z)qp2Z7Pj4_tU>AM()Uu%))*#uBySkQK$W|(h#;DKdEmcZW6-CT6Wo=24tDy=?}GxY z2GLf#lepgrpoy=r%IasTHp+_VG~ZA&=xZ*0x4O{9g^B!^gP}U%L}|S3ItdoQaXCAI z{;QL(ht=g+i7`Av#Vl)pUp_fUTm)>Cux~}s$!w+I^aN)mX`}VdKYud+1zwhggZn0U zB++@TQZ%?DY9}}mZ&*na4D(L8*WQ(#WAYgnB!vjtxeg0Imw&lN${R3*C0u3i=!i?fsZJ7x?b8lVF0Q(jLWi5+Da7lM z!0qxusNeGgEf@D=CwTp6qhQ0jG}hYzHo&J4F+#wOa**XFW2OLcZB-c!ThJ6BmOgw| zf-*F4S5U1s%a{f;n`I6jJC$q3O##xVbUly!2Bm$n4+%DwL~qIvb~aEV03QRvA(GD9@s%blF823;X}MxtqI^~jry2b;#f=C4sJ|&|mB-=6 z(Js}t*!L(A;`cMmiLYrMo3%7?Vik%7oTQ*zN^Dm+)4frV|zPF+5e zQWRk*@poD&6_nG^ei-BNFx)|Oh-iRk^IwQ@MH&QmKPMWSEmB=jhCPy} zA>fDpFl*^?N_~%UMwxV{OfbOW(n_O!=_ApwADmo}>08%H+=2W91|MEw#y!P}#mxn6 zA0N$33oQM)W)sT5L{|W0rT3i7ezuHvL`5d0{Evh8wKXSpEiJ z`IS)T0$ySg#&c%3j!7ZLAmt}t%7@GIB{^gyCVVbw50x0S_u>$QUU}AgZ|$}ed{~L{FdOC?$&eVH zZnzhw!eBo8=Ug>OAEUs@M+2PF8hG(ij#3ozBKH>%9kRs}Kc$kZIAhcRRzE=#h#hdKG=<@=E2C2y|e5LH@*we3G6>t^H(Bs0({q?N3SkqQ7|3^{4bR z{U`nYlvT*ja1(_b;kJOkqzilT#P|;W4NxKx8v$(U2#RHXSc!f}71EdW6N$X+KOQDN zz*Q$&OF!dSbbv@70}7Q$dEC(6RSIhLxK2bKx;X@6By@4*7&cYNNk=!mOFGub;MN zfcdD20Y3|lxji8Y?sCZ6f&Y?Z69V9FI%;lgQpl6#5C!IYaaqQoop!k3W=JZFR+S|D z#Vo~J!4|0sk%|+@({T9M{r^|FqNOd9aM95H{2m!b*Wj`VJYD@tCS0# zjvE#GG!*zPQuz-l%XGqFMDCru^Pyp2othAKcoUKhYyb?Wc_x^7WgL_zEz0W5?u4*K zn_(+ZNbi z0DOW*0=Rp_LUCO=+m|Mm#nXiAbH>Zd<5_LQ2%u*jFlY`K%?!h&&&2%%=isel?^ z;*LWpJjhHh5gj}zT}T$X(5EutRKrv2H9|n;^)p_1NEy4}ikCu5=@OZKYJR!E{zm6k zZbV73XCEqT6NO22Jtj(qFc=b)LP4Unnlz+@5|)D2!Hp&S3X(FwIPl}vp9)e=l&WBJ z(C?8Y4yKkp@*C=9F0Dr(V(U4;r?qG-hQe<4PGv1~Jmtn@P=ubGQY(f@R?PpqQ(4~2 zEWJG;j`Ai-AmIz&oq|O2?Weo4_i1NFoDgTpr-jXbak0dd?#R+H6Dc444Dn3czYE z(N}9~E-p6)u{XUQ24e1FhpS*zZOOvWwEOLcEa%P1OI7bxGci+J`PN9I&BI~8&#~YV z(Q8AV7#>Wx-+pR%@ZmoEj^GL!h<>{2w<*_+rGIv@lqJyHhmCzWrH87O9mJU1X+=>C zjs{r`II$f-)dNoTMi6gexA0Xmn-%X3M6G2n>+!r3(PyjG`YtcRFUdYR`0>a9qi^w z9gjr*dx|#JxsgFS#JLB{7`>zj>rHOk;6e9K6)IYEnA%Zrc{~)E{+`)$%nWoP(am;kU}UZD#cFx zr5g+#)6+wQOX1YFpSM`7=7iN$`h#1Ss|~b}i2mUQ^NJIw6fLivAQ2=eojM5w;3ep( zOd$LzovO88*^0mz#2$>3h8(n_uf!BUxfdiNVim?aKv-_-i;-a!i47$0a<+JVTEx-|Sq#(3b>5>%`g@g$UW_WS>Md_s@Y4$`w-lWfvf?Sb| zXv#!L2a^4s%@WVBtXxUiQ>5gy2SSlN+&jZKF(GR5_Jo*0-&OMHy?j6RI+!#il$0K3 zy0M%WwPK05aYUp}D|QfZX1D&$-a>*yRnD=YrB_)w7)uj*V>bgKZ z+o8QB+C)2dwM_VQIq!+zHlw_(}|PzgfJWF1xj7*Sbh2UbFC} zxhVR`^XdA-Yn|kwwY5uDtZC%2RlD%>^L?{-Ff|XYMv;HSYmar^U5P9wy5&jU zmoZD)*`|^lXBUiLjtT|<`h;)Gr??dHwg`psr^plG!J*17%23`q|2Vuo74sAwv23z4 zNHYgt5Mf~@HB5LUSh~YO0)v^B!G#=h9QlFhSnWCM$w;hj(J2kGy}7%WNT2u#RPImm z5|26OV7J>R#QkA6EXBSUUg)OR^n!zy^sQB|K$_HaRq0CC7UZExi<%DYQHfJtZ`stm zqH#LcMune=k#R>OMDivhgQZ(dn3SgiVz;HMjn0YZI#tB!^>*mD4z*UGEn+Oxv zW~X%lKmM^UiPZIhN`nDYp*j-7}0ZajTq!&XwUZ zJ^obs7YA}M5rY3I9(69?_y8w7of5i==_2fP((iSqTXFCWE>zDX7l`eGbV@P^hx1G3SAYmpfwheHtEtmpX=iifXI z2!j55j!oi}BDXMj?v(0)=RJL%qfYiAKlC+j1eL>{gokw1<4`cDG~JHd>T)E}QgU!RyZFkDIHK%ka6D z630m6?{e8&9S6;HUKNXqa9!L9@0F=XP7>R0#I*bvr%s~Hihrehe=6jU?mH(-?{P{1 zQ|xoPFXc!Ct;gYR>Aj!gffB(hUMRfnqL~6WFBEWFL_)D5A=FLCyfISD4~L5t2rOc;q{9xOpJ!@*879cwL;IW4503uBhywTGUlI+LRlq?!f^%M^XFj+%d$=c&rFtRNRv!rg?fEI#z8)c5 zEV3m1#p$B=M+c%4^&++wu+)$!CTgzE2B%jDjUtWQkS=#;^27;iDjT=a{pYYYQ~#?qRD_UmS}Bc>8`f!?89{wjmga1{d{CyMiJShO{r=u}W; z6D88!T2AzE2=fsoda9-0D5u=n!&BuVosfVG)}f+6YIaOSa9thHj_Uq8T59=|96=SI zs~&2LP{`y$j)#171+naBi%0wC7qNU+)a2@wCL%{QK4l*d6dMJN1z2ryC$MzBHP8b_ z2pu6u7R|wWxA1xqR|hb6@ahSvDK)VOCYq>*)r7k~xRF;Lv~Vm&(gZW7ltPzgOtE_~ zMuFz7(XqKW2=h=RMnd{Az@dcMa~REefboT}Bn6QK2)*hO&x zmCIXu>$8)5$hqZ5n<%wJ2y6{#ggf89d!IHZpH+0r*9-D|)qD3;clJ5m#*>|h_44Vd z*T|7F3^1d$G{A%4A~2`smgEK5R_wd=^@}DD1v|kqc6N0#KR>I>>~%kb?iMHe#DS(v zX__x7551Kg^J(hu)hvA3AT;c!e3v#YjEvVPRLUwx%_$9j!u=NTAXEP&Dm!6Lps-)$ zKCKC2SL7kDfPbcq4i*u(5y0zRWb01IqbiCdbyl|VL%;l;kF)9Fv%>?a>KZC;h^>J$ zoTS$?i)zI1vYtn3yGitEM{t+FzSgDfl3X~UW0@ZRM33vD=7juq6I~b?DT&&Q^sZq% z(1%q|4cHS!c8Rb=Rfb?OGXUnrz5SDCA=ze>WHy+cp6(p)Nvg8ZHayr{n^x;T4XpwB zxkoB}w0_MtVHLs0BAJUOxcTQp=M8ANC%32ELMestnrlk{bZ=X1SR^m{t$!-xxDIXd zsS70-2CgkG4)K7yvDC=i;wBbkpmV2T<>&LM90D}ZzFWprs+EE1@GHg2u=4qpRu#Z- z9!QFS4F;9xPv?Y!b)H$NS1VBa|4`JtR_@^Nnc{00JxWt5UWRkwoS*{C!BV`sSsh&* zUP?E%B*~d(w1S~<-UcOLVKAI+;S45Gv-GrlVx%@m2;#4W)0r~N-7FXw{*g=`QX)#| zdh3_G;?1xvhMmAd3||9!l9I|2)C6as;~6&boj?z<99--1!2;GARvWhq<|BHG<4geK zCP{lH1)w@H{lRNfpA6{bSJ{7gC?Cb^usVUT#5fMwDA{$KvqLMZoT1kP=@<^ z-~YacNJz5t9*NgZxehjUj>rw#9q#X2sgR`-ci~_vz9Ni^NBI7I?)7;%VJS}>)TC=( z#yn#}yi?C*KheWN`gl6m5tLIgNH63`pwy`F26aGjB|#Il+k~gwD!U17Hnxm5!hR_S z-jd(=#gj`|spronw5ji)C2ZlEs_(U5yL!5q4EzRuHthxK)=pdi5@lyZM>CKniTF$3 z{tkP}MYhAAeE7kG-5Hp0@9ujK?!JEy*QFbL>leO_q@CcZ8z(;$z5vBQ{!aWLqeYAs z%<(<24(xWH`=9D1KIh1Q4NP|?HG+iRxjn^Ea0JmARl(b%lQ~}2scvUYxl464<(AL) z7E@%;c!!{iaj}DjBC((*i;?z~tKA95_vn%mfj{%Uo zLZ_b+O{>Pqpe|6mV{}TnI3dcSkO)8f z7c=Tq&d0eP)n&NY9wO3c%D|PHQ1^}LN5oQ3yGYUVz4@GqJX3{Oq`yto4(8H=ri6>p z4fBKNR-hT2cc~ z7a5lW;%DHH=aDVaN0Hk>aMkUp>_ZvN8Ji&cS$Zf;9Y5)#IhYM|+!_=o@ia=B#P{rf zRv3M9nb;})4hG{+f9n@Z=9LA7rzG;55_|;J6*LI%cKcnlM^Ms~prT$&J&D%e5uKBM z@9-yh|L^U7|HJE~{<;6G^(aQKfG5skP$|OoiH(JXGO;K`{&Zex0#vtI5P@_5a-x?6 zUxG|3Z8IetrM6bc!#g}X+MW`9a(haYMLdiZ;NfilQ&nf=xiF770YC3Zl?NIJm0L`e zjb8mhq5^otSU|HRSSX_FQscpI-y_)|r|qd~woLK6`)lb|i)Za^Rc@K$bdM&XP&9f| z>GUa%bU#c2<_h6Mr(K%j5$7r6Vz{YU#6u90hjn$;FkL28kjWJ9EiY;HbYch+4zk1N zc6*A?M?|?wzN)7^#j5K)%7Oq%XR>Whv2A*UMan@`im1+#07Yj4B^3vq36L)Gh7p+4 z=#ptkGfc|u5n+<<{QR8R$UdTpR3?%l&5F@R>qOzSi#yeuUp9;kOa?1CSxg2loWVkx z!t`U6%8CG!$QrW}9|$ayjv}@wq?+!W9v*pk#rw%)cbtH*;su#-$p{YzsToK{Zo9)#=x~y!WTF@JzArJkGYS zwUxdfFTd5sT}1Fci>hwFa(4Js0dsURc;|5fzo2EC4?NZ{sfZVr=Xs9(&DNFiu@>%2 z&uD@D1y<}xpRc!OiKW%>8|^`l+TV}TqHorGg#MT-9{-N}`f9@qMhP0noW9gX9y58> z$TW|hyxcY9uk=5;o!|Om`<9mB^_5Qu^0od;Vp#8Q8XvmP-tpkNrEM%Ezwmmu3k+L* zzUpu05Z7OXz2u9(-afs;WZs7))k_<>GqC>Z{BS9p$cL{<{ONa1zMDsA4Yd#5KAL9~ z_*Y^d^_^~j3OAXF4rrw(zp8m`3THfoHc>#aH*PSv-T+WE_=0+yM{nP1(_Llag`%$o z7>rEx>~JfdY*))}uE9qO{+a@#7%gV~O>e|&5?*~u`l6AiCiGf|4Kdu;4$dz=?c-%3cTdf`GmGap)HJ|nHN`ND7g;&_ic zj{C~8$cbafX+plZ1})vETCv*Ea!gCzJ#8)Zq^J9!njQY+hj$=VSn}kO>VU!_!D@l+D19BLcNVdPOa(|`OjF&M^-07>n2=1cFCIuz z=BcC8d$eQd);!XgL;6iqecWAl!oY15f-5n3syknKxQIGn46%6jRM)ri6cL9-9)_0D zju1%BJhQYz0`JuMA(frd=Cv9+FKAY&>NL$g4=JT%$m0-dO;hDlo9UE@)L}|n$P>tX z?@ZU+S<_ToC`h;@t9KnUkQf=q#B8iq@3$=u)L@&rHZt50Dk)v44GAVbTZQVF)3XVb zmXS(CD({i8zP|F+_7%5IS)K}j4?3GBxi?$86@iyRe`tPU>BqUKlYWKvYtrv4tuvv| zn%MJ6hEqg}z1Kai`_k{Pi#+q;SG^+hNVxq4>W~&oP4O35&cD|Gra4PUvXUc1({rZ? za5_N|@CR0273#h}aFp*Cw8!)OTV2kh%dY*Zu=%2QV9u#hOsrec>!N4q{=2;qWy3~e zG|8k9FZ>_a5pYy|3KI%Nr{b+6OcSI2Sc*{{B14RRLA^r0+SJ!;#n`SOiZ2G`r^HWr5|2W7V1#&% z@DMb_!FS!If5S4KBR$%q_4eBEXg@{T$kE%n@}s_RQYYdw5@Xo5*sy-{;6Tjp*8kkP zXo6=jwczPVmEns7556}^5m>FvGAoB`EL=RJ+J&CwNr-;iSyorXB~9XaPxv5Qc!13f z>9Q_-q=_R-R)tUNQdK}CP4wov0MckwdqbniQ&b>b_qI<*IiPFjZ?Pc>97K!FfkeKp zoxc$|JY;aO7@hS+Rwte?E)J}WTzoT`^64@YSAY=ZpkH1lvjS{ttJt}s^Apf=VU(-CeG z!tb$?{vvw(Cmmjk%8cB;rI}`EnW-63319n!IH@8(<9#wE@Ji_*d9&gT$D`Vpkm||99knFrYz5PEYe5H_cU0`Ynq{C#d|i&wtUjlMvyp-Fqy=6R3{ zQL5foMQQ3Cp@fGdRihP2`i71xD)cP-!@ye1tB@tfv()YR!BH%JyoRiZND;V!MrTDL zA2uBX8q1@QMrmx#qr|Up?K+RNUr9!>^5p`0c5OJumw7IkxZUbwW83{uY|6?}M#!>q z)R}GUQGYSeHOKwCjesyseg-A}j+K&M#hlR7pk5;bR~V~uny=w)iJCLD9tM}Rm5ANUn-N8uGK18&!?LIbCJuPF=eG|pV zr?OBcwfnSQS0=H>Vn0RS2o0h`C)z$o35*)rp+IDh*4f@q{CQoXo=I4ac_zZB?Lyyg zwSjlCLeJ}UH6E09`gUvF6LZzFqbkYPf`$U5fdTdKb6gDxY|ZM%AI+?`8UH)AEoNG3 zn;$-J^qTMWuXpN~U+h-3X-bBtrX&-0Xh*-I#Rvomr71|QGt|uo-qPP}OG5<7!KE%G zxpHmK+V}-|Mv6SEIYSMO@T(F1zkNSG@Fjlswd2&nqU~#qF(o?wCr3Ww?2eS%fLNT2 zTu2FUN=h{{>gc8i0zoq2RE2UB0H^>B@%_^lw~bKn@2ewU5eTtBdl3;g8gbWHa`1*C zehdiB#;o-#9*9)35y}F?5pn#d2I@vOe$oGj$JhKmHNI8H&z~=e;UU=`qZlu#xPjBZ z1QS1H$>nD(3BQleFNt}nzzsEci1Q6Vtcn2P>(`pFY5+c!gO3&&rViw3zM~^;wn<3F za?s{vL2+xnCe4CIUd!(hjzmE=GKq4{YlL#e&T=<`(@7L1+ahgPC>TKFUa&wKOVc{O z%B=wsj>LvcxXo$K_BuCw0yNFcvR?rLrU#HROJQQxC6Bl{O188Feof(6c=^wL1Q?;2 zMdRP-YOoMZ9huGC9qL%L_(rcq^}3a}PyhDMRTnDqJ1X*E_7t}c8Q+9RsASQ>+Y6UM zaS&&S9UhLdg8jGTFgeAeFG_GAANd`5P6-gt`O(UA3$5LeDp_rg6k}QjfQ=N zJzgrl5YGwkpguv#noMOo^ZaRD7qq;of5+6C#ncmocSX(qHizX+`}B$L|ZilVA4IZ`+evXuvWe_gJmG ziN${BTm!KF_H@=(jW@YqYe0TCkwZ-cS%3HI4|-!>j_{8%ZgIc2-t8eK7|DfcMx`fT zeeeDs#T9R6?>aB0DAhHMqpXmsfDGjWozFm`uw}(7L`11w5 zeO_;0a@%0J-s<`?CGgRB=$RJ8V?fJH=;oWon`0+if^s;k1v&ivn?4z1 zWJxBT{2#rbtwshx5Dgfqh(~y5Z_*A4`58F_hC=aU7+=316ZLj3M|gJWQcLoNARY&f z-C!2)Q!!L&I{0i<>CkV*bx=DrkXZo5vhq8`g#Z@VKthHJAwU0*fvXqf9P8H)SRlFiTGx#5I=y_1eiq z;r?35G~KD{Ag&zEcV(|Iw3UVisBDe~R_$k%c$WFXK)VxPVIA+U#6W59n~H2`pe5G;g`wgbR~jlV5i>l?cKE4>pKtkNu+rg z#S(0|cQ;@VoaRyRYA{Qe1^j@sH!pDrCH*tsbvS|_^eP$q6B(8OLQ$*|iFBl_y}CJ^ zAqiYXI3v*SKpcf=_;{AV35487O%)QHoSr{LzUfnnF!HBX%NF}l?xT{HMBQLRb1Or} zNShWkE5@;;#{}fT&Y+AF(yjVg?5Zj8m%2a+0b(a1cpq|{-aw8qF-gacAO#C4)hH5B z+V6T)1u)%40E?^y42RJQ@fL-kOymAVZzAU`bW=pq5pR)+4;4j}jZnR!$E2@mE z8WzmlIZ@g{HA({=jSNzwG|UxQ(kSh5MVD%nexpX0v`T|qrM!$?FKldO;`MSlk%~4A z%itGaNt}i@RBO~}Bny0na27?LWQ$6w>(eKhf|9!X1X|e)89lUFMdkWvSTxE7;v|kf zkvh*|4uRO|pq7SvP<@X~t61SRI?WKdYjmo(W%s>Kr@FKfA6=ubBi)X9aYq!jQ^Wyzmv3s7 zG(A!orWf{A5}K66w1UuF12hn8@06_itY65C)Pef~e57haFZWWih>VW{nSyDeCgVR$1tE z%pHQ4+;THgb4^kwyzEPjr;fQG@RA=Yjyv{!g6Ckpbfq=4@A2cY>chMo7Moj-3Eh9m z_Kla170mx~-$;FIOpwe=zR{BdV}-c9+;=){j>On6`%+KU8!OD>h?; z+?S=dxw-$clUvtm$J~c_$#oGQw74AOT7K~ad@z;xBv;7|&DO*zzN!~Z)HafDq6BkU zes_$2ns0L$m1#qUAf1Naiu@5X6^6%mJ(jOJ?BBnZPmcA3lQK6gZgbaJFV&+{J))Ga z+|=-7J^DT3+MisW=~C407|-?P)RqR_6O}eZhdY!-`ATg0Ed?4 zd6u+P+!VlQ_}Esh@s>~COyseHEA(4OXaHEDdUuRq1#&r#xw-NE5i-i|ToR-CA~Z?S zA~DR4t*`lJD)deYQBIPuEp)%ym4D5c^_|)B3Fd^c%>3hF%vw%)QVbFMaB;pk!GueTSe96Y zq3*i$7a^9UX1CdeYn&{J5Tuo5)Ov)u;XubOAAg*TJ^%lHFh)W7Y<#mGfo zQ^pt;IF^@lU<_Bl$R0K$5_@j*hR4oO^i0#~KjDy+PpEc%adW81P=Z=j zW7Uy)~K^t}g2J)c61lr~<=`QU4z-QlEFmoG0EzIORQ$_Lgzq6?FvoT1{4Pi!|#rvdls zxlS4eQr=CQ<-=8I+AOo}9?9BinjW!iTEJvT@qVl7l$OhE+kuH;VQASe0Ss~Y3Ik>~ zE@);r`EU^FMB0ecP}AT!khIh+Pxn<@DCeBEniD~75@s4{s(H8q3#+EvWq+B{+sz6T z)(GrcN;RQ$e{4lq!psUz|hHoLa}wiLtI)wQfLv zHbVxLy^FmAD$~WN(!%+Ir)lGCsYLO$AF?3oKkrahZ*T&xZdV48W>7*KbKRuY?CGIz zM`=1~U|L+9qDGZN#t&jo20?i{UQrjpr-MY($N%ubBFpw2~RuN6#UcKT#L z7FWZTH40W_ogbMNeWbw&xeOs6JkCS`$P?ulBdtc10F)nCw8v+%s%+@&-F%2?pp$hnM>r8OS1o*>qlmQ~Q zNYKW`Sgu1Mn~2RnYuB|a(WPZDb(M8B0(OZyPdY4qm9;SADS$-oxfV~MIT7EU>nZy< zw`9h65N{Gb1RwGaYuyz~echji?<0c3NBBJ|h{b5667cuhSb*F#7SHH)cR{Zx4B;aD zX9PY}somYNawL;{V{yumturY5y(j622mwun`lsMJlmNHg&hVw)mQE1J<8kHdK$UwC zluD>y7PRN|eXARir5GMh1}543#=~>!s3Dl~bMj3fx85LEmD>AW3ll)GKx3{N%r}Q{ zZm7()^cf_}&RMI^oQD7sQ({p&28%PVbe#*>s#Jr!a?F$=#E+tWU@c`QA4OGO@(GzC#zRzpy3-UG;>q3B=lZJaL zx>|~;Xv+KBD{JHh#Kk-guk>H`)(*e1(!Ed*t};^k+x(svAlU#ERuBda`=U)$aUV-L z4#2!1(qaRYCEOLO?NF7phA&HoaB>X}9XMbam_36M7bo40yvtr3S5Eo$-P%w?81ISH4yQ_C#<1(2q#$XRc|^EM)B`)hvauSPL9UVtJg<%(UR|0AzTAR7Z@u62 zdJnf^$stx>Vg3A0EV=WK;g^IIAsVWJb*P=__^hpQ;W|3i>ay##w#J3-&sLT=_@NrM zC61s7f3m^i6d_o*#D(&l0Z6H8{k7pd-Q^PFsk%W(p{<&Ch%zjs{MkclpTIIA<+iur5YK9#O=o#DQX*rFh zY5AG9@`MCZ6b8F#UXtX>l_u*VT*bq5Z)03;H>`)>;~XpJzNDrGS1QVEpye2eigPR_ ziD|2Px{}y>p;NbR#Yz8)5xV~hwfLd7g=fL}g2XVU{#LCfEYppmtrH8?BDf2Vi;`IGrC@Uko% z+(!xBcP6+OrBXDwBWfwTe&cS6U|?j)jN7}ib4>6heikC=sL^4;F7|&JAe1MKdbCKc z%`tkj;w_bb8ovo>gDpQ{X~_p2Nxn+9P(7aNF@Wvf>VN6)W&jO+;?*HeOl1p{yj%lk zb%_wK-?3-Q+2eSHU@=N?Dr1xtQ0zg=^Cu^&)6kN#QEo4j#6~_Bh&(~c-3AOIG)xYw z&;peN*8&XNJAJ_wf&P&RK}@1zQ{+9xkTzEG4fho*GoFlUd7L;<9nF717cPF?xS%c#XFbR|sK+nmtT9xyFejLQk=>@K38X1C%&t0COV zyhdXdmv*VPQ8bW!k8F5`=V7(RTuWoalJO+wQl;u#YbKNc&}tF52J>O44ioQHH$(ww$V>yRd~Ry)3m!E3qo8c|rX9wa1yb9=gj4$1{>FkpH_% zkZ{B9WIR90~PLGV`|T(}H9bdAJJe8_-I#iJ@6F*8=~dh;t) zj$ee=A@V~ztGWp>ioTe}Wh@Nhggx(*sas*MP^^rCOnHw|3lzgipp1grheJGbXBd?E zD)pRU9*T2wFF;^hhQXHurlji)2$!mcVm^E;OCOL#&2?)8VRmjrVLY~t(<{o7;GCa5 zfR-wKt17t*gJDO}3~W-fr+bg3N*gBSOE7INpG6X??6@FIQH(5Fq5BDTaCm}40RhTK zWxEutD&1^}L-@rL68FNF+z5u_7j@Gl-(y__dWzAL0#MNm6-BUSY(73wY&UkO2sCCi zSxJ6Nx#^`C8RW#yoA?@?R6f8Y#%~@HE3HA9$9r7U<8xYCCwGt4KGsDdvPlKF_FSpc zVM}x62_Y2;P7>=2d{fuOyjEM(V;{=Lqfwnm!ljg7fKi>uKm}r(;OLv0>5*k! zH*VMfkC2KlvfYXv1dbzyH-EO=Phe;m@Ff#SB3Y=sT9M|Gbrou15fi47%deZJf@nO+1hg%6N1vK1I#bwam501~p zM|=f~OFWplluO;av4759JPoXy0B4Mb>y2iFsXEO|uCdY4oLW+YaimCh_p61k_&~D1 z`JvmhmL8|n_ZTOk$w)lz_2l?0F0C}$mtG0hSx55Lri5gzM2zm>kSzAgQ=C{~&0(#o z1T?SoiXvf|487iSvNTXOSh^BU8;CRNDbwL@vntOZ-;a**7@t1fBOy7>XzMTP_ij|{ zsVwVaYFDa5Va1SjSA2{3Uey!=J1+61yWW_DW|k8Q@UsTaazX~nujEQJG*|3MEH50+ zZXJ_?C4q7cuRU~8iFl}UNqZCKkyz;R*2B`-U}tA~)_adT`0-v~1&32`4+j)bVo!r+ z8ox;F;F;LG=?SAB4nHML*DE>%8O$LShZ}V`j+b3+CDg9?mJEsE>4tlai;1olA{t97 zi{=B|3K1b2g4uDD+9c;PU5b}dw+gy9Wuk^0#c;1Ux}<)ddW%AwNgHF zc@^_X1Ul%6DjD>jq$kpE4N649p7g1%zpcXFeA4wdWC5eUetjnIC3T~7Pn6Wna)gSL z{*p9ZzjbQm7bG5`L?Si<=#ZX(mByC!4g0d5B9!^DyrY}=EP(dD}@sfCwm9xUtwZlRM_={1=bR3^R@Kwn{WyYEi5hi^+v~3y0G^u*k zVN(;L!*sYLlqU}?LMbDarrv`E#_vdmh3Lp=a@{O!$+zgdtFMqTNBZF6^zcw6rEK8O zQ8ZOH??}+DJJm?x7uqK*jy36JSBL$&Fy6;Rz|pib*q+*0S^CCy8iBDb|)p0TiXbfHn*)sqXOtPZ0|;A##uSLY>=^a`d^{O@WzxEC@Yarei`P zWK)!$PlWSQ0O}SAUqI*ZAtP^)XnasG+OHC`O8f?nR2`#o@M~;KOdUFYRjO6)eo!$b zu6GJ!+hK|OKeS!&2HKQ{nS4LtoW(W5WcXF!1uCuzk9Rhcgutm>I=V;IAvt{=IWca&=8);`#ik$ zFHk0hk@Sa;7Ww@IeRT_x#!!mH-SO>oRo3KEBuotzh~CRqiZ0tJt|CS$t{0`@x=fED zt=xv|-LOSwtq$KnUlED`Yp2SQG_M4>drp(HR{oFj*Cq=d~4*+|J_kKvcl27me+y-zO! zo9}?l4m0^!7QmP1&fOR7|KBueFi><>aOO+}p2KVxS6RIL?7pVU(pm)}~- zXrA>{GH8w$qB2SPmiXN)?i+eBeS5&WqAQ`l^_!ZD%S1=bz+MjnF?X@URWPcy5H~dK ze)}Os??0o?0$J}g6En4yZ;dqCJRJ7>91AW3Tui^sZen;`QTny!Nwg-f~m3hU{Rf?ABLl6g`0%!yR@RCw-$^^on(y3bem8}SjnK&y54LMFl zUx_JzaxYYBQYsn{mRse$C$J7dx?~}7{-8xHoj6XMHUMSqZI(eKxv73mxcAM@X|)EV z05OcH6z;MHh~Cw#+noWqQ4DIkFkndy>9$}%<`IKxr=hI?G<+CPD<=A(iYFMtPO)$$ zY1S5=O~D`M1QfU4S5Y7n+We5puP9Ay%jliMPj>I$efQqX|Ni*i_QrP;@X5V(GNbn_h9$lC);-l_Je!7_wW7S!8S&g9PNXGw9(S${ZFD*8!xR2)<%4HclYkQ zKjh9xb@kr80JQNw_}PPZ?=mDbAmjfVl%e|6a-49?h?jr;Akq&_2($bh=Tvze9U|J` zTQuaGI=-xV7Kxt(x1pI=eu+IgIiQ0lr`!#Rqq`Edr~+vS6ljZ+F6E|6Wu{#PLX_0M zjOcCj-V!O7v#j7q^o~#%rI(JR*%JYIlV-m$*74ETmvlWvBmF&_IdD2JuB7ZKQgYe@ zp-3L?onf57q@aQK3y=8yAA224ni5J%4>R3Z&Wl))vUHXRYl zg$*sW@?-*JGPi+Ux2d32UWAMFfW;y#CwSzNjhL=DSd$&*a&UBVc=~WQrH1ZjrH5fy zPM$?{r{CEeWA4oRGCNYxSakKSRhK@btLp;wY=`!iXcO%$(K6xF<-8}ZFAkPYy8Z(f z?d&OT6nQo>_;a;DM)cwKVyci7Sn62gOgBpoOfEMVu3 zKjX{6(J3F90MP;xoSq8eqfO{Kf9p@Rf_z`MJjweqW=T8SRFdOblDqJ2`4pET-WH)S z{uFs4Ji^sbN_poWhqp6EDRj;6D37)54ARU+w`CHOOdj75LM8@1G1@kA>wqdjfyB6sSJ-&BySEmY_QU7q*meN z5do(M$1roqP1Mrh{=C6L-~bDT3q!ScR8jref+~Vs{y+<5MN%8-)RQunSkX9=>sYv) zb`pT$a56CSVq9>xB3wmACv)Op;FRE7hFeja9Vcyu9)*S@KA}s40aN6#uB(3H!txw@ zNuMkp`F@UI3^ZUK0FFtPRPZoATr?-)Kn#b2S$-=0ivu~B2*FqGMlRp@04F@161s}% zBJ6e2@BM1u!8ec_!yD8yxRqyG=zv$v)&q7;{LUME`p65yH_I2zA_a%WT0 zC|z!}!&+;>T*7FR_u(!&Hq8gv8PlU)?o=dk^ z_qOhMVGh|w({|^wN&gkR?tK2Zc`&(+pKB>`j5H3*7v$ui9hV zZqT8_!G=>O(I(#x|4R2h9q>0H&cBx0WjRZi zpoNW^HkKDh508czojE%Ds0G7%&Y|d1T9h6Hzay!VRS?n7X2yijx<#|Wz~zdLaZB&? zh%0o6mV%}1ulr`5M?g{{UfsKVc(SzNSghOE$>PCfh=pzv8DvD)@kq`yom4X(0E7R< z0en>65pFhMn_3DGl0$TOHG8<9UNeMaW=}FS&KjUlW8q*{&)?E9ahA)%s(VAGz34rj zMCo$%r8v8IqP{d*fEiZAXSp?eD&LEMNb&6Bgdv_0jBI#@6=}wKK+@5Nb8&t05gFo+ z2_tc9?sL@lK(^BWPQ?B^d0`-`yuPPOGXY$3kWN_W#~K)T+0E}x_(p**P{@_Gwe85( zMsht?ixgJGnD!opkCfL0o28pkvNS(zGk$D`DI(b&pOMen&c?d@Mkffbi}Q2L)~d(e z@Ez5nuENo#+(>l~4$zrvEr;Ih*xmRzZutFE>lF|liNG>e@A|e)d(H3ZhYHWg7Zn1RYs)=9 zxe(*Q#o0rb03L48Tkj(wpsl4T*uEYiTr9FA{iT1$8;=e|Ck%Bcww4`71lBO^+-z`* z@fxO)TPe{FmU-fYHIOoBwa*WZi3qN%12l6aH6Fe4Cpm&DK36@|7RkVt!r2^e)<-P++2Xx@>hfkFaE3-n z6On@(pK_jjMxwC*t8GT^$l==qMhG1tM;6V&dbjX;5myJ$av2fygw&LpSOgPIRHSgi zT_4=YD-T*Y79(kbxy52#b;cCC2V)dy-Wr`0b;v2sWnv_xA8Qk|=P;V{02?Q+3I&k_ z2)s93E=S#o)6Z+&)>4>`B|Xp;>jLSSpatGM&+yZ32x!sVJ` z8P|;c0{D7Cp09fEp6brNbqyVvcESbe(^Ice`u!_fi*IvJ-dqIc)ZCK1fb~Q2lGRHVDniRiKtl z3nSw-3YD_TZH|MV$kacH%G^Q|g=ua5BKK)c5WJ}idBgabHaf1c1v$D+(NnLB zY~2ZYR7H`b&dN4^=$F6qaW*}Cc6cCFT|>nUu{CgplT`c61vEAd&%_VH(Ivl<=+lni zE`NQkOW7q+uHT_!8T9@{kL#l5lxrjuzJF&iQWCWp>0QHkpbvAkN3bV~>=I##stm!V zZ2-)Rd;2HP!t6aeR&W*VpwuZvV?e4jo6OvZSyIMEtPCrkUmcAD7|sJp5hi6&x^D+MClstX|EylE zK*^Sgbwf6p0v|q8d<~-)JS3z$=E4&}1qAd;@#94NAbm zU^v^t8O;4^>1p}INNtc1#9s@i^Du2X1~D*if|}qAbUec*zLPlc7*^qDNfm|#^AWwpaVCIqlcYV%bB&*w{@@^a5HyU0rBpXE z-gP5Tw1Sv)p55G#7-oyvP?X|ZCyz2_vH7SCw~E%8qGhj${W}rEJb3J27Gfr}et~NF zKv!TKOVJI*FW3>L>R6#a`6JqvDG45LqKwUv4^YmvK}HL|S0n*NAgEYk8AgIv-K9a> zsb`{HZ16-XPW2)ma~3#IH#)*JMP&VV9kaSM;2Y7&_o|cS>7sTVhDS)>@&s?3;&@ou zV6Q;thmSJbNbI&b+}oe*{_y^L4`#a`KA3&*(fc36-?*GL-7tTf)d!@w;BuHMC8VN0 zfFCsJoS`3vso_fehoOzX5CpOs;&JN@uYLE;1!O7!=HTk!GqmvS(K=Nf!Jd#JMIrxH7xY!G_>Y(_G5Q101;3HmFMZKsvX!~kDlnX-@ zZF%O(emo2GQu!&YT6#cLKX5U5XO@~$JzE}8)(^IoXvU-HPQy^SLD_@i=*goeT+@P= zC_a;;BGYg^!MGZt!Km6&7<) zh@+%3`Q!NH)Hx;gf`VbL2F%8$KTywAs+)72o_YrDVjl@Mu%D?qa>T2m7!qzvM8+XO z8Osw*&yV=jbmuXl)LJK)Y(k|ds4+KuxF{4r^pfe$>G}EN%L@$6BnZ#ex>hpX=}HZk zKT!!d*@rUz9i7aHahR&^7L*>6i(OFoyr7uwLSHrunK$wY762_PgVD4q9hyPA)Pbd~ zwsVcwmc&gmu#;Y&N%Rj);&$64mZ9J@=gD|ZzF>}nbAuAqutt>HJO=AX0f)lTisnX)0m#_o+{4Hj22LWWRXQqu}C&E zS*#u`Alrat_#|l!81Q9v@>;N=lMF-Hs}F)NKKNw7fUz*-i+$8VSAV|WhC*>5ig?3G^Y5a|0&Ap2&E0~Kr5IoVkh86aASfifOdjM&AFW` zAUA-C+yJz!F$q4#Iv@_@Sp^7V?*wlE3g;f^SV}deeSlqlk*{P^;U~z-uyNHC2KyTm zY{x2`?BoP(Ly(1xeiMv-`dB8(i7R;N%;zDyTLn z%D}ZRifZg-Vcu(m3ly0NUQ| zdQ<$kBYF`u1kbJWijC(T?N)+sct`s;lYr{n=o@ZSqKHv^H}Ygg9?+ZItYJm=1-jlb zTVYP}lJj(vRnb4*G_SdLlZ*I`n_P%9bECmxtih+NYG&`Iv>JM|jlt`1m&4HQGpY?* z^baK|N4Ki+IB(S3tc?Ir{nwdx1f_pa;pQ<&JH)<=;(OCJ(jWYGLx^bEa)Gv}u=C3aw zRldou9JSPwUp^?{TWyj{`BiD8wNZJ?bAeiwg>0)|3A_s5-&`mW5=zY=utE;*SefW1 zestA3@#Jn!@l6$E(#T0SxoJJ(TvJb#_&Y}S@|+jEZPYy!O2(*`UR4Awc-y|3Gu6B@ z+da{{Thd9!Zv`{tWlgQ_SN2$y*TDUOzizwmg_#pU8uGlUN#= z2lHJbGCW{Lzs&`6MxvVIliwbbqc&#oPQzX?#Tq(UQ;|JuWxL)2T^qUOu0vM=X_VFN zP07X8+*{uA_il1sym6C@VP%x>|3?I zDk0`xFD*QAVy?V-wY2cv>?|_gU5!i ztiv^HA_BM@1h4@2Y+?ehR+AfdlkG&x(fo1UpBEVAbsNLj7ZUb^GX()#U*Bh`FSn8! zne!HFb8tIwEajIWt=%p)s+7kTAWylYse+j;T*-xBQCmvNn)Llz5RNjzD`#?7fq}Wg zYccW#_9~7V_kqBCtOtST7D^?w#HJ+HNaGp|@vFyJM3WbO9Xw-g-aziqpj!fF&XFkm zN)kPrG(y_Mz^F#8yHP9GFf$M*Iw=u{WfsbD0rp{;(41#TK?%zSnk2Q@0N{QDK^f>n z9ut0DL&|Z+sgm#n#n6MpEJL}+gV|)MD`LgYfUO?E{W)C^M~S6K`@DjCKIV!eq%;gS%E!0>nsRV(b=12Rp2X3TuOFDwH3c-$WZfWr zmEbaK#wcP6$_Jeq2e0zoqANW(8Yt0IqpZ~xDGFJ@BCWV!(i#A%yZIe+R7=(M1vf%8ecYT>D3{Y?v2@+@SjFmPux) znf?#|I=6FE?eqtp+8sc-Y$zozZ0E53EN*9+ZZB@<;qa2}%vQd*ouTx_?aULgrR^-p z!gdy*ajmwUhuk@@()FX3r=qtrE-Z2Fbq@5Q4Y&VhOs%w8g2RerrOhv2Ha-a(& zE-Iin$(Q~WZ_cf=g(NW(qq((qfWSn`@u6oRFr`Poczi;n0HU~aUmMtkEDjrl(Y*t7 z8B(U$WRJ|8?%2|JO>RkC#lIXcHIx>UTc@)p@nl3EwwyZTyiNztJYp71sXAof9I`}1 zc}b8mR_ho4XJnX|_#@R`Sf}}s3NIOe^eYtPGCsS8=YtKGAF0Tac~!r{4J$0t{7%9w zE3!y(!qaw}^_Y*`x%9hPj^!PoP?&gO!mfv0YK!#b9V>4~9`vULo10^Oywrtdbc+E5 zh2x;@KrmeDuB<{pOP{M&?;iW9E^QR|A;&$QQUavTiiBRL4_5;czI}{s`&15y2Ij+- ze2J@y`KaYM?U)7yld>;Wyha>y?YwfBW6jL^YSxTLL>oBIho2@3b<55P&$%YzI!_Y= zc|zLOZ|naHM4DX1drYx)T*;*WUnJ@4S^iMLCW#1S;#UA2U@ zBYBfZqj**7QG7m<3W}HEo(%(WFA%(>vm$u*X>c?XJZ}YXJ>i=Oo*%I@MDYAT@u@E& zcv)NBh6$cupowoHcz%F5ewg6FM)>C?!Sg$u^NQd>mI=HFUQv4%2%e_`a=2*pF6T6U z6^#?E^GZs9#&MmJFi3WyqVdYzk_60|Va(r3`sH^xj}-aFp~9Sc)H|#k)J41iV(}X7 z0)cdeGbP?B(tVC!8Kg@+X3R|Dcw;`q`pF$bH>y{8XcHj4vlQfYAYAng#Ke=p2#FTJ)dapJuPBV|$Bth= z#4r z(wr+~>{hHm+?yZZGKBM~Hh+A;GDnQ+<*VD@d~kZ+8zkKzSC5u^vFxoYBQDU)1z8Q< z(V5)*XmN9hZCTE3`Yg>JK{lt3p*zI7e8!l=qm=o_m`Q;^QRbiro;r|g41jdegg)Jt z@5)2PkfI0R9D9z+PmRNabo#(oDj7r!=E%35#u@%FR6~wuNhP*sT|QzV}d#1_%1us>4nImTOO@4QtdSDS`pnZ@HsTM3CjWZ{P2Yc|OEm&$u<4 zcRuKkh%Yz!Vs+;mAKv?EjB`H3gintu|E=ESP5&77hce;QroMl>Kf@?6qyTCQnpS~# zYZCEsjgOMQMpn^aW(fS8;q<@t!0v(khn=VWv^jL-m%+#(ik2xB<@h1aah))7iM+8o zcFZFd1(73`^Ea;QGR6o>9QWm=pFX23BU2z4&WMNzJbYe&l;JIf27>PJh>u~seGfk* zChFy!bC$hFlfu_^K|BsT6M|XXC2^;sWvE*zUIzLtJ0mGPgO~---Jjoa9thxz8jv^- zM3BGo_kgPv1q4}HQ6V);t2BcrS*6|P4CgRllk%Pc;duYt?yqsG19C=fo%3;~FC@0l zlf9qRnv!|K<6X=nUQGJ}#X0ZhoP1lbIPQUEs%>C-=mV?t)dI%ZpD%|5i1VMU^+qTU zflCO$$s8+6_~=`hpo}3dgCyW->KIWOo!SB@-60T_Nhc<}#I15uAp~#N3J+S<%NR7& zOPFfvvZ!*I0oouW(g5|!r6gdFY~|6yO(kT3gjCvl$?@*DWoV|T1U~~S1v8;zN-EF` zhh5$~$o*G06^RBD7PT_o=Vg?sot!;9lkWx%=7m&!SHAnak-E8Fy8FDBUdVQzHf;6t zV4HZByOFcNW^4}?3Syle2Cs&WBx?8rh7~HI&{g1GeW-QrB^35M-L!8*P~?o{MA}pE zT(~|bg&F^)+3r(c!OS8R1aU?VkI!{tQc<@Dk6|%;us`KGnr=k?Q6ZPo6xX1V6r-7a z{Nkj4!#vN!RJD_N61)@tMDG~cfLOH&i^g`GT(KQvVmgu72Du>xi&M&5h)@oie=08x zid_XTua^L8TM5XHaf6kxo)M;;ytH{GE_+Jd=B;hAuqoR{@fOr*@`hTwGG0vN`oylJ zP~KH*TdGiASVeEzmK4e>Ywb%F67hNhxi2XtIyI;^Cb06T=(eURmrF(MO~cZq0$A2J zw2@kuS1_Z-Ep5+IlEQJ$4i96`(Z8t9=<9FL3M$CfV{cY&H%d1$tUby*-b8;mq)$rn9dy+_o?2Ec&Qc> zdwUP(`^n4qX+FjmJI2YI6Lbrkq51nj(eFGw(N^q82te15=*lOnx39qYu9Ai>>{LGj zpe60pul&IiZBdC|bv)vxk1!b_h%{gmUCNGagANsz>e+>Sh7x4<>N4KKL&ar!c1yXZ zhqwbiyHsuRq2n-tAE)jN!isFqViUq%n+E}6X3}^)+29!=O}|j3WD!H-&-DF^VfwUyCkUR)`&AVSc$A{Q1jMFnCNw=x%-F_Rj~HR)N4l+wfy z|GO%4v6*0FLr3a)7HuV8!a=_^bjg@oDJ?=Yb)mbINqCobRhiaOhw2M0WxiD+>eJE- z5s4Y8g_WO+orR%#4+ZPAeKVXLV zS-xPk{_#V?gBPvVJDi4?$!l+1*g<`vk{J6}6kI&KhO($Xiw7*7S3@PQ8|6ON5t6Kz z|IE)$x6uMBoXHTk&=bd1JC(w@1q3pZQEVgu<4)reb@`+kU z@@ojeyjkDmIh-2J7kr2Y{`yXYaUgo`e1u(bBv;GuZ~I1m+1HmLUr;#^0zy~l`gEvI zYkWfCz#{9@ADXary&hrkLD*t!D}?Ww`Ax5n2mP{{z8oL`qz(@GEH1&kG{O?Xi}kA& z!A`}cTe4JOp3mQL|KpKIfZ=1LS57qoy;oZpf&j>3Amger_#WPR_yhMabfT{j28WTJ zGz}&($EN2y^NEW$69&#!`_j*ior27bIU@rYavpL0dtOu3ld@1$KLQ z*^CFe=Jd^FBZc-~FduN!&X<;HFVjz%7#1ud_0H0C@e4)8>f@D-Nc0TSEy(Q>OQSB3 zW)grhIJW)tx$r43>{(=KF^8>U*&YjnIL~d*fw$e;M^hfzlM|hM5^MxC@gpSZkk@ch0l5IawdP@MTjCbIv@NkNn`&#@ z-PBdwQ=hk_1u_CtOs2az=1qs=4Uo2$tef!=G0ORoyO}grm8&Rlh2Yh0hCz~w#6&tA>ewkEUY-z@P1FWfgGh6cb%J=Ar&EV+ z-&n=E&N6x_Og*vqVl&2o#sY{~>`Lnb3OEkvATyF~jIh8wdwwXD!+gH33->CP&J`-h z1mGhN$@gcTkqSr8{;gI(+yUbZ^VDwmt?4wKC73yf3e?5#M$ck1P%uOmNc>(Eml1j- z`wQdmSHLi>3UnP64yGKu#RXM`&GtMVIMn%g1rN*tGu|Z@_*T)CmlwMXMKsC(^DOr# zaE2f@tcTK03gx3~i!j6O)eBM0<9|=1{N?cxNjFBa zn@#4wl*0FnaIEJFBwYdoV6Jy699zG2{JT5>eT)e?CW>Ud=yJu}*{%`8d6LV_~~&QCxR%Q6{Zd%kG;*-stt)TbQcbTbK_5ue~ut z3ro1=xLd|8patB%-)pAE&lPWV-1mzc5tP6uNw-Eo7)(+5on9+76^LbdI2V^X-XM2N z{e59X*?K%LExEL!t4`9<(c1QO|KK4`3OesaX!C8%C72WYR!LIHEHq_~jP{fUwcx)) z$eG8yTs}Uc4-}?n6B~yW${;RF{#n$GUp~G<>CCQuaqUa<({0s6Dn)$2rP)pgBfXvm z7;QW%SfYxQkVNpJjF$l1;W(fU)8c~mMo)l7C{y1b;vp!364#6r0*KxXpXIlvB`3gM zum*?IwHU^eh?cs`C$loCzscy@r-4J86CiG}sVN+E$AFD{g` zTh+7GutaqT2!y11gKJj^e7H~se=$9T#HW}n8f@aii^=+>VC%8}i*8(uT)Kw|V+^MW z#)JqR!xb>H(@lBFa!SrT?9@XpGOsBaxn{$b`xY7`GrF0FpYob|KDxiPC?!)+hqzZjPi=ULCir zm0Z@1vz#Nn!B$Bz)!W{G%?f*JN^7OiWYXVD!t@A?&DR9;9z)ekLG}FpiBfyu=rgir z8Gk6pv67Ps7?OLGLjd9QZ$bxMR$Co#Ewj$uTagK^Ok`eqI zMG7CpIHdv}jP#2X_q&l^vCK+>lExlBGFMhfrR0j)=);M^x#OvZe^Urfg|AnmX@C63ZnfPsWW0Ml^EeIee`AxIO!2||NX0*#JI%9<~!@22Fl)pIc*X2ki;iDC@L*O zm?-UUB!4jn)agVE`Kc^~0y;lK~2M%|X(>XF%#sVu}lmoaEUZ%J^Q$2lAgj8J% zami?BlAdlI;+Y-cGSf#jfTA3i4Bq=QJx--!`l0-cuv=cobV7;v&n^%&a6+DBy>OTG zSjPTYqEp4n?L@GeetDdbg`QaQ1QhS6FfR$RO!R=U)BtfsJG6}9?$S4)H3Rvx7_xzH zoowwm6J6{~v)^ZYO}CVmgyDRDcNc`HqPzjv)72WBfS^|ud$IWdpg?!V*;ed)7ojVC zPQo8$c5;XqRgS2_N;;#+3s%aM@H<+So)Ws~d}G58N1g(JQB>LQEcY`ZpiD(DiRt0v z?Le-EEe8UIZ8HsLTC|Zq0-VciEjoL@Gt7 z4X14XVo~rcB~eC?$5dSBC#R2FbBw6sSVAk)Wln|TvXvu*G}Y(UnBXDEJvc@f;HtL4 zmGkQ30L`R&gS(*g!6UDQ!m1}*@*#g#Pyjz09II6f11ne5r+rzhH;Zchxmc1yq)Z4l0f#Xj39a?ol>5sLC~y z;lmqQ;iyA2`bG~W!WJQa!Imy**M5C(#zXuLUu${@zbNYI@5+99)YSyHFSO^ColDx0w2bsoU}VZ`uBw-!?Yau&Tl<#yvV@`XWLc z@7Nrpj)Bpg$ReikhRbpRFT?kn#`kDwlw)xQ!O-}x+zOPVxd-R6Ba05mxZII; z()!beYF>B?TL zQ&T;bh%y~$EHVugI+`d3l*@unY>&H%TMk}tj?-&qs6&p3;jow}AEFnkwF+ggM*8xX zL)lmBeIabD6ifA?FNuYjKF8A+$Hth;T8#yfY^?Xy)s~LpHCzp@l5gZq!+m{~nVVO} z(cxXi?ul*1(Gh+O`)ykd_`=TO1j(H>C>dSyUY@hD(i%gjD7)l#F&Nmt$tSVsDUPqV zYYggYzQ$uiy3;}YyO03JPApNIYcia#jsa*rgI9h#h9U#aXmm<0QYr5@I*T44f@>v6f`GOyKq)+Y2@US1 zUe2Zm4W^SiVGpWY>hV=>Rxs(lq8yjK$jZlFhT;=gS@{4Weg^Ppc1{8VX+hFWMJ*ns zN)BjxssKGc>p|HM+34)yjDUq|ARSgHN=m-dohJbdk^o5TTb?3uO;yUrmrG!YTy3_X#vX0~hPsn-4YdH{AX0;gS&jxvYbKOL ztX)}5-+jF55UG9=t+D>v2oy}D0t+RlQTlfRrQYheCrB!%?4Jv#T04*$1ksVLP?)er zw(#D9HL~ro8YX7PLcMVcF1S<{)5)xx})87ny^=%gjNri_9UQJ?8LP z;@R9mUNireJM_u-{|$F|>Fu!G>|-qOS&p|(M1FYf;FwEaz&MYsi~Lr+V_8h=y@pFp z9{>N~@#*LGs*P&MO*qh;LFx_eU=M=Ol;7yuG%%vS+N}5A!^6&R(@m4X}xw zUxo%{lGt3+bMw_P+AlqYKiOErALa&r$Jp!>mKJ-2O43syChN0OW(lytF449VTYY7i zZ+d7G$%H4o;7^zRGHerku6{?Y`Sej#;T^AY{)z>_xD`F?_%RNIJ;#WMy+`O9oKD0O zT+9--vRkxxE|Gt)OHV9Di#U!YBGSBY>Y}-|A_^E53RV;w%lr%Hmeld&(%@o`@U*DH zm3~=uBn_*blP4XfaQji5~)P zFIQty0(_mb+#h=>pP8+BI4yU1 zpi2?MC?(CaHn_^rPE*G4!2@xhayfLfE*#}j6%$ktPP?w3?@@CetA(i0LW|(s?CSB} zo_x%lg)?8ILU*&c$Z>&i3?^fi%_A28!$Oi`xM=X7$iAk6Axp6Xysv~~ZjU&2kgC`= zp+Ja;FGij(QwcjM6@>?#Sv`rpc)E46f55|ah*^%iF>RbsB4;V3wJGuFc{=NW?HQ_e zVOYSFj*9?9m52&#o)D>+LN`>ME%NnT5uCU((HS0%Zy`q2U#Egc+G$x$|Kf(ek?$AZ#ncl-trUC8=yc zi7ny`z{HB^D^tZ9ln`d;LPy71AvDt52~-lf!vkokC3);9+hb5L%qfaNO@f_oJ(8lu zFey|7^W{o$)OfuZvtf#2Yf*~5r&2q+2e=V%DW+3dECo9{P=p!*SSSHNjJcFy5P>Ty zBv94^*#ezo%T$^U7lRcG)=bONip_Y4PVS8T@pV&PCt~DpWCG8MhLcvfiJ^OaR+;}q(uBjunqw7F$ z+!75T!cu4v4mNH!qRi4~G4Dfsb)BkP48j^MkB|)6vd0GB7&Yb#Jxu4@j8A15pUWP4 zgCvoK8cP^yj#w_8{s{_e8D4EMdd>hwuFx3XRkZK57j$hUE*Z>o0W8}Rg^A{r*BcjJ z4Ov;x5Wfx8^V?|H`90Tg4#d!asc9J3>G^d3SbT(NI--5Bi^3o`$@Vd8aUN8MQ@Ko| zCU@0nhLts`)QtrKZC!{%JHXrV~6E)Om}PO0Q#oN?Wzk;I4( zPb-4#L01VW!6SLT^1K9B@(OSRyJY>GAL6*_owp9VwI-I{3H zKwMDHnT{j^9*=X{@9pC!c6h#p>gT(amr@(}V7?jI%_}RVm>Q3Yi1e*Jp~G1s1AGrN zVj-q3={_{28}tyle#Onx;7q>`x^yvbccroHz*!taC5~Q6Ogagiif!?ulkobOKmcj| zA05Fw`W59@*(&N=uO7<1_!d-w^#elXSOltfCZ>SKFOoX=rj*Y91`*)qqa>56BE_b` zmTA#d^iyvs%J{GJj#WE>3tHrUd*m}q2Z56>cjlaDSXZs%+WW`}xIPiyE^yp%UP zw5wFi;*4fuV*+|76FYHw)jU$y^*+G(fOAx$`^a%GJ!=0;xHp3Qb!C3-e@Xu%EzJ6$ zj!4+kVtYh($XfBGYflfoqP_UiZ%=^;{Y@d&eU1>;#XaebVSKSD4E+rdDNAHKY~l!F zW_Emtx%+76i~d=^t|KqokB>mFodgkIF1LT@sCDctJ z`XqI40g~`2Q8$*(mzsJfPjrN78}W=~4PRMF=OKHiaz>4JnYY)%6IP;TK#|!~?Ww8v zVA1g{-#&bFw7lK~EaSWj1i(#N^6u0>sKePIIj?*bO8o=CCd#Jf22eLMA)$MU*m5XQSm8)JvHS*|g zwW|hUSaf0XMM~EVkR`q--kQ(pcpoNtfN9rulrNJZqor| zX`*2ZERk8Ooi>4qM1ZwhCALe;MFO~a7MwHGJ8a>mUy@h`R2HdN1XE**sZ5@5fl|z3 zSX+mhEl<4t)GuD`ai}GJ;!a8c1YJr?DoR4{$wIQag*>GV3l9`={I0wkw zE-K}BEVvH8g0RQbh0c_he$?8tW>nErRtNnSL2>ZcY?0sWUgpwT1VSG`+~9d34P?mK zRz@90s;62clC6!NoKhIW#Hks7S1;8%Z#XQ$SMCIICD1SFI=S}ZuIR46+3R{{Y9`oICg(I2@w-{kS5z_WMZnvWY|SOwYDLY(WirC!w%5Wy%w6no5save)$m_ z^hz`Gie6xACT402eXVJ(&KHP8Trr_x@54;N#k>|Qs z_K#2I(hGX|Z^olSVq~ zbR$d~ok#fbNlHK(W4IKPonpc(i?yr#gL!gEVDeR@YA}z&iVIZG@+Yl5TZR+?2lWnq z%5L!rQKVXw4t%h36aUZL9S^nrxAey7XpdMgYYKjY{l9~yXMXMo%S|rZ;ITE%6^+^4 zW~RucQ&fQ)gLQF~##G)}=xPr4dynq44S$m_2-OQMXe@YJ;zqFesdS9AU2EL0+1-bV z*1E54$Zfy!vgQDeg6E zvwgpXpd+5V7m!=pi3CDH5&3S#UuztU9n;fCWH?CAH1+MvkOel^!KS=6ubnLx5F$DH zM=Q+BS{zGZ#+@L3cET{*1_5{mdFovqe@dp3V0IDLK`{tBFir|`(TcW`QUK*zkc}8D zjBf#nsOR6~F}>zg5$)P5JxT=X#BoAT14!ydJ!i6T0FDGAKqo5~Ff_t~A$6kd2@tId z)UD27P3s7#t-=758qzJnfJdhW)k?Fs0?_DTfW{@-nSY_!wX76~tCMC4@pF!C7R7SY zUEa3GraIjv)31DO#&})teztk<_6K*S{`W_BHdelyfY0vS`QhfBpKX$Zwg>s}_U3Jp zU-uwCA;tB^ut7fk;T_i+^&zgc)`z&(xF8>V`pM?Tdj0z0M<0Jo!tCth{zspD|KmIN zH}8D5akF6Gzq5Jo&iC(c5TdP06{L-pGIu|VQf<8VJ6Id>?aj^GAN&C2KsEK@odC4) z-v9ai4{kFgBp}oO^_@q%sMI&WZoSxhbtmG)k8%EvIPtF{Lqr)&iFR`OHC zPeI%4nV0?qeROcZF<#X=O0a{60oYqIs_10O4TIwYgeX_=I`z-u%@$I1 z9VutiM~skK*5HcrXKkL+sP~l3+uPUme`Gv(YjP-!8+UWYgW%ByU%cp*^sBbl+GB7NByU;{>Q#TD?s*9qH^r~L|c%hLr?zM8siZzY2 z@o5!)alCEz4yER$)gm>^W_2YfibAYMgx7OChKY^@OXE01U@+4%xQIiB zBY)t=>kr)Z2<2fAGNnOs$m>NTpiS%qJTv3)1Lszcx!ksr{dU8Wj@j@cH&s&wJ0fdr zi&lYDsp*086YgQ|GBs+tw9j}ODc??>=cG)IfFRYa7Aova5*Z%mku13MO)R9afGu1y zoQr$6G`Lx-N?XAaV8K3TW20vr<7fVKMh-rnd?JN1qhzj~cv8v|3mW052r@H>F~D+E z1egJgnK~(YF=W|MFzv%kd}oeMgo$ghQ@eond*9)a?X7@?H{%t<6uGP`381*JEXT$* z?nr)>D;NU}mAjrSRr(aADw~sOX*Gn%C>@q{0^h5sW zc$*wlWlAJ-k96n7p>1g)Qk4U!(^r?Bif942D|{g~zYWV260E>6q3k{-0L;P{F=e6W%uqFN z?T+WZ%QC9;PG_=7`xU(I`1Db;V6ugDh|-LXV@~7m+H$3x1gvLO@lg?`i<|M%pnbOP zMoi0}G3q4QWbLqrboD19{%F24vh+UZ2|)9mrKSHlj)V63Li2e%oTR$Fsl9bbi29bS zP#BJ_5edQS>h~QhD{E4jPUOmDO14rKc@R(-B6JXb?UOihID`~t8oQ_BcI1f@`~WT| z1SQNLtSm2%9u^HTI&*Z^Q3ykO&ZX!~Qj|Ufza#p+MG)u3r z%HC%uEc#PUvFs0$Ka3`nG_M102XF%M2XM|sI$@ld0TW$z^Sc?gQN}<>E9cj0D?*Oc z)+4V{@Hp*#%JXB<%&4<8JMI}VO$*8H=%!g9>p?qxb9kK`AEUM&lS-_tF}Jwn)$?}B zlo_eswgWmMNCr{S5FprLJeAGPF~ckAaDa&fUf?G>pbH$Fh(@+FB0@34(sieU=H{{BUygU`t09 zk)Eq(>j>k3_WT?UHk;va@sXv|U-EZ=AMR+Ms1>obfTe_lH-Wi2T(tRk5pvT4k#bk; z%=5;Hcu+cS%AOwoLN^=uRmbgkBQJQ2NgOXal4ofZmK2jrA>*OgV=6%>$Q@k%=^QRt zV@H900Dd|L`f@aERKmLmrc40o+)t+j}H%k6-^x#lQqsBbzf_0R;>puR$m#O$jr#zYI2+MZ1__Td|66mv_CR48@5gE9#Df@aL-zfH2 zfK@gl2%BQJbt?pTbZ z9n9QP3gu0iV)I~(0?AvWV{x(l<)uic8F?ZAhY)7VVHD>B$`?{d$%!OD7uE@5?^|80hP&HYpb))_QPEAz10m|sopyq4k&~<-?n?-Ht`c`EaQ^rdWuyA zspkEvSNBkndXOaI%dPPB^6jZtNLnflP#%{t5~Aani@=78$ZxIQ<~(<>FlNKm`@XbpG?D+%^4zwm$pl*7S>c}AFYC- z&aRF_#l}NC=pcgzCMi4eT*#NMNQ?|Bo>Egu60r*SXX@w>{DL+Dc(I8r-5v7O(3aF) z*~$<7azCGD(cP!JI}+73RLl^=f#aH`)id+a$MC%QxrNgt=+8}`dIUH5?<_TGy(Di1 zX;=!qKh)<6zA)w`;Ft)qvo&SAn39Jpln3gV=emMDmS>kXmUfjPXv_?Nc@eGW;AyD6 zr~7iQq8uwdxwXF~X^(}r;=$J1)LQ@DkQ$KXwjMKEJ?J7FjAe|z+1-Lxf|C=M%{QQB zp4=D{n6?hcOQ{{%+Zr2?WTapF&!rsKrLFu}7zU;-jI?|p-bKW)*EZ0-)3CDh`Bo0z z4J>0{We_qj4Spq98CEvGx*7*Cj0ZYJpaz4=@~3-3!J6@}V%WQ6XaD22ZCn}LMYC^$ zR~FAStSyRtf_Kj(0{hOKGwsqpk0PFZ*WX|?9byb7Hl^gWEN`MVNCe`-VRWvr_698m zyq8dyJK)-%@ZF1%`f%RwDCP;!gFLBxf_lRlXn%%PY$xo8KoXC9d`p70#;$O=U_RP! zah(ZZyenzn@?PU_-hZ&Rya*abW+@`>`>xfEz#%y)n0Gf9#E03(YzRux*TKVlVbE;U zhFe7IRMB!*t$8r6okxx;hR=j_VnJ#L;-uIiaE`YxMK=_~Z3si_o{!z!iPilCDZXlF ztgiV29 zLCf?Jjr?9UGC!Qvio@_^13t*K+hEoc6ok|S3o!%D;okjh^9T1nyg%Li`2O^xPwsw- zZH8xBv^tRBB9jAewe0l)e5akx>H1-q3NHA67~1#?N7JH<$F=Lm1LoQ3o%i4O z5OGO%v_tb+UU-f5Olz`2x!vt;3l-8-VlEs^WF*jX$0uz6zW4e*oUlAk?9`-3U*IEH z|I&BqPxP^fK3Y806%=6!q8ITbP-0YAgF2wNlAx&tZxbFrKZ&WUabJ*d;3fIa=Z}dm z?L^IEUZah9clLCau-S&roe$fuO?{oM4_pH~o7Mtx>sCAf(#}qgj`ppLp zT1q1v>66dTj{U61I3*&U&R6f&7}oVDJRkGKjS3pa_web*>k`6Hw#C(Pw1DhlnsXEU z2!y-C*RleQKxAtsvfn=JTCtzob6a`6YS4`6!x4?&Mir3?22&0Xy&|X0h!2>Y86?lX z&L*=1ez26RSMH5~$h5$OJ$aAy|45y7w8lCp%iEaNr1a1$nk)>!o^u_#fb7V(k`lpJ z0hFQ#Ne_wz(3D0Y&j1l4&9Hu<8v$niCAtg}1QO4BKx?vAKw)@idPRQ3gl~zS0fr)o zoruiD!wVZ2DpkiHF&TM}D-bj+N=#_Bm64oqKnGzoc2@VCjj{av$N2eorb&PAS{ciU ze~b%qS0c0D(Qb1g1TUg@Kq2Fs)H>X+(Vp2cgOdJ^WZ28;gnB7l0?A&qKcQlnN2ti- zYs4V|dMGk!29SSa9cz_Taye>o6b&djD0%E6T*1hhB_70{Wpa&$q7n-awiPIz!l;#q z0$Ho*k^T;0p}V2N{h1?<*qs+e3{;>P=PJpLdo!H_eZs-OJiYgbLmKh7#<-k9=Iw5( zHH!`DP^GontW!X1b<9rx`|J{(Oxx>?ZB;^j@HLlSEwnJMIcCGSZ+Z}MXESJqJG{mv{m$SPf{3}1 z8q3qeLw#K%{q#p3>4=f~&GpXo;}5391SCwbF^f;-SUKpBCf&Ppv8U;L%6d8#Nd=fD z4@!j%w!%jf5vTYiWt{hjWP;?4+v!9}tSpbIymtpDA+Cq)g29cKnjP>iJ27JnWJyyIi zygJp>bgH>sJLu-dV>vElF+WIDPJT)|qwL-N`5h4%d+R9doBcUH-ku+yM>OP`A@N!T zTb$wf4o|urb~#CL%KHb(QCOI0^Loq+B`n53LZ$CwEwFQ&)cH<>rOu0$W+@3 z0`^c&VkqhDDOs$Bl45~C-B6nNydxt7t)(g1BMC@eH#%geS0@XZB2-GwCZvDdA-iz{ zyeG%#3}x!m+dXe(F4+&jX3 zCSo}^qCjYOP+Hn+WC1K5fC^ZLyMQP@)NvyVV5I%_CTw(3xM(y{xDZ9a5xj2yO~Zv$ zzJUl>jl4Q9TefHI5RkDKX3icq0CF3NL@9lAbR`QPHPnWT8ftIZUiy#PP#=?~1+Ebe zX82T&?K_G5vb=6r4VOk1)~?3TM%u;zEfu;RwJ{K#nW*y0qB0-jhq*2n%hAe<521Be z9HqKb|JB_ew(j7j=3nc0E3V^{$hr06eVv{(a%-g8`j5k@+tpfw>i<7({bN?x;#noL zUB{!3o&V<>K~(3O%yZTrg}lfhzVr`C22Q=rb&^rea0%laIe09|e(~AF{xQ*bj>wmz zQ@1^yaA-`a=YZtFhy1VLWJG-Y;xS$h{t`mBpnmn&eaY2;Sag0Z_M4c}xA}7KNx1sf zA3~l_%E&Q4Ag8(nJ`EtZIuL;zVTj!{nF3&pXgxETfw_Gj!L#=#zT;RPUa z-Q?Ec?jBwgHu>%E&JJdpXoVJ1g!K#G!eFJz;tsCvdRAF<5hpOrv++r)r-#5$XpMiWH*f24UU5Sb69`8?pc?6>I8QXIG}v&v3DRs zA?H4jyHi5sSzyqP?yM9EBL`)65br-1guzq9eEQ97Ja*uOKIJfb?YDH?q!PsmF4!d~ zrYDobot_LBy#qq*c&O|VSmoWjK(Vn=Vj~>ZlOxI@c=>G9e$~d|G^KO_c?+z!fOXHw z@-gmqNJn`CDNhS#ELql=>W;N2Yv8(^VtM>v2?tK33Lw(yVMZd4HH)Lx<%tz4sI1J% zykifY(tp*2nOaqN$mlP) zsuzySB;5-ulPlUkCi^nbb>+d(c=117cbwyw{!39J*Gm~t+g???gKY+&|$i)?lhnjyu>_UEz{bn?=`k?*J z5u!Pj=As)PT8k=^oOo;d!PXZlk((fYCFyT%Ln!*1vPu04iRAGC&sg~=F@){N6I@&) z_?_qb9IlU?B0wDKUl2G+KXr~%e(Uk{R+g?inA~_IqT71N6HsZ2kZ%0b z&pfp|7YEah*GrBBO2Uxy9F8L%5GT`o`*4FaFC2dO(FSYO2Ta8NfDbkSi%W{-3oGI; za?xNnx5Id6%9e>QI!R%Cbq<&k;|oXTy00E_DAU^PVSFLZ)_Rv+PyKA+Q_IkB2jGhx zYq~W9U0yT%1J)x_@xSz?p;NiwDfr%cgxy_{stJ{go;u68wL>7IS&1G=DZuK0{mJ zibU12OYERDAJn^&xF$7dz9ca%jr!9@bGQE>L=9~9>loYVMyj?%OMJJ9=Zj0=o2r4X zk766^SlJn9YIZd!Kw2a0l>9?>L!WFKv*t#(d`EY`j&(0Ojj2hSsE10mVWg=0F| z&4pt+Y3af-%@OUBaN+C*7%owZw+Df>vzPBpz>(t^!1GujZ3&%7-U#5_3 zy9hQrXDPP;wu*e*HYY&>SR4=SFZB<&Wx{EE`?o`qHRgErRJN;2ui5?fw<=`OIJlM~s7vOvxIvQh7KyAvrnkhWrVsVcA{}+ixDlH)Y)cBe$9WndoW4Vq&K! zJ|@Yy#B}R%2y%&`kSW)(Ctqp4BXB~f-BGQj^e!9eTrk7V5X0q+WY8jYKrRv zp*W8Jq&Q6SHz1ln55>Lo15sS$P_$%-b$(q5byrtdpy!3+BAAKfjY;Obx}~C-Vx{te| z2?>TI(9N5b@oHwK{B6+;`u;Fz&mX!S-3B+-pJ%fkiPD0ztI=!k)#TCywT_{B-C=yj zwL67*wi_;_xGS7uslyxEdIn{7JjQoa6Sg*CMP<$r))9`;g~@Rpm0iM=c!MBy;WP1N*m|lV>iW@lMOS9V~y-Kj6{r4 zkMuA^vzFr0RM*WX0mx+l!l)`nk$gK0ss`lEUHz|P?YzO-CD;Dk4j};R{{H#F1MXht zqvB0Re&!})0$zOBteDB73~qEOr}h^%h18{W6$Q}dA{Q$f@NQe_@X=#qgrZr; zE*Wer6qLO+{dBnwM`y&Qp%9~#uwgvX^^2|OwLk7(3^#RGoUsK`($LP7q=AXi9+~Ud zAg?-S6e}o%5xv4uwXh(pV?0FLt^EG}_9J(y0Jd?$U?(*uK>42JiCcZ;Drr-b56;f&Z9CLa^ZJ6d!oE=`lXhDFoh zyoKNHed%auBJ1hMp+-KtPymAA%A710xTv^A+d;DvQ#pdd^%u{ zb~<1qoCaE;ng;EYOanH0X^=)N0dZzVXshiv2DpsBzV`HXtO+i{i6vui4E9);(PYuO z9|-o$)vV@jX8Iqhk$hc|*a4k*G|91}+g!ftOfZ&lf6G;l&v{%(@iUQ?OPej0J-(Yw z$5(0B*mNl<_;aBznwMcpyD#VM5_MIICZxz=8zvT9z;}Z9D%NTb(cB9R-=bQ4)j6w! zI^;*!&AkxcQ38oBbX1t%Qu_ci>@hmaW=8Wi@@82;nduhW4v5pWvbG#Gh$95l^proImiN}pOf#Jve8}*Zgb=y4so}dWt%IQOt-NWyYr@-&+{`mLr ze6acHy(xa{cW!@p|MuNGI3E`9-ktj&{p~x`4?q3M`yb!I7jX&x@kgKBxqWYAv<$!V zv)dnR5;;lp{?fm!QQ`5fQ7bGjezX-WPlT15XPLO!kwV1Rik;0<719Myv>9L$RiK|p}1AyyzAoWef(s% z8q;Js6+Kx|B2*RyvO#3S5ElcgHqnOOn4sKrofH}Dm^hJ|bAn=X57ll84(tT^EKa29 zoJiAYtfu@hKi)b$<>ok%vU39GHda%63$;Gtiw1}?GhBBwG|<^mePn^+$W=HdcDqi( zjQ@iQ?(E^l1P#%R3F@BcID`J!(aME0&=0|;aJSSrX&{68u!w#)H<5;Df`%uW$hbb? z)$eBr`3}Fle=4d9TtYhTim1ZwXzrUCPemqWmB>gcgbKoPjf7@@I?ICcuBmqN`MbCK zsK`F{9HcLc)VPLV5;!<|u#3sM{MudbovPRN$Xymh{NeT3>>Kxpg2;3ScD8-X4Fb|W zLhtj47*{I%cCQ%|O11JzuN4)1xizp*t?j3~(a$SKyXT79cP|I?R<&PyE6cUvw{27% zw-ME5y6~axplqx4QM)JM?^fUajZ&?BbMfQC++VM6Ugo=jsW%H41bR0S*ucSbs`;-A z4-my^RDOlsqx3DOiI!iT5v9Z!Jq^6QQLP8V$r-f9gNsz-*JDDwyV%&v23!4L7t2^~ zd%l`zSg!q2^ZD{GHcsOO$5-c%Pd0LRUj5aDUxWJ9nyPJ9eY^@uiwcqUCj$qKYoqk8 zuP$E!O%vrU;@ypitF32phbq@(axM+2!B=Xuzp9XH_a@3z zwCWc!Z5YY$&i?+L&mGCbCo%j{e2$Yi zU~ve4M~5(+Z}-PP{>h!65c{xy28$b9`|n$M3hL#?kY^3NRS?5&Ob-SXC(7AuAF!AM z>|hU$ljkN0aP}qHi$U-WF0OAWQRyRUe?E$lqv?&0Aw)uT8%Es(4e1_7R34we-Jq1E z6ZD;Xx_0rI!--FB4h<-ubP6`Nm!RQ^9=%NT=!FV-nnGgqqXFot3-G*H1J8cyBn6Vq z*Fg$Ihn}=(6Vza;od;>)NpDLgdRqdX@&L`VNDoOSXu9?k7%)%KJd_lMeS#Lt$jBo! z&LospWfxM0nu#=76QT^2MaW$I&04oytmHMXdG(=2-f-y96dApqMYRslR+!|!-W61t z;_~RjZcNaC6_R;7~bP~tL^(wsROxPW|} zzg;v6wUJtK$+li@ZE2v@nbtE4RMWYX*>trPi&^w(3e{|O|3?}z@+*MV8rG6y`di2sA&^XGRy_am((h7qu3hH;L}muo7!aZ27nbAQEKA9j=_Kt6z#XdO!Ygm_^;PGki@)O+b zvOB(YUy0LO;!Az3le?b$TPDY>pC;@^v*N0o$H!W9^i3i zviI^L?4Vz9(kn7wT!npPUJon@H;r0_Wyx;cX;~*>o%VGSX6^pT@p7xJ9r0!~-%!#B zFcvrOxk;*ZKuUCovoEVR47Fp-)fdV4_3X;m+nP(BO~@g6HoX?57AW+MhJ!wR=3!FO zN**RTqN0rI=M{n>Dr_(^hNaN2yGc+w_K_1vIn7`H>7E7lNGVTbm*!WE>I8Rb67=y> z0|)Qs%8ohEZ`ouQktKu&B93oSSJ=bplRaOL!(4TU&5nnM#K&%m8dUN;%QGN|)QkVR z2ckWu4E1EV*OL8b20FgKGSvTnIzDS9B)-=8tgsir;~SIfN=iW)*$9HDKsc*PE~PN1 zSmC^VmAyv47w_}m=+%t*5uV=hZm#`vki%>L$a%l6E;5{so8xB&)Ct8XzX^=0$EBeR z1^a-G2vPS4nEczlXuur)NojpJ09i&L?R7jTk9rTaY^(9QHz23kc}n=yBE%e=n(2r= zL?Jx)ACq<^Bzi6oYFu&54AYiR7|*%`rX8Lzg?UqhBq}O7oZ3#*h!ZQ0z$t+Pgovy( zr|&d;1`vhacW=f!2>>o4h_$yGO2!<@Oici|;_aS3Q4kGOXjfT|$d^J(mf?9;s!54X~t|WUe`iOKcw3bPY_#L}NEnWMkB8o2C z`CnSHAbZFEFX#e|=#_M_+USB^Ai78bfIsvI;MzZmWh3^?n!*IJ^(dM#@)owUY%^jj zeE!$4ogI-nyK4i_)1DE;c4mvpys@yIfnC_nKCCZpXOej2wVD=dJIj6@YH5JAouTx_ z?TkKtX*&zDu$={HT&vs8&x;>4xJ5;8XZ(SJhg(j=+_L-Qk3YJ06&WS+wk7 zX?;OoV^9cs|6cr%LRV!vD~!v8o|i5BrT?WWZOVd!t#hU6Y_Q0nGYefr$$VvPkTL>u z$ezq0%@PvC!XY2peysZ9l+X_#X+0DNbAmxcwMy(m6s|TUIAIXkgMoL3k8G-GY(h$x z&4j|FNf5UWnGaFB%n-;e6OLwmOsS8L(GmoZ(jFiUN@46KoRKP=a$jFnD{}|mbI>UR zMuBW_y)-yYzbO+48WX0Xi6*@<@X-Hb>)<0p*T_b!AFK}El>Khr!gW94{b-Q z)G&Wglz~fzP7_Fz7%`3j49E2*MJt0%+B}+UC_4$wFh8_nW&TJR8ATvUwwwk_X(C8l ziO!j@yEpR*ptOI4AWbBzGJf>T8)@(;GelZD%65?fhdqx)gGa6{8c1k}?UF{1SOntb zmD$5b+>blzFH7EVphkO?Q-HqU;EsVlsKmerjzQKZzyXb zbhM8QTRP5^d2f*M(D$ROSoQ$-Hmh5{u2wnwPgni(_3VqR*4#g#6v>#cE_5cy*Fobp zk67-766lq)6DHZU@GWk(a*P zN(;+oIheR~JM0zrr)d2TeGgqr{%F1irVq`RQkva~tsEPe1+PPd>Z*>Aj!czDKN@NJsN4gEro}>GBSq zq>D?JR#QCSxa#(G&cW;A6U!`(z17aTPA1n=4oB&#+x^tv;vxYz;6u|o_c@;XYS+_F zS51{@u4$f|u9{DevFsf56w5p@(B|dIa2WfwC98~h3>P%>m}G{*yQnXwf<9SHWq}*A z)O;1MK!*(Lid?O1oyOO!CPwM&j|)m|C6tu@R*lx_D_6ydl%LXU_I28MbuVpXpAmX9 zOz_I1QVycD+e-H`!N2at1P8l4$@aw&!)}WQ9iPl}S)T=)FyU;9D;6sgsB*$6hz7b* zEvl(Ou6q$YVIr5g3Epm=aj`>v-@#}#!8?twppuJ0F-ARo<`J?9L3UwYB=I_z99+Ak z;nF+*{6triTaQSdE0<38b5!tK5EUk;yKEgIHASN2t=aMMqq7rk)8||Gg!+RLiBE1l zm+>ZBl{cLEUozletGx6nd$T#j$mZWFT~lGt^*IZF^m+<>=PeErbtso6lUaXPh1qLCEphQYG@{ zHqNp4CV1+xR5zQcV*HbPAAj(J+xOr%8#i$wyMlw`Y<=q{PGrgSUp<-q^3KuDeNYh3JBH1}58bCz5%g8@ zh`;*}^wTHKt0Xwv zI+Ul_#=Sg}B5>e6;#;fyR~1@1&9c9Wy)mk1w=c)*`uz3g=gJ#Qz^FxRf32{s<_7PN zM;(r@j<6XxR;{mtUnb z>E0$W=64I$=CZg1uQG}s-To{oB!UvuPkTfdEicW0mKSI6uL$LPswnKx<6OkU z{SaN&WTgc=&`T4P0U>peEmCgoyIVN@wlrag*>h?2xKHkFaVAYq@KJA(AdhFu@Z<~b zxpfo#fsPDTEY(xOvd~8ct1)=SbLTbW-zzq!Q=w+OMBRv8FGAe`&GXGX=H1!B;}gQ! zNV*N5i1`|l@z|U7TMEN;$kO<$F3-ej8|iQDP9-VzX~_`Ng6><+-K-+A(6pngkt$a>wXF;F3SzS}bMUPJ7=K@Su~IIzDb zH4a-$%3#SXZJXhM_e+`7%N_arScAi#P5h@Y;KpL!=mOX97?@2Q@GjAMypu0ZQ2~~^ zH$C%6Q`ytquA>rZ3oTTTuWmA(Y5d)Uv7s#x;VE-Ui22`;4SDy3F{d zw0oMt71wZ?Ak4u?7aghEwTZfYae(rYVE9+<=GCz?rlYAr>I*f=Z(P--$B6BPjy3k5 zKBFw_p>UxHQm5X!Ye>#l@|58%5(}}|%BK;-c>A6%Z<%F&zJ}d|Ce`P4Zwy%qkhcR% ze~s|$#I9P?qos+m73k+`+c2v2nqV<{Fud-g>irXC`_=B%bEOHHGi93a(EVjw(B8SDT(Wpe85bh_hQyLwK5tM?y*HQ2cctmtH)bJcs zLrK%uxI|RhOXJqBqg~So-^pqxtOj=uB_+QRU*6my6r?z_agGbb_e?N9S1e1#SYuj# z2B2TNdwcjcOHwbkB?E=oT&iHyYnr0}I_rlTTT|qnw z%Th6xn>m)Z^s$3;$+1ZBR|hh3&3B2KaD24KK)L7GXPG=GNyO$3m9wCs2z{^!%>z8k zZV@tsq7we;Hj5UJ+l~eu^{uLnA$u-awgX4p%q)$aDQrP#2D^p}nlTbT9z<@IHe%hB zDc#^Xkc^f%KiuxkS=VNbPEg-Gm_~-se6RrX9*T0=UWUwh}?ITfnJHn2Y@Ab?I z4iQQ+tzACZLrB}^?Lr5RM|-Dp-UFBs#7&z<$q$0={P1AQrcOOz0Vt%3WE`MYI!IvJ zpoi0~%%CF|lm-;#2>GcH|C#g<{7iND&lEesze5=wDd7wV8aUbiVkUoFo#b^dpCvj~ z%=d9R6Rf6BSU->S_*Cg73GUZXp;VX}8ZX^?z*uU4oG*tcoQWCgEf)^mtr^IlMN`_y zErQ-1%)iKDak+oS*VJ?>qKKk&%GA882yF~KHJ;TPoPap^m5#;gPlozr>-0c@YFelH z8rGB7MO~9WIppS62cxheO{qRS#*P!mrJ?Z>Q_y&z5gy*sqpGLJPrJ}$w4oN%5wlwU#<|D{YpSJBys2LR|z$hDe=TT-|;5^Zj6Fr}1cjrLRhe(sd^Ju;1OrWf| z&^rM#l%YkxSQNxXa_9DVj5W6!Dwl++$%rb~8?-WA=2Yl8+L@yGqUw!zHeUmzDC6RrcUaz`qGQV>K-Sj2!_onk4jYIw zSmHQw6SRuJaMJ?A-^aX9@Z#-VlAm!d=)DvX(Gjw4DrJwhTud^a{Q~qZ?8Ei)7r0Zf z7(Q2R(PW%&9#>Weszi=R0||9yL3_gYJKd0cx}kPqU^<(xD+ag3B$P1p3FO*!y&Yx> zI%fzwu4t-QU$_TyFI9&2=bZVgyj8VU_100;0eL!SSX;!Otuu0kYO$T9o9xrhHpNn5 zPxlts+Y{qO5YhIDc3>?HCeeu22tl&nU}B?!9YVcT*EkhWX<<94_=%wH4z$XXGLBJS zb8^kdKo3Y&F|B4PDwVv z4l9UO3PwxbBYUfqpM)wEMDkyhIU>=b=})qg*bV7o#WP`OP*wnN);gom^ODWOV&oem zam!4Gro3e!4g^k4KcOxV@FsKAH&30Hj7TET&P#twW+izCNLvpQ$Qz0xT&WZYr+Eh8%<(+Wc9cLK9vG0C zKPly}qT1n_=WkOy`Ij@d7^ZVlE;fs)^$=pg6sUGrd|@|VHbX21{ZzYGQ3r79fNb6JKUt1X5E5{~}SH51@k&$;w2ODFgvL5OeUg zt%*OU)7>7BGntcslB8~|l4Cf7)Ev})d= zo#8{u-KH1b)Q_S^axU>kdK%jXRRAVc*eb-}?z>gTHAFc=Iq2A{;D zr#Oq>t}&>qxe~RKdsBn^T}S|I@C=OPm*=7&&8cn}C+HH+(XuqaM|bMBDe2A7h-nZVZU4qJy>u^M9*ZwP*$3 z^o&yI=0|KX1$P;>YinK$MXZ+6ETl=QpmB1vDt^B05h)Dhmosw9;s$m$f;VorLaUB; zs*0Gup9cLadz~A*mH0m!I3uTw6J6B-3nHmSb*0gmdi2V=NhVfVYcwrQng5+W07S1BIv*EX3sUB@q4>J z`RLQBqC$|CN`L;Z5TIZC962ZSfQu9I?x$|NM! zra%s6yt`4uiAHaZ-@|u=EMD#{^)urq$oSbrS|v7iFDTEH0w9~mK7AdHAn@-3yv<@OnYK$NX8 z;NR(VSF$uf$n!|tg3T{Ve6v@gT3vhZdsY?v^>mN-f#2*S0$4u=Bvw&q`IWy1916o?hs?jCLJm5!rrpN17T$HX zw}0NPG^x}YB-dKm)t;U?@mH?(6ZV}fvZkS2Z81H(1AOdhc|*V<0rZ)CHG3=W=1%lb zT*X3P0qo$YVA?it2w=O9G3cLJNuL>n=tZVZYNlXAY7s+Lp@&qAll+Yfp~|F2oHB;E z42n`WuEkXuu9pVLY6L`OQV~ufZyz@*#0A2&LS?CXsRpO*gsGvXaqq zn!o}ialz@-&x7rU;)`y@>LZT|3SylehC!SPsScq_X>cFo-52S;?8)XD9EUav9f-e* zYlk8ng2KoqYf<|Us&A6E9}z)`6fx6N@`gvHyz|jb+z>G&D14k}?Yp15+Bqb@FI#d8 z?=w#m!7Qo7iU9^MG&OCwDNdWh(A0l}(tT2w>YTu^gepKaQrz@T{1e#~*nkoM6yp_t zyk~Dm&)DZ4+aNcjU~wLK3u#9J5+60{8BgpWfO+!twv~Wf1zfVXd25F(Zr(H*^*3*A zlZ8#$HcD(t`beLY+Le*i-lt&gN(!ZOWo=6pO1DbUo3b@Mq}FyPoG=MuVSCn7CFa)KpVl;(u=*R+ zp`C-=*vF+J7ga?T>~4>C)Yspn9rbm)bhXjm;x;Y1yRc7FMSEeNT2E`1yR=Wqo0e>8 zX`iO8MX&M}_i6gIU)-k|*5}fFdNU-Y%lD}w{an6J2P-fIf9m!rL{Zt<F2^uwUL09v{S$G2lzLP@kKeC)bXhNyR%719wN?^RFklCgO2e=xuTHIP-o(Oc0;*^ zS&pk(%A-;_ZlB#>ZE~f(olU@xEucZgl}RYBO6h3SKfskH_XR8E`L5i#FIb};>q@oz zf_2PboKN>z$V)lEsdKZ8HuK_2Sq$JrrrT#MW{L{Rk6UFfHe-&Y)VNjT0!<{>8rw@I zy1Lj*urVjWeb#V_uPHO`6`dvbQ*zrXb)mbINya$ATv4W4k|WGB(HMMDDQ#bH`8uwt z+_f)Qsqs`Y$i8Tu;<#fxWG?MSveFXSOIAvLOzzant8thw)v`q847M+}xf(AY%Nggz z>LjOk`q~$((K`o7O7f!pbkdwN$-Y=uJy8$s(~EZ17X+P4^~E~ti-}{5)-Q;_-r?j_ zsL$MHJ)v^U!-pdM3;TLW$aGrKXEwShSB`DNPPVhCXTi;B``DW04QKv*L7Xhfw94A~ zf_Q1irL%lKa{}VJK0cMC^Vv9A5_}_@=cN<%P5svpd!@!v-c1@M$#-hb{PmqJ^8Av9 z6gM~IM5Q7muCwp*-^eff`a(c#VyNC2M6|Q|bf`}RhgTF-)=pZM-$94>ILvjVztf?f zj)ig~K$@KSC;Qt+qm@q9QSnLRx%Q>`={94PQISgvuhi`(O!#SHmGU0QZ9FO%4XVvY zY{MrT3Q?^qGypV517cjK_zo+8p7}m}@BJ|@$P(evGlwP(m&i2gTPKn=Q=oT#cwb6a zyM#t6r|a|(i=gCrn!BZJ?{t7-Oxf`K2q~p*0uqSsECj5-0evAh{_)+~ckuRWb9nGK2+N(5RG3+suMLPDUVX159w6E7VC0wGC4 z%qX-3O&??*X|Gq!vo1GYOx90$$Q69)Uv%SQ3vR>ZUMNTeq! zaursDr{A#(i#nu=8l9*a|`8R+XzQf}LY} z51REdza8F+icu$B7+JGYA@$n9F+>uu(t~{~WQFPO7jg`fUzw{&31+{bfAIM9bGXOs zQNWc>3vYGi+TixuC&|`TRstJ?ID6Bk+v>`PPr1deFfgph$RQE1vv6!e{@UZH^@Jc8 z=IR)q5ZxV#6z;rZSR9_t5|)IFZvIrCwdb)K@EO2H4{@*j`zbdOR2{(sHHnZ8ZPj|C zwyfWQ?)mglR6$o_t+;4_3y9(bi2wEZMMN2y0SX@=7xQKr1T414+fL;KFh>M9n0kok~Ml%FB&0yh#c+e*qVJdxYgrR|)FKMx;6?PdZG&l~Gw~(-O9O2v=0ncjYfw)h-whWlrze0TbmT#C4 zhwcfQG(2zlIgiysO?YF8#N6y^**T!9)x76JX|v?QaOJ$?JF<%cuS%m8(Yr+qm`|U` zi&Vg{a6|LnN%<%T4#yLmde^QAqAQOP=6#=#Ix^LJ&>7E{xH6|(C;JDe10mnK$uk5z zUwE;{<5OjlBgDBLa(BRXx!1l6KTjU$4ko(wqq_~vohV24@@FDO#Aj2zRr$&RLDn7o zT3t_?dh~fZz@3W6z#{@ITZdm?@J@{4d&?g}YXxdgG4|r1KU`t4AkNW;%terzpybQXGvcwX=JGvpkApT9Xl9 zu%m-W5k3@$5CFuOFS!sz;EH<9mi0ikKwwryKqe&q$3_ZIWMWBFZ z-h_H2h#BN3djeyj2+KZW+<(-(|Lu@ru71A1#bbTC6KY42VglRyvTm_^0$gi;e#pZK zE^iMN=*i{|AMo_4NMOd*kkCOR>1l(XzJxr37oi|q!)uw8!l2`d&A$b zO`ALGJpqYo!)L{FGW!{t?$$)p2J+D2oayLxfjOJ=eQ%%FP>1JR2lEY*H-Rj-s^6QB z&4nu`ikR9H-gk@WW*pCv*i%UdGChhoJ)Q`s$Y(w@4A%$$=FskEXCYR+68 zb5YdRcFA)_1N=EzOr$xL6NS~K`peWG@4N>zI5%4igvS3zr7Ix zv1=&|gwGL-W$uY5!uiGY4*lsC9HvE1p(c(XSZ2pcwMDX?{#j2hwVZ!_Oge(Al1452 z=32xRoKcd8%bn_m^;h0#@-kNirH))v?7F%eM4wMCTo%f{r47T`nk0v{>`BVnih`s} zx01(0+Ri(*8n;lEVxw<7y2%CFLPc^XsndO5N_3Bhm^QH<|7 zdF57zvqM6E7$~!06l|hwng}UZqD{nN5!oj!t~F^nSA*Ja#p=C|Nr3sO9RvOrB&Z}& zcrH;p=wBz95}jUkUnF%RcceH&vtHPW4Z77X7Z|s6MH07^sHDSRd{Mj=YLTcA$#8+3 z$8$D8EKjgzk0l>_$51sXUxrW1FfwQw+uohD#3S7RSo^WFd!oF4XH15X-pmt;+FK9o z;Ftz_Iu;e|&7P2<5Qi3}C51Mg9O)5jchQl}`jKrSFqU@JQC)kq>HMhBGH#Jz^G6^= zxm{7ONxPLhM^$Py1y0q7TRKapdxKYupB3@p2{5^pKvDg z+)#;UBX65rTiCQ51D)Wi%_w>Hqz;FX|=T0rHmftXmX_Aypd9U~#3og_YB+meA z?S9nS8xGW>Rn`3#L2)p(Y?0sWUgpwT1VSG`+~9d34P@v^>6YH$t;@VkEa5?I^yHMn z81BYG)^~})*o%yz&Q)tEu5}J&3}3_N0sEE$V4-O z6&~Q-W)&Yp=jY>@f5zm*Dg85M#?M3lgat+E9gs_9p)vqZ(Vz$bab$a+`*+B3G|=3@ zR|HQVH{d2ngF=4m7sU^stz+)r2M-KpEIc>uHH@e&!VO8g|6!zDz*nMkg;;!=38Y4- zfqvaJ4K1B|`tY&f>DkkVuNxjrxDTHg&Y=_7Y1p_axVT2Zb9)NrO&BZt$0u`X0=;}# zKt~f=_Ij~eu^DqY`5p950j(InliC4z%>-dhygPG^MMMjWm^K5dw8ar>mPeR=g{Hla zPf`N%7-5(kO)KLGacz`A_?eVU0$%09#Vb**u~W_KSl^I53e zhTQfm_Mihe76Mjm+Eo$x`N{Mg58MQD&?hk5!6?Y9*n$Obadl47f;KbLs^}`K&-Ue5 zuZ|RTG=bdGP9zWtipX~>{!+5T?kTK32LCV`zkM09z$VrZ$Be&rwpc)jSS5vUW#iR}nT>PC4{S~vhl0^#<^$^{IKuwY1?xLgK^)&=TTXCQ%1 zptcGFP-;lG1Oxf$Rk+lRcQm`q*+2di$Z?mb<0h6r+oBA zJ0+|f9-S-;9x=P0ZQi^60lA~}?~m@_s-J+*?%es|=AEBy;;`R?e0Y2FHvalO$WI9H zxiM^zPk(sFwMKo2YpwMmt~D;m2cLejxv^fqe)!SH9}_M#`?&wnC*S}0&i&0hpKaVM z*!S;j-n;Yt`y1GMt5iYSXeo2|vnbWZd%uIV5#Qb<70wS(4pdVg-U&b(@BN?O|KK)5 zLIN_DukRojSt`X_DB{w*x)VO}$_^er@vr_r?7iD>?AMjw>0?i~tcxYe$@fZJkve}<6S_{^@r32>EMq$YvjH{>_XCoRxWL02yzAjQeA-1-+0 znMCv;uat|y14c+rVspI0d^IG_9?P8@X}0{)dU`%udtY?2-?3N%hpOpAF?$5dnf6;C z7|G%88NvzjO*3%C{#4*(A9pX`J6;DLO>2p{S@|894x zi$f+f$k382&+CGWix#lkHosgIEnp!LX7#v5Xi6uPuoKFeebG4_4NndReRS5C&@5dj zhGmZq3>92wwTHMDnKV zQxVNbe*8ft%k!1^9_?a<FC{|JMg~_|{CK62e6-eb<$=#M((PEg z@YC_0$vc>uk5;3|->2FGS$nb%ks-X>AD!(Hr4bwaa(A$$4J2-P%<&sgGFZS!HW!1B z(?D8`1c<|e{L@l__-PZo&aeNeR*?SD_wq7zAxgK}C5v?cKC5MOZOSC_{30-avNzFm*rs~VD)9`|BQZJ~29db3c zd96T-)D(v6A@4B8V8_(l9xWPgS+P_KUs zKt6G58A2EjgQ_I7sW=a_>?&n*9VwUyJEOEbIQjVjCp_&FmI2WP(saG_;P3UOn^W+0 zq{c9&wghfPGcD?aRxO2Epl;6nl{^Zz69am z_RcLQv0CI<;%T}Eb%0doEY++4|F2X0@jT?tc2t~*g!J48|a$`z0 z9_O3i1;926cM#cU305Zn1pk!oqPV_NWRYd0QU#@`NWOy5f3|{MOmsz!Q+g|sB7rI_ z@f27YLy=jiSQ&-ZF9x48u4Lrf#5NM=UeWmiQ1XH-wHjo zt^1_#5|n6!<%Ob$Mnh!H6rHu#f+0P(DUK=Ns*broT$%;Z`B_by5K32THVC+ct}#6E zok7&obcm9I<=tOScB2u{EfH0BFAhdC3yys$NJ<+YF5+5fCXq%)G##JdvL&rgLnFW_ z%0WG}BYiB9kxk76h?_&_@ZsQKFSTY6(sUj&G}VNHA`FYNI`&21BK{*zBg^H>s;QA? zMYI!N@Kt<(Rxe3))0RdHFwKf6PDIQT-XJQep!rd9I%0@tcv~8tW*4 zNB|$>po|@4JBcRH7PWw|^6IZ2@@yKI@sLg!cV>)1c-hQvGjyYrox+eS zG<4mOwUwlLQj|=fy6sP)Bc+;(4^qvjyEHlp;XrH$yU3|1-8U4y1a_klF0b?P7_oJ~ z6*O!c)}n-YqfAjFl^Ab;&Ikob;yJS`j!O}pqlQ;PwE*J|n`1hAs0+G)gA&omu117` zdtavOJozxMf)~lPI)2a^uS~2ee1^riW+p4CoO4_4DQ1cDUHZ0Yuj)PhQRW$0Q6_M) z>s+;wwwHzxeN{akQ^PqKl0wLBQU!0JpBIBm)Wc*XTY~UFhYDd@z!DCFKc+rt;NlRgIF-a6M>ZdKH z5_AsVffYWT!$y~}Bfx`w8E-+NZ50)b3YzKc%;iK2L)Z|VYEM=AuPBUZ=)s9x@wrh& zIyOW)D0YlRaPmB&9k!&#HL~cFY(X{OLWBN}krN;3bkIgD>)GPd9vPw>P|l2+RK4O+ zq^L%xoG+hsov{F`Eb0W7&Jl51z%Zf1F0N`%ulX7)iaDQ7V)rufi0o2V)d)-Wna7i-Is8MJyRopk{*B97b_IAR$rNv7Uxpbbh|Nih2OGU}MDvR4Q-nt=~>E;fl4~JzU-D%N=B`Lm|}p*4_KH*~iyo z8Ed`b&^h_OYSleaJX-S_dNOT?3evBqR-x4U7i%pIa6hOB#Hp$!MMNSlDH&B{j+Lw~ zM3rYg-Z8^7;^L0aN}$#fdx++^5wHWzJEd~Ic>H=R8{$*h--mev0nWqJ?$i zHK}y*c0tczBHzbrg&gcDlg`6nf05uXU6ELkJ`g)P9?}ZqRliSThpB$T;{2L2RN-jyt z`B!OJqQ^hc=MsdFdl5J@T$c~wfanGxJW$7ktrF~1mR&knI#q@sF*5+-MNHb!W!!9o zV;NUbj-BprAMbJ)2#OMd2Wx9nYW=6dHE@6K65mC+^O$YIG8Tyz$&6NltA0Ls-hdX} z9fx4~LsGoAmBTEO7yZsZlyF>+wqnP!qx5`Jf@1N3_>t!mObjH<^SjfqqUZCgoC9c} zb+?SEuvP}9!mlt^h83M(;i>`{$^+dZV1q%azU}CpP+(R0=a=vtl<*BGDI}9A;Nhk0 zYZ$%YaYMRcf_Y(7fI+VquVz+<=fex}#=c4VF^05OFcivLp%^T5x`Q=D1jH#3pO#D*13jzJ6zAy)>*E?1P$_0G@u?#&2!cwat0@YFy@1nJOC-ogJglrID9B`Zq&THlR$Sv7`0z-=QRB=OaPr8FgWY=!J1y z;}iBBe)sx4oW=7#u~C!Uyo`Cqgs4-#OMaq{1?l7KL{Cs&#V}Vwo&<`GvORwbD5@lA zqIR8dAFr}yXtT0rv=R23PtdLMn~~?t^T!EI=|RamczS^dDAO5!um0N6*Xc&bU(vH^ zFJQN}!vRPqJ1sg=i@@(VBHnx_X2p^1Hi=nrbyFJB%z&5!SxC%EC_7~zEoEv(#dcy= zxx_(d5#9NyH7QApstdd=sZUXZMdnewd~Qn2x`uWbmVo`CqH>@rfSgi~9`-S@&#fb` zU$!Yb^*(m$*Cl54%J{fY-c5<8$C~!q#H`4b__%p(Vpb@Z)}29RVphygm6Gnp#H=#Q zB*9?}TJn0TwiB~*dn83_60^$ivX6bCCz{T0HGv_~!}!S1wF>fbaf6B)1`~<>A0HX| z)x@mab{R$|wx{NTlxJ?n($QflUmHu&@$O_o$TyjZ7kyikn6;*jlv!pPie_TgnmE$? zmCkW~uQE>AR`^+2vKb1LnzTsFYCycl;#Bw;r>0Dv)f#xJ$P}f?KZE`AJg!a5>Wr0= z4@n}$%0&jj9&+;3Q26*PBxaQb_bn2$s+B<4V4?LpdU2y){mB0KUVwWni73JohX>@b z^Pf+~OTKH>_X|-r*QS(yKA>E|m?{)tJGZOS9Q6s&l4<^)D?P$}+>7)r?c}UI>)^kd zO2qqpte@^iH0&o12|>5!0R3N9e%MJ=eky29CV$P=ZI_X)KXZ7#b-#}V)ZJBQetM?W zwx;`xg2KqSWfJ{l6OlePQp&!l{%Av)FtK}j03y4lY;w5S@8`n398+@!2*ga7T9x&9 zD)ZdN?4CS(n^$3GwtF!uag@ZwD^HK6 zqkJwir4gdE4D`u~68B~G=RzRn7BUH8t8;M_Ii#-$RXoNl_Uq>*nc$aIETJzo6Y{d& z;|kX}p2BP$on3C>*K@7#XCl{5u2xL_$(T(1c%H0UsU_{8a@;MgvbwD*c{mx{Axwr+-z}>|)MYq!9bjF%KEcm3=)oI1A2Jch zKBLy$9Dy^E)%|Kk;8Y$x$lA{lfm2!ZGXBQ1=x@c>C?j43w`@h=R3^LxHW4_L)GmPY z5jd5wF5ovs;8bF|C~-9cr_#A^X zjBLoekb`kwBkcP56DlfnSa-1(A?cEYiV7r#%tV6sVkaL76}c2!2^C>2J?4^7(X6Kq zTgj@&v=mi^hlbnoWtSQD(j?1?45;zR6Do3f-JDR-fy6$Ogo<2IO+v*o;hIpfr{@RE zfe-zago<2Et%Qnobwcq@vYolwa|so>&)NwU3v#p)D$dniNT}$1eUT&XjroL%*yLs= zzZY5w6)`>~NuWs7m4u4eo+?4#U2*{G`_+Vs7?3KB9tHedoKL8TiKJ5B@zIyw;}R+= z6xd=y#WHoSIkNRE&yDw~5-K`%o+rN~p`xt{YeGeg3YXmnJm`>p3GZ)8sEFMl5?U>2 zlTZ;;z#tY)tlxD-?E1N5{oO#mf)wm(nZ=|$rV*Oq{jxuxcuS>{p5PtDJ~8$2!ads`Q6T3i-sM zVO?IvM_4Hjm$a0zew_gE#yE{7)-TSev}M)_ieyGSotuio=QXi@m9y}cl}fB%B{RHT zHxlbOgg<)a+t#tTOSu7WT$U2+Hv&jHn(>uzw-NGRIRlq8Ba-h_fThgUW~A?>$dXMe zv3{lM&MmsyOvd`fh@zAc`HIIx{DX0oU6q|N@5Vwkrg;zJg;MHDcO}-ZqE_BCq?(YR zC++@Cr7}YSIpipFE6i%e`jsyJc9oh~ze=EYyE--2ucA?2SLHFWex9?zaZ&OLl;QVs8tJRA2i+=N#UA1HVN^N<& zt{}#kI7QM2Y!Gi-Z7$X?n#o)C){gZnrR9y(vK{LeW#i2S=Mzfc;=ZKpLabj!mh4vA zYf79sm1eD2zo`0dIl0CB70Qcs%c_;Fb=IsKSEcf~&Wm+pu?5E0NwBV;sAVK2)~{1u z5$jhWks1j~E7q^FTPcgx)mXpEXr*jc*TnioYeq691P&={Y{&XlR;f=H>(}X}TCsj3 zzZCJ1Jn)G13k>F5{CULs)$e5Dv1Dv%kRb)qNGa{p>xe+j!XxKPu^+azyfgSMGfSCw zw-m~D`LV(4>MdgZDu>kFo)ni-@HNpgBTs1;U1Au4UK8t=swEDM_iR4auhTJQtlu7z z@w-I4LEYQL)Qx4aqb1*SRmvj7yQa+UGl=!8!KUGe75GbH{c51U@L0b+G`^oK)~^yy zWvpLek&({LjXYh=CaV*NI|<8A&eY<3?i7mWxrhJ*gOiUnG8 zKEEoMg!et<^c0i?>-F6&;61i=KObe4`PwR-5GsDhWPrb~y zc|syHVjyAp6{As!gW=(>;+v|UIMf~;+B9VWX?4V;KxkCUApl;}@Q%DbQVk&fFJ-Sw zPKnv*S_o;g8WGNw4g@P9BGUTHi)6O7jZL(PZo~_m`PGDpuVa>^C$}dt(qO()Z z!@@@jn%Sro`A+bdjXs>q^_9e9B!REu2Cvt%(KJKZcr}!{uLvRn74H2p78ENU%S-y` zi!IVd1PzSqM@9kokO>l;NZao{5`6eX6_{mVFt2X+PxFz(|zlW2d_8Ij3y;KJN^4L84D*V8cok=odBIUJYq3Ye(b2INu_Tk4 zo}XZhU_)~hm0FdQFezksDi#fmZEaE=Mq%0AXtz%40S7C|HiC#QR{xEgkP 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

IZux*3A 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%0D!k-Gxggm@@7xYE)NdI3=yQ5EU`Jv16Iv``Rv$9 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ⅅgEX{u)ra4}s&g?kL*Fl7udBpm?6ZzL| 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

qvg!RmzQWqbhA1wsq{Xu) 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 G^oRc9Ehusli(mJryqocat;p{WCvX;@QaI~u z)oFw3Vf!RxKi>91_8Eu&7dq6Cqa2=(P;!uSf*|D(yTsHsSVkBUo_j&^0fyvZV3f