OCILIB (C Driver for Oracle) 3.12.1
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-2013 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, 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 
00472 #ifdef OCI_IMPORT_RUNTIME
00473 
00474     char path[OCI_SIZE_BUFFER+1];
00475 
00476     size_t len = (size_t) 0;
00477 
00478 #endif
00479 
00480     /* check if it was already initialized */
00481 
00482     if (OCILib.loaded == TRUE)
00483     {
00484         return TRUE;
00485     }
00486 
00487     memset(&OCILib, 0, sizeof(OCI_Library));
00488 
00489     OCILib.error_handler = err_handler;
00490 
00491     OCILib.version_compile = OCI_VERSION_COMPILE;
00492     OCILib.version_runtime = OCI_VERSION_RUNTIME;
00493 
00494     OCILib.env_mode = mode;
00495 
00496 #ifdef OCI_CHARSET_ANSI
00497 
00498     /* test for UTF8 environment */
00499 
00500     {
00501         char *str = getenv("NLS_LANG");
00502 
00503         if (str != NULL)
00504         {
00505             char nls_lang[OCI_SIZE_OBJ_NAME+1] = "";
00506 
00507             strncat(nls_lang, str, OCI_SIZE_OBJ_NAME);
00508 
00509             for (str = nls_lang; *str != 0; str++)
00510             {
00511                 *str = (char) toupper(*str);
00512             }
00513 
00514             OCILib.nls_utf8 = (strstr(nls_lang, "UTF8") != NULL);
00515         }
00516     }
00517 
00518 #endif
00519 
00520 #ifdef OCI_IMPORT_LINKAGE
00521 
00522     OCI_NOT_USED(lib_path);
00523 
00524     #if defined(OCI_BIG_UINT_ENABLED)
00525 
00526     OCILib.use_lob_ub8 = TRUE;
00527 
00528     #endif
00529 
00530     #if defined(OCI_STMT_SCROLLABLE_READONLY)
00531 
00532     OCILib.use_scrollable_cursors = TRUE;
00533 
00534     #endif
00535 
00536 #else
00537 
00538     memset(path, 0, sizeof(path));
00539 
00540     #if defined(OCI_CHARSET_WIDE)
00541 
00542     if (lib_path != NULL && lib_path[0] != 0)
00543     {
00544         len = wcstombs(path, lib_path, sizeof(path));
00545     }
00546 
00547     #else
00548 
00549     if (lib_path != NULL && lib_path[0] != 0)
00550     {
00551         strncat(path, lib_path, sizeof(path) - strlen(path));
00552 
00553         len = strlen(path);
00554     }
00555 
00556     #endif
00557 
00558     if ((len > (size_t) 0) && (len < sizeof(path)) && (path[len - (size_t) 1] != OCI_CHAR_SLASH))
00559     {
00560         path[len] = OCI_CHAR_SLASH;
00561         len++;
00562     }
00563 
00564     strncat(path, OCI_DL_ANSI_NAME, sizeof(path) - len);
00565 
00566     OCILib.lib_handle = LIB_OPEN(path);
00567 
00568     if (OCILib.lib_handle != NULL)
00569     {
00570 
00571         /* Now loading all symbols - no check is performed on each function,
00572            Basic checks will be done to ensure we're loading an
00573            Oracle and compatible library ...
00574         */
00575 
00576         LIB_SYMBOL(OCILib.lib_handle, "OCIEnvCreate", OCIEnvCreate,
00577                    OCIENVCREATE);
00578 
00579         LIB_SYMBOL(OCILib.lib_handle, "OCIServerAttach", OCIServerAttach,
00580                    OCISERVERATTACH);
00581         LIB_SYMBOL(OCILib.lib_handle, "OCIServerDetach", OCIServerDetach,
00582                    OCISERVERDETACH);
00583 
00584         LIB_SYMBOL(OCILib.lib_handle, "OCIHandleAlloc", OCIHandleAlloc,
00585                    OCIHANDLEALLOC);
00586         LIB_SYMBOL(OCILib.lib_handle, "OCIHandleFree",  OCIHandleFree,
00587                    OCIHANDLEFREE);
00588 
00589         LIB_SYMBOL(OCILib.lib_handle, "OCIDescriptorAlloc", OCIDescriptorAlloc,
00590                    OCIDESCRIPTORALLOC);
00591         LIB_SYMBOL(OCILib.lib_handle, "OCIDescriptorFree", OCIDescriptorFree,
00592                    OCIDESCRIPTORFREE);
00593 
00594         LIB_SYMBOL(OCILib.lib_handle, "OCIAttrSet", OCIAttrSet,
00595                    OCIATTRSET);
00596         LIB_SYMBOL(OCILib.lib_handle, "OCIAttrGet", OCIAttrGet,
00597                    OCIATTRGET);
00598 
00599         LIB_SYMBOL(OCILib.lib_handle, "OCIParamSet", OCIParamSet,
00600                    OCIPARAMSET);
00601         LIB_SYMBOL(OCILib.lib_handle, "OCIParamGet", OCIParamGet,
00602                    OCIPARAMGET);
00603 
00604         LIB_SYMBOL(OCILib.lib_handle, "OCISessionBegin", OCISessionBegin,
00605                    OCISESSIONBEGIN);
00606         LIB_SYMBOL(OCILib.lib_handle, "OCISessionEnd", OCISessionEnd,
00607                    OCISESSIONEND);
00608 
00609         LIB_SYMBOL(OCILib.lib_handle, "OCIPasswordChange", OCIPasswordChange,
00610                    OCIPASSWORDCHANGE);
00611 
00612         LIB_SYMBOL(OCILib.lib_handle, "OCITransStart", OCITransStart,
00613                    OCITRANSSTART);
00614         LIB_SYMBOL(OCILib.lib_handle, "OCITransDetach", OCITransDetach,
00615                    OCITRANSDETACH);
00616         LIB_SYMBOL(OCILib.lib_handle, "OCITransPrepare", OCITransPrepare,
00617                    OCITRANSPREPARE);
00618         LIB_SYMBOL(OCILib.lib_handle, "OCITransForget", OCITransForget,
00619                    OCITRANSFORGET);
00620         LIB_SYMBOL(OCILib.lib_handle, "OCITransCommit", OCITransCommit,
00621                    OCITRANSCOMMIT);
00622         LIB_SYMBOL(OCILib.lib_handle, "OCITransRollback", OCITransRollback,
00623                    OCITRANSROLLBACK);
00624 
00625         LIB_SYMBOL(OCILib.lib_handle, "OCIErrorGet",  OCIErrorGet,
00626                    OCIERRORGET);
00627         LIB_SYMBOL(OCILib.lib_handle, "OCIServerVersion", OCIServerVersion,
00628                    OCISERVERVERSION);
00629         LIB_SYMBOL(OCILib.lib_handle, "OCIBreak", OCIBreak,
00630                    OCIBREAK);
00631 
00632         LIB_SYMBOL(OCILib.lib_handle, "OCIBindByPos", OCIBindByPos,
00633                    OCIBINDBYPOS);
00634         LIB_SYMBOL(OCILib.lib_handle, "OCIBindByName", OCIBindByName,
00635                    OCIBINDBYNAME);
00636         LIB_SYMBOL(OCILib.lib_handle, "OCIBindDynamic", OCIBindDynamic,
00637                    OCIBINDDYNAMIC);
00638         LIB_SYMBOL(OCILib.lib_handle, "OCIBindObject", OCIBindObject,
00639                    OCIBINDOBJECT);
00640 
00641         LIB_SYMBOL(OCILib.lib_handle, "OCIDefineByPos", OCIDefineByPos,
00642                    OCIDEFINEBYPOS);
00643         LIB_SYMBOL(OCILib.lib_handle, "OCIDefineObject", OCIDefineObject,
00644                    OCIDEFINEOBJECT);
00645 
00646         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtPrepare", OCIStmtPrepare,
00647                    OCISTMTPREPARE);
00648         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtExecute", OCIStmtExecute,
00649                    OCISTMTEXECUTE);
00650         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtFetch", OCIStmtFetch,
00651                    OCISTMTFETCH);
00652         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtFetch2", OCIStmtFetch2,
00653                    OCISTMTFETCH2);
00654 
00655         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtGetPieceInfo", OCIStmtGetPieceInfo,
00656                    OCISTMTGETPIECEINFO);
00657         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtSetPieceInfo", OCIStmtSetPieceInfo,
00658                    OCISTMTSETPIECEINFO);
00659 
00660         LIB_SYMBOL(OCILib.lib_handle, "OCILobCreateTemporary", OCILobCreateTemporary,
00661                    OCILOBCREATETEMPORARY);
00662         LIB_SYMBOL(OCILib.lib_handle, "OCILobFreeTemporary", OCILobFreeTemporary,
00663                    OCILOBFREETEMPORARY);
00664         LIB_SYMBOL(OCILib.lib_handle, "OCILobIsTemporary", OCILobIsTemporary,
00665                    OCILOBISTEMPORARY);
00666         LIB_SYMBOL(OCILib.lib_handle, "OCILobRead", OCILobRead,
00667                    OCILOBREAD);
00668         LIB_SYMBOL(OCILib.lib_handle, "OCILobWrite", OCILobWrite,
00669                    OCILOBWRITE);
00670         LIB_SYMBOL(OCILib.lib_handle, "OCILobCopy", OCILobCopy,
00671                    OCILOBCOPY);
00672         LIB_SYMBOL(OCILib.lib_handle, "OCILobTrim", OCILobTrim,
00673                    OCILOBTRIM);
00674         LIB_SYMBOL(OCILib.lib_handle, "OCILobErase", OCILobErase,
00675                    OCILOBERASE);
00676         LIB_SYMBOL(OCILib.lib_handle, "OCILobAppend", OCILobAppend,
00677                    OCILOBAPPEND);
00678         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetLength", OCILobGetLength,
00679                    OCILOBGETLENGTH);
00680         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetChunkSize", OCILobGetChunkSize,
00681                    OCILOBGETCHUNKSIZE);
00682         LIB_SYMBOL(OCILib.lib_handle, "OCILobOpen", OCILobOpen,
00683                    OCILOBOPEN);
00684         LIB_SYMBOL(OCILib.lib_handle, "OCILobClose", OCILobClose,
00685                    OCILOBCLOSE);
00686 
00687     #ifdef ORAXB8_DEFINED
00688 
00689         LIB_SYMBOL(OCILib.lib_handle, "OCILobCopy2", OCILobCopy2,
00690                    OCILOBCOPY2);
00691         LIB_SYMBOL(OCILib.lib_handle, "OCILobErase2", OCILobErase2,
00692                    OCILOBERASE2);
00693         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetLength2", OCILobGetLength2,
00694                    OCILOBGETLENGTH2);
00695         LIB_SYMBOL(OCILib.lib_handle, "OCILobLoadFromFile2", OCILobLoadFromFile2,
00696                    OCILOBLOADFROMFILE2);
00697         LIB_SYMBOL(OCILib.lib_handle, "OCILobRead2", OCILobRead2,
00698                    OCILOBREAD2);
00699         LIB_SYMBOL(OCILib.lib_handle, "OCILobTrim2", OCILobTrim2,
00700                    OCILOBTRIM2);
00701         LIB_SYMBOL(OCILib.lib_handle, "OCILobWrite2", OCILobWrite2,
00702                    OCILOBWRITE2);
00703         LIB_SYMBOL(OCILib.lib_handle, "OCILobWriteAppend2", OCILobWriteAppend2,
00704                    OCILOBWRITEAPPEND2);
00705 
00706     #endif
00707 
00708         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileOpen", OCILobFileOpen,
00709                    OCILOBFILEOPEN);
00710         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileClose", OCILobFileClose,
00711                    OCILOBFILECLOSE);
00712         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileCloseAll", OCILobFileCloseAll,
00713                    OCILOBFILECLOSEALL);
00714         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileIsOpen", OCILobFileIsOpen,
00715                    OCILOBFILEISOPEN);
00716         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileExists", OCILobFileExists,
00717                    OCILOBFILEEXISTS);
00718         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileGetName", OCILobFileGetName,
00719                    OCILOBFIELGETNAME);
00720         LIB_SYMBOL(OCILib.lib_handle, "OCILobFileSetName", OCILobFileSetName,
00721                    OCILOBFILESETNAME);
00722         LIB_SYMBOL(OCILib.lib_handle, "OCILobLoadFromFile", OCILobLoadFromFile,
00723                    OCILOBLOADFROMFILE);
00724         LIB_SYMBOL(OCILib.lib_handle, "OCILobWriteAppend", OCILobWriteAppend,
00725                    OCILOBWRITEAPPEND);
00726         LIB_SYMBOL(OCILib.lib_handle, "OCILobIsEqual", OCILobIsEqual,
00727                    OCILOBISEQUAL);
00728         LIB_SYMBOL(OCILib.lib_handle, "OCILobAssign", OCILobAssign,
00729                    OCILOBASSIGN);
00730         LIB_SYMBOL(OCILib.lib_handle, "OCILobLocatorAssign", OCILobLocatorAssign,
00731                    OCILOBLOCATORASSIGN);
00732         LIB_SYMBOL(OCILib.lib_handle, "OCILobFlushBuffer", OCILobFlushBuffer,
00733                    OCILOBFLUSHBUFFER);
00734         LIB_SYMBOL(OCILib.lib_handle, "OCILobGetStorageLimit", OCILobGetStorageLimit,
00735                    OCILOBGETSTORAGELIMIT);
00736         LIB_SYMBOL(OCILib.lib_handle, "OCILobEnableBuffering", OCILobEnableBuffering,
00737                    OCILOBENABLEBUFFERING);
00738         LIB_SYMBOL(OCILib.lib_handle, "OCILobDisableBuffering", OCILobDisableBuffering,
00739                    OCILOBDISABLEBUFFERING);
00740 
00741         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAssign", OCIDateAssign,
00742                    OCIDATEASSIGN);
00743         LIB_SYMBOL(OCILib.lib_handle, "OCIDateToText", OCIDateToText,
00744                    OCIDATETOTEXT);
00745         LIB_SYMBOL(OCILib.lib_handle, "OCIDateFromText", OCIDateFromText,
00746                    OCIDATEFROMTEXT);
00747         LIB_SYMBOL(OCILib.lib_handle, "OCIDateCompare", OCIDateCompare,
00748                    OCIDATECOMPARE);
00749         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAddMonths", OCIDateAddMonths,
00750                    OCIDATEADDMONTHS);
00751         LIB_SYMBOL(OCILib.lib_handle, "OCIDateAddDays", OCIDateAddDays,
00752                    OCIDATEADDDAYS);
00753         LIB_SYMBOL(OCILib.lib_handle, "OCIDateLastDay", OCIDateLastDay,
00754                    OCIDATELASTDAY);
00755         LIB_SYMBOL(OCILib.lib_handle, "OCIDateDaysBetween", OCIDateDaysBetween,
00756                    OCIDATEDAYSBETWEEN);
00757         LIB_SYMBOL(OCILib.lib_handle, "OCIDateZoneToZone", OCIDateZoneToZone,
00758                    OCIDATEZONETOZONE);
00759         LIB_SYMBOL(OCILib.lib_handle, "OCIDateNextDay", OCIDateNextDay,
00760                    OCIDATENEXTDAY);
00761         LIB_SYMBOL(OCILib.lib_handle, "OCIDateCheck", OCIDateCheck,
00762                    OCIDATECHECK);
00763         LIB_SYMBOL(OCILib.lib_handle, "OCIDateSysDate", OCIDateSysDate,
00764                    OCIDATESYSDATE);
00765         LIB_SYMBOL(OCILib.lib_handle, "OCIDescribeAny", OCIDescribeAny,
00766                    OCIDESCRIBEANY);
00767 
00768         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalAssign", OCIIntervalAssign,
00769                    OCIINTERVALASSIGN);
00770         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalCheck", OCIIntervalCheck,
00771                    OCIINTERVALCHECK);
00772         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalCompare", OCIIntervalCompare,
00773                    OCIINTERVALCOMPARE);
00774         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalFromText", OCIIntervalFromText,
00775                    OCIINTERVALFROMTEXT);
00776         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalToText", OCIIntervalToText,
00777                    OCIINTERVALTOTEXT);
00778         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalFromTZ", OCIIntervalFromTZ,
00779                    OCIINTERVALFROMTZ);
00780         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalGetDaySecond", OCIIntervalGetDaySecond,
00781                    OCIINTERVALGETDAYSECOND);
00782         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalGetYearMonth", OCIIntervalGetYearMonth,
00783                    OCIINTERVALGETYEARMONTH);
00784         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSetDaySecond", OCIIntervalSetDaySecond,
00785                    OCIINTERVALSETDAYSECOND);
00786         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSetYearMonth", OCIIntervalSetYearMonth,
00787                    OCIINTERVALSETYEARMONTH);
00788         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalSubtract", OCIIntervalSubtract,
00789                    OCIINTERVALSUBTRACT);
00790         LIB_SYMBOL(OCILib.lib_handle, "OCIIntervalAdd", OCIIntervalAdd,
00791                    OCIINTERVALADD);
00792 
00793         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeAssign", OCIDateTimeAssign,
00794                    OCIDATETIMEASSIGN);
00795         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeCheck", OCIDateTimeCheck,
00796                    OCIDATETIMECHECK);
00797         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeCompare", OCIDateTimeCompare,
00798                    OCIDATETIMECOMPARE);
00799         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeConstruct", OCIDateTimeConstruct,
00800                    OCIDATETIMECONSTRUCT);
00801         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeConvert", OCIDateTimeConvert,
00802                    OCIDATETIMECONVERT);
00803         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeFromArray", OCIDateTimeFromArray,
00804                    OCIDATETIMEFROMARRAY);
00805         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeToArray", OCIDateTimeToArray,
00806                    OCIDATETIMETOARRAY);
00807         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeFromText", OCIDateTimeFromText,
00808                    OCIDATETIMEFROMTEXT);
00809         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeToText", OCIDateTimeToText,
00810                    OCIDATETIMETOTEXT);
00811         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetDate", OCIDateTimeGetDate,
00812                    OCIDATETIMEGETDATE);
00813         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTime", OCIDateTimeGetTime,
00814                    OCIDATETIMEGETTIME);
00815         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTimeZoneName", OCIDateTimeGetTimeZoneName,
00816                    OCIDATETIMEGETTIMEZONENAME);
00817         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeGetTimeZoneOffset", OCIDateTimeGetTimeZoneOffset,
00818                    OCIDATETIMEGETTIMEZONEOFFSET);
00819         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeIntervalAdd", OCIDateTimeIntervalAdd,
00820                    OCIDATETIMEINTERVALADD);
00821         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeIntervalSub", OCIDateTimeIntervalSub,
00822                    OCIDATETIMEINTERVALSUB);
00823         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeSubtract", OCIDateTimeSubtract,
00824                    OCIDATETIMESUBTRACT);
00825         LIB_SYMBOL(OCILib.lib_handle, "OCIDateTimeSysTimeStamp", OCIDateTimeSysTimeStamp,
00826                    OCIDATETIMESYSTIMESTAMP);
00827 
00828         LIB_SYMBOL(OCILib.lib_handle, "OCITypeByName", OCITypeByName,
00829                    OCITYPEBYNAME);
00830 
00831         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToInt", OCINumberToInt,
00832                    OCINUMBERTOINT);
00833         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromInt", OCINumberFromInt,
00834                    OCINUMBERFROMINT);
00835 
00836         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToReal", OCINumberToReal,
00837                    OCINUMBERTOREAL);
00838         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromReal", OCINumberFromReal,
00839                    OCINUMBERFROMREAL);
00840 
00841         LIB_SYMBOL(OCILib.lib_handle, "OCINumberToText", OCINumberToText,
00842                    OCINUMBERTOTEXT);
00843         LIB_SYMBOL(OCILib.lib_handle, "OCINumberFromText", OCINumberFromText,
00844                    OCINUMBERFROMTEXT);
00845 
00846         LIB_SYMBOL(OCILib.lib_handle, "OCIStringPtr", OCIStringPtr,
00847                    OCISTRINGPTR);
00848         LIB_SYMBOL(OCILib.lib_handle, "OCIStringAssignText", OCIStringAssignText,
00849                    OCISTRINGASSIGNTEXT);
00850 
00851         LIB_SYMBOL(OCILib.lib_handle, "OCIRawPtr", OCIRawPtr,
00852                    OCIRAWPTR);
00853         LIB_SYMBOL(OCILib.lib_handle, "OCIRawAssignBytes", OCIRawAssignBytes,
00854                    OCIRAWASSIGNBYTES);
00855         LIB_SYMBOL(OCILib.lib_handle, "OCIRawResize", OCIRawResize,
00856                    OCIRAWRESIZE);
00857         LIB_SYMBOL(OCILib.lib_handle, "OCIRawAllocSize", OCIRawAllocSize,
00858                    OCIRAWALLOCSIZE);
00859         LIB_SYMBOL(OCILib.lib_handle, "OCIRawSize", OCIRawSize,
00860                    OCIRAWSIZE);
00861 
00862         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectNew", OCIObjectNew,
00863                    OCIOBJECTNEW);
00864         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectFree", OCIObjectFree,
00865                    OCIOBJECTFREE);
00866         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectSetAttr", OCIObjectSetAttr,
00867                    OCIOBJECTSETATTR);
00868         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetAttr", OCIObjectGetAttr,
00869                    OCIOBJECTGETATTR);
00870         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectPin", OCIObjectPin,
00871                    OCIOBJECTPIN);
00872         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectUnpin", OCIObjectUnpin,
00873                    OCIOBJECTUNPIN);
00874         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectCopy", OCIObjectCopy,
00875                    OCIOBJECTCOPY);
00876         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetObjectRef", OCIObjectGetObjectRef,
00877                    OCIOBJECTGETOBJECTREF);
00878         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetProperty", OCIObjectGetProperty,
00879                    OCIOBJECTGETPROPERTY);
00880         LIB_SYMBOL(OCILib.lib_handle, "OCIObjectGetInd", OCIObjectGetInd,
00881                    OCIOBJECTGETIND);
00882 
00883         LIB_SYMBOL(OCILib.lib_handle, "OCIRefAssign", OCIRefAssign,
00884                    OCIREFASSIGN);
00885         LIB_SYMBOL(OCILib.lib_handle, "OCIRefIsNull", OCIRefIsNull,
00886                    OCIREFISNULL);
00887         LIB_SYMBOL(OCILib.lib_handle, "OCIRefClear", OCIRefClear,
00888                    OCIREFCLEAR);
00889         LIB_SYMBOL(OCILib.lib_handle, "OCIRefToHex", OCIRefToHex,
00890                    OCIREFTOHEX);
00891         LIB_SYMBOL(OCILib.lib_handle, "OCIRefHexSize", OCIRefHexSize,
00892                    OCIREFHEXSIZE);
00893 
00894         LIB_SYMBOL(OCILib.lib_handle, "OCIArrayDescriptorAlloc", OCIArrayDescriptorAlloc,
00895                    OCIARRAYDESCRIPTORALLOC);
00896         LIB_SYMBOL(OCILib.lib_handle, "OCIArrayDescriptorFree", OCIArrayDescriptorFree,
00897                    OCIARRAYDESCRIPTORFREE);
00898 
00899         LIB_SYMBOL(OCILib.lib_handle, "OCIClientVersion", OCIClientVersion,
00900                    OCICLIENTVERSION);
00901 
00902         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadProcessInit", OCIThreadProcessInit,
00903                    OCITHREADPROCESSINIT);
00904         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadInit", OCIThreadInit,
00905                    OCITHREADINIT);
00906         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadTerm", OCIThreadTerm,
00907                    OCITHREADTERM);
00908 
00909         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadIdInit", OCIThreadIdInit,
00910                    OCITHREADIDINIT);
00911         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadIdDestroy", OCIThreadIdDestroy,
00912                    OCITHREADIDDESTROY);
00913         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadHndInit", OCIThreadHndInit,
00914                    OCITHREADHNDINIT);
00915         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadHndDestroy", OCIThreadHndDestroy,
00916                    OCITHREADHNDDESTROY);
00917         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadCreate", OCIThreadCreate,
00918                    OCITHREADCREATE);
00919         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadJoin", OCIThreadJoin,
00920                    OCITHREADJOIN);
00921         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadClose", OCIThreadClose,
00922                    OCITHREADCLOSE);
00923 
00924         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexInit", OCIThreadMutexInit,
00925                    OCITHREADMUTEXINIT);
00926         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexDestroy", OCIThreadMutexDestroy,
00927                    OCITHREADMUTEXDESTROY);
00928         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexAcquire", OCIThreadMutexAcquire,
00929                    OCITHREADMUTEXACQUIRE);
00930         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadMutexRelease", OCIThreadMutexRelease,
00931                    OCITHREADMUTEXRELEASE);
00932 
00933         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyInit", OCIThreadKeyInit,
00934                    OCITHREADKEYINIT);
00935         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyDestroy", OCIThreadKeyDestroy,
00936                    OCITHREADKEYDESTROY);
00937         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeySet", OCIThreadKeySet,
00938                    OCITHREADKEYSET);
00939         LIB_SYMBOL(OCILib.lib_handle, "OCIThreadKeyGet", OCIThreadKeyGet,
00940                    OCITHREADKEYGET);
00941 
00942         LIB_SYMBOL(OCILib.lib_handle, "OCIConnectionPoolCreate", OCIConnectionPoolCreate,
00943                    OCICONNECTIONPOOLCREATE);
00944         LIB_SYMBOL(OCILib.lib_handle, "OCIConnectionPoolDestroy", OCIConnectionPoolDestroy,
00945                    OCICONNECTIONPOOLDESTROY);
00946 
00947         LIB_SYMBOL(OCILib.lib_handle, "OCISessionPoolCreate", OCISessionPoolCreate,
00948                    OCISESSIONPOOLCREATE);
00949         LIB_SYMBOL(OCILib.lib_handle, "OCISessionPoolDestroy", OCISessionPoolDestroy,
00950                    OCISESSIONPOOLDESTROY);
00951 
00952         LIB_SYMBOL(OCILib.lib_handle, "OCISessionGet", OCISessionGet,
00953                    OCISESSIONGET);
00954         LIB_SYMBOL(OCILib.lib_handle, "OCISessionRelease", OCISessionRelease,
00955                    OCISESSIONRELEASE);
00956 
00957         LIB_SYMBOL(OCILib.lib_handle, "OCICollSize", OCICollSize,
00958                    OCICOLLSIZE);
00959         LIB_SYMBOL(OCILib.lib_handle, "OCICollMax", OCICollMax,
00960                    OCICOLLMAX);
00961         LIB_SYMBOL(OCILib.lib_handle, "OCICollGetElem", OCICollGetElem,
00962                    OCICOLLGETITEM);
00963         LIB_SYMBOL(OCILib.lib_handle, "OCICollAssignElem", OCICollAssignElem,
00964                    OCICOLLASSIGNELEM);
00965         LIB_SYMBOL(OCILib.lib_handle, "OCICollAssign", OCICollAssign,
00966                    OCICOLLASSIGN);
00967         LIB_SYMBOL(OCILib.lib_handle, "OCICollAppend", OCICollAppend,
00968                    OCICOLLAPPEND);
00969         LIB_SYMBOL(OCILib.lib_handle, "OCICollTrim", OCICollTrim,
00970                    OCICOLLTRIM);
00971 
00972         LIB_SYMBOL(OCILib.lib_handle, "OCIIterCreate", OCIIterCreate,
00973                    OCIITERCREATE);
00974         LIB_SYMBOL(OCILib.lib_handle, "OCIIterDelete", OCIIterDelete,
00975                    OCIITERDELETE);
00976         LIB_SYMBOL(OCILib.lib_handle, "OCIIterInit", OCIIterInit,
00977                    OCIITERINIT);
00978         LIB_SYMBOL(OCILib.lib_handle, "OCIIterNext", OCIIterNext,
00979                    OCIITERNEXT);
00980         LIB_SYMBOL(OCILib.lib_handle, "OCIIterPrev", OCIIterPrev,
00981                    OCIITERPREV);
00982 
00983         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathAbort", OCIDirPathAbort,
00984                    OCIDIRPATHABORT);
00985         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathDataSave", OCIDirPathDataSave,
00986                    OCIDIRPATHDATASAVE);
00987         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathFinish", OCIDirPathFinish,
00988                    OCIDIRPATHFINISH);
00989         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathPrepare", OCIDirPathPrepare,
00990                    OCIDIRPATHPREPARE);
00991         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathLoadStream", OCIDirPathLoadStream,
00992                    OCIDIRPATHLOADSTREAM);
00993         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayEntrySet", OCIDirPathColArrayEntrySet,
00994                    OCIDIRPATHCOLARRAYENTRYSET);
00995         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayReset", OCIDirPathColArrayReset,
00996                    OCIDIRPATHCOLARRAYRESET);
00997         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathColArrayToStream", OCIDirPathColArrayToStream,
00998                    OCIDIRPATHCOLARRAYTOSTREAM);
00999         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathStreamReset", OCIDirPathStreamReset,
01000                    OCIDIRPATHSTREAMRESET);
01001         LIB_SYMBOL(OCILib.lib_handle, "OCIDirPathFlushRow", OCIDirPathFlushRow,
01002                    OCIDIRPATHFLUSHROW);
01003 
01004         LIB_SYMBOL(OCILib.lib_handle, "OCICacheFree", OCICacheFree,
01005                    OCICACHEFREE);
01006         LIB_SYMBOL(OCILib.lib_handle, "OCIPing", OCIPing,
01007                    OCIPING);
01008 
01009         LIB_SYMBOL(OCILib.lib_handle, "OCIDBStartup", OCIDBStartup,
01010                    OCIDBSTARTUP);
01011         LIB_SYMBOL(OCILib.lib_handle, "OCIDBShutdown", OCIDBShutdown,
01012                    OCIDBSHUTDOWN);
01013 
01014         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtPrepare2", OCIStmtPrepare2,
01015                    OCISTMTPREPARE2);
01016         LIB_SYMBOL(OCILib.lib_handle, "OCIStmtRelease", OCIStmtRelease,
01017                    OCISTMTRELEASE);
01018 
01019         LIB_SYMBOL(OCILib.lib_handle, "OCISubscriptionRegister", OCISubscriptionRegister,
01020                    OCISUBSCRIPTIONREGISTER);
01021         LIB_SYMBOL(OCILib.lib_handle, "OCISubscriptionUnRegister", OCISubscriptionUnRegister,
01022                    OCISUBSCRIPTIONUNREGISTER);
01023 
01024         LIB_SYMBOL(OCILib.lib_handle, "OCIAQEnq", OCIAQEnq,
01025                    OCIAQENQ);
01026         LIB_SYMBOL(OCILib.lib_handle, "OCIAQDeq", OCIAQDeq,
01027                    OCIAQDEQ);
01028         LIB_SYMBOL(OCILib.lib_handle, "OCIAQListen", OCIAQListen,
01029                    OCIAQLISTEN);
01030 
01031         LIB_SYMBOL(OCILib.lib_handle, "xaoSvcCtx", xaoSvcCtx,
01032                    XAOSVCCTX);
01033         LIB_SYMBOL(OCILib.lib_handle, "xaoEnv", xaoEnv,
01034                    XAOENV);
01035 
01036         /* API Version checking */
01037 
01038         if (OCIArrayDescriptorFree != NULL)
01039         {
01040             OCILib.version_runtime = OCI_11_1;
01041         }
01042         else if (OCIClientVersion != NULL)
01043         {
01044             OCILib.version_runtime = OCI_10_2;
01045         }
01046         else if (OCILobWrite2 != NULL)
01047         {
01048             OCILib.version_runtime = OCI_10_1;
01049         }
01050         else if (OCIStmtPrepare2  != NULL)
01051         {
01052             OCILib.version_runtime = OCI_9_2;
01053         }
01054         else if (OCIDateTimeGetTimeZoneName != NULL)
01055         {
01056             OCILib.version_runtime = OCI_9_0;
01057         }
01058         else if (OCIThreadProcessInit != NULL)
01059         {
01060             OCILib.version_runtime = OCI_8_1;
01061         }
01062         else if (OCIEnvCreate != NULL)
01063         {
01064             OCILib.version_runtime = OCI_8_0;
01065         }
01066         else
01067         {
01068             LIB_CLOSE(OCILib.lib_handle);
01069 
01070             OCI_ExceptionLoadingSymbols();
01071 
01072             res = FALSE;
01073         }
01074     }
01075     else
01076     {
01077         OCI_ExceptionLoadingSharedLib();
01078 
01079         res = FALSE;
01080     }
01081 
01082     if (res == TRUE)
01083     {
01084 
01085     #if defined(OCI_BIG_UINT_ENABLED)
01086 
01087         if ((OCILib.version_runtime >= OCI_10_1) && (OCILobCopy2 != NULL))
01088         {
01089             OCILib.use_lob_ub8 = TRUE;
01090         }
01091 
01092     #endif
01093 
01094     #if defined(OCI_STMT_SCROLLABLE_READONLY)
01095 
01096         if ((OCILib.version_runtime >= OCI_9_0) && (OCIStmtFetch2 != NULL))
01097         {
01098             OCILib.use_scrollable_cursors = TRUE;
01099         }
01100 
01101     #endif
01102 
01103     }
01104 
01105 #endif
01106 
01107 #if defined(OCI_CHARSET_WIDE)
01108 
01109     /* Oracle 8i does not support full Unicode mode */
01110 
01111     if ((res == TRUE) && (OCILib.version_runtime < OCI_9_0))
01112     {
01113         OCI_ExceptionNotAvailable(NULL, OCI_FEATURE_WIDE_USERDATA);
01114 
01115         res = FALSE;
01116     }
01117 
01118 #endif
01119 
01120     /* Initialize OCI environment */
01121 
01122     if (res == TRUE)
01123     {
01124         ub4 oci_mode = OCI_ENV_MODE | OCI_OBJECT;
01125     
01126         /* check modes */
01127 
01128         if (mode & OCI_ENV_THREADED)
01129         {
01130             oci_mode |= OCI_THREADED;
01131         }
01132 
01133         if (mode & OCI_ENV_EVENTS)
01134         {
01135             oci_mode |= OCI_EVENTS;
01136         }
01137 
01138         /* create environment on success */
01139 
01140         res = res && (OCI_SUCCESS == OCIEnvCreate(&OCILib.env, oci_mode,
01141                                                   (dvoid *) NULL, NULL, NULL, NULL,
01142                                                   (size_t) 0, (dvoid **) NULL));
01143 
01144         if (res == FALSE)
01145         {
01146             OCI_ExceptionOCIEnvironment();
01147         }
01148 
01149         /*  allocate error handle */
01150 
01151         res = res && (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) OCILib.env,
01152                                                      (dvoid **) (void *) &OCILib.err,
01153                                                      (ub4) OCI_HTYPE_ERROR,
01154                                                      (size_t) 0, (dvoid **) NULL));
01155     }
01156 
01157     /* on success, we need to initialize OCIThread object support */
01158 
01159     if (res == TRUE)
01160     {
01161         if (OCI_LIB_THREADED)
01162         {
01163             OCIThreadProcessInit();
01164 
01165             res = (OCI_SUCCESS == OCIThreadInit(OCILib.env, OCILib.err));
01166         }
01167 
01168         /* create thread key for thread errors */
01169 
01170         OCILib.key_errs = OCI_ThreadKeyCreateInternal((POCI_THREADKEYDEST) OCI_ErrorFree);
01171 
01172         /* allocate connections internal list */
01173 
01174         if (res == TRUE)
01175         {
01176             OCILib.cons = OCI_ListCreate(OCI_IPC_CONNECTION);
01177 
01178             res = (OCILib.cons != NULL);
01179         }
01180 
01181         /* allocate pools internal list */
01182 
01183         if (res == TRUE)
01184         {
01185 
01186             OCILib.pools = OCI_ListCreate(OCI_IPC_POOL);
01187 
01188             res = (OCILib.pools != NULL);
01189         }
01190 
01191     #if OCI_VERSION_COMPILE >= OCI_10_2
01192 
01193         /* allocate connection pools internal list */
01194 
01195         if (res == TRUE)
01196         {
01197 
01198             OCILib.subs = OCI_ListCreate(OCI_IPC_NOTIFY);
01199 
01200             res = (OCILib.subs != NULL);
01201         }
01202 
01203     #endif
01204 
01205         if (res == TRUE)
01206         {
01207 
01208             OCILib.arrs = OCI_ListCreate(OCI_IPC_ARRAY);
01209 
01210             res = (OCILib.arrs != NULL);
01211         }
01212     }
01213 
01214     if (res == TRUE)
01215     {
01216         OCILib.loaded = TRUE;
01217     }
01218 
01219     /* test for XA support */
01220 
01221 #ifdef _WINDOWS               
01222     #if OCI_VERSION_COMPILE >= OCI_10_1     
01223         OCILib.use_xa = (xaoEnv != NULL);
01224     #else
01225         OCILib.use_xa = FALSE;
01226     #endif
01227 #else
01228     OCILib.use_xa = TRUE;
01229 #endif
01230 
01231     return res;
01232 }
01233 
01234 /* --------------------------------------------------------------------------------------------- *
01235  * OCI_Cleanup
01236  * --------------------------------------------------------------------------------------------- */
01237 
01238 boolean OCI_API OCI_Cleanup
01239 (
01240     void
01241 )
01242 {
01243     boolean res = TRUE;
01244 
01245     /* free all arrays */
01246 
01247     OCI_ListForEach(OCILib.arrs, (POCI_LIST_FOR_EACH) OCI_ArrayClose);
01248     OCI_ListClear(OCILib.arrs);
01249 
01250     /* free all subscriptions */
01251 
01252     OCI_ListForEach(OCILib.subs, (POCI_LIST_FOR_EACH) OCI_SubscriptionClose);
01253     OCI_ListClear(OCILib.subs);
01254 
01255     /* free all connections */
01256 
01257     OCI_ListForEach(OCILib.cons, (POCI_LIST_FOR_EACH) OCI_ConnectionClose);
01258     OCI_ListClear(OCILib.cons);
01259 
01260     /* free all pools */
01261 
01262     OCI_ListForEach(OCILib.pools, (POCI_LIST_FOR_EACH) OCI_PoolClose);
01263     OCI_ListClear(OCILib.pools);
01264 
01265     /* free objects */
01266 
01267     OCI_KeyMapFree();
01268 
01269     OCI_ListFree(OCILib.cons);
01270     OCI_ListFree(OCILib.pools);
01271     OCI_ListFree(OCILib.subs);
01272     OCI_ListFree(OCILib.arrs);
01273 
01274     OCILib.cons    = NULL;
01275     OCILib.pools   = NULL;
01276     OCILib.subs    = NULL;
01277     OCILib.key_map = NULL;
01278 
01279     /* finalize OCIThread object support */
01280 
01281     if (OCI_LIB_THREADED)
01282     {
01283         OCI_CALL0
01284         (
01285             res, OCILib.err,
01286 
01287             OCIThreadTerm(OCILib.env, OCILib.err)
01288         )
01289     }
01290 
01291     /* free error thread key */
01292 
01293     if (OCILib.key_errs != NULL)
01294     {
01295         OCI_ThreadKey *key = OCILib.key_errs;
01296         OCI_Error *err     = OCI_ErrorGet(FALSE, FALSE);
01297 
01298         OCILib.key_errs = NULL;
01299 
01300         OCI_ErrorFree(err);
01301         OCI_ThreadKeySet(key, NULL);
01302         OCI_ThreadKeyFree(key);
01303     }
01304 
01305     /* set unloaded flag */
01306 
01307     OCILib.loaded = FALSE;
01308 
01309     /* close error handle */
01310 
01311     if (OCILib.err != NULL)
01312     {
01313         OCI_HandleFree(OCILib.err, OCI_HTYPE_ERROR);
01314     }
01315 
01316     /* close environment handle
01317        => direct OCIHandleFree() because this handle was not allocated
01318        with OCI_HandleAlloc()
01319     */
01320 
01321     if (OCILib.env != NULL)
01322     {
01323         OCIHandleFree(OCILib.env, OCI_HTYPE_ENV);
01324     }
01325 
01326 #ifdef OCI_IMPORT_RUNTIME
01327 
01328     if (OCILib.lib_handle != NULL)
01329     {
01330         LIB_CLOSE(OCILib.lib_handle);
01331     }
01332 
01333 #endif
01334 
01335     /* checks for unfreed handles */
01336 
01337     if (OCILib.nb_hndlp > 0)
01338     {
01339         OCI_ExceptionUnfreedData(OCI_HDLE_HANDLE, OCILib.nb_hndlp);
01340         res = FALSE;
01341     }
01342 
01343     /* checks for unfreed descriptors */
01344 
01345     if (OCILib.nb_descp > 0)
01346     {
01347         OCI_ExceptionUnfreedData(OCI_HDLE_DESCRIPTOR, OCILib.nb_descp);
01348         res = FALSE;
01349     }
01350 
01351     /* checks for unfreed objects */
01352 
01353     if (OCILib.nb_objinst > 0)
01354     {
01355         OCI_ExceptionUnfreedData(OCI_HDLE_OBJECT, OCILib.nb_objinst);
01356         res = FALSE;
01357     }
01358 
01359     memset(&OCILib, 0, sizeof(OCILib));
01360 
01361     return res;
01362 }
01363 
01364 /* --------------------------------------------------------------------------------------------- *
01365  * OCI_GetOCICompileVersion
01366  * --------------------------------------------------------------------------------------------- */
01367 
01368 unsigned int OCI_API OCI_GetOCICompileVersion
01369 (
01370     void
01371 )
01372 {
01373     return (unsigned int) OCILib.version_compile;
01374 }
01375 
01376 /* --------------------------------------------------------------------------------------------- *
01377  * OCI_GetOCIRuntimeVersion
01378  * --------------------------------------------------------------------------------------------- */
01379 
01380 unsigned int OCI_API OCI_GetOCIRuntimeVersion
01381 (
01382     void
01383 )
01384 {
01385     return (unsigned int) OCILib.version_runtime;
01386 }
01387 
01388 /* --------------------------------------------------------------------------------------------- *
01389  * OCI_GetImportMode
01390  * --------------------------------------------------------------------------------------------- */
01391 
01392 unsigned int OCI_API OCI_GetImportMode
01393 (
01394     void
01395 )
01396 {
01397     return (unsigned int) OCI_IMPORT_MODE;
01398 }
01399 
01400 /* --------------------------------------------------------------------------------------------- *
01401  * OCI_GetCharsetMetaData
01402  * --------------------------------------------------------------------------------------------- */
01403 
01404 unsigned int OCI_API OCI_GetCharsetMetaData
01405 (
01406     void
01407 )
01408 {
01409     return (unsigned int) OCI_CHAR_MTEXT;
01410 }
01411 
01412 /* --------------------------------------------------------------------------------------------- *
01413  * OCI_GetCharsetUserData
01414  * --------------------------------------------------------------------------------------------- */
01415 
01416 unsigned int OCI_API OCI_GetCharsetUserData
01417 (
01418     void
01419 )
01420 {
01421     return (unsigned int) OCI_CHAR_DTEXT;
01422 }
01423 
01424 /* --------------------------------------------------------------------------------------------- *
01425  * OCI_GetLastError
01426  * --------------------------------------------------------------------------------------------- */
01427 
01428 OCI_Error * OCI_API OCI_GetLastError
01429 (
01430     void
01431 )
01432 {
01433     OCI_Error *err = NULL;
01434 
01435     if ((OCILib.loaded == FALSE) || (OCI_LIB_CONTEXT))
01436     {
01437         err = OCI_ErrorGet(TRUE, FALSE);
01438 
01439         if (err != NULL)
01440         {
01441             if (err->raise == FALSE)
01442             {
01443                 err = NULL;
01444             }
01445         }
01446     }
01447 
01448     return err;
01449 }
01450 
01451 /* --------------------------------------------------------------------------------------------- *
01452  * OCI_EnableWarnings
01453  * --------------------------------------------------------------------------------------------- */
01454 
01455 void OCI_API OCI_EnableWarnings
01456 (
01457     boolean value
01458 )
01459 {
01460     OCILib.warnings_on = value;
01461 }
01462 
01463 /* --------------------------------------------------------------------------------------------- *
01464  * OCI_SetErrorHandler
01465  * --------------------------------------------------------------------------------------------- */
01466 
01467 void OCI_API OCI_SetErrorHandler
01468 (
01469     POCI_ERROR handler
01470 )
01471 {
01472     OCILib.error_handler = handler;
01473 }
01474 
01475 /* --------------------------------------------------------------------------------------------- *
01476  * OCI_DatabaseStartup
01477  * --------------------------------------------------------------------------------------------- */
01478 
01479 boolean OCI_API OCI_DatabaseStartup
01480 (
01481     const mtext *db,
01482     const mtext *user,
01483     const mtext *pwd,
01484     unsigned int sess_mode,
01485     unsigned int start_mode,
01486     unsigned int start_flag,
01487     const mtext *spfile
01488 )
01489 {
01490     boolean res         = TRUE;
01491     OCI_Connection *con = NULL;
01492 
01493     OCI_CHECK_REMOTE_DBS_CONTROL_ENABLED(FALSE);
01494 
01495 #if OCI_VERSION_COMPILE >= OCI_10_2
01496 
01497     if (start_mode & OCI_DB_SPM_START)
01498     {
01499         OCIAdmin *adm = NULL;
01500 
01501         /* connect with prelim authenfication mode */
01502 
01503         con = OCI_ConnectionCreate(db, user, pwd, sess_mode | OCI_PRELIM_AUTH);
01504 
01505         if (con != NULL)
01506         {
01507             if ((spfile != NULL) && (spfile[0] != 0))
01508             {
01509                 void *ostr = NULL;
01510                 int osize  = -1;
01511 
01512                 /* allocate admin handle */
01513 
01514                 res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) OCILib.env,
01515                                                       (dvoid **) (void *) &adm,
01516                                                       (ub4) OCI_HTYPE_ADMIN,
01517                                                       (size_t) 0, (dvoid **) NULL));
01518 
01519                 /* set client spfile if provided */
01520 
01521                 ostr = OCI_GetInputMetaString(spfile, &osize);
01522 
01523                 OCI_CALL2
01524                 (
01525                     res, con,
01526 
01527                     OCIAttrSet((dvoid *) adm, (ub4) OCI_HTYPE_ADMIN,
01528                                (dvoid *) ostr, (ub4) osize,
01529                                (ub4) OCI_ATTR_ADMIN_PFILE, con->err)
01530                 )
01531 
01532                 OCI_ReleaseMetaString(ostr);
01533             }
01534 
01535             /* startup DB */
01536 
01537             OCI_CALL2
01538             (
01539                 res, con,
01540 
01541                 OCIDBStartup(con->cxt, con->err, (OCIAdmin *) adm, OCI_DEFAULT, start_flag)
01542             )
01543 
01544             /* release security admin handle */
01545 
01546             if (adm != NULL)
01547             {
01548                 OCI_HandleFree(OCILib.err, OCI_HTYPE_ADMIN);
01549             }
01550 
01551             /* disconnect */
01552 
01553             OCI_ConnectionFree(con);
01554         }
01555         else
01556         {
01557             res = FALSE;
01558         }
01559     }
01560 
01561     if (res == TRUE)
01562     {
01563         /* connect without prelim mode */
01564 
01565         con = OCI_ConnectionCreate(db, user, pwd, sess_mode);
01566 
01567         /* alter database */
01568 
01569         if (con != NULL)
01570         {
01571             OCI_Statement *stmt = OCI_StatementCreate(con);
01572 
01573             /* mount database */
01574 
01575             if (start_mode & OCI_DB_SPM_MOUNT)
01576             {
01577                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE MOUNT")));
01578             }
01579 
01580             /* open database */
01581 
01582             if (start_mode & OCI_DB_SPM_OPEN)
01583             {
01584                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE OPEN")));
01585             }
01586 
01587             OCI_StatementFree(stmt);
01588 
01589             /* disconnect */
01590 
01591             OCI_ConnectionFree(con);
01592         }
01593         else
01594         {
01595             res = FALSE;
01596         }
01597     }
01598 
01599 #else
01600 
01601     res = FALSE;
01602 
01603     OCI_NOT_USED(db);
01604     OCI_NOT_USED(user);
01605     OCI_NOT_USED(pwd);
01606     OCI_NOT_USED(sess_mode);
01607     OCI_NOT_USED(start_mode);
01608     OCI_NOT_USED(start_flag);
01609     OCI_NOT_USED(spfile);
01610     OCI_NOT_USED(con);
01611 
01612 #endif
01613 
01614     OCI_RESULT(res);
01615 
01616     return res;
01617 }
01618 
01619 /* --------------------------------------------------------------------------------------------- *
01620  * OCI_DatabaseShutdown
01621  * --------------------------------------------------------------------------------------------- */
01622 
01623 boolean OCI_API OCI_DatabaseShutdown
01624 (
01625     const mtext *db,
01626     const mtext *user,
01627     const mtext *pwd,
01628     unsigned int sess_mode,
01629     unsigned int shut_mode,
01630     unsigned int shut_flag
01631 )
01632 {
01633     boolean res         = TRUE;
01634     OCI_Connection *con = NULL;
01635 
01636     OCI_CHECK_REMOTE_DBS_CONTROL_ENABLED(FALSE);
01637 
01638 #if OCI_VERSION_COMPILE >= OCI_10_2
01639 
01640     /* connect to server */
01641 
01642     con = OCI_ConnectionCreate(db, user, pwd, sess_mode);
01643 
01644     if (con != NULL)
01645     {
01646         /* delete current transaction before the abort */
01647 
01648         if ((con->trs != NULL) && (shut_flag == OCI_DB_SDF_ABORT))
01649         {
01650             OCI_TransactionFree(con->trs);
01651 
01652             con->trs = NULL;
01653         }
01654 
01655         /* start shutdown */
01656 
01657         if (shut_mode & OCI_DB_SDM_SHUTDOWN)
01658         {
01659             /* start shutdown process */
01660 
01661             OCI_CALL2
01662             (
01663                 res, con,
01664 
01665                 OCIDBShutdown(con->cxt, con->err, (OCIAdmin *) NULL, shut_flag)
01666             )
01667         }
01668 
01669         /* alter database if we are not in abort mode */
01670 
01671         if ((res == TRUE) && (shut_flag != OCI_DB_SDF_ABORT))
01672         {
01673             OCI_Statement *stmt = OCI_StatementCreate(con);
01674 
01675             /* close database */
01676 
01677             if (shut_mode & OCI_DB_SDM_CLOSE)
01678             {
01679                 res = (res && OCI_ExecuteStmt(stmt, MT("ALTER DATABASE CLOSE NORMAL")));
01680             }
01681 
01682             /* unmount database */
01683 
01684             if (shut_mode & OCI_DB_SDM_DISMOUNT)
01685             {
01686                 res = (res && OCI_ExecuteStmt(stmt,MT( "ALTER DATABASE DISMOUNT")));
01687             }
01688 
01689             OCI_StatementFree(stmt);
01690 
01691             /* delete current transaction before the shutdown */
01692 
01693             if (con->trs != NULL)
01694             {
01695                 OCI_TransactionFree(con->trs);
01696 
01697                 con->trs = NULL;
01698             }
01699 
01700             /* do the final shutdown if we are not in abort mode */
01701 
01702             OCI_CALL2
01703             (
01704                 res, con,
01705 
01706                 OCIDBShutdown(con->cxt, con->err, (OCIAdmin *) 0, OCI_DBSHUTDOWN_FINAL)
01707             )
01708         }
01709 
01710         /* disconnect */
01711 
01712         OCI_ConnectionFree(con);
01713     }
01714     else
01715     {
01716         res = FALSE;
01717     }
01718 
01719 #else
01720 
01721     res = FALSE;
01722 
01723     OCI_NOT_USED(db);
01724     OCI_NOT_USED(user);
01725     OCI_NOT_USED(pwd);
01726     OCI_NOT_USED(sess_mode);
01727     OCI_NOT_USED(shut_mode);
01728     OCI_NOT_USED(shut_flag);
01729     OCI_NOT_USED(con);
01730 
01731 #endif
01732 
01733     OCI_RESULT(res);
01734 
01735     return res;
01736 }
01737 
01738 /* --------------------------------------------------------------------------------------------- *
01739  * OCI_SetHAHandler
01740  * --------------------------------------------------------------------------------------------- */
01741 
01742 boolean OCI_API OCI_SetHAHandler
01743 (
01744     POCI_HA_HANDLER  handler
01745 )
01746 {
01747     boolean  res      = TRUE;
01748     void    *callback = NULL;
01749 
01750     OCI_CHECK_INITIALIZED(FALSE)
01751 
01752     OCI_CHECK_HIGH_AVAILABILITY_ENABLED(FALSE)
01753 
01754     OCILib.ha_handler = handler;
01755 
01756 #if OCI_VERSION_COMPILE >= OCI_10_2
01757 
01758     if (handler)
01759     {
01760         callback = (void*) OCI_ProcHAEvent;
01761     }
01762 
01763     OCI_CALL3
01764     (
01765         res, OCILib.err,
01766 
01767         OCIAttrSet((dvoid *) OCILib.env, (ub4) OCI_HTYPE_ENV, (dvoid *) callback, 
01768                    (ub4) 0, (ub4) OCI_ATTR_EVTCBK, OCILib.err)
01769     )
01770 
01771     OCI_RESULT(res);
01772 
01773 #else
01774     
01775     OCI_NOT_USED(callback);
01776 
01777 #endif
01778 
01779     return res;
01780 }