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