ROOT logo
// @(#)root/oracle:$Id: TOracleServer.cxx 30663 2009-10-11 22:11:51Z pcanal $
// Author: Yan Liu and Shaowen Wang   23/11/04

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TOracleServer                                                        //
//                                                                      //
// This class implements an OCCI interface to Oracle data bases.        //
// It uses the instantclient10 software available from Oracle.          //
// To install this client software do:                                  //
// 1) Download Instant Client Packages (4 files) from:                  //
//     http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
// 2) Unzip the files into instantclient10_1 (Mac OS X example here):   //
//     unzip instantclient-basic-macosx-10.1.0.3.zip                    //
//     unzip instantclient-sqlplus-macosx-10.1.0.3.zip                  //
//     unzip instantclient-sdk-macosx-10.1.0.3.zip                      //
//     unzip instantclient-jdbc-macosx-10.1.0.3.zip                     //
// 3) Create two symbolic links for the files that have the version     //
//    appended:                                                         //
//      ln -s libclntsh.dylib.10.1 libclntsh.dylib                      //
//      ln -s libocci.dylib.10.1 libocci.dylib                          //
// 4) Add instantclient10_1 directory to your (DY)LD_LIBRARY_PATH       //
//    in your .profile:                                                 //
//      export DYLD_LIBRARY_PATH="<pathto>/instantclient10_1"           //
//    Use DY only on Mac OS X.                                          //
// 5) If you also want to use the sqlplus command line app add also     //
//      export SQLPATH="<pathto>/instantclient10_1"                     //
// 6) If you want to connect to a remote db server you will also need   //
//    to create a tnsname.ora file which describes the local_name for   //
//    the remote db servers (at CERN most public machines have this     //
//    file in /etc). If it is not in /etc create TNS_ADMIN:             //
//      export TNS_ADMIN="<path-to-dir-containing-tnsname.ora>"         //
// 7) Test it our with the sqlplus command line app:                    //
//      sqlplus [username][/password]@<local_name>                      //
//    or                                                                //
//      sqlplus [username][/password]@//[hostname][:port][/database]    //
//                                                                      //
// ATTENTION: This plugin will not work on Mac OS X / Intel as Oracle   //
// has no intention to release a universal binary of the instantclient  //
// libraries.                                                           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TOracleServer.h"
#include "TOracleResult.h"
#include "TOracleStatement.h"
#include "TSQLColumnInfo.h"
#include "TSQLTableInfo.h"
#include "TUrl.h"
#include "TList.h"
#include "TObjString.h"

ClassImp(TOracleServer)

const char* TOracleServer::fgDatimeFormat = "MM/DD/YYYY, HH24:MI:SS";


// Reset error and check that server connected
#define CheckConnect(method, res)                       \
      ClearError();                                     \
      if (!IsConnected()) {                             \
         SetError(-1,"Oracle database is not connected",method); \
         return res;                                    \
      }

// catch Oracle exception after try block
#define CatchError(method)                           \
   catch (SQLException &oraex) {                     \
      SetError(oraex.getErrorCode(), oraex.getMessage().c_str(), method); \
   }

//______________________________________________________________________________
TOracleServer::TOracleServer(const char *db, const char *uid, const char *pw)
{
   // Open a connection to a Oracle DB server. The db arguments should be
   // of the form "oracle://connection_identifier[/<database>]", e.g.:
   // "oracle://cmscald.fnal.gov/test". The uid is the username and pw
   // the password that should be used for the connection.

   fEnv = 0;
   fConn = 0;

   TUrl url(db);

   if (!url.IsValid()) {
      TString errmsg = "Malformed db argument ";
      errmsg+=db;
      SetError(-1, errmsg.Data(), "TOracleServer");
      MakeZombie();
      return;
   }

   if (strncmp(url.GetProtocol(), "oracle", 6)) {
      SetError(-1, "protocol in db argument should be oracle://", "TOracleServer");
      MakeZombie();
      return;
   }

   const char *conn_str = url.GetFile();
   if (conn_str!=0)
     if (*conn_str == '/') conn_str++; //skip leading "/" if appears

   try {
      // found out whether to use objet mode
      TString options = url.GetOptions();
      Int_t pos = options.Index("ObjectMode");
      // create environment accordingly
      if (pos != kNPOS) {
        fEnv = Environment::createEnvironment(Environment::OBJECT);
      } else {
        fEnv = Environment::createEnvironment();
      }
      fConn = fEnv->createConnection(uid, pw, conn_str);

      fType = "Oracle";
      fHost = url.GetHost();
      fDB   = conn_str;
      fPort = url.GetPort();
      fPort = (fPort>0) ? fPort : 1521;
      return;

   } CatchError("TOracleServer")

   MakeZombie();
}

//______________________________________________________________________________
TOracleServer::~TOracleServer()
{
   // Close connection to Oracle DB server.

   if (IsConnected())
      Close();
}


//______________________________________________________________________________
void TOracleServer::Close(Option_t *)
{
   // Close connection to Oracle DB server.

   ClearError();

   try {
      if (fConn)
         fEnv->terminateConnection(fConn);
      if (fEnv)
         Environment::terminateEnvironment(fEnv);
   } CatchError("Close")

   fPort = -1;
}

//______________________________________________________________________________
TSQLStatement *TOracleServer::Statement(const char *sql, Int_t niter)
{
   CheckConnect("Statement",0);

   if (!sql || !*sql) {
      SetError(-1, "no query string specified","Statement");
      return 0;
   }

   try {
      oracle::occi::Statement *stmt = fConn->createStatement(sql);

      Blob parblob(fConn);

      return new TOracleStatement(fEnv, fConn, stmt, niter, fErrorOut);

   } CatchError("Statement")

   return 0;
}

//______________________________________________________________________________
TSQLResult *TOracleServer::Query(const char *sql)
{
   // Execute SQL command. Result object must be deleted by the user.
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.

   CheckConnect("Query",0);

   if (!sql || !*sql) {
      SetError(-1, "no query string specified","Query");
      return 0;
   }

   try {
      oracle::occi::Statement *stmt = fConn->createStatement();

      // NOTE: before special COUNT query was executed to define number of
      // rows in result set. Now it is not requried, while TOracleResult class
      // will automatically fetch all rows from resultset when
      // GetRowCount() will be called first time.
      // It is better do not use GetRowCount() to avoid unnecessary memory usage.

      stmt->setSQL(sql);
      stmt->setPrefetchRowCount(1000);
      stmt->setPrefetchMemorySize(1000000);
      stmt->execute();

      TOracleResult *res = new TOracleResult(fConn, stmt);
      return res;
   } CatchError("Query")

   return 0;
}

//______________________________________________________________________________
Bool_t TOracleServer::Exec(const char* sql)
{
   // Execute sql command wich does not produce any result set.
   // Return kTRUE if succesfull

   CheckConnect("Exec", kFALSE);

   if (!sql || !*sql) {
      SetError(-1, "no query string specified","Exec");
      return kFALSE;
   }

   oracle::occi::Statement *stmt = 0;

   Bool_t res = kFALSE;

   try {
      stmt = fConn->createStatement(sql);
      stmt->execute();
      res = kTRUE;
   } CatchError("Exec")

   try {
      fConn->terminateStatement(stmt);
   } CatchError("Exec")

   return res;
}

//______________________________________________________________________________
TSQLResult *TOracleServer::GetTables(const char *dbname, const char * /*wild*/)
{
   // List all tables in the specified database. Wild is for wildcarding
   // "t%" list all tables starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   // In Oracle 9 and above, table is accessed in schema.table format.
   // GetTables returns tables in all schemas accessible for the user.
   // Assumption: table ALL_OBJECTS is accessible for the user, which is true in Oracle 10g
   // The returned TSQLResult has two columns: schema_name, table_name
   // "dbname": if specified, return table list of this schema, or return all tables
   // "wild" is not used in this implementation

   CheckConnect("GetTables",0);

   TString sqlstr("SELECT object_name,owner FROM ALL_OBJECTS WHERE object_type='TABLE'");
   if (dbname && dbname[0])
      sqlstr = sqlstr + " AND owner='" + dbname + "'";

   return Query(sqlstr.Data());
}

//______________________________________________________________________________
TList* TOracleServer::GetTablesList(const char* wild)
{
   CheckConnect("GetTablesList",0);

   TString cmd("SELECT table_name FROM user_tables");
   if ((wild!=0) && (*wild!=0))
      cmd+=Form(" WHERE table_name LIKE '%s'", wild);

   TSQLStatement* stmt = Statement(cmd);
   if (stmt==0) return 0;

   TList* lst = 0;

   if (stmt->Process()) {
      stmt->StoreResult();
      while (stmt->NextResultRow()) {
         const char* tablename = stmt->GetString(0);
         if (tablename==0) continue;
         if (lst==0) {
            lst = new TList;
            lst->SetOwner(kTRUE);
         }
         lst->Add(new TObjString(tablename));
      }
   }

   delete stmt;

   return lst;
}

//______________________________________________________________________________
TSQLTableInfo *TOracleServer::GetTableInfo(const char* tablename)
{
   // Produces SQL table info
   // Object must be deleted by user

   CheckConnect("GetTableInfo",0);

   if ((tablename==0) || (*tablename==0)) return 0;

   TString table(tablename);
   table.ToUpper();
   TString sql;
   sql.Form("SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, CHAR_COL_DECL_LENGTH FROM user_tab_columns WHERE table_name = '%s' ORDER BY COLUMN_ID", table.Data());

   TSQLStatement* stmt = Statement(sql.Data(), 10);
   if (stmt==0) return 0;

   if (!stmt->Process()) {
      delete stmt;
      return 0;
   }

   TList* lst = 0;

   stmt->StoreResult();

   while (stmt->NextResultRow()) {
      const char* columnname = stmt->GetString(0);
      TString data_type = stmt->GetString(1);
      Int_t data_length = stmt->GetInt(2);      // this is size in bytes
      Int_t data_precision = stmt->GetInt(3);
      Int_t data_scale = stmt->GetInt(4);
      const char* nstr = stmt->GetString(5);
      Int_t char_col_decl_length = stmt->GetInt(6);
      Int_t data_sign = -1; // no info about sign

      Int_t sqltype = kSQL_NONE;

      if (data_type=="NUMBER") {
         sqltype = kSQL_NUMERIC;
         if (data_precision<=0) {
            data_precision = -1;
            data_scale = -1;
         } else
         if (data_scale<=0)
            data_scale = -1;
         data_sign = 1;
      } else

      if (data_type=="CHAR") {
         sqltype = kSQL_CHAR;
         data_precision = char_col_decl_length;
         data_scale = -1;
      } else

      if ((data_type=="VARCHAR") || (data_type=="VARCHAR2")) {
         sqltype = kSQL_VARCHAR;
         data_precision = char_col_decl_length;
         data_scale = -1;
      } else

      if (data_type=="FLOAT") {
         sqltype = kSQL_FLOAT;
         data_scale = -1;
         if (data_precision==126) data_precision = -1;
         data_sign = 1;
      } else

      if (data_type=="BINARY_FLOAT") {
         sqltype = kSQL_FLOAT;
         data_scale = -1;
         data_precision = -1;
         data_sign = 1;
      } else

      if (data_type=="BINARY_DOUBLE") {
         sqltype = kSQL_DOUBLE;
         data_scale = -1;
         data_precision = -1;
         data_sign = 1;
      } else

      if (data_type=="LONG") {
         sqltype = kSQL_VARCHAR;
         data_length = 0x7fffffff; // size of LONG 2^31-1
         data_precision = -1;
         data_scale = -1;
      } else

      if (data_type.Contains("TIMESTAMP")) {
         sqltype = kSQL_TIMESTAMP;
         data_precision = -1;
      }

      Bool_t IsNullable = kFALSE;
      if (nstr!=0)
         IsNullable = (*nstr=='Y') || (*nstr=='y');

      TSQLColumnInfo* info =
         new TSQLColumnInfo(columnname,
                            data_type,
                            IsNullable,
                            sqltype,
                            data_length,
                            data_precision,
                            data_scale,
                            data_sign);

      if (lst==0) lst = new TList;
      lst->Add(info);
   }

   delete stmt;

   return new TSQLTableInfo(tablename, lst);
}

//______________________________________________________________________________
TSQLResult *TOracleServer::GetColumns(const char * /*dbname*/, const char *tablename,
                                      const char * wild)
{
   // List all columns in specified table in the specified database.
   // Wild is for wildcarding "t%" list all columns starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   CheckConnect("GetColumns",0);

//  make no sense, while method is not implemented
//   if (SelectDataBase(dbname) != 0) {
//      SetError(-1, "Database is not connected","GetColumns");
//      return 0;
//   }

   TString sql;
   TString table(tablename);
   table.ToUpper();
   if (wild && wild[0]) 
      sql.Form("SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name like '%s' ORDER BY COLUMN_ID", wild);
   else 
      sql.Form("SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name = '%s' ORDER BY COLUMN_ID", table.Data());
   return Query(sql);
}

//______________________________________________________________________________
Int_t TOracleServer::SelectDataBase(const char * /*dbname*/)
{
   // Select a database. Returns 0 if successful, non-zero otherwise.
   // NOT IMPLEMENTED.

   CheckConnect("SelectDataBase", -1);

   // do nothing and return success code
   return 0;
}

//______________________________________________________________________________
TSQLResult *TOracleServer::GetDataBases(const char * /*wild*/)
{
   // List all available databases. Wild is for wildcarding "t%" list all
   // databases starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.
   // NOT IMPLEMENTED.

   CheckConnect("GetDataBases",0);

   return 0;
}

//______________________________________________________________________________
Int_t TOracleServer::CreateDataBase(const char * /*dbname*/)
{
   // Create a database. Returns 0 if successful, non-zero otherwise.
   // NOT IMPLEMENTED.

   CheckConnect("CreateDataBase",-1);

   return -1;
}

//______________________________________________________________________________
Int_t TOracleServer::DropDataBase(const char * /*dbname*/)
{
   // Drop (i.e. delete) a database. Returns 0 if successful, non-zero
   // otherwise.
   // NOT IMPLEMENTED.

   CheckConnect("DropDataBase",-1);

   return -1;
}

//______________________________________________________________________________
Int_t TOracleServer::Reload()
{
   // Reload permission tables. Returns 0 if successful, non-zero
   // otherwise. User must have reload permissions.
   // NOT IMPLEMENTED.

   CheckConnect("Reload", -1);

   return -1;
}

//______________________________________________________________________________
Int_t TOracleServer::Shutdown()
{
   // Shutdown the database server. Returns 0 if successful, non-zero
   // otherwise. User must have shutdown permissions.
   // NOT IMPLEMENTED.

   CheckConnect("Shutdown", -1);

   return -1;
}

//______________________________________________________________________________
const char *TOracleServer::ServerInfo()
{
   // Return Oracle server version info.

   CheckConnect("ServerInfo", 0);

   fInfo = "Oracle";
   TSQLStatement* stmt = Statement("select * from v$version");
   if (stmt!=0) {
       stmt->EnableErrorOutput(kFALSE);
       if (stmt->Process()) {
          fInfo = "";
          stmt->StoreResult();
          while (stmt->NextResultRow()) {
             if (fInfo.Length()>0) fInfo += "\n";
             fInfo += stmt->GetString(0);
          }
       }
       delete stmt;
   }

   return fInfo.Data();
}

//______________________________________________________________________________
Bool_t TOracleServer::StartTransaction()
{
   // Call Commit() to submit all chanes, done before.
   // Commit() ot Rollback() must be used to complete submitted actions or cancel them

   return Commit();
}

//______________________________________________________________________________
Bool_t TOracleServer::Commit()
{
   // Commits all changes made since the previous Commit() or Rollback()
   // Return kTRUE if OK

   CheckConnect("Commit", kFALSE);

   try {
      fConn->commit();
      return kTRUE;
   } CatchError("Commit")

   return kFALSE;
}

//______________________________________________________________________________
Bool_t TOracleServer::Rollback()
{
   // Drops all changes made since the previous Commit() or Rollback()
   // Return kTRUE if OK

   CheckConnect("Rollback", kFALSE);

   try {
      fConn->rollback();
      return kTRUE;
   } CatchError("Rollback")

   return kFALSE;
}

//______________________________________________________________________________
void TOracleServer::SetDatimeFormat(const char* fmt)
{
   // set format for converting timestamps or date field into string
   // default value is "MM/DD/YYYY, HH24:MI:SS"

   if (fmt==0) fmt = "MM/DD/YYYY, HH24:MI:SS";    
   fgDatimeFormat = fmt;
}

//______________________________________________________________________________
const char* TOracleServer::GetDatimeFormat()
{
   // return value of actul convertion format from timestamps or date to string    
   
   return fgDatimeFormat;   
}
 TOracleServer.cxx:1
 TOracleServer.cxx:2
 TOracleServer.cxx:3
 TOracleServer.cxx:4
 TOracleServer.cxx:5
 TOracleServer.cxx:6
 TOracleServer.cxx:7
 TOracleServer.cxx:8
 TOracleServer.cxx:9
 TOracleServer.cxx:10
 TOracleServer.cxx:11
 TOracleServer.cxx:12
 TOracleServer.cxx:13
 TOracleServer.cxx:14
 TOracleServer.cxx:15
 TOracleServer.cxx:16
 TOracleServer.cxx:17
 TOracleServer.cxx:18
 TOracleServer.cxx:19
 TOracleServer.cxx:20
 TOracleServer.cxx:21
 TOracleServer.cxx:22
 TOracleServer.cxx:23
 TOracleServer.cxx:24
 TOracleServer.cxx:25
 TOracleServer.cxx:26
 TOracleServer.cxx:27
 TOracleServer.cxx:28
 TOracleServer.cxx:29
 TOracleServer.cxx:30
 TOracleServer.cxx:31
 TOracleServer.cxx:32
 TOracleServer.cxx:33
 TOracleServer.cxx:34
 TOracleServer.cxx:35
 TOracleServer.cxx:36
 TOracleServer.cxx:37
 TOracleServer.cxx:38
 TOracleServer.cxx:39
 TOracleServer.cxx:40
 TOracleServer.cxx:41
 TOracleServer.cxx:42
 TOracleServer.cxx:43
 TOracleServer.cxx:44
 TOracleServer.cxx:45
 TOracleServer.cxx:46
 TOracleServer.cxx:47
 TOracleServer.cxx:48
 TOracleServer.cxx:49
 TOracleServer.cxx:50
 TOracleServer.cxx:51
 TOracleServer.cxx:52
 TOracleServer.cxx:53
 TOracleServer.cxx:54
 TOracleServer.cxx:55
 TOracleServer.cxx:56
 TOracleServer.cxx:57
 TOracleServer.cxx:58
 TOracleServer.cxx:59
 TOracleServer.cxx:60
 TOracleServer.cxx:61
 TOracleServer.cxx:62
 TOracleServer.cxx:63
 TOracleServer.cxx:64
 TOracleServer.cxx:65
 TOracleServer.cxx:66
 TOracleServer.cxx:67
 TOracleServer.cxx:68
 TOracleServer.cxx:69
 TOracleServer.cxx:70
 TOracleServer.cxx:71
 TOracleServer.cxx:72
 TOracleServer.cxx:73
 TOracleServer.cxx:74
 TOracleServer.cxx:75
 TOracleServer.cxx:76
 TOracleServer.cxx:77
 TOracleServer.cxx:78
 TOracleServer.cxx:79
 TOracleServer.cxx:80
 TOracleServer.cxx:81
 TOracleServer.cxx:82
 TOracleServer.cxx:83
 TOracleServer.cxx:84
 TOracleServer.cxx:85
 TOracleServer.cxx:86
 TOracleServer.cxx:87
 TOracleServer.cxx:88
 TOracleServer.cxx:89
 TOracleServer.cxx:90
 TOracleServer.cxx:91
 TOracleServer.cxx:92
 TOracleServer.cxx:93
 TOracleServer.cxx:94
 TOracleServer.cxx:95
 TOracleServer.cxx:96
 TOracleServer.cxx:97
 TOracleServer.cxx:98
 TOracleServer.cxx:99
 TOracleServer.cxx:100
 TOracleServer.cxx:101
 TOracleServer.cxx:102
 TOracleServer.cxx:103
 TOracleServer.cxx:104
 TOracleServer.cxx:105
 TOracleServer.cxx:106
 TOracleServer.cxx:107
 TOracleServer.cxx:108
 TOracleServer.cxx:109
 TOracleServer.cxx:110
 TOracleServer.cxx:111
 TOracleServer.cxx:112
 TOracleServer.cxx:113
 TOracleServer.cxx:114
 TOracleServer.cxx:115
 TOracleServer.cxx:116
 TOracleServer.cxx:117
 TOracleServer.cxx:118
 TOracleServer.cxx:119
 TOracleServer.cxx:120
 TOracleServer.cxx:121
 TOracleServer.cxx:122
 TOracleServer.cxx:123
 TOracleServer.cxx:124
 TOracleServer.cxx:125
 TOracleServer.cxx:126
 TOracleServer.cxx:127
 TOracleServer.cxx:128
 TOracleServer.cxx:129
 TOracleServer.cxx:130
 TOracleServer.cxx:131
 TOracleServer.cxx:132
 TOracleServer.cxx:133
 TOracleServer.cxx:134
 TOracleServer.cxx:135
 TOracleServer.cxx:136
 TOracleServer.cxx:137
 TOracleServer.cxx:138
 TOracleServer.cxx:139
 TOracleServer.cxx:140
 TOracleServer.cxx:141
 TOracleServer.cxx:142
 TOracleServer.cxx:143
 TOracleServer.cxx:144
 TOracleServer.cxx:145
 TOracleServer.cxx:146
 TOracleServer.cxx:147
 TOracleServer.cxx:148
 TOracleServer.cxx:149
 TOracleServer.cxx:150
 TOracleServer.cxx:151
 TOracleServer.cxx:152
 TOracleServer.cxx:153
 TOracleServer.cxx:154
 TOracleServer.cxx:155
 TOracleServer.cxx:156
 TOracleServer.cxx:157
 TOracleServer.cxx:158
 TOracleServer.cxx:159
 TOracleServer.cxx:160
 TOracleServer.cxx:161
 TOracleServer.cxx:162
 TOracleServer.cxx:163
 TOracleServer.cxx:164
 TOracleServer.cxx:165
 TOracleServer.cxx:166
 TOracleServer.cxx:167
 TOracleServer.cxx:168
 TOracleServer.cxx:169
 TOracleServer.cxx:170
 TOracleServer.cxx:171
 TOracleServer.cxx:172
 TOracleServer.cxx:173
 TOracleServer.cxx:174
 TOracleServer.cxx:175
 TOracleServer.cxx:176
 TOracleServer.cxx:177
 TOracleServer.cxx:178
 TOracleServer.cxx:179
 TOracleServer.cxx:180
 TOracleServer.cxx:181
 TOracleServer.cxx:182
 TOracleServer.cxx:183
 TOracleServer.cxx:184
 TOracleServer.cxx:185
 TOracleServer.cxx:186
 TOracleServer.cxx:187
 TOracleServer.cxx:188
 TOracleServer.cxx:189
 TOracleServer.cxx:190
 TOracleServer.cxx:191
 TOracleServer.cxx:192
 TOracleServer.cxx:193
 TOracleServer.cxx:194
 TOracleServer.cxx:195
 TOracleServer.cxx:196
 TOracleServer.cxx:197
 TOracleServer.cxx:198
 TOracleServer.cxx:199
 TOracleServer.cxx:200
 TOracleServer.cxx:201
 TOracleServer.cxx:202
 TOracleServer.cxx:203
 TOracleServer.cxx:204
 TOracleServer.cxx:205
 TOracleServer.cxx:206
 TOracleServer.cxx:207
 TOracleServer.cxx:208
 TOracleServer.cxx:209
 TOracleServer.cxx:210
 TOracleServer.cxx:211
 TOracleServer.cxx:212
 TOracleServer.cxx:213
 TOracleServer.cxx:214
 TOracleServer.cxx:215
 TOracleServer.cxx:216
 TOracleServer.cxx:217
 TOracleServer.cxx:218
 TOracleServer.cxx:219
 TOracleServer.cxx:220
 TOracleServer.cxx:221
 TOracleServer.cxx:222
 TOracleServer.cxx:223
 TOracleServer.cxx:224
 TOracleServer.cxx:225
 TOracleServer.cxx:226
 TOracleServer.cxx:227
 TOracleServer.cxx:228
 TOracleServer.cxx:229
 TOracleServer.cxx:230
 TOracleServer.cxx:231
 TOracleServer.cxx:232
 TOracleServer.cxx:233
 TOracleServer.cxx:234
 TOracleServer.cxx:235
 TOracleServer.cxx:236
 TOracleServer.cxx:237
 TOracleServer.cxx:238
 TOracleServer.cxx:239
 TOracleServer.cxx:240
 TOracleServer.cxx:241
 TOracleServer.cxx:242
 TOracleServer.cxx:243
 TOracleServer.cxx:244
 TOracleServer.cxx:245
 TOracleServer.cxx:246
 TOracleServer.cxx:247
 TOracleServer.cxx:248
 TOracleServer.cxx:249
 TOracleServer.cxx:250
 TOracleServer.cxx:251
 TOracleServer.cxx:252
 TOracleServer.cxx:253
 TOracleServer.cxx:254
 TOracleServer.cxx:255
 TOracleServer.cxx:256
 TOracleServer.cxx:257
 TOracleServer.cxx:258
 TOracleServer.cxx:259
 TOracleServer.cxx:260
 TOracleServer.cxx:261
 TOracleServer.cxx:262
 TOracleServer.cxx:263
 TOracleServer.cxx:264
 TOracleServer.cxx:265
 TOracleServer.cxx:266
 TOracleServer.cxx:267
 TOracleServer.cxx:268
 TOracleServer.cxx:269
 TOracleServer.cxx:270
 TOracleServer.cxx:271
 TOracleServer.cxx:272
 TOracleServer.cxx:273
 TOracleServer.cxx:274
 TOracleServer.cxx:275
 TOracleServer.cxx:276
 TOracleServer.cxx:277
 TOracleServer.cxx:278
 TOracleServer.cxx:279
 TOracleServer.cxx:280
 TOracleServer.cxx:281
 TOracleServer.cxx:282
 TOracleServer.cxx:283
 TOracleServer.cxx:284
 TOracleServer.cxx:285
 TOracleServer.cxx:286
 TOracleServer.cxx:287
 TOracleServer.cxx:288
 TOracleServer.cxx:289
 TOracleServer.cxx:290
 TOracleServer.cxx:291
 TOracleServer.cxx:292
 TOracleServer.cxx:293
 TOracleServer.cxx:294
 TOracleServer.cxx:295
 TOracleServer.cxx:296
 TOracleServer.cxx:297
 TOracleServer.cxx:298
 TOracleServer.cxx:299
 TOracleServer.cxx:300
 TOracleServer.cxx:301
 TOracleServer.cxx:302
 TOracleServer.cxx:303
 TOracleServer.cxx:304
 TOracleServer.cxx:305
 TOracleServer.cxx:306
 TOracleServer.cxx:307
 TOracleServer.cxx:308
 TOracleServer.cxx:309
 TOracleServer.cxx:310
 TOracleServer.cxx:311
 TOracleServer.cxx:312
 TOracleServer.cxx:313
 TOracleServer.cxx:314
 TOracleServer.cxx:315
 TOracleServer.cxx:316
 TOracleServer.cxx:317
 TOracleServer.cxx:318
 TOracleServer.cxx:319
 TOracleServer.cxx:320
 TOracleServer.cxx:321
 TOracleServer.cxx:322
 TOracleServer.cxx:323
 TOracleServer.cxx:324
 TOracleServer.cxx:325
 TOracleServer.cxx:326
 TOracleServer.cxx:327
 TOracleServer.cxx:328
 TOracleServer.cxx:329
 TOracleServer.cxx:330
 TOracleServer.cxx:331
 TOracleServer.cxx:332
 TOracleServer.cxx:333
 TOracleServer.cxx:334
 TOracleServer.cxx:335
 TOracleServer.cxx:336
 TOracleServer.cxx:337
 TOracleServer.cxx:338
 TOracleServer.cxx:339
 TOracleServer.cxx:340
 TOracleServer.cxx:341
 TOracleServer.cxx:342
 TOracleServer.cxx:343
 TOracleServer.cxx:344
 TOracleServer.cxx:345
 TOracleServer.cxx:346
 TOracleServer.cxx:347
 TOracleServer.cxx:348
 TOracleServer.cxx:349
 TOracleServer.cxx:350
 TOracleServer.cxx:351
 TOracleServer.cxx:352
 TOracleServer.cxx:353
 TOracleServer.cxx:354
 TOracleServer.cxx:355
 TOracleServer.cxx:356
 TOracleServer.cxx:357
 TOracleServer.cxx:358
 TOracleServer.cxx:359
 TOracleServer.cxx:360
 TOracleServer.cxx:361
 TOracleServer.cxx:362
 TOracleServer.cxx:363
 TOracleServer.cxx:364
 TOracleServer.cxx:365
 TOracleServer.cxx:366
 TOracleServer.cxx:367
 TOracleServer.cxx:368
 TOracleServer.cxx:369
 TOracleServer.cxx:370
 TOracleServer.cxx:371
 TOracleServer.cxx:372
 TOracleServer.cxx:373
 TOracleServer.cxx:374
 TOracleServer.cxx:375
 TOracleServer.cxx:376
 TOracleServer.cxx:377
 TOracleServer.cxx:378
 TOracleServer.cxx:379
 TOracleServer.cxx:380
 TOracleServer.cxx:381
 TOracleServer.cxx:382
 TOracleServer.cxx:383
 TOracleServer.cxx:384
 TOracleServer.cxx:385
 TOracleServer.cxx:386
 TOracleServer.cxx:387
 TOracleServer.cxx:388
 TOracleServer.cxx:389
 TOracleServer.cxx:390
 TOracleServer.cxx:391
 TOracleServer.cxx:392
 TOracleServer.cxx:393
 TOracleServer.cxx:394
 TOracleServer.cxx:395
 TOracleServer.cxx:396
 TOracleServer.cxx:397
 TOracleServer.cxx:398
 TOracleServer.cxx:399
 TOracleServer.cxx:400
 TOracleServer.cxx:401
 TOracleServer.cxx:402
 TOracleServer.cxx:403
 TOracleServer.cxx:404
 TOracleServer.cxx:405
 TOracleServer.cxx:406
 TOracleServer.cxx:407
 TOracleServer.cxx:408
 TOracleServer.cxx:409
 TOracleServer.cxx:410
 TOracleServer.cxx:411
 TOracleServer.cxx:412
 TOracleServer.cxx:413
 TOracleServer.cxx:414
 TOracleServer.cxx:415
 TOracleServer.cxx:416
 TOracleServer.cxx:417
 TOracleServer.cxx:418
 TOracleServer.cxx:419
 TOracleServer.cxx:420
 TOracleServer.cxx:421
 TOracleServer.cxx:422
 TOracleServer.cxx:423
 TOracleServer.cxx:424
 TOracleServer.cxx:425
 TOracleServer.cxx:426
 TOracleServer.cxx:427
 TOracleServer.cxx:428
 TOracleServer.cxx:429
 TOracleServer.cxx:430
 TOracleServer.cxx:431
 TOracleServer.cxx:432
 TOracleServer.cxx:433
 TOracleServer.cxx:434
 TOracleServer.cxx:435
 TOracleServer.cxx:436
 TOracleServer.cxx:437
 TOracleServer.cxx:438
 TOracleServer.cxx:439
 TOracleServer.cxx:440
 TOracleServer.cxx:441
 TOracleServer.cxx:442
 TOracleServer.cxx:443
 TOracleServer.cxx:444
 TOracleServer.cxx:445
 TOracleServer.cxx:446
 TOracleServer.cxx:447
 TOracleServer.cxx:448
 TOracleServer.cxx:449
 TOracleServer.cxx:450
 TOracleServer.cxx:451
 TOracleServer.cxx:452
 TOracleServer.cxx:453
 TOracleServer.cxx:454
 TOracleServer.cxx:455
 TOracleServer.cxx:456
 TOracleServer.cxx:457
 TOracleServer.cxx:458
 TOracleServer.cxx:459
 TOracleServer.cxx:460
 TOracleServer.cxx:461
 TOracleServer.cxx:462
 TOracleServer.cxx:463
 TOracleServer.cxx:464
 TOracleServer.cxx:465
 TOracleServer.cxx:466
 TOracleServer.cxx:467
 TOracleServer.cxx:468
 TOracleServer.cxx:469
 TOracleServer.cxx:470
 TOracleServer.cxx:471
 TOracleServer.cxx:472
 TOracleServer.cxx:473
 TOracleServer.cxx:474
 TOracleServer.cxx:475
 TOracleServer.cxx:476
 TOracleServer.cxx:477
 TOracleServer.cxx:478
 TOracleServer.cxx:479
 TOracleServer.cxx:480
 TOracleServer.cxx:481
 TOracleServer.cxx:482
 TOracleServer.cxx:483
 TOracleServer.cxx:484
 TOracleServer.cxx:485
 TOracleServer.cxx:486
 TOracleServer.cxx:487
 TOracleServer.cxx:488
 TOracleServer.cxx:489
 TOracleServer.cxx:490
 TOracleServer.cxx:491
 TOracleServer.cxx:492
 TOracleServer.cxx:493
 TOracleServer.cxx:494
 TOracleServer.cxx:495
 TOracleServer.cxx:496
 TOracleServer.cxx:497
 TOracleServer.cxx:498
 TOracleServer.cxx:499
 TOracleServer.cxx:500
 TOracleServer.cxx:501
 TOracleServer.cxx:502
 TOracleServer.cxx:503
 TOracleServer.cxx:504
 TOracleServer.cxx:505
 TOracleServer.cxx:506
 TOracleServer.cxx:507
 TOracleServer.cxx:508
 TOracleServer.cxx:509
 TOracleServer.cxx:510
 TOracleServer.cxx:511
 TOracleServer.cxx:512
 TOracleServer.cxx:513
 TOracleServer.cxx:514
 TOracleServer.cxx:515
 TOracleServer.cxx:516
 TOracleServer.cxx:517
 TOracleServer.cxx:518
 TOracleServer.cxx:519
 TOracleServer.cxx:520
 TOracleServer.cxx:521
 TOracleServer.cxx:522
 TOracleServer.cxx:523
 TOracleServer.cxx:524
 TOracleServer.cxx:525
 TOracleServer.cxx:526
 TOracleServer.cxx:527
 TOracleServer.cxx:528
 TOracleServer.cxx:529
 TOracleServer.cxx:530
 TOracleServer.cxx:531
 TOracleServer.cxx:532
 TOracleServer.cxx:533
 TOracleServer.cxx:534
 TOracleServer.cxx:535
 TOracleServer.cxx:536
 TOracleServer.cxx:537
 TOracleServer.cxx:538
 TOracleServer.cxx:539
 TOracleServer.cxx:540
 TOracleServer.cxx:541
 TOracleServer.cxx:542
 TOracleServer.cxx:543
 TOracleServer.cxx:544
 TOracleServer.cxx:545
 TOracleServer.cxx:546
 TOracleServer.cxx:547
 TOracleServer.cxx:548
 TOracleServer.cxx:549
 TOracleServer.cxx:550
 TOracleServer.cxx:551
 TOracleServer.cxx:552
 TOracleServer.cxx:553
 TOracleServer.cxx:554
 TOracleServer.cxx:555
 TOracleServer.cxx:556
 TOracleServer.cxx:557
 TOracleServer.cxx:558
 TOracleServer.cxx:559
 TOracleServer.cxx:560
 TOracleServer.cxx:561
 TOracleServer.cxx:562
 TOracleServer.cxx:563
 TOracleServer.cxx:564
 TOracleServer.cxx:565
 TOracleServer.cxx:566
 TOracleServer.cxx:567
 TOracleServer.cxx:568
 TOracleServer.cxx:569
 TOracleServer.cxx:570
 TOracleServer.cxx:571
 TOracleServer.cxx:572
 TOracleServer.cxx:573
 TOracleServer.cxx:574
 TOracleServer.cxx:575
 TOracleServer.cxx:576
 TOracleServer.cxx:577
 TOracleServer.cxx:578
 TOracleServer.cxx:579
 TOracleServer.cxx:580
 TOracleServer.cxx:581
 TOracleServer.cxx:582
 TOracleServer.cxx:583
 TOracleServer.cxx:584
 TOracleServer.cxx:585
 TOracleServer.cxx:586
 TOracleServer.cxx:587
 TOracleServer.cxx:588
 TOracleServer.cxx:589
 TOracleServer.cxx:590
 TOracleServer.cxx:591
 TOracleServer.cxx:592
 TOracleServer.cxx:593
 TOracleServer.cxx:594
 TOracleServer.cxx:595
 TOracleServer.cxx:596
 TOracleServer.cxx:597
 TOracleServer.cxx:598
 TOracleServer.cxx:599
 TOracleServer.cxx:600
 TOracleServer.cxx:601
 TOracleServer.cxx:602
 TOracleServer.cxx:603
 TOracleServer.cxx:604
 TOracleServer.cxx:605