58 ClassImp(TOracleServer);
61 using namespace oracle::occi;
63 const char* TOracleServer::fgDatimeFormat =
"MM/DD/YYYY, HH24:MI:SS";
67 #define CheckConnect(method, res) \
69 if (!IsConnected()) { \
70 SetError(-1,"Oracle database is not connected",method); \
75 #define CatchError(method) \
76 catch (SQLException &oraex) { \
77 SetError(oraex.getErrorCode(), oraex.getMessage().c_str(), method); \
86 TOracleServer::TOracleServer(
const char *db,
const char *uid,
const char *pw)
94 sword major_version(0), minor_version(0), update_num(0), patch_num(0), port_update_num(0);
95 OCIClientVersion(&major_version, &minor_version, &update_num, &patch_num, &port_update_num);
96 Info(
"TOracleServer",
"Oracle Call Interface version %u.%u.%u.%u.%u",
97 (
unsigned) major_version, (
unsigned) minor_version, (
unsigned) update_num, (
unsigned) patch_num, (
unsigned) port_update_num);
102 if (!url.IsValid()) {
103 TString errmsg =
"Malformed db argument ";
105 SetError(-1, errmsg.Data(),
"TOracleServer");
110 if (strncmp(url.GetProtocol(),
"oracle", 6)) {
111 SetError(-1,
"protocol in db argument should be oracle://",
"TOracleServer");
116 const char *conn_str = url.GetFile();
118 if (*conn_str ==
'/') conn_str++;
122 TString options = url.GetOptions();
123 Int_t pos = options.Index(
"ObjectMode");
126 fEnv = Environment::createEnvironment(Environment::OBJECT);
128 fEnv = Environment::createEnvironment();
130 fConn = fEnv->createConnection(uid, pw, conn_str ? conn_str :
"");
133 fHost = url.GetHost();
135 fPort = url.GetPort();
136 fPort = (fPort>0) ? fPort : 1521;
139 } CatchError(
"TOracleServer")
147 TOracleServer::~TOracleServer()
157 void TOracleServer::Close(Option_t *)
163 fEnv->terminateConnection(fConn);
165 Environment::terminateEnvironment(fEnv);
166 } CatchError(
"Close")
173 TSQLStatement *TOracleServer::Statement(const
char *sql, Int_t niter)
175 CheckConnect(
"Statement",0);
178 SetError(-1,
"no query string specified",
"Statement");
183 oracle::occi::Statement *stmt = fConn->createStatement(sql);
187 return new TOracleStatement(fEnv, fConn, stmt, niter, fErrorOut);
189 } CatchError(
"Statement")
198 TSQLResult *TOracleServer::Query(const
char *sql)
200 CheckConnect(
"Query",0);
203 SetError(-1,
"no query string specified",
"Query");
208 oracle::occi::Statement *stmt = fConn->createStatement();
217 stmt->setPrefetchRowCount(1000);
218 stmt->setPrefetchMemorySize(1000000);
221 TOracleResult *res =
new TOracleResult(fConn, stmt);
223 } CatchError(
"Query")
232 Bool_t TOracleServer::Exec(const
char* sql)
234 CheckConnect(
"Exec", kFALSE);
237 SetError(-1,
"no query string specified",
"Exec");
241 oracle::occi::Statement *stmt = 0;
246 stmt = fConn->createStatement(sql);
252 fConn->terminateStatement(stmt);
264 TSQLResult *TOracleServer::GetTables(const
char *dbname, const
char * )
273 CheckConnect(
"GetTables",0);
275 TString sqlstr(
"SELECT object_name,owner FROM ALL_OBJECTS WHERE object_type='TABLE'");
276 if (dbname && dbname[0])
277 sqlstr = sqlstr +
" AND owner='" + dbname +
"'";
279 return Query(sqlstr.Data());
284 TList* TOracleServer::GetTablesList(
const char* wild)
286 CheckConnect(
"GetTablesList",0);
288 TString cmd(
"SELECT table_name FROM user_tables");
289 if ((wild!=0) && (*wild!=0))
290 cmd+=Form(
" WHERE table_name LIKE '%s'", wild);
292 TSQLStatement* stmt = Statement(cmd);
293 if (stmt==0)
return 0;
297 if (stmt->Process()) {
299 while (stmt->NextResultRow()) {
300 const char* tablename = stmt->GetString(0);
301 if (tablename==0)
continue;
304 lst->SetOwner(kTRUE);
306 lst->Add(
new TObjString(tablename));
319 TSQLTableInfo *TOracleServer::GetTableInfo(
const char* tablename)
321 CheckConnect(
"GetTableInfo",0);
323 if ((tablename==0) || (*tablename==0))
return 0;
325 TString table(tablename);
328 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());
330 TSQLStatement* stmt = Statement(sql.Data(), 10);
331 if (stmt==0)
return 0;
333 if (!stmt->Process()) {
342 while (stmt->NextResultRow()) {
343 const char* columnname = stmt->GetString(0);
344 TString data_type = stmt->GetString(1);
345 Int_t data_length = stmt->GetInt(2);
346 Int_t data_precision = stmt->GetInt(3);
347 Int_t data_scale = stmt->GetInt(4);
348 const char* nstr = stmt->GetString(5);
349 Int_t char_col_decl_length = stmt->GetInt(6);
350 Int_t data_sign = -1;
352 Int_t sqltype = kSQL_NONE;
354 if (data_type==
"NUMBER") {
355 sqltype = kSQL_NUMERIC;
356 if (data_precision<=0) {
365 if (data_type==
"CHAR") {
367 data_precision = char_col_decl_length;
371 if ((data_type==
"VARCHAR") || (data_type==
"VARCHAR2")) {
372 sqltype = kSQL_VARCHAR;
373 data_precision = char_col_decl_length;
377 if (data_type==
"FLOAT") {
378 sqltype = kSQL_FLOAT;
380 if (data_precision==126) data_precision = -1;
384 if (data_type==
"BINARY_FLOAT") {
385 sqltype = kSQL_FLOAT;
391 if (data_type==
"BINARY_DOUBLE") {
392 sqltype = kSQL_DOUBLE;
398 if (data_type==
"LONG") {
399 sqltype = kSQL_VARCHAR;
400 data_length = 0x7fffffff;
405 if (data_type.Contains(
"TIMESTAMP")) {
406 sqltype = kSQL_TIMESTAMP;
410 Bool_t IsNullable = kFALSE;
412 IsNullable = (*nstr==
'Y') || (*nstr==
'y');
414 TSQLColumnInfo* info =
415 new TSQLColumnInfo(columnname,
424 if (lst==0) lst =
new TList;
430 return new TSQLTableInfo(tablename, lst);
439 TSQLResult *TOracleServer::GetColumns(
const char * ,
const char *tablename,
442 CheckConnect(
"GetColumns",0);
451 TString table(tablename);
454 sql.Form(
"select COLUMN_NAME, concat(concat(concat(data_type,'('),data_length),')') \"Type\" FROM user_tab_columns WHERE table_name like '%s' ORDER BY COLUMN_ID", wild);
456 sql.Form(
"select COLUMN_NAME, concat(concat(concat(data_type,'('),data_length),')') \"Type\" FROM user_tab_columns WHERE table_name = '%s' ORDER BY COLUMN_ID", table.Data());
464 Int_t TOracleServer::SelectDataBase(
const char * )
466 CheckConnect(
"SelectDataBase", -1);
479 TSQLResult *TOracleServer::GetDataBases(
const char * )
481 CheckConnect(
"GetDataBases",0);
490 Int_t TOracleServer::CreateDataBase(
const char * )
492 CheckConnect(
"CreateDataBase",-1);
502 Int_t TOracleServer::DropDataBase(
const char * )
504 CheckConnect(
"DropDataBase",-1);
514 Int_t TOracleServer::Reload()
516 CheckConnect(
"Reload", -1);
526 Int_t TOracleServer::Shutdown()
528 CheckConnect(
"Shutdown", -1);
536 const char *TOracleServer::ServerInfo()
538 CheckConnect(
"ServerInfo", 0);
541 TSQLStatement* stmt = Statement(
"select * from v$version");
543 stmt->EnableErrorOutput(kFALSE);
544 if (stmt->Process()) {
547 while (stmt->NextResultRow()) {
548 if (fInfo.Length()>0) fInfo +=
"\n";
549 fInfo += stmt->GetString(0);
562 Bool_t TOracleServer::StartTransaction()
571 Bool_t TOracleServer::Commit()
573 CheckConnect(
"Commit", kFALSE);
578 } CatchError(
"Commit")
587 Bool_t TOracleServer::Rollback()
589 CheckConnect(
"Rollback", kFALSE);
594 } CatchError(
"Rollback")
603 void TOracleServer::SetDatimeFormat(const
char* fmt)
605 if (fmt==0) fmt =
"MM/DD/YYYY, HH24:MI:SS";
606 fgDatimeFormat = fmt;
612 const char* TOracleServer::GetDatimeFormat()
614 return fgDatimeFormat;