OCILIB (C Driver for Oracle) 3.12.1
|
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 }