OCILIB (C Driver for Oracle) 3.9.1
D:/Perso/dev/ocilib/ocilib/src/library.c
00001 /*
00002     +-----------------------------------------------------------------------------------------+
00003     |                                                                                         |
00004     |                               OCILIB - C Driver for Oracle                              |
00005     |                                                                                         |
00006     |                                (C Wrapper for Oracle OCI)                               |
00007     |                                                                                         |
00008     |                              Website : http://www.ocilib.net                            |
00009     |                                                                                         |
00010     |             Copyright (c) 2007-2011 Vincent ROGIER <vince.rogier@ocilib.net>            |
00011     |                                                                                         |
00012     +-----------------------------------------------------------------------------------------+
00013     |                                                                                         |
00014     |             This library is free software; you can redistribute it and/or               |
00015     |             modify it under the terms of the GNU Lesser General Public                  |
00016     |             License as published by the Free Software Foundation; either                |
00017     |             version 2 of the License, or (at your option) any later version.            |
00018     |                                                                                         |
00019     |             This library is distributed in the hope that it will be useful,             |
00020     |             but WITHOUT ANY WARRANTY; without even the implied warranty of              |
00021     |             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           |
00022     |             Lesser General Public License for more details.                             |
00023     |                                                                                         |
00024     |             You should have received a copy of the GNU Lesser General Public            |
00025     |             License along with this library; if not, write to the Free                  |
00026     |             Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.          |
00027     |                                                                                         |
00028     +-----------------------------------------------------------------------------------------+
00029 */
00030 
00031 /* --------------------------------------------------------------------------------------------- *
00032  * $Id: library.c, v 3.9.1 2011-07-08 00:00 Vincent Rogier $
00033  * --------------------------------------------------------------------------------------------- */
00034 
00035 #include "ocilib_internal.h"
00036 
00037 /* ********************************************************************************************* *
00038  *                             INTERNAL VARIABLES
00039  * ********************************************************************************************* */
00040 OCI_Library OCILib;
00041 
00042 OCI_SQLCmdInfo SQLCmds[OCI_SQLCMD_COUNT] =
00043 {
00044     {OCI_SFC_CREATE_TABLE,             MT("CREATE TABLE")                                         },
00045     {OCI_SFC_SET_ROLE,                 MT("SET ROLE")                                             },
00046     {OCI_SFC_INSERT,                   MT("INSERT")                                               },
00047     {OCI_SFC_SELECT,                   MT("SELECT")                                               },
00048     {OCI_SFC_UPDATE,                   MT("UPDATE")                                               },
00049     {OCI_SFC_DROP_ROLE,                MT("DROP ROLE")                                            },
00050     {OCI_SFC_DROP_VIEW,                MT("DROP VIEW")                                            },
00051     {OCI_SFC_DROP_TABLE,               MT("DROP TABLE")                                           },
00052     {OCI_SFC_DELETE,                   MT("DELETE")                                               },
00053     {OCI_SFC_CREATE_VIEW,              MT("CREATE VIEW")                                          },
00054     {OCI_SFC_DROP_USER,                MT("DROP USER")                                            },
00055     {OCI_SFC_CREATE_ROLE,              MT("CREATE ROLE")                                          },
00056     {OCI_SFC_CREATE_SEQUENCE,          MT("CREATE SEQUENCE")                                      },
00057     {OCI_SFC_ALTER_SEQUENCE,           MT("ALTER SEQUENCE")                                       },
00058     {OCI_SFC_DROP_SEQUENCE,            MT("DROP SEQUENCE")                                        },
00059     {OCI_SFC_CREATE_SCHEMA,            MT("CREATE SCHEMA")                                        },
00060     {OCI_SFC_CREATE_CLUSTER,           MT("CREATE CLUSTER")                                       },
00061     {OCI_SFC_CREATE_USER,              MT("CREATE USER")                                          },
00062     {OCI_SFC_CREATE_INDEX,             MT("CREATE INDEX")                                         },
00063     {OCI_SFC_DROP_INDEX,               MT("DROP INDEX")                                           },
00064     {OCI_SFC_DROP_CLUSTER,             MT("DROP CLUSTER")                                         },
00065     {OCI_SFC_VALIDATE_INDEX,           MT("VALIDATE INDEX")                                       },
00066     {OCI_SFC_CREATE_PROCEDURE,         MT("CREATE PROCEDURE")                                     },
00067     {OCI_SFC_ALTER_PROCEDURE,          MT("ALTER PROCEDURE")                                      },
00068     {OCI_SFC_ALTER_TABLE,              MT("ALTER TABLE")                                          },
00069     {OCI_SFC_EXPLAIN,                  MT("EXPLAIN")                                              },
00070     {OCI_SFC_GRANT,                    MT("GRANT")                                                },
00071     {OCI_SFC_REVOKE,                   MT("REVOKE")                                               },
00072     {OCI_SFC_CREATE_SYNONYM,           MT("CREATE SYNONYM")                                       },
00073     {OCI_SFC_DROP_SYNONYM,             MT("DROP SYNONYM")                                         },
00074     {OCI_SFC_ALTER_SYSTEM_SWITCHLOG,   MT("ALTER SYSTEM SWITCHLOG")                               },
00075     {OCI_SFC_SET_TRANSACTION,          MT("SET TRANSACTION")                                      },
00076     {OCI_SFC_PLSQL_EXECUTE,            MT("PL/SQL EXECUTE")                                       },
00077     {OCI_SFC_LOCK,                     MT("LOCK")                                                 },
00078     {OCI_SFC_NOOP,                     MT("NOOP")                                                 },
00079     {OCI_SFC_RENAME,                   MT("RENAME")                                               },
00080     {OCI_SFC_COMMENT,                  MT("COMMENT")                                              },
00081     {OCI_SFC_AUDIT,                    MT("AUDIT")                                                },
00082     {OCI_SFC_NO_AUDIT,                 MT("NO AUDIT")                                             },
00083     {OCI_SFC_ALTER_INDEX,              MT("ALTER INDEX")                                          },
00084     {OCI_SFC_CREATE_EXTERNAL_DATABASE, MT("CREATE EXTERNAL DATABASE")                             },
00085     {OCI_SFC_DROP_EXTERNALDATABASE,    MT("DROP EXTERNALDATABASE")                                },
00086     {OCI_SFC_CREATE_DATABASE,          MT("CREATE DATABASE")                                      },
00087     {OCI_SFC_ALTER_DATABASE,           MT("ALTER DATABASE")                                       },
00088     {OCI_SFC_CREATE_ROLLBACK_SEGMENT,  MT("CREATE ROLLBACK SEGMENT")                              },
00089     {OCI_SFC_ALTER_ROLLBACK_SEGMENT,   MT("ALTER ROLLBACK SEGMENT")                               },
00090     {OCI_SFC_DROP_ROLLBACK_SEGMENT,    MT("DROP ROLLBACK SEGMENT")                                },
00091     {OCI_SFC_CREATE_TABLESPACE,        MT("CREATE TABLESPACE")                                    },
00092     {OCI_SFC_ALTER_TABLESPACE,         MT("ALTER TABLESPACE")                                     },
00093     {OCI_SFC_DROP_TABLESPACE,          MT("DROP TABLESPACE")                                      },
00094     {OCI_SFC_ALTER_SESSION,            MT("ALTER SESSION")                                        },
00095     {OCI_SFC_ALTER_USER,               MT("ALTER USER")                                           },
00096     {OCI_SFC_COMMIT_WORK,              MT("COMMIT (WORK)")                                        },
00097     {OCI_SFC_ROLLBACK,                 MT("ROLLBACK")                                             },
00098     {OCI_SFC_SAVEPOINT,                MT("SAVEPOINT")                                            },
00099     {OCI_SFC_CREATE_CONTROL_FILE,      MT("CREATE CONTROL FILE")                                  },
00100     {OCI_SFC_ALTER_TRACING,            MT("ALTER TRACING")                                        },
00101     {OCI_SFC_CREATE_TRIGGER,           MT("CREATE TRIGGER")                                       },
00102     {OCI_SFC_ALTER_TRIGGER,            MT("ALTER TRIGGER")                                        },
00103     {OCI_SFC_DROP_TRIGGER,             MT("DROP TRIGGER")                                         },
00104     {OCI_SFC_ANALYZE_TABLE,            MT("ANALYZE TABLE")                                        },
00105     {OCI_SFC_ANALYZE_INDEX,            MT("ANALYZE INDEX")                                        },
00106     {OCI_SFC_ANALYZE_CLUSTER,          MT("ANALYZE CLUSTER")                                      },
00107     {OCI_SFC_CREATE_PROFILE,           MT("CREATE PROFILE")                                       },
00108     {OCI_SFC_DROP_PROFILE,             MT("DROP PROFILE")                                         },
00109     {OCI_SFC_ALTER_PROFILE,            MT("ALTER PROFILE")                                        },
00110     {OCI_SFC_DROP_PROCEDURE,           MT("DROP PROCEDURE")                                       },
00111     {OCI_SFC_ALTER_RESOURCE_COST,      MT("ALTER RESOURCE COST")                                  },
00112     {OCI_SFC_CREATE_SNAPSHOT_LOG,      MT("CREATE SNAPSHOT LOG")                                  },
00113     {OCI_SFC_ALTER_SNAPSHOT_LOG,       MT("ALTER SNAPSHOT LOG")                                   },
00114     {OCI_SFC_DROP_SNAPSHOT_LOG,        MT("DROP SNAPSHOT LOG")                                    },
00115     {OCI_SFC_DROP_SUMMARY,             MT("DROP SUMMARY")                                         },
00116     {OCI_SFC_CREATE_SNAPSHOT,          MT("CREATE SNAPSHOT")                                      },
00117     {OCI_SFC_ALTER_SNAPSHOT,           MT("ALTER SNAPSHOT")                                       },
00118     {OCI_SFC_DROP_SNAPSHOT,            MT("DROP SNAPSHOT")                                        },
00119     {OCI_SFC_CREATE_TYPE,              MT("CREATE TYPE")                                          },
00120     {OCI_SFC_DROP_TYPE,                MT("DROP TYPE")                                            },
00121     {OCI_SFC_ALTER_ROLE,               MT("ALTER ROLE")                                           },
00122     {OCI_SFC_ALTER_TYPE,               MT("ALTER TYPE")                                           },
00123     {OCI_SFC_CREATE_TYPE_BODY,         MT("CREATE TYPE BODY")                                     },
00124     {OCI_SFC_ALTER_TYPE_BODY,          MT("ALTER TYPE BODY")                                      },
00125     {OCI_SFC_DROP_TYPE_BODY,           MT("DROP TYPE BODY")                                       },
00126     {OCI_SFC_DROP_LIBRARY,             MT("DROP LIBRARY")                                         },
00127     {OCI_SFC_TRUNCATE_TABLE,           MT("TRUNCATE TABLE")                                       },
00128     {OCI_SFC_TRUNCATE_CLUSTER,         MT("TRUNCATE CLUSTER")                                     },
00129     {OCI_SFC_CREATE_BITMAPFILE,        MT("CREATE BITMAPFILE")                                    },
00130     {OCI_SFC_ALTER_VIEW,               MT("ALTER VIEW")                                           },
00131     {OCI_SFC_DROP_BITMAPFILE,          MT("DROP BITMAPFILE")                                      },
00132     {OCI_SFC_SET_CONSTRAINTS,          MT("SET CONSTRAINTS")                                      },
00133     {OCI_SFC_CREATE_FUNCTION,          MT("CREATE FUNCTION")                                      },
00134     {OCI_SFC_ALTER_FUNCTION,           MT("ALTER FUNCTION")                                       },
00135     {OCI_SFC_DROP_FUNCTION,            MT("DROP FUNCTION")                                        },
00136     {OCI_SFC_CREATE_PACKAGE,           MT("CREATE PACKAGE")                                       },
00137     {OCI_SFC_ALTER_PACKAGE,            MT("ALTER PACKAGE")                                        },
00138     {OCI_SFC_DROP_PACKAGE,             MT("DROP PACKAGE")                                         },
00139     {OCI_SFC_CREATE_PACKAGE_BODY,      MT("CREATE PACKAGE BODY")                                  },
00140     {OCI_SFC_ALTER_PACKAGE_BODY,       MT("ALTER PACKAGE BODY")                                   },
00141     {OCI_SFC_DROP_PACKAGE_BODY,        MT("DROP PACKAGE BODY")                                    },
00142     {OCI_SFC_CREATE_DIRECTORY,         MT("CREATE DIRECTORY")                                     },
00143     {OCI_SFC_DROP_DIRECTORY,           MT("DROP DIRECTORY")                                       },
00144     {OCI_SFC_CREATE_LIBRARY,           MT("CREATE LIBRARY")                                       },
00145     {OCI_SFC_CREATE_JAVA,              MT("CREATE JAVA")                                          },
00146     {OCI_SFC_ALTER_JAVA,               MT("ALTER JAVA")                                           },
00147     {OCI_SFC_DROP_JAVA,                MT("DROP JAVA")                                            },
00148     {OCI_SFC_CREATE_OPERATOR,          MT("CREATE OPERATOR")                                      },
00149     {OCI_SFC_CREATE_INDEXTYPE,         MT("CREATE INDEXTYPE")                                     },
00150     {OCI_SFC_DROP_INDEXTYPE,           MT("DROP INDEXTYPE")                                       },
00151     {OCI_SFC_ALTER_INDEXTYPE,          MT("ALTER INDEXTYPE")                                      },
00152     {OCI_SFC_DROP_OPERATOR,            MT("DROP OPERATOR")                                        },
00153     {OCI_SFC_ASSOCIATE_STATISTICS,     MT("ASSOCIATE STATISTICS")                                 },
00154     {OCI_SFC_DISASSOCIATE_STATISTICS,  MT("DISASSOCIATE STATISTICS")                              },
00155     {OCI_SFC_CALL_METHOD,              MT("CALL METHOD")                                          },
00156     {OCI_SFC_CREATE_SUMMARY,           MT("CREATE SUMMARY")                                       },
00157     {OCI_SFC_ALTER_SUMMARY,            MT("ALTER SUMMARY")                                        },
00158     {OCI_SFC_CREATE_DIMENSION,         MT("CREATE DIMENSION")                                     },
00159     {OCI_SFC_ALTER_DIMENSION,          MT("ALTER DIMENSION")                                      },
00160     {OCI_SFC_DROP_DIMENSION,           MT("DROP DIMENSION")                                       },
00161     {OCI_SFC_CREATE_CONTEXT,           MT("CREATE CONTEXT")                                       },
00162     {OCI_SFC_DROP_CONTEXT,             MT("DROP CONTEXT")                                         },
00163     {OCI_SFC_ALTER_OUTLINE,            MT("ALTER OUTLINE")                                        },
00164     {OCI_SFC_CREATE_OUTLINE,           MT("CREATE OUTLINE")                                       },
00165     {OCI_SFC_DROP_OUTLINE,             MT("DROP OUTLINE")                                         },
00166     {OCI_SFC_UPDATE_INDEXES,           MT("UPDATE INDEXES")                                       },
00167     {OCI_SFC_ALTER_OPERATOR,           MT("ALTER OPERATOR")                                       }
00168 };
00169 
00170 #ifdef OCI_IMPORT_RUNTIME
00171 
00172 /* OCI function pointers */
00173 
00174 OCIENVCREATE                 OCIEnvCreate                 = NULL;
00175 OCISERVERATTACH              OCIServerAttach              = NULL;
00176 OCISERVERDETACH              OCIServerDetach              = NULL;
00177 OCIHANDLEALLOC               OCIHandleAlloc               = NULL;
00178 OCIHANDLEFREE                OCIHandleFree                = NULL;
00179 OCIDESCRIPTORALLOC           OCIDescriptorAlloc           = NULL;
00180 OCIDESCRIPTORFREE            OCIDescriptorFree            = NULL;
00181 OCISESSIONBEGIN              OCISessionBegin              = NULL;
00182 OCISESSIONEND                OCISessionEnd                = NULL;
00183 OCIPASSWORDCHANGE            OCIPasswordChange            = NULL;
00184 OCIBINDBYPOS                 OCIBindByPos                 = NULL;
00185 OCIBINDBYNAME                OCIBindByName                = NULL;
00186 OCIBINDDYNAMIC               OCIBindDynamic               = NULL;
00187 OCIBINDOBJECT                OCIBindObject                = NULL;
00188 OCIDEFINEBYPOS               OCIDefineByPos               = NULL;
00189 OCIDEFINEOBJECT              OCIDefineObject              = NULL;
00190 OCISTMTPREPARE               OCIStmtPrepare               = NULL;
00191 OCISTMTEXECUTE               OCIStmtExecute               = NULL;
00192 OCISTMTFETCH                 OCIStmtFetch                 = NULL;
00193 OCISTMTFETCH2                OCIStmtFetch2                = NULL;
00194 OCISTMTGETPIECEINFO          OCIStmtGetPieceInfo          = NULL;
00195 OCISTMTSETPIECEINFO          OCIStmtSetPieceInfo          = NULL;
00196 OCIPARAMGET                  OCIParamGet                  = NULL;
00197 OCIPARAMSET                  OCIParamSet                  = NULL;
00198 OCITRANSSTART                OCITransStart                = NULL;
00199 OCITRANSDETACH               OCITransDetach               = NULL;
00200 OCITRANSPREPARE              OCITransPrepare              = NULL;
00201 OCITRANSFORGET               OCITransForget               = NULL;
00202 OCITRANSCOMMIT               OCITransCommit               = NULL;
00203 OCITRANSROLLBACK             OCITransRollback             = NULL;
00204 OCIERRORGET                  OCIErrorGet                  = NULL;
00205 OCILOBCREATETEMPORARY        OCILobCreateTemporary        = NULL;
00206 OCILOBFREETEMPORARY          OCILobFreeTemporary          = NULL;
00207 OCILOBISTEMPORARY            OCILobIsTemporary            = NULL;
00208 OCILOBAPPEND                 OCILobAppend                 = NULL;
00209 OCILOBCOPY                   OCILobCopy                   = NULL;
00210 OCILOBGETLENGTH              OCILobGetLength              = NULL;
00211 OCILOBGETCHUNKSIZE           OCILobGetChunkSize           = NULL;
00212 OCILOBREAD                   OCILobRead                   = NULL;
00213 OCILOBWRITE                  OCILobWrite                  = NULL;
00214 OCILOBTRIM                   OCILobTrim                   = NULL;
00215 OCILOBERASE                  OCILobErase                  = NULL;
00216 OCILOBOPEN                   OCILobOpen                   = NULL;
00217 OCILOBCLOSE                  OCILobClose                  = NULL;
00218 OCILOBLOCATORASSIGN          OCILobLocatorAssign          = NULL;
00219 OCILOBASSIGN                 OCILobAssign                 = NULL;
00220 OCILOBISEQUAL                OCILobIsEqual                = NULL;
00221 OCILOBFLUSHBUFFER            OCILobFlushBuffer            = NULL;
00222 OCILOBENABLEBUFFERING        OCILobEnableBuffering        = NULL;
00223 OCILOBDISABLEBUFFERING       OCILobDisableBuffering       = NULL;
00224 OCILOBGETSTORAGELIMIT        OCILobGetStorageLimit        = NULL;
00225 OCILOBFILEOPEN               OCILobFileOpen               = NULL;
00226 OCILOBFILECLOSE              OCILobFileClose              = NULL;
00227 OCILOBFILECLOSEALL           OCILobFileCloseAll           = NULL;
00228 OCILOBFILEISOPEN             OCILobFileIsOpen             = NULL;
00229 OCILOBFILEEXISTS             OCILobFileExists             = NULL;
00230 OCILOBFIELGETNAME            OCILobFileGetName            = NULL;
00231 OCILOBFILESETNAME            OCILobFileSetName            = NULL;
00232 OCILOBLOADFROMFILE           OCILobLoadFromFile           = NULL;
00233 OCILOBWRITEAPPEND            OCILobWriteAppend            = NULL;
00234 OCISERVERVERSION             OCIServerVersion             = NULL;
00235 OCIBREAK                     OCIBreak                     = NULL;
00236 OCIATTRGET                   OCIAttrGet                   = NULL;
00237 OCIATTRSET                   OCIAttrSet                   = NULL;
00238 OCIDATEASSIGN                OCIDateAssign                = NULL;
00239 OCIDATETOTEXT                OCIDateToText                = NULL;
00240 OCIDATEFROMTEXT              OCIDateFromText              = NULL;
00241 OCIDATECOMPARE               OCIDateCompare               = NULL;
00242 OCIDATEADDMONTHS             OCIDateAddMonths             = NULL;
00243 OCIDATEADDDAYS               OCIDateAddDays               = NULL;
00244 OCIDATELASTDAY               OCIDateLastDay               = NULL;
00245 OCIDATEDAYSBETWEEN           OCIDateDaysBetween           = NULL;
00246 OCIDATEZONETOZONE            OCIDateZoneToZone            = NULL;
00247 OCIDATENEXTDAY               OCIDateNextDay               = NULL;
00248 OCIDATECHECK                 OCIDateCheck                 = NULL;
00249 OCIDATESYSDATE               OCIDateSysDate               = NULL;
00250 OCIDESCRIBEANY               OCIDescribeAny               = NULL;
00251 OCIINTERVALASSIGN            OCIIntervalAssign            = NULL;
00252 OCIINTERVALCHECK             OCIIntervalCheck             = NULL;
00253 OCIINTERVALCOMPARE           OCIIntervalCompare           = NULL;
00254 OCIINTERVALFROMTEXT          OCIIntervalFromText          = NULL;
00255 OCIINTERVALTOTEXT            OCIIntervalToText            = NULL;
00256 OCIINTERVALFROMTZ            OCIIntervalFromTZ            = NULL;
00257 OCIINTERVALGETDAYSECOND      OCIIntervalGetDaySecond      = NULL;
00258 OCIINTERVALGETYEARMONTH      OCIIntervalGetYearMonth      = NULL;
00259 OCIINTERVALSETDAYSECOND      OCIIntervalSetDaySecond      = NULL;
00260 OCIINTERVALSETYEARMONTH      OCIIntervalSetYearMonth      = NULL;
00261 OCIINTERVALSUBTRACT          OCIIntervalSubtract          = NULL;
00262 OCIINTERVALADD               OCIIntervalAdd               = NULL;
00263 OCIDATETIMEASSIGN            OCIDateTimeAssign            = NULL;
00264 OCIDATETIMECHECK             OCIDateTimeCheck             = NULL;
00265 OCIDATETIMECOMPARE           OCIDateTimeCompare           = NULL;
00266 OCIDATETIMECONSTRUCT         OCIDateTimeConstruct         = NULL;
00267 OCIDATETIMECONVERT           OCIDateTimeConvert           = NULL;
00268 OCIDATETIMEFROMARRAY         OCIDateTimeFromArray         = NULL;
00269 OCIDATETIMETOARRAY           OCIDateTimeToArray           = NULL;
00270 OCIDATETIMEFROMTEXT          OCIDateTimeFromText          = NULL;
00271 OCIDATETIMETOTEXT            OCIDateTimeToText            = NULL;
00272 OCIDATETIMEGETDATE           OCIDateTimeGetDate           = NULL;
00273 OCIDATETIMEGETTIME           OCIDateTimeGetTime           = NULL;
00274 OCIDATETIMEGETTIMEZONENAME   OCIDateTimeGetTimeZoneName   = NULL;
00275 OCIDATETIMEGETTIMEZONEOFFSET OCIDateTimeGetTimeZoneOffset = NULL;
00276 OCIDATETIMEINTERVALADD       OCIDateTimeIntervalAdd       = NULL;
00277 OCIDATETIMEINTERVALSUB       OCIDateTimeIntervalSub       = NULL;
00278 OCIDATETIMESUBTRACT          OCIDateTimeSubtract          = NULL;
00279 OCIDATETIMESYSTIMESTAMP      OCIDateTimeSysTimeStamp      = NULL;
00280 OCIARRAYDESCRIPTORALLOC      OCIArrayDescriptorAlloc      = NULL;
00281 OCIARRAYDESCRIPTORFREE       OCIArrayDescriptorFree       = NULL;
00282 OCICLIENTVERSION             OCIClientVersion             = NULL;
00283 OCITYPEBYNAME                OCITypeByName                = NULL;
00284 OCINUMBERTOINT               OCINumberToInt               = NULL;
00285 OCINUMBERFROMINT             OCINumberFromInt             = NULL;
00286 OCINUMBERTOREAL              OCINumberToReal              = NULL;
00287 OCINUMBERFROMREAL            OCINumberFromReal            = NULL;
00288 OCINUMBERTOTEXT              OCINumberToText              = NULL;
00289 OCINUMBERFROMTEXT            OCINumberFromText            = NULL;
00290 OCISTRINGPTR                 OCIStringPtr                 = NULL;
00291 OCISTRINGASSIGNTEXT          OCIStringAssignText          = NULL;
00292 OCIRAWPTR                    OCIRawPtr                    = NULL;
00293 OCIRAWASSIGNBYTES            OCIRawAssignBytes            = NULL;
00294 OCIRAWRESIZE                 OCIRawResize                 = NULL;
00295 OCIRAWALLOCSIZE              OCIRawAllocSize              = NULL;
00296 OCIRAWSIZE                   OCIRawSize                   = NULL;
00297 OCIOBJECTNEW                 OCIObjectNew                 = NULL;
00298 OCIOBJECTFREE                OCIObjectFree                = NULL;
00299 OCIOBJECTSETATTR             OCIObjectSetAttr             = NULL;
00300 OCIOBJECTGETATTR             OCIObjectGetAttr             = NULL;
00301 OCIOBJECTPIN                 OCIObjectPin                 = NULL;
00302 OCIOBJECTUNPIN               OCIObjectUnpin               = NULL;
00303 OCIOBJECTCOPY                OCIObjectCopy                = NULL;
00304 OCIOBJECTGETOBJECTREF        OCIObjectGetObjectRef        = NULL;
00305 OCIOBJECTGETPROPERTY         OCIObjectGetProperty         = NULL;
00306 OCIOBJECTGETIND              OCIObjectGetInd              = NULL;
00307 OCIREFASSIGN                 OCIRefAssign                 = NULL;
00308 OCIREFISNULL                 OCIRefIsNull                 = NULL;
00309 OCIREFCLEAR                  OCIRefClear                  = NULL;
00310 OCIREFTOHEX                  OCIRefToHex                  = NULL;
00311 OCIREFHEXSIZE                OCIRefHexSize                = NULL;
00312 OCITHREADPROCESSINIT         OCIThreadProcessInit         = NULL;
00313 OCITHREADINIT                OCIThreadInit                = NULL;
00314 OCITHREADTERM                OCIThreadTerm                = NULL;
00315 OCITHREADIDINIT              OCIThreadIdInit              = NULL;
00316 OCITHREADIDDESTROY           OCIThreadIdDestroy           = NULL;
00317 OCITHREADHNDINIT             OCIThreadHndInit             = NULL;
00318 OCITHREADHNDDESTROY          OCIThreadHndDestroy          = NULL;
00319 OCITHREADCREATE              OCIThreadCreate              = NULL;
00320 OCITHREADJOIN                OCIThreadJoin                = NULL;
00321 OCITHREADCLOSE               OCIThreadClose               = NULL;
00322 OCITHREADMUTEXINIT           OCIThreadMutexInit           = NULL;
00323 OCITHREADMUTEXDESTROY        OCIThreadMutexDestroy        = NULL;
00324 OCITHREADMUTEXACQUIRE        OCIThreadMutexAcquire        = NULL;
00325 OCITHREADMUTEXRELEASE        OCIThreadMutexRelease        = NULL;
00326 OCITHREADKEYINIT             OCIThreadKeyInit             = NULL;
00327 OCITHREADKEYDESTROY          OCIThreadKeyDestroy          = NULL;
00328 OCITHREADKEYSET              OCIThreadKeySet              = NULL;
00329 OCITHREADKEYGET              OCIThreadKeyGet              = NULL;
00330 OCICONNECTIONPOOLCREATE      OCIConnectionPoolCreate      = NULL;
00331 OCICONNECTIONPOOLDESTROY     OCIConnectionPoolDestroy     = NULL;
00332 OCISESSIONPOOLCREATE         OCISessionPoolCreate         = NULL;
00333 OCISESSIONPOOLDESTROY        OCISessionPoolDestroy        = NULL;
00334 OCISESSIONGET                OCISessionGet                = NULL;
00335 OCISESSIONRELEASE            OCISessionRelease            = NULL;
00336 OCICOLLSIZE                  OCICollSize                  = NULL;
00337 OCICOLLMAX                   OCICollMax                   = NULL;
00338 OCICOLLGETITEM               OCICollGetElem               = NULL;
00339 OCICOLLASSIGNELEM            OCICollAssignElem            = NULL;
00340 OCICOLLASSIGN                OCICollAssign                = NULL;
00341 OCICOLLAPPEND                OCICollAppend                = NULL;
00342 OCICOLLTRIM                  OCICollTrim                  = NULL;
00343 OCIITERCREATE                OCIIterCreate                = NULL;
00344 OCIITERDELETE                OCIIterDelete                = NULL;
00345 OCIITERINIT                  OCIIterInit                  = NULL;
00346 OCIITERNEXT                  OCIIterNext                  = NULL;
00347 OCIITERPREV                  OCIIterPrev                  = NULL;
00348 OCIDIRPATHABORT              OCIDirPathAbort              = NULL;
00349 OCIDIRPATHDATASAVE           OCIDirPathDataSave           = NULL;
00350 OCIDIRPATHFINISH             OCIDirPathFinish             = NULL;
00351 OCIDIRPATHPREPARE            OCIDirPathPrepare            = NULL;
00352 OCIDIRPATHLOADSTREAM         OCIDirPathLoadStream         = NULL;
00353 OCIDIRPATHCOLARRAYENTRYSET   OCIDirPathColArrayEntrySet   = NULL;
00354 OCIDIRPATHCOLARRAYRESET      OCIDirPathColArrayReset      = NULL;
00355 OCIDIRPATHCOLARRAYTOSTREAM   OCIDirPathColArrayToStream   = NULL;
00356 OCIDIRPATHSTREAMRESET        OCIDirPathStreamReset        = NULL;
00357 OCIDIRPATHFLUSHROW           OCIDirPathFlushRow           = NULL;
00358 OCICACHEFREE                 OCICacheFree                 = NULL;
00359 OCIPING                      OCIPing                      = NULL;
00360 OCIDBSTARTUP                 OCIDBStartup                 = NULL;
00361 OCIDBSHUTDOWN                OCIDBShutdown                = NULL;
00362 OCISTMTPREPARE2              OCIStmtPrepare2              = NULL;
00363 OCISTMTRELEASE               OCIStmtRelease               = NULL;
00364 OCISUBSCRIPTIONREGISTER      OCISubscriptionRegister      = NULL;
00365 OCISUBSCRIPTIONUNREGISTER    OCISubscriptionUnRegister    = NULL;
00366 OCIAQENQ                     OCIAQEnq                     = NULL;
00367 OCIAQDEQ                     OCIAQDeq                     = NULL;
00368 OCIAQLISTEN                  OCIAQListen                  = NULL;
00369 XAOSVCCTX                    xaoSvcCtx                    = NULL;
00370 XAOENV                       xaoEnv                       = NULL;
00371 
00372 #ifdef ORAXB8_DEFINED
00373 
00374 OCILOBCOPY2                  OCILobCopy2                  = NULL;
00375 OCILOBERASE2                 OCILobErase2                 = NULL;
00376 OCILOBGETLENGTH2             OCILobGetLength2             = NULL;
00377 OCILOBLOADFROMFILE2          OCILobLoadFromFile2          = NULL;
00378 OCILOBREAD2                  OCILobRead2                  = NULL;
00379 OCILOBTRIM2                  OCILobTrim2                  = NULL;
00380 OCILOBWRITE2                 OCILobWrite2                 = NULL;
00381 OCILOBWRITEAPPEND2           OCILobWriteAppend2           = NULL;
00382 
00383 #endif /* ORAXB8_DEFINED */
00384 
00385 #endif /* OCI_IMPORT_RUNTIME */
00386 
00387 /* ********************************************************************************************* *
00388  *                             PRIVATE FUNCTIONS
00389  * ********************************************************************************************* */
00390 
00391 /* --------------------------------------------------------------------------------------------- *
00392  * OCI_KeyMapFree
00393  * --------------------------------------------------------------------------------------------- */
00394 
00395 boolean OCI_KeyMapFree
00396 (
00397     void
00398 )
00399 {
00400     boolean res      = TRUE;
00401     OCI_HashEntry *e = NULL;
00402     OCI_HashValue *v = NULL;
00403     int i, n, nb_err = 0;
00404 
00405     OCI_CHECK(OCILib.key_map == NULL, TRUE)
00406 
00407     n = OCI_HashGetSize(OCILib.key_map);
00408 
00409     for (i = 0; i < n; i++)
00410     {
00411         e = OCI_HashGetEntry(OCILib.key_map, i);
00412 
00413         while (e != NULL)
00414         {
00415             v = e->values;
00416 
00417             while (v != NULL)
00418             {
00419                 if (FALSE == OCI_ThreadKeyFree((OCI_ThreadKey *) (v->value.p_void)))
00420                 {
00421                     nb_err++;
00422                 }
00423 
00424                 v = v->next;
00425             }
00426 
00427             e = e->next;
00428         }
00429     }
00430 
00431     res = (OCI_HashFree(OCILib.key_map) && (nb_err == 0));
00432 
00433     OCILib.key_map = NULL;
00434 
00435     return res;
00436 }
00437 
00438 /* --------------------------------------------------------------------------------------------- *
00439  * OCI_SetStatus
00440  * --------------------------------------------------------------------------------------------- */
00441 
00442 void OCI_SetStatus
00443 (
00444     boolean res
00445 )
00446 {
00447     OCI_Error *err = OCI_ErrorGet(FALSE, FALSE);
00448 
00449     if (err != NULL)
00450     {
00451         err->raise = (res == FALSE);
00452     }
00453 }
00454 
00455 /* ********************************************************************************************* *
00456  *                            PUBLIC FUNCTIONS
00457  * ********************************************************************************************* */
00458 
00459 /* --------------------------------------------------------------------------------------------- *
00460  * OCI_Initialize
00461  * --------------------------------------------------------------------------------------------- */
00462 
00463 boolean OCI_API OCI_Initialize
00464 (
00465     POCI_ERROR   err_handler,
00466     const mtext *lib_path,
00467     unsigned int mode
00468 )
00469 {
00470     boolean res  = TRUE;
00471     ub4 oci_mode = OCI_ENV_MODE | OCI_OBJECT;
00472 
00473 #ifdef OCI_IMPORT_RUNTIME
00474 
00475     char path[OCI_SIZE_BUFFER+1];
00476 
00477     size_t len = (size_t) 0;
00478 
00479 #endif
00480 
00481     /* check if it was already initialized */
00482 
00483     if (OCILib.loaded == TRUE)
00484     {
00485         return TRUE;
00486     }
00487 
00488     memset(&OCILib, 0, sizeof(OCI_Library));
00489 
00490     OCILib.error_handler = err_handler;
00491 
00492     OCILib.version_compile = OCI_VERSION_COMPILE;
00493     OCILib.version_runtime = OCI_VERSION_RUNTIME;
00494 
00495     OCILib.env_mode = mode;
00496 
00497 #ifdef OCI_CHARSET_ANSI
00498 
00499     /* test for UTF8 environment */
00500 
00501     {
00502         char *str = getenv("NLS_LANG");
00503 
00504         if (str != NULL)
00505         {
00506             char nls_lang[OCI_SIZE_OBJ_NAME+1] = "";
00507 
00508             strncat(nls_lang, str, OCI_SIZE_OBJ_NAME);
00509 
00510             for (str = nls_lang; *str != 0; str++)
00511             {
00512                 *str = (char) toupper(*str);
00513             }
00514 
00515             OCILib.nls_utf8 = (strstr(nls_lang, "UTF8") != NULL);
00516         }
00517     }
00518 
00519 #endif
00520 
00521 #ifdef OCI_IMPORT_LINKAGE
00522 
00523     OCI_NOT_USED(lib_path);
00524 
00525     #if defined(OCI_BIG_UINT_ENABLED)
00526 
00527     OCILib.use_lob_ub8 = TRUE;
00528 
00529     #endif
00530 
00531     #if defined(OCI_STMT_SCROLLABLE_READONLY)
00532 
00533     OCILib.use_scrollable_cursors = TRUE;
00534 
00535     #endif
00536 
00537 #else
00538 
00539     memset(path, 0, sizeof(path));
00540 
00541     #if defined(OCI_CHARSET_WIDE)
00542 
00543     if (lib_path != NULL && lib_path[0] != 0)
00544     {
00545         len = wcstombs(path, lib_path, sizeof(path));
00546     }
00547 
00548     #else
00549 
00550     if (lib_path != NULL && lib_path[0] != 0)
00551     {
00552         strncat(path, lib_path, sizeof(path));
00553 
00554         len = strlen(path);
00555     }
00556 
00557     #endif
00558 
00559     if ((len > (size_t) 0) && (len < sizeof(path)) && (path[len - (size_t) 1] != OCI_CHAR_SLASH))
00560     {
00561         path[len] = OCI_CHAR_SLASH;
00562         len++;
00563     }
00564 
00565     strncat(path, OCI_DL_ANSI_NAME, sizeof(path) - len);
00566 
00567     OCILib.lib_handle = LIB_OPEN(path);
00568 
00569     if (OCILib.lib_handle != NULL)
00570     {
00571 
00572         /* Now loading all symbols - no check is performed on each function,
00573            Basic checks will be done to ensure we're loading an
00574            Oracle and compatible library ...
00575         */
00576 
00577         LIB_SYMBOL(OCILib.lib_handle, "OCIEnvCreate", OCIEnvCreate,
00578                    OCIENVCREATE);
00579 
00580         LIB_SYMBOL(OCILib.lib_handle, "OCIServerAttach", OCIServerAttach,
00581                    OCISERVERATTACH);
00582         LIB_SYMBOL(OCILib.lib_handle, "OCIServerDetach", OCIServerDetach,
00583                    OCISERVERDETACH);
00584 
00585         LIB_SYMBOL(OCILib.lib_handle, "OCIHandleAlloc", OCIHandleAlloc,
00586                    OCIHANDLEALLOC);
00587         LIB_SYMBOL(OCILib.lib_handle, "OCIHandleFree",  OCIHandleFree,
00588                    OCIHANDLEFREE);
00589 
00590         LIB_SYMBOL(OCILib.lib_handle, "OCIDescriptorAlloc", OCIDescriptorAlloc,
00591                    OCIDESCRIPTORALLOC);
00592         LIB_SYMBOL(OCILib.lib_handle, "OCIDescriptorFree", OCIDescriptorFree,
00593                    OCIDESCRIPTORFREE);
00594 
00595         LIB_SYMBOL(OCILib.lib_handle, "OCIAttrSet", OCIAttrSet,
00596                    OCIATTRSET);
00597         LIB_SYMBOL(OCILib.lib_handle, "OCIAttrGet", OCIAttrGet,
00598                    OCIATTRGET);
00599 
00600         LIB_SYMBOL(OCILib.lib_handle, "OCIParamSet", OCIParamSet,
00601                    OCIPARAMSET);
00602         LIB_SYMBOL(OCILib.lib_handle, "OCIParamGet", OCIParamGet,
00603                    OCIPARAMGET);
00604 
00605         LIB_SYMBOL(OCILib.lib_handle, "OCISessionBegin", OCISessionBegin,
00606                    OCISESSIONBEGIN);
00607         LIB_SYMBOL(OCILib.lib_handle, "OCISessionEnd", OCISessionEnd,
00608                    OCISESSIONEND);
00609 
00610         LIB_SYMBOL(OCILib.lib_handle, "OCIPasswordChange", OCIPasswordChange,
00611                    OCIPASSWORDCHANGE);
00612 
00613         LIB_SYMBOL(OCILib.lib_handle, "OCITransStart", OCITransStart,
00614                    OCITRANSSTART);
00615         LIB_SYMBOL(OCILib.lib_handle, "OCITransDetach", OCITransDetach,
00616                    OCITRANSDETACH);
00617         LIB_SYMBOL(OCILib.lib_handle, "OCITransPrepare", OCITransPrepare,
00618                    OCITRANSPREPARE);
00619         LIB_SYMBOL(OCILib.lib_handle, "OCITransForget", OCITransForget,
00620                    OCITRANSFORGET);
00621         LIB_SYMBOL(OCILib.lib_handle, "OCITransCommit", OCITransCommit,
00622                    OCITRANSCOMMIT);
00623         LIB_SYMBOL(OCILib.lib_handle, "OCITransRollback", OCITransRollback,
00624                    OCITRANSROLLBACK);
00625 
00626         LIB_SYMBOL(OCILib.lib_handle, "OCIErrorGet",  OCIErrorGet,
00627                    OCIERRORGET);
00628         LIB_SYMBOL(OCILib.lib_handle, "OCIServerVersion", OCIServerVersion,
00629                    OCISERVERVERSION);
00630         LIB_SYMBOL(OCILib.lib_handle, "OCIBreak", OCIBreak,
00631                    OCIBREAK);
00632 
00633         LIB_SYMBOL(OCILib.lib_handle, "OCIBindByPos", OCIBindByPos,
00634                    OCIBINDBYPOS);
00635         LIB_SYMBOL(OCILib.lib_handle, "OCIBindByName", OCIBindByName,
00636                    OCIBINDBYNAME);
00637         LIB_SYMBOL(OCILib.lib_handle, "OCIBindDynamic", OCIBindDynamic,
00638                    OCIBINDDYNAMIC);
00639         LIB_SYMBOL(OCILib.lib_handle, "OCIBindObject", OCIBindObject,
00640                    OCIBINDOBJECT);
00641 
00642         LIB_SYMBOL(OCILib.lib_handle, "OCIDefineByPos", OCIDefineByPos,
00643                    OCIDEFINEBYPOS);
00644         LIB_SYMBOL(OCILib.lib_handle, "OCIDefineObject", OCIDefineObject,
00645                    OCIDEFINEOBJECT);
00646 
00647         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtPrepare", OCIStmtPrepare,
00648                    OCISTMTPREPARE);
00649         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtExecute", OCIStmtExecute,
00650                    OCISTMTEXECUTE);
00651         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtFetch", OCIStmtFetch,
00652                    OCISTMTFETCH);
00653         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtFetch2", OCIStmtFetch2,
00654                    OCISTMTFETCH2);
00655 
00656         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtGetPieceInfo", OCIStmtGetPieceInfo,
00657                    OCISTMTGETPIECEINFO);
00658         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtSetPieceInfo", OCIStmtSetPieceInfo,
00659                    OCISTMTSETPIECEINFO);
00660 
00661         LIB_SYMBOL(OCILib.lib_handle, "OCILobCreateTemporary", OCILobCreateTemporary,
00662                    OCILOBCREATETEMPORARY);
00663         LIB_SYMBOL(OCILib.lib_handle, "OCILobFreeTemporary", OCILobFreeTemporary,
00664                    OCILOBFREETEMPORARY);
00665         LIB_SYMBOL(OCILib.lib_handle, "OCILobIsTemporary", OCILobIsTemporary,
00666                    OCILOBISTEMPORARY);
00667         LIB_SYMBOL(OCILib.lib_handle, "OCILobRead", OCILobRead,
00668                    OCILOBREAD);
00669         LIB_SYMBOL(OCILib.lib_handle, "OCILobWrite", OCILobWrite,
00670                    OCILOBWRITE);
00671         LIB_SYMBOL(OCILib.lib_handle, "OCILobCopy", OCILobCopy,
00672                    OCILOBCOPY);
00673         LIB_SYMBOL(OCILib.lib_handle, "OCILobTrim", OCILobTrim,
00674                    OCILOBTRIM);
00675         LIB_SYMBOL(OCILib.lib_handle, "OCILobErase", OCILobErase,
00676                    OCILOBERASE);
00677         LIB_SYMBOL(OCILib.lib_handle, "OCILobAppend", OCILobAppend,
00678                    OCILOBAPPEND);
00679         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetLength", OCILobGetLength,
00680                    OCILOBGETLENGTH);
00681         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetChunkSize", OCILobGetChunkSize,
00682                    OCILOBGETCHUNKSIZE);
00683         LIB_SYMBOL(OCILib.lib_handle, "OCILobOpen", OCILobOpen,
00684                    OCILOBOPEN);
00685         LIB_SYMBOL(OCILib.lib_handle, "OCILobClose", OCILobClose,
00686                    OCILOBCLOSE);
00687 
00688     #ifdef ORAXB8_DEFINED
00689 
00690         LIB_SYMBOL(OCILib.lib_handle, "OCILobCopy2", OCILobCopy2,
00691                    OCILOBCOPY2);
00692         LIB_SYMBOL(OCILib.lib_handle, "OCILobErase2", OCILobErase2,
00693                    OCILOBERASE2);
00694         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetLength2", OCILobGetLength2,
00695                    OCILOBGETLENGTH2);
00696         LIB_SYMBOL(OCILib.lib_handle, "OCILobLoadFromFile2", OCILobLoadFromFile2,
00697                    OCILOBLOADFROMFILE2);
00698         LIB_SYMBOL(OCILib.lib_handle, "OCILobRead2", OCILobRead2,
00699                    OCILOBREAD2);
00700         LIB_SYMBOL(OCILib.lib_handle, "OCILobTrim2", OCILobTrim2,
00701                    OCILOBTRIM2);
00702         LIB_SYMBOL(OCILib.lib_handle, "OCILobWrite2", OCILobWrite2,
00703                    OCILOBWRITE2);
00704         LIB_SYMBOL(OCILib.lib_handle, "OCILobWriteAppend2", OCILobWriteAppend2,
00705                    OCILOBWRITEAPPEND2);
00706 
00707     #endif
00708 
00709         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileOpen", OCILobFileOpen,
00710                    OCILOBFILEOPEN);
00711         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileClose", OCILobFileClose,
00712                    OCILOBFILECLOSE);
00713         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileCloseAll", OCILobFileCloseAll,
00714                    OCILOBFILECLOSEALL);
00715         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileIsOpen", OCILobFileIsOpen,
00716                    OCILOBFILEISOPEN);
00717         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileExists", OCILobFileExists,
00718                    OCILOBFILEEXISTS);
00719         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileGetName", OCILobFileGetName,
00720                    OCILOBFIELGETNAME);
00721         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileSetName", OCILobFileSetName,
00722                    OCILOBFILESETNAME);
00723         LIB_SYMBOL(OCILib.lib_handle, "OCILobLoadFromFile", OCILobLoadFromFile,
00724                    OCILOBLOADFROMFILE);
00725         LIB_SYMBOL(OCILib.lib_handle, "OCILobWriteAppend", OCILobWriteAppend,
00726                    OCILOBWRITEAPPEND);
00727         LIB_SYMBOL(OCILib.lib_handle, "OCILobIsEqual", OCILobIsEqual,
00728                    OCILOBISEQUAL);
00729         LIB_SYMBOL(OCILib.lib_handle, "OCILobAssign", OCILobAssign,
00730                    OCILOBASSIGN);
00731         LIB_SYMBOL(OCILib.lib_handle, "OCILobLocatorAssign", OCILobLocatorAssign,
00732                    OCILOBLOCATORASSIGN);
00733         LIB_SYMBOL(OCILib.lib_handle, "OCILobFlushBuffer", OCILobFlushBuffer,
00734                    OCILOBFLUSHBUFFER);
00735         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetStorageLimit", OCILobGetStorageLimit,
00736                    OCILOBGETSTORAGELIMIT);
00737         LIB_SYMBOL(OCILib.lib_handle, "OCILobEnableBuffering", OCILobEnableBuffering,
00738                    OCILOBENABLEBUFFERING);
00739         LIB_SYMBOL(OCILib.lib_handle, "OCILobDisableBuffering", OCILobDisableBuffering,
00740                    OCILOBDISABLEBUFFERING);
00741 
00742         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAssign", OCIDateAssign,
00743                    OCIDATEASSIGN);
00744         LIB_SYMBOL(OCILib.lib_handle, "OCIDateToText", OCIDateToText,
00745                    OCIDATETOTEXT);
00746         LIB_SYMBOL(OCILib.lib_handle, "OCIDateFromText", OCIDateFromText,
00747                    OCIDATEFROMTEXT);
00748         LIB_SYMBOL(OCILib.lib_handle, "OCIDateCompare", OCIDateCompare,
00749                    OCIDATECOMPARE);
00750         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAddMonths", OCIDateAddMonths,
00751                    OCIDATEADDMONTHS);
00752         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAddDays", OCIDateAddDays,
00753                    OCIDATEADDDAYS);
00754         LIB_SYMBOL(OCILib.lib_handle, "OCIDateLastDay", OCIDateLastDay,
00755                    OCIDATELASTDAY);
00756         LIB_SYMBOL(OCILib.lib_handle, "OCIDateDaysBetween", OCIDateDaysBetween,
00757                    OCIDATEDAYSBETWEEN);
00758         LIB_SYMBOL(OCILib.lib_handle, "OCIDateZoneToZone", OCIDateZoneToZone,
00759                    OCIDATEZONETOZONE);
00760         LIB_SYMBOL(OCILib.lib_handle, "OCIDateNextDay", OCIDateNextDay,
00761                    OCIDATENEXTDAY);
00762         LIB_SYMBOL(OCILib.lib_handle, "OCIDateCheck", OCIDateCheck,
00763                    OCIDATECHECK);
00764         LIB_SYMBOL(OCILib.lib_handle, "OCIDateSysDate", OCIDateSysDate,
00765                    OCIDATESYSDATE);
00766         LIB_SYMBOL(OCILib.lib_handle, "OCIDescribeAny", OCIDescribeAny,
00767                    OCIDESCRIBEANY);
00768 
00769         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalAssign", OCIIntervalAssign,
00770                    OCIINTERVALASSIGN);
00771         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalCheck", OCIIntervalCheck,
00772                    OCIINTERVALCHECK);
00773         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalCompare", OCIIntervalCompare,
00774                    OCIINTERVALCOMPARE);
00775         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalFromText", OCIIntervalFromText,
00776                    OCIINTERVALFROMTEXT);
00777         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalToText", OCIIntervalToText,
00778                    OCIINTERVALTOTEXT);
00779         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalFromTZ", OCIIntervalFromTZ,
00780                    OCIINTERVALFROMTZ);
00781         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalGetDaySecond", OCIIntervalGetDaySecond,
00782                    OCIINTERVALGETDAYSECOND);
00783         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalGetYearMonth", OCIIntervalGetYearMonth,
00784                    OCIINTERVALGETYEARMONTH);
00785         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSetDaySecond", OCIIntervalSetDaySecond,
00786                    OCIINTERVALSETDAYSECOND);
00787         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSetYearMonth", OCIIntervalSetYearMonth,
00788                    OCIINTERVALSETYEARMONTH);
00789         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSubtract", OCIIntervalSubtract,
00790                    OCIINTERVALSUBTRACT);
00791         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalAdd", OCIIntervalAdd,
00792                    OCIINTERVALADD);
00793 
00794         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeAssign", OCIDateTimeAssign,
00795                    OCIDATETIMEASSIGN);
00796         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeCheck", OCIDateTimeCheck,
00797                    OCIDATETIMECHECK);
00798         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeCompare", OCIDateTimeCompare,
00799                    OCIDATETIMECOMPARE);
00800         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeConstruct", OCIDateTimeConstruct,
00801                    OCIDATETIMECONSTRUCT);
00802         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeConvert", OCIDateTimeConvert,
00803                    OCIDATETIMECONVERT);
00804         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeFromArray", OCIDateTimeFromArray,
00805                    OCIDATETIMEFROMARRAY);
00806         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeToArray", OCIDateTimeToArray,
00807                    OCIDATETIMETOARRAY);
00808         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeFromText", OCIDateTimeFromText,
00809                    OCIDATETIMEFROMTEXT);
00810         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeToText", OCIDateTimeToText,
00811                    OCIDATETIMETOTEXT);
00812         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetDate", OCIDateTimeGetDate,
00813                    OCIDATETIMEGETDATE);
00814         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTime", OCIDateTimeGetTime,
00815                    OCIDATETIMEGETTIME);
00816         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTimeZoneName", OCIDateTimeGetTimeZoneName,
00817                    OCIDATETIMEGETTIMEZONENAME);
00818         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTimeZoneOffset", OCIDateTimeGetTimeZoneOffset,
00819                    OCIDATETIMEGETTIMEZONEOFFSET);
00820         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeIntervalAdd", OCIDateTimeIntervalAdd,
00821                    OCIDATETIMEINTERVALADD);
00822         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeIntervalSub", OCIDateTimeIntervalSub,
00823                    OCIDATETIMEINTERVALSUB);
00824         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeSubtract", OCIDateTimeSubtract,
00825                    OCIDATETIMESUBTRACT);
00826         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeSysTimeStamp", OCIDateTimeSysTimeStamp,
00827                    OCIDATETIMESYSTIMESTAMP);
00828 
00829         LIB_SYMBOL(OCILib.lib_handle, "OCITypeByName", OCITypeByName,
00830                    OCITYPEBYNAME);
00831 
00832         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToInt", OCINumberToInt,
00833                    OCINUMBERTOINT);
00834         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromInt", OCINumberFromInt,
00835                    OCINUMBERFROMINT);
00836 
00837         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToReal", OCINumberToReal,
00838                    OCINUMBERTOREAL);
00839         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromReal", OCINumberFromReal,
00840                    OCINUMBERFROMREAL);
00841 
00842         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToText", OCINumberToText,
00843                    OCINUMBERTOTEXT);
00844         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromText", OCINumberFromText,
00845                    OCINUMBERFROMTEXT);
00846 
00847         LIB_SYMBOL(OCILib.lib_handle, "OCIStringPtr", OCIStringPtr,
00848                    OCISTRINGPTR);
00849         LIB_SYMBOL(OCILib.lib_handle, "OCIStringAssignText", OCIStringAssignText,
00850                    OCISTRINGASSIGNTEXT);
00851 
00852         LIB_SYMBOL(OCILib.lib_handle, "OCIRawPtr", OCIRawPtr,
00853                    OCIRAWPTR);
00854         LIB_SYMBOL(OCILib.lib_handle, "OCIRawAssignBytes", OCIRawAssignBytes,
00855                    OCIRAWASSIGNBYTES);
00856         LIB_SYMBOL(OCILib.lib_handle, "OCIRawResize", OCIRawResize,
00857                    OCIRAWRESIZE);
00858         LIB_SYMBOL(OCILib.lib_handle, "OCIRawAllocSize", OCIRawAllocSize,
00859                    OCIRAWALLOCSIZE);
00860         LIB_SYMBOL(OCILib.lib_handle, "OCIRawSize", OCIRawSize,
00861                    OCIRAWSIZE);
00862 
00863         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectNew", OCIObjectNew,
00864                    OCIOBJECTNEW);
00865         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectFree", OCIObjectFree,
00866                    OCIOBJECTFREE);
00867         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectSetAttr", OCIObjectSetAttr,
00868                    OCIOBJECTSETATTR);
00869         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetAttr", OCIObjectGetAttr,
00870                    OCIOBJECTGETATTR);
00871         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectPin", OCIObjectPin,
00872                    OCIOBJECTPIN);
00873         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectUnpin", OCIObjectUnpin,
00874                    OCIOBJECTUNPIN);
00875         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectCopy", OCIObjectCopy,
00876                    OCIOBJECTCOPY);
00877         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetObjectRef", OCIObjectGetObjectRef,
00878                    OCIOBJECTGETOBJECTREF);
00879         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetProperty", OCIObjectGetProperty,
00880                    OCIOBJECTGETPROPERTY);
00881         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetInd", OCIObjectGetInd,
00882                    OCIOBJECTGETIND);
00883 
00884         LIB_SYMBOL(OCILib.lib_handle, "OCIRefAssign", OCIRefAssign,
00885                    OCIREFASSIGN);
00886         LIB_SYMBOL(OCILib.lib_handle, "OCIRefIsNull", OCIRefIsNull,
00887                    OCIREFISNULL);
00888         LIB_SYMBOL(OCILib.lib_handle, "OCIRefClear", OCIRefClear,
00889                    OCIREFCLEAR);
00890         LIB_SYMBOL(OCILib.lib_handle, "OCIRefToHex", OCIRefToHex,
00891                    OCIREFTOHEX);
00892         LIB_SYMBOL(OCILib.lib_handle, "OCIRefHexSize", OCIRefHexSize,
00893                    OCIREFHEXSIZE);
00894 
00895         LIB_SYMBOL(OCILib.lib_handle, "OCIArrayDescriptorAlloc", OCIArrayDescriptorAlloc,
00896                    OCIARRAYDESCRIPTORALLOC);
00897         LIB_SYMBOL(OCILib.lib_handle, "OCIArrayDescriptorFree", OCIArrayDescriptorFree,
00898                    OCIARRAYDESCRIPTORFREE);
00899 
00900         LIB_SYMBOL(OCILib.lib_handle, "OCIClientVersion", OCIClientVersion,
00901                    OCICLIENTVERSION);
00902 
00903         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadProcessInit", OCIThreadProcessInit,
00904                    OCITHREADPROCESSINIT);
00905         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadInit", OCIThreadInit,
00906                    OCITHREADINIT);
00907         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadTerm", OCIThreadTerm,
00908                    OCITHREADTERM);
00909 
00910         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadIdInit", OCIThreadIdInit,
00911                    OCITHREADIDINIT);
00912         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadIdDestroy", OCIThreadIdDestroy,
00913                    OCITHREADIDDESTROY);
00914         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadHndInit", OCIThreadHndInit,
00915                    OCITHREADHNDINIT);
00916         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadHndDestroy", OCIThreadHndDestroy,
00917                    OCITHREADHNDDESTROY);
00918         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadCreate", OCIThreadCreate,
00919                    OCITHREADCREATE);
00920         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadJoin", OCIThreadJoin,
00921                    OCITHREADJOIN);
00922         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadClose", OCIThreadClose,
00923                    OCITHREADCLOSE);
00924 
00925         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexInit", OCIThreadMutexInit,
00926                    OCITHREADMUTEXINIT);
00927         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexDestroy", OCIThreadMutexDestroy,
00928                    OCITHREADMUTEXDESTROY);
00929         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexAcquire", OCIThreadMutexAcquire,
00930                    OCITHREADMUTEXACQUIRE);
00931         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexRelease", OCIThreadMutexRelease,
00932                    OCITHREADMUTEXRELEASE);
00933 
00934         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyInit", OCIThreadKeyInit,
00935                    OCITHREADKEYINIT);
00936         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyDestroy", OCIThreadKeyDestroy,
00937                    OCITHREADKEYDESTROY);
00938         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeySet", OCIThreadKeySet,
00939                    OCITHREADKEYSET);
00940         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyGet", OCIThreadKeyGet,
00941                    OCITHREADKEYGET);
00942 
00943         LIB_SYMBOL(OCILib.lib_handle, "OCIConnectionPoolCreate", OCIConnectionPoolCreate,
00944                    OCICONNECTIONPOOLCREATE);
00945         LIB_SYMBOL(OCILib.lib_handle, "OCIConnectionPoolDestroy", OCIConnectionPoolDestroy,
00946                    OCICONNECTIONPOOLDESTROY);
00947 
00948         LIB_SYMBOL(OCILib.lib_handle, "OCISessionPoolCreate", OCISessionPoolCreate,
00949                    OCISESSIONPOOLCREATE);
00950         LIB_SYMBOL(OCILib.lib_handle, "OCISessionPoolDestroy", OCISessionPoolDestroy,
00951                    OCISESSIONPOOLDESTROY);
00952 
00953         LIB_SYMBOL(OCILib.lib_handle, "OCISessionGet", OCISessionGet,
00954                    OCISESSIONGET);
00955         LIB_SYMBOL(OCILib.lib_handle, "OCISessionRelease", OCISessionRelease,
00956                    OCISESSIONRELEASE);
00957 
00958         LIB_SYMBOL(OCILib.lib_handle, "OCICollSize", OCICollSize,
00959                    OCICOLLSIZE);
00960         LIB_SYMBOL(OCILib.lib_handle, "OCICollMax", OCICollMax,
00961                    OCICOLLMAX);
00962         LIB_SYMBOL(OCILib.lib_handle, "OCICollGetElem", OCICollGetElem,
00963                    OCICOLLGETITEM);
00964         LIB_SYMBOL(OCILib.lib_handle, "OCICollAssignElem", OCICollAssignElem,
00965                    OCICOLLASSIGNELEM);
00966         LIB_SYMBOL(OCILib.lib_handle, "OCICollAssign", OCICollAssign,
00967                    OCICOLLASSIGN);
00968         LIB_SYMBOL(OCILib.lib_handle, "OCICollAppend", OCICollAppend,
00969                    OCICOLLAPPEND);
00970         LIB_SYMBOL(OCILib.lib_handle, "OCICollTrim", OCICollTrim,
00971                    OCICOLLTRIM);
00972 
00973         LIB_SYMBOL(OCILib.lib_handle, "OCIIterCreate", OCIIterCreate,
00974                    OCIITERCREATE);
00975         LIB_SYMBOL(OCILib.lib_handle, "OCIIterDelete", OCIIterDelete,
00976                    OCIITERDELETE);
00977         LIB_SYMBOL(OCILib.lib_handle, "OCIIterInit", OCIIterInit,
00978                    OCIITERINIT);
00979         LIB_SYMBOL(OCILib.lib_handle, "OCIIterNext", OCIIterNext,
00980                    OCIITERNEXT);
00981         LIB_SYMBOL(OCILib.lib_handle, "OCIIterPrev", OCIIterPrev,
00982                    OCIITERPREV);
00983 
00984         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathAbort", OCIDirPathAbort,
00985                    OCIDIRPATHABORT);
00986         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathDataSave", OCIDirPathDataSave,
00987                    OCIDIRPATHDATASAVE);
00988         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathFinish", OCIDirPathFinish,
00989                    OCIDIRPATHFINISH);
00990         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathPrepare", OCIDirPathPrepare,
00991                    OCIDIRPATHPREPARE);
00992         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathLoadStream", OCIDirPathLoadStream,
00993                    OCIDIRPATHLOADSTREAM);
00994         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayEntrySet", OCIDirPathColArrayEntrySet,
00995                    OCIDIRPATHCOLARRAYENTRYSET);
00996         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayReset", OCIDirPathColArrayReset,
00997                    OCIDIRPATHCOLARRAYRESET);
00998         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayToStream", OCIDirPathColArrayToStream,
00999                    OCIDIRPATHCOLARRAYTOSTREAM);
01000         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathStreamReset", OCIDirPathStreamReset,
01001                    OCIDIRPATHSTREAMRESET);
01002         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathFlushRow", OCIDirPathFlushRow,
01003                    OCIDIRPATHFLUSHROW);
01004 
01005         LIB_SYMBOL(OCILib.lib_handle, "OCICacheFree", OCICacheFree,
01006                    OCICACHEFREE);
01007         LIB_SYMBOL(OCILib.lib_handle, "OCIPing", OCIPing,
01008                    OCIPING);
01009 
01010         LIB_SYMBOL(OCILib.lib_handle, "OCIDBStartup", OCIDBStartup,
01011                    OCIDBSTARTUP);
01012         LIB_SYMBOL(OCILib.lib_handle, "OCIDBShutdown", OCIDBShutdown,
01013                    OCIDBSHUTDOWN);
01014 
01015         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtPrepare2", OCIStmtPrepare2,
01016                    OCISTMTPREPARE2);
01017         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtRelease", OCIStmtRelease,
01018                    OCISTMTRELEASE);
01019 
01020         LIB_SYMBOL(OCILib.lib_handle, "OCISubscriptionRegister", OCISubscriptionRegister,
01021                    OCISUBSCRIPTIONREGISTER);
01022         LIB_SYMBOL(OCILib.lib_handle, "OCISubscriptionUnRegister", OCISubscriptionUnRegister,
01023                    OCISUBSCRIPTIONUNREGISTER);
01024 
01025         LIB_SYMBOL(OCILib.lib_handle, "OCIAQEnq", OCIAQEnq,
01026                    OCIAQENQ);
01027         LIB_SYMBOL(OCILib.lib_handle, "OCIAQDeq", OCIAQDeq,
01028                    OCIAQDEQ);
01029         LIB_SYMBOL(OCILib.lib_handle, "OCIAQListen", OCIAQListen,
01030                    OCIAQLISTEN);
01031 
01032         LIB_SYMBOL(OCILib.lib_handle, "xaoSvcCtx", xaoSvcCtx,
01033                    XAOSVCCTX);
01034         LIB_SYMBOL(OCILib.lib_handle, "xaoEnv", xaoEnv,
01035                    XAOENV);
01036 
01037         /* API Version checking */
01038 
01039         if (OCIArrayDescriptorFree != NULL)
01040         {
01041             OCILib.version_runtime = OCI_11_1;
01042         }
01043         else if (OCIClientVersion != NULL)
01044         {
01045             OCILib.version_runtime = OCI_10_2;
01046         }
01047         else if (OCILobWrite2 != NULL)
01048         {
01049             OCILib.version_runtime = OCI_10_1;
01050         }
01051         else if (OCIStmtPrepare2  != NULL)
01052         {
01053             OCILib.version_runtime = OCI_9_2;
01054         }
01055         else if (OCIDateTimeGetTimeZoneName != NULL)
01056         {
01057             OCILib.version_runtime = OCI_9_0;
01058         }
01059         else if (OCIThreadProcessInit != NULL)
01060         {
01061             OCILib.version_runtime = OCI_8_1;
01062         }
01063         else if (OCIEnvCreate != NULL)
01064         {
01065             OCILib.version_runtime = OCI_8_0;
01066         }
01067         else
01068         {
01069             LIB_CLOSE(OCILib.lib_handle);
01070 
01071             OCI_ExceptionLoadingSymbols();
01072 
01073             res = FALSE;
01074         }
01075     }
01076     else
01077     {
01078         OCI_ExceptionLoadingSharedLib();
01079 
01080         res = FALSE;
01081     }
01082 
01083     if (res == TRUE)
01084     {
01085 
01086     #if defined(OCI_BIG_UINT_ENABLED)
01087 
01088         if ((OCILib.version_runtime >= OCI_10_1) && (OCILobCopy2 != NULL))
01089         {
01090             OCILib.use_lob_ub8 = TRUE;
01091         }
01092 
01093     #endif
01094 
01095     #if defined(OCI_STMT_SCROLLABLE_READONLY)
01096 
01097         if ((OCILib.version_runtime >= OCI_9_0) && (OCIStmtFetch2 != NULL))
01098         {
01099             OCILib.use_scrollable_cursors = TRUE;
01100         }
01101 
01102     #endif
01103 
01104     }
01105 
01106 #endif
01107 
01108 #if defined(OCI_CHARSET_WIDE)
01109 
01110     /* Oracle 8i does not support full Unicode mode */
01111 
01112     if ((res == TRUE) && (OCILib.version_runtime < OCI_9_0))
01113     {
01114         OCI_ExceptionNotAvailable(NULL, OCI_FEATURE_WIDE_USERDATA);
01115 
01116         res = FALSE;
01117     }
01118 
01119 #endif
01120 
01121     /* Initialize OCI environment */
01122 
01123     if (res == TRUE)
01124     {
01125         /* check modes */
01126 
01127         if (mode & OCI_ENV_THREADED)
01128         {
01129             oci_mode |= OCI_THREADED;
01130         }
01131 
01132         if (mode & OCI_ENV_EVENTS)
01133         {
01134             oci_mode |= OCI_EVENTS;
01135         }
01136 
01137         /* create environment on success */
01138 
01139         res = res && (OCI_SUCCESS == OCIEnvCreate(&OCILib.env, oci_mode,
01140                                                   (dvoid *) NULL, NULL, NULL, NULL,
01141                                                   (size_t) 0, (dvoid **) NULL));
01142 
01143         if (res == FALSE)
01144         {
01145             OCI_ExceptionOCIEnvironment();
01146         }
01147 
01148         /*  allocate error handle */
01149 
01150         res = res && (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) OCILib.env,
01151                                                      (dvoid **) (void *) &OCILib.err,
01152                                                      (ub4) OCI_HTYPE_ERROR,
01153                                                      (size_t) 0, (dvoid **) NULL));
01154     }
01155 
01156     /* on success, we need to initialize OCIThread object support */
01157 
01158     if (res == TRUE)
01159     {
01160         if (OCI_LIB_THREADED)
01161         {
01162             OCIThreadProcessInit();
01163 
01164             res = (OCI_SUCCESS == OCIThreadInit(OCILib.env, OCILib.err));
01165         }
01166 
01167         /* create thread key for thread errors */
01168 
01169         OCILib.key_errs = OCI_ThreadKeyCreateInternal((POCI_THREADKEYDEST) OCI_ErrorFree);
01170 
01171         /* allocate connections internal list */
01172 
01173         if (res == TRUE)
01174         {
01175             OCILib.cons = OCI_ListCreate(OCI_IPC_CONNECTION);
01176 
01177             res = (OCILib.cons != NULL);
01178         }
01179 
01180         /* allocate pools internal list */
01181 
01182         if (res == TRUE)
01183         {
01184 
01185             OCILib.pools = OCI_ListCreate(OCI_IPC_POOL);
01186 
01187             res = (OCILib.pools != NULL);
01188         }
01189 
01190     #if OCI_VERSION_COMPILE >= OCI_10_2
01191 
01192         /* allocate connection pools internal list */
01193 
01194         if (res == TRUE)
01195         {
01196 
01197             OCILib.subs = OCI_ListCreate(OCI_IPC_NOTIFY);
01198 
01199             res = (OCILib.subs != NULL);
01200         }
01201 
01202     #endif
01203 
01204         if (res == TRUE)
01205         {
01206 
01207             OCILib.arrs = OCI_ListCreate(OCI_IPC_ARRAY);
01208 
01209             res = (OCILib.arrs != NULL);
01210         }
01211     }
01212 
01213     if (res == TRUE)
01214     {
01215         OCILib.loaded = TRUE;
01216     }
01217 
01218     return res;
01219 }
01220 
01221 /* --------------------------------------------------------------------------------------------- *
01222  * OCI_Cleanup
01223  * --------------------------------------------------------------------------------------------- */
01224 
01225 boolean OCI_API OCI_Cleanup
01226 (
01227     void
01228 )
01229 {
01230     boolean res = TRUE;
01231 
01232     /* free all arrays */
01233 
01234     OCI_ListForEach(OCILib.arrs, (POCI_LIST_FOR_EACH) OCI_ArrayClose);
01235     OCI_ListClear(OCILib.arrs);
01236 
01237     /* free all subscriptions */
01238 
01239     OCI_ListForEach(OCILib.subs, (POCI_LIST_FOR_EACH) OCI_SubscriptionClose);
01240     OCI_ListClear(OCILib.subs);
01241 
01242     /* free all connections */
01243 
01244     OCI_ListForEach(OCILib.cons, (POCI_LIST_FOR_EACH) OCI_ConnectionClose);
01245     OCI_ListClear(OCILib.cons);
01246 
01247     /* free all pools */
01248 
01249     OCI_ListForEach(OCILib.pools, (POCI_LIST_FOR_EACH) OCI_PoolClose);
01250     OCI_ListClear(OCILib.pools);
01251 
01252     /* free objects */
01253 
01254     OCI_KeyMapFree();
01255 
01256     OCI_ListFree(OCILib.cons);
01257     OCI_ListFree(OCILib.pools);
01258     OCI_ListFree(OCILib.subs);
01259     OCI_ListFree(OCILib.arrs);
01260 
01261     OCILib.cons    = NULL;
01262     OCILib.pools   = NULL;
01263     OCILib.subs    = NULL;
01264     OCILib.key_map = NULL;
01265 
01266     /* finalize OCIThread object support */
01267 
01268     if (OCI_LIB_THREADED)
01269     {
01270         OCI_CALL0
01271         (
01272             res, OCILib.err,
01273 
01274             OCIThreadTerm(OCILib.env, OCILib.err)
01275         )
01276     }
01277 
01278     /* free error thread key */
01279 
01280     if (OCILib.key_errs != NULL)
01281     {
01282         OCI_ThreadKey *key = OCILib.key_errs;
01283         OCI_Error *err     = OCI_ErrorGet(FALSE, FALSE);
01284 
01285         OCILib.key_errs = NULL;
01286 
01287         OCI_ErrorFree(err);
01288         OCI_ThreadKeySet(key, NULL);
01289         OCI_ThreadKeyFree(key);
01290     }
01291 
01292     /* set unloaded flag */
01293 
01294     OCILib.loaded = FALSE;
01295 
01296     /* close error handle */
01297 
01298     if (OCILib.err != NULL)
01299     {
01300         OCI_HandleFree(OCILib.err, OCI_HTYPE_ERROR);
01301     }
01302 
01303     /* close environment handle
01304        => direct OCIHandleFree() because this handle was not allocated
01305        with OCI_HandleAlloc()
01306     */
01307 
01308     if (OCILib.env != NULL)
01309     {
01310         OCIHandleFree(OCILib.env, OCI_HTYPE_ENV);
01311     }
01312 
01313 #ifdef OCI_IMPORT_RUNTIME
01314 
01315     if (OCILib.lib_handle != NULL)
01316     {
01317         LIB_CLOSE(OCILib.lib_handle);
01318     }
01319 
01320 #endif
01321 
01322     /* checks for unfreed handles */
01323 
01324     if (OCILib.nb_hndlp > 0)
01325     {
01326         OCI_ExceptionUnfreedData(OCI_HDLE_HANDLE, OCILib.nb_hndlp);
01327         res = FALSE;
01328     }
01329 
01330     /* checks for unfreed descriptors */
01331 
01332     if (OCILib.nb_descp > 0)
01333     {
01334         OCI_ExceptionUnfreedData(OCI_HDLE_DESCRIPTOR, OCILib.nb_descp);
01335         res = FALSE;
01336     }
01337 
01338     /* checks for unfreed objects */
01339 
01340     if (OCILib.nb_objinst > 0)
01341     {
01342         OCI_ExceptionUnfreedData(OCI_HDLE_OBJECT, OCILib.nb_objinst);
01343         res = FALSE;
01344     }
01345 
01346     memset(&OCILib, 0, sizeof(OCILib));
01347 
01348     return res;
01349 }
01350 
01351 /* --------------------------------------------------------------------------------------------- *
01352  * OCI_GetOCICompileVersion
01353  * --------------------------------------------------------------------------------------------- */
01354 
01355 unsigned int OCI_API OCI_GetOCICompileVersion
01356 (
01357     void
01358 )
01359 {
01360     return (unsigned int) OCILib.version_compile;
01361 }
01362 
01363 /* --------------------------------------------------------------------------------------------- *
01364  * OCI_GetOCIRuntimeVersion
01365  * --------------------------------------------------------------------------------------------- */
01366 
01367 unsigned int OCI_API OCI_GetOCIRuntimeVersion
01368 (
01369     void
01370 )
01371 {
01372     return (unsigned int) OCILib.version_runtime;
01373 }
01374 
01375 /* --------------------------------------------------------------------------------------------- *
01376  * OCI_GetImportMode
01377  * --------------------------------------------------------------------------------------------- */
01378 
01379 unsigned int OCI_API OCI_GetImportMode
01380 (
01381     void
01382 )
01383 {
01384     return (unsigned int) OCI_IMPORT_MODE;
01385 }
01386 
01387 /* --------------------------------------------------------------------------------------------- *
01388  * OCI_GetCharsetMetaData
01389  * --------------------------------------------------------------------------------------------- */
01390 
01391 unsigned int OCI_API OCI_GetCharsetMetaData
01392 (
01393     void
01394 )
01395 {
01396     return (unsigned int) OCI_CHAR_MTEXT;
01397 }
01398 
01399 /* --------------------------------------------------------------------------------------------- *
01400  * OCI_GetCharsetUserData
01401  * --------------------------------------------------------------------------------------------- */
01402 
01403 unsigned int OCI_API OCI_GetCharsetUserData
01404 (
01405     void
01406 )
01407 {
01408     return (unsigned int) OCI_CHAR_DTEXT;
01409 }
01410 
01411 /* --------------------------------------------------------------------------------------------- *
01412  * OCI_GetLastError
01413  * --------------------------------------------------------------------------------------------- */
01414 
01415 OCI_Error * OCI_API OCI_GetLastError
01416 (
01417     void
01418 )
01419 {
01420     OCI_Error *err = NULL;
01421 
01422     if ((OCILib.loaded == FALSE) || (OCI_LIB_CONTEXT))
01423     {
01424         err = OCI_ErrorGet(TRUE, FALSE);
01425 
01426         if (err != NULL)
01427         {
01428             if (err->raise == FALSE)
01429             {
01430                 err = NULL;
01431             }
01432         }
01433     }
01434 
01435     return err;
01436 }
01437 
01438 /* --------------------------------------------------------------------------------------------- *
01439  * OCI_EnableWarnings
01440  * --------------------------------------------------------------------------------------------- */
01441 
01442 void OCI_API OCI_EnableWarnings
01443 (
01444     boolean value
01445 )
01446 {
01447     OCILib.warnings_on = value;
01448 }
01449 
01450 /* --------------------------------------------------------------------------------------------- *
01451  * OCI_SetErrorHandler
01452  * --------------------------------------------------------------------------------------------- */
01453 
01454 void OCI_API OCI_SetErrorHandler
01455 (
01456     POCI_ERROR handler
01457 )
01458 {
01459     OCILib.error_handler = handler;
01460 }
01461 
01462 /* --------------------------------------------------------------------------------------------- *
01463  * OCI_DatabaseStartup
01464  * --------------------------------------------------------------------------------------------- */
01465 
01466 boolean OCI_API OCI_DatabaseStartup
01467 (
01468     const mtext *db,
01469     const mtext *user,
01470     const mtext *pwd,
01471     unsigned int sess_mode,
01472     unsigned int start_mode,
01473     unsigned int start_flag,
01474     const mtext *spfile
01475 )
01476 {
01477     boolean res         = TRUE;
01478     OCI_Connection *con = NULL;
01479 
01480     OCI_CHECK_REMOTE_DBS_CONTROL_ENABLED(FALSE);
01481 
01482 #if OCI_VERSION_COMPILE >= OCI_10_2
01483 
01484     if (start_mode & OCI_DB_SPM_START)
01485     {
01486         OCIAdmin *adm = NULL;
01487 
01488         /* connect with prelim authenfication mode */
01489 
01490         con = OCI_ConnectionCreate(db, user, pwd, sess_mode | OCI_PRELIM_AUTH);
01491 
01492         if (con != NULL)
01493         {
01494             if ((res == TRUE) && (spfile != NULL) && (spfile[0] != 0))
01495             {
01496                 void *ostr = NULL;
01497                 int osize  = -1;
01498 
01499                 /* allocate admin handle */
01500 
01501                 res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) OCILib.env,
01502                                                       (dvoid **) (void *) &adm,
01503                                                       (ub4) OCI_HTYPE_ADMIN,
01504                                                       (size_t) 0, (dvoid **) NULL));
01505 
01506                 /* set client spfile if provided */
01507 
01508                 ostr = OCI_GetInputMetaString(spfile, &osize);
01509 
01510                 OCI_CALL2
01511                 (
01512                     res, con,
01513 
01514                     OCIAttrSet((dvoid *) adm, (ub4) OCI_HTYPE_ADMIN,
01515                                (dvoid *) ostr, (ub4) osize,
01516                                (ub4) OCI_ATTR_ADMIN_PFILE, con->err)
01517                 )
01518 
01519                 OCI_ReleaseMetaString(ostr);
01520             }
01521 
01522             /* startup DB */
01523 
01524             OCI_CALL2
01525             (
01526                 res, con,
01527 
01528                 OCIDBStartup(con->cxt, con->err, (OCIAdmin *) adm, OCI_DEFAULT, start_flag)
01529             )
01530 
01531             /* release security admin handle */
01532 
01533             if (adm != NULL)
01534             {
01535                 OCI_HandleFree(OCILib.err, OCI_HTYPE_ADMIN);
01536             }
01537 
01538             /* disconnect */
01539 
01540             OCI_ConnectionFree(con);
01541         }
01542         else
01543         {
01544             res = FALSE;
01545         }
01546     }
01547 
01548     if (res == TRUE)
01549     {
01550         /* connect without prelim mode */
01551 
01552         con = OCI_ConnectionCreate(db, user, pwd, sess_mode);
01553 
01554         /* alter database */
01555 
01556         if (con != NULL)
01557         {
01558             OCI_Statement *stmt = OCI_StatementCreate(con);
01559 
01560             /* mount database */
01561 
01562             if (start_mode & OCI_DB_SPM_MOUNT)
01563             {
01564                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE MOUNT")));
01565             }
01566 
01567             /* open database */
01568 
01569             if (start_mode & OCI_DB_SPM_OPEN)
01570             {
01571                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE OPEN")));
01572             }
01573 
01574             OCI_StatementFree(stmt);
01575 
01576             /* disconnect */
01577 
01578             OCI_ConnectionFree(con);
01579         }
01580         else
01581         {
01582             res = FALSE;
01583         }
01584     }
01585 
01586 #else
01587 
01588     res = FALSE;
01589 
01590     OCI_NOT_USED(db);
01591     OCI_NOT_USED(user);
01592     OCI_NOT_USED(pwd);
01593     OCI_NOT_USED(sess_mode);
01594     OCI_NOT_USED(start_mode);
01595     OCI_NOT_USED(start_flag);
01596     OCI_NOT_USED(spfile);
01597     OCI_NOT_USED(con);
01598 
01599 #endif
01600 
01601     OCI_RESULT(res);
01602 
01603     return res;
01604 }
01605 
01606 /* --------------------------------------------------------------------------------------------- *
01607  * OCI_DatabaseShutdown
01608  * --------------------------------------------------------------------------------------------- */
01609 
01610 boolean OCI_API OCI_DatabaseShutdown
01611 (
01612     const mtext *db,
01613     const mtext *user,
01614     const mtext *pwd,
01615     unsigned int sess_mode,
01616     unsigned int shut_mode,
01617     unsigned int shut_flag
01618 )
01619 {
01620     boolean res         = TRUE;
01621     OCI_Connection *con = NULL;
01622 
01623     OCI_CHECK_REMOTE_DBS_CONTROL_ENABLED(FALSE);
01624 
01625 #if OCI_VERSION_COMPILE >= OCI_10_2
01626 
01627     /* connect to server */
01628 
01629     con = OCI_ConnectionCreate(db, user, pwd, sess_mode);
01630 
01631     if (con != NULL)
01632     {
01633         /* delete current transaction before the abort */
01634 
01635         if ((con->trs != NULL) && (shut_flag == OCI_DB_SDF_ABORT))
01636         {
01637             OCI_TransactionFree(con->trs);
01638 
01639             con->trs = NULL;
01640         }
01641 
01642         /* start shutdown */
01643 
01644         if (shut_mode & OCI_DB_SDM_SHUTDOWN)
01645         {
01646             /* start shutdown process */
01647 
01648             OCI_CALL2
01649             (
01650                 res, con,
01651 
01652                 OCIDBShutdown(con->cxt, con->err, (OCIAdmin *) NULL, shut_flag)
01653             )
01654         }
01655 
01656         /* alter database if we are not in abort mode */
01657 
01658         if ((res == TRUE) && (shut_flag != OCI_DB_SDF_ABORT))
01659         {
01660             OCI_Statement *stmt = OCI_StatementCreate(con);
01661 
01662             /* close database */
01663 
01664             if (shut_mode & OCI_DB_SDM_CLOSE)
01665             {
01666                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE CLOSE NORMAL")));
01667             }
01668 
01669             /* unmount database */
01670 
01671             if (shut_mode & OCI_DB_SDM_DISMOUNT)
01672             {
01673                 res = (res && OCI_ExecuteStmt(stmt,MT( "ALTER DATABASE DISMOUNT")));
01674             }
01675 
01676             OCI_StatementFree(stmt);
01677 
01678             /* delete current transaction before the shutdown */
01679 
01680             if (con->trs != NULL)
01681             {
01682                 OCI_TransactionFree(con->trs);
01683 
01684                 con->trs = NULL;
01685             }
01686 
01687             /* do the final shutdown if we are not in abort mode */
01688 
01689             OCI_CALL2
01690             (
01691                 res, con,
01692 
01693                 OCIDBShutdown(con->cxt, con->err, (OCIAdmin *) 0, OCI_DBSHUTDOWN_FINAL)
01694             )
01695         }
01696 
01697         /* disconnect */
01698 
01699         OCI_ConnectionFree(con);
01700     }
01701     else
01702     {
01703         res = FALSE;
01704     }
01705 
01706 #else
01707 
01708     res = FALSE;
01709 
01710     OCI_NOT_USED(db);
01711     OCI_NOT_USED(user);
01712     OCI_NOT_USED(pwd);
01713     OCI_NOT_USED(sess_mode);
01714     OCI_NOT_USED(shut_mode);
01715     OCI_NOT_USED(shut_flag);
01716     OCI_NOT_USED(con);
01717 
01718 #endif
01719 
01720     OCI_RESULT(res);
01721 
01722     return res;
01723 }
01724 
01725 /* --------------------------------------------------------------------------------------------- *
01726  * OCI_SetHAHandler
01727  * --------------------------------------------------------------------------------------------- */
01728 
01729 boolean OCI_API OCI_SetHAHandler
01730 (
01731     POCI_HA_HANDLER  handler
01732 )
01733 {
01734     boolean  res      = TRUE;
01735     void    *callback = NULL;
01736 
01737     OCI_CHECK_INITIALIZED(FALSE)
01738 
01739     OCI_CHECK_HIGH_AVAILABILITY_ENABLED(FALSE)
01740 
01741     OCILib.ha_handler = handler;
01742 
01743     /* On MSVC, casting a function pointer to a data pointer generates a warning.
01744        As there is no other to way to do regarding the OCI API, let's disable this
01745        warning just the time to set the callback attribute to the environment handle */
01746 
01747 #ifdef _MSC_VER
01748 
01749     #pragma warning(disable: 4054)
01750 
01751 #endif
01752 
01753     if (handler)
01754     {
01755         callback = (void*) OCI_ProcHAEvent;
01756     }
01757 
01758 #ifdef _MSC_VER
01759 
01760     #pragma warning(default: 4054)
01761 
01762 #endif
01763 
01764     OCI_CALL3
01765     (
01766         res, OCILib.err,
01767 
01768         OCIAttrSet((dvoid *) OCILib.env, (ub4) OCI_HTYPE_ENV, (dvoid *) callback, 
01769                    (ub4) 0, (ub4) OCI_ATTR_EVTCBK, OCILib.err)
01770     )
01771 
01772     OCI_RESULT(res);
01773 
01774     return res;
01775 }