• Main Page
  • Modules
  • Data Structures
  • Files
  • File List

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

Generated on Mon Dec 13 2010 22:32:01 for OCILIB (C Driver for Oracle) by  doxygen 1.7.2