C:/Users/vincent/Data/Perso/dev/ocilib/ocilib/src/library.c

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

Generated on Thu Jul 30 17:41:52 2009 for OCILIB (C Driver for Oracle) by  doxygen 1.5.4