| /********************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| // @@@ END COPYRIGHT @@@ |
| **********************************************************************/ |
| /* -*-C++-*- |
| ***************************************************************************** |
| * |
| * File: udrutil.cpp |
| * Description: Generic utilities... |
| * Created: 01/01/2001 |
| * Language: C++ |
| * |
| ***************************************************************************** |
| */ |
| #include "Platform.h" |
| |
| |
| #include "sql_buffer.h" |
| #include "Int64.h" |
| #include "udrutil.h" |
| #include "udrdefs.h" |
| #include "udrglobals.h" |
| #include "LmLangManager.h" |
| #include "LmParameter.h" |
| #include "spinfo.h" |
| #include "ComDiags.h" |
| #include <stdarg.h> |
| #include <ctype.h> |
| #include "ComRtUtils.h" |
| |
| |
| extern char *getDatatypeAsString(Int32 datatype, NABoolean extFormat = FALSE); |
| |
| FILE *UdrTraceFile = stdout; |
| |
| #define TF_STRING(x) ( (x) ? ("TRUE") : ("FALSE") ) |
| |
| void displaySqlBuffer(SqlBuffer *sbuf, Lng32 sbuflen, ostream &os) |
| { |
| os << "Display an SQL Buffer:" << endl; |
| os << " Buffer Size : " << sbuf->get_buffer_size() << endl; |
| os << " Used Size : " << sbuf->get_used_size() << endl; |
| os << " Free Size : " |
| << (sbuf->get_buffer_size() - sbuf->get_used_size()) << endl; |
| |
| switch (sbuf->bufType()) |
| { |
| case SqlBufferBase::NORMAL_: |
| os << " Buffer Type : Normal" << endl; |
| break; |
| case SqlBufferBase::DENSE_: |
| os << " Buffer Type : Dense" << endl; |
| break; |
| case SqlBufferBase::OLT_: |
| os << " Buffer Type : OLT" << endl; |
| break; |
| default: |
| os << " Buffer Type : Unknown (" |
| << sbuf->bufType() << ")" << endl; |
| break; |
| } |
| |
| os << " Packed? : " << TF_STRING(sbuf->packed()) << endl; |
| os << " Empty? : " << TF_STRING(sbuf->isFull()) << endl; |
| os << " Full? : " << TF_STRING(sbuf->isEmpty()) << endl; |
| os << " Free? : " << TF_STRING(sbuf->isFree()) << endl; |
| |
| Lng32 numtuppdescs = sbuf->getTotalTuppDescs(); |
| os << " Total Tupp Descs : " << numtuppdescs << endl; |
| os << " Processed Tupp Descs : " << sbuf->getProcessedTuppDescs() << endl; |
| |
| #ifdef SQL_BUFFER_SIGNATURE |
| char csig[100]; |
| convertInt64ToAscii(sbuf->getSignature(), csig); |
| os << " Signature : " << csig << endl; |
| #endif |
| |
| tupp_descriptor *td; |
| char *ctupp; |
| ControlInfo *ci; |
| |
| for (Lng32 i = 1; i <= numtuppdescs; i++) |
| { |
| td = sbuf->getTuppDescriptor(i); |
| if (td == NULL) |
| { |
| break; |
| } |
| |
| ctupp = td->getTupleAddress(); |
| |
| if (td->isDataTuple()) |
| { |
| ServerDebug(""); |
| ServerDebug("Data Tuple:"); |
| os << " Tupp(" << i << ") Ref Count : " |
| << td->getReferenceCount() << endl; |
| os << " Tupp(" << i << ") Allocated Size: " |
| << td->getAllocatedSize() << endl; |
| dumpBuffer((unsigned char *)ctupp, td->getAllocatedSize()); |
| } |
| |
| else if (td->isStatsTuple()) |
| { |
| ServerDebug(""); |
| ServerDebug("Stats Tuple:"); |
| os << " Tupp(" << i << ") Ref Count : " |
| << td->getReferenceCount() << endl; |
| os << " Tupp(" << i << ") Allocated Size: " |
| << td->getAllocatedSize() << endl; |
| } |
| |
| else if (td->isDiagsTuple()) |
| { |
| ServerDebug(""); |
| ServerDebug("Diags Tuple:"); |
| os << " Tupp(" << i << ") Ref Count : " |
| << td->getReferenceCount() << endl; |
| os << " Tupp(" << i << ") Allocated Size: " |
| << td->getAllocatedSize() << endl; |
| } |
| |
| else if (td->isControlTuple()) |
| { |
| ServerDebug(""); |
| ServerDebug("Control Tuple:"); |
| os << " Tupp(" << i << ") Ref Count : " |
| << td->getReferenceCount() << endl; |
| os << " Tupp(" << i << ") Allocated Size: " |
| << td->getAllocatedSize() << endl; |
| |
| ci = (ControlInfo *)td->getTupleAddress(); |
| up_state us = ci->getUpState(); |
| down_state ds = ci->getDownState(); |
| |
| os << " Tupp(" << i << ") UpState : " << endl; |
| os << " Tupp(" << i << ") Parent Index : " |
| << us.parentIndex << endl; |
| os << " Tupp(" << i << ") Down Index : " |
| << us.downIndex << endl; |
| |
| switch (us.status) |
| { |
| case ex_queue::Q_NO_DATA: |
| { |
| os << " Tupp(" << i << ") Status : Q_NO_DATA" << endl; |
| break; |
| } |
| case ex_queue::Q_OK_MMORE: |
| { |
| os << " Tupp(" << i << ") Status : Q_OK_MMORE" << endl; |
| break; |
| } |
| case ex_queue::Q_SQLERROR: |
| { |
| os << " Tupp(" << i << ") Status : Q_SQLERROR" << endl; |
| break; |
| } |
| case ex_queue::Q_INVALID: |
| { |
| os << " Tupp(" << i<< ") Status : Q_INVALID" << endl; |
| break; |
| } |
| case ex_queue::Q_GET_DONE: |
| { |
| os << " Tupp(" << i << ") Status : Q_GET_DONE" << endl; |
| break; |
| } |
| default: |
| { |
| os << " Tupp(" << i << ") Request : Unknown (" |
| << us.status << ")" << endl; |
| break; |
| } |
| } |
| |
| os << " Tupp(" << i << ") Match Nbr : " << us.getMatchNo() << endl; |
| os << " Tupp(" << i << ") DownState : " << endl; |
| |
| switch (ds.request) |
| { |
| case ex_queue::GET_N: |
| { |
| os << " Tupp(" << i << ") Request : GET_N" << endl; |
| break; |
| } |
| case ex_queue::GET_ALL: |
| { |
| os << " Tupp(" << i << ") Request : GET_ALL" << endl; |
| break; |
| } |
| case ex_queue::GET_NOMORE: |
| { |
| os << " Tupp(" << i << ") Request : GET_NOMORE" << endl; |
| break; |
| } |
| case ex_queue::GET_EMPTY: |
| { |
| os << " Tupp(" << i << ") Request : GET_EMPTY" << endl; |
| break; |
| } |
| case ex_queue::GET_EOD: |
| { |
| os << " Tupp(" << i << ") Request : GET_EOD" << endl; |
| break; |
| } |
| case ex_queue::GET_NEXT_N: |
| { |
| os << " Tupp(" << i << ") Request : GET_NEXT_N" << endl; |
| break; |
| } |
| case ex_queue::GET_NEXT_N_MAYBE_WAIT: |
| { |
| os << " Tupp(" << i |
| << ") Request : GET_NEXT_N_MAYBE_WAIT" << endl; |
| break; |
| } |
| case ex_queue::GET_NEXT_0_MAYBE_WAIT: |
| { |
| os << " Tupp(" << i |
| << ") Request : GET_NEXT_0_MAYBE_WAIT" << endl; |
| break; |
| } |
| default: |
| { |
| os << " Tupp(" << i << ") Request : Unknown (" |
| << ds.request << ")" << endl; |
| break; |
| } |
| } |
| |
| os << " Tupp(" << i |
| << ") Request : " << ds.request << endl; |
| os << " Tupp(" << i |
| << ") Request Value : " << ds.requestValue << endl; |
| os << " Tupp(" << i |
| << ") Nbr Get Nexts : " << ds.numGetNextsIssued << endl; |
| os << " Tupp(" << i |
| << ") Parent Index : " << ds.parentIndex << endl; |
| |
| os << " Tupp(" << i |
| << ") Buff Seq Nbr : " << ci->getBufferSequenceNumber() << endl; |
| |
| os << " Tupp(" << i << ") Diags Area? : " |
| << TF_STRING(ci->getIsDiagsAreaPresent()) << endl; |
| os << " Tupp(" << i << ") Ext Diags Area? : " |
| << TF_STRING(ci->getIsExtDiagsAreaPresent()) << endl; |
| os << " Tupp(" << i << ") Data Row? : " |
| << TF_STRING(ci->getIsDataRowPresent()) << endl; |
| os << " Tupp(" << i << ") Stats Area? : " |
| << TF_STRING(ci->getIsStatsAreaPresent()) << endl; |
| os << " Tupp(" << i << ") ExtStats Area? : " |
| << TF_STRING(ci->getIsExtStatsAreaPresent()) << endl; |
| |
| } // if (td->isControlTuple()) |
| |
| else |
| { |
| // some other type of tuple... |
| ServerDebug(""); |
| ServerDebug("Unknown Tuple:"); |
| os << " Tupp(" << i << ") Ref Count : " |
| << td->getReferenceCount() << endl; |
| os << " Tupp(" << i << ") Allocated Size: " |
| << td->getAllocatedSize() << endl; |
| } |
| |
| } // for (long i = 1; i <= numtuppdescs; i++) |
| |
| os << endl; |
| |
| } // displaySqlBuffer |
| |
| // This method is not invoked from anywhere, need to determine if we should keep it, if so, we have to add |
| // a way to invoke it. |
| void displayStatement(SQLSTMT_ID s) |
| { |
| cout << " Statement ID :" << endl; |
| cout << " Version :" << s.version << endl; |
| cout << " Name Mode :" << s.name_mode << endl; |
| cout << " Module :" << endl; |
| cout << " Version :" << s.module->version << endl; |
| cout << " Name :" << s.module->module_name << endl; |
| |
| #if defined( _MSC_VER ) |
| char ct[100]; |
| convertInt64ToAscii(s.module->creation_timestamp, ct); |
| cout << " Creation Timestamp :" << ct << endl; |
| #endif |
| |
| cout << " Char Set :" << s.module->charset << endl; |
| cout << " Name Length :" << s.module->module_name_len << endl; |
| cout << " Identifier :" << s.identifier << endl; |
| cout << " Handle :" << s.handle << endl; |
| cout << " Char Set :" << s.charset << endl; |
| cout << " Identifier Length :" << s.identifier_len << endl; |
| } // displayStatement |
| |
| void dumpLmParameter(LmParameter &p, Lng32 i, const char *prefix) |
| { |
| if (prefix == NULL) |
| prefix = ""; |
| |
| ServerDebug("%s [%ld] Name [%s]", prefix, i, |
| p.getParamName() ? p.getParamName() : ""); |
| ServerDebug("%s FS type %s, prec %d, scale %d, charset %d", prefix, |
| getDatatypeAsString(p.fsType()), |
| (Int32) p.prec(), (Int32) p.scale(), (Int32) p.encodingCharSet()); |
| ServerDebug("%s direction %s, collation %d, objMap %ld, resultSet %s", |
| prefix, |
| getDirectionName(p.direction()), (Int32) p.collation(), |
| (Int32) p.objMapping(), TF_STRING(p.resultSet())); |
| ServerDebug("%s IN offset %d, len %d, null offset %d, null len %d", |
| prefix, (Int32) p.inDataOffset(), (Int32) p.inSize(), |
| (Int32) p.inNullIndOffset(), (Int32) p.inNullIndSize()); |
| ServerDebug("%s vclen offset %d, vclen len %d", prefix, |
| (Int32) p.inVCLenIndOffset(), (Int32) p.inVCLenIndSize()); |
| ServerDebug("%s OUT offset %d, len %d, null offset %d, null len %d", |
| prefix, (Int32) p.outDataOffset(), (Int32) p.outSize(), |
| (Int32) p.outNullIndOffset(), (Int32) p.outNullIndSize()); |
| ServerDebug("%s vclen offset %d, vclen len %d", prefix, |
| (Int32) p.outVCLenIndOffset(), (Int32) p.outVCLenIndSize()); |
| |
| } // dumpLmParameter |
| |
| void dumpBuffer(unsigned char *buffer) |
| { |
| dumpBuffer(buffer, str_len((char *)buffer)); |
| } |
| |
| void dumpBuffer(unsigned char *buffer, size_t len) |
| { |
| if (buffer == NULL) |
| { |
| return; |
| } |
| |
| // |
| // We will print the buffer 16 characters at a time. For each group |
| // of 16 characters will we build two strings. One we call the "hex" |
| // string and the other the "ascii" string. They will be formatted |
| // as follows: |
| // |
| // hex: "<hex pair> <hex pair> ..." |
| // ascii: "<ascii value><ascii value>..." |
| // |
| // where each <hex pair> is a 4-character hex representation of |
| // 2-bytes and each <ascii value> is 1 character. |
| // |
| const Int32 CHARS_PER_LINE = 16; |
| const Int32 ASCII_BUF_LEN = CHARS_PER_LINE + 1; |
| |
| const Int32 HEX_BUF_LEN = |
| (2 * CHARS_PER_LINE) // 2 hex characters per byte of input |
| + (CHARS_PER_LINE / 2) // one space between each <hex pair> |
| + 1; // null terminator |
| |
| // |
| // The 100-byte pads in the following two buffers are only used as |
| // safeguards to prevent corrupting the stack. The code should work |
| // without the padding. |
| // |
| char hexBuf[HEX_BUF_LEN + 100]; |
| char asciiBuf[ASCII_BUF_LEN + 100]; |
| size_t i, j, hexOffset, asciiOffset; |
| size_t startingOffset; |
| Int32 nCharsWritten; |
| |
| // |
| // This message will be used for buffer overflow assertion failures |
| // |
| const char *msg = "Buffer overflow in dumpBuffer() routine"; |
| |
| i = 0; |
| while (i < len) |
| { |
| // |
| // Initialize the two buffers with blank padding and null |
| // terminators |
| // |
| memset(hexBuf, ' ', HEX_BUF_LEN); |
| memset(asciiBuf, ' ', ASCII_BUF_LEN); |
| hexBuf[HEX_BUF_LEN - 1] = '\0'; |
| asciiBuf[ASCII_BUF_LEN - 1] = '\0'; |
| hexOffset = 0; |
| asciiOffset = 0; |
| startingOffset = i; |
| |
| // |
| // Inside the following for loop hexOffset should be incremented |
| // by 2 or 3 and asciiOffset incremented by 1. |
| // |
| for (j = 0; j < CHARS_PER_LINE && i < len; j++, i++) |
| { |
| // |
| // Write a 2-character hex value to the hex buffer. The %X |
| // format expects an int value. |
| // |
| nCharsWritten = sprintf(&hexBuf[hexOffset], "%02X", |
| (Int32) buffer[i]); |
| UDR_ASSERT(nCharsWritten == 2, msg); |
| hexOffset += 2; |
| |
| // |
| // Add a space to the hex buffer following each pair of bytes |
| // |
| if (j % 2 == 1) |
| { |
| hexBuf[hexOffset++] = ' '; |
| } |
| |
| // |
| // Write one character to the ascii buffer |
| // |
| char c; |
| if (!isprint(buffer[i])) |
| { |
| c = '.'; |
| } |
| else |
| { |
| c = buffer[i]; |
| } |
| asciiBuf[asciiOffset++] = c; |
| |
| } // for (j = 0; j < CHARSPERLINE && i < len; j++, i++) |
| |
| UDR_ASSERT(hexOffset < HEX_BUF_LEN, msg); |
| UDR_ASSERT(asciiOffset < ASCII_BUF_LEN, msg); |
| UDR_ASSERT(hexBuf[HEX_BUF_LEN - 1] == '\0', msg); |
| UDR_ASSERT(asciiBuf[ASCII_BUF_LEN - 1] == '\0', msg); |
| |
| ServerDebug("%08X %-*s | %s", (Int32) startingOffset, |
| (Int32) (HEX_BUF_LEN - 1), hexBuf, asciiBuf); |
| |
| } // while (i < len) |
| |
| ServerDebug(""); |
| |
| } // dumpBuffer |
| |
| void dumpComCondition(ComCondition *cc, char *ind) |
| { |
| //ServerDebug("%s Class Origin : %s", ind, cc->getClassOrigin()); |
| //ServerDebug("%s Sub Class Origin : %s", ind, cc->getSubClassOrigin()); |
| //ServerDebug("%s Message : %s", ind, cc->getMessageText()); |
| //ServerDebug("%s Message Length : %ld", ind, |
| // (long) cc->getMessageLength()); |
| |
| ServerDebug("%s Condition Nbr : %ld", ind, |
| (Lng32) cc->getConditionNumber()); |
| ServerDebug("%s SQL Code : %ld", ind, (Lng32) cc->getSQLCODE()); |
| ServerDebug("%s Server Name : %s", ind, cc->getServerName()); |
| ServerDebug("%s Connection Name : %s", ind, cc->getConnectionName()); |
| ServerDebug("%s Constraint Name : %s", ind, cc->getConstraintName()); |
| ServerDebug("%s Constraint Catalog : %s", ind, |
| cc->getConstraintCatalog()); |
| ServerDebug("%s Constraint Schema : %s", ind, cc->getConstraintSchema()); |
| ServerDebug("%s Catalog Name : %s", ind, cc->getCatalogName()); |
| ServerDebug("%s Schema Name : %s", ind, cc->getSchemaName()); |
| ServerDebug("%s Table Name : %s", ind, cc->getTableName()); |
| ServerDebug("%s Column Name : %s", ind, cc->getColumnName()); |
| ServerDebug("%s Cursor Name : ", ind, cc->getSqlID()); |
| ServerDebug("%s Row Number : %ld", ind, (Lng32) cc->getRowNumber()); |
| |
| for (Int32 jj=0; jj<ComCondition::NumOptionalParms;jj++) |
| { |
| if (cc->getOptionalString(jj) != NULL) |
| { |
| ServerDebug("%s OptionalString(%ld) : %s", |
| ind, (Lng32) jj, cc->getOptionalString(jj)); |
| } |
| |
| if (cc->getOptionalInteger(jj) != ComDiags_UnInitialized_Int) |
| { |
| ServerDebug("%s OptionalInteger(%ld): %ld", |
| ind, (Lng32) jj, (Lng32) cc->getOptionalInteger(jj)); |
| } |
| } |
| |
| } // dumpComCondition... |
| |
| void dumpDiagnostics (ComDiagsArea *diags, Lng32 indent) |
| { |
| ComCondition *cc; |
| Lng32 ii; |
| Lng32 nbrW, nbrE, nbrA; |
| |
| Lng32 indmax; |
| if (indent > 99) |
| { |
| indmax = 99; |
| } |
| else |
| { |
| indmax = indent; |
| } |
| |
| char ind[100]; |
| Lng32 indIdx = 0; |
| for (indIdx = 0; indIdx < indmax; indIdx++) |
| ind[indIdx] = ' '; |
| ind[indIdx] = '\0'; |
| |
| nbrW = diags->getNumber(DgSqlCode::WARNING_); |
| nbrE = diags->getNumber(DgSqlCode::ERROR_); |
| nbrA = diags->getNumber(); // errors followed by warnings... |
| |
| ServerDebug(" "); |
| ServerDebug("%sContents of Diagnostics Area:", ind ); |
| ServerDebug("%s-----------------------------", ind ); |
| ServerDebug("%sMain Error : %ld", ind, |
| (Lng32) diags->mainSQLCODE()); |
| ServerDebug("%sNumber : %ld", ind, |
| (Lng32) diags->getNumber()); |
| ServerDebug("%sAre More? : %s", ind, |
| (diags->areMore() ? "TRUE" : "FALSE")); |
| ServerDebug("%sRow Count : %ld", ind, |
| (Lng32) diags->getRowCount()); |
| ServerDebug("%sCost : %le", ind, |
| (double) diags->getCost()); |
| ServerDebug("%sAvg Stream Wait Time : %ld", ind, |
| (Lng32) diags->getAvgStreamWaitTime()); |
| ServerDebug("%sLength Limit : %ld", ind, |
| (Lng32) diags->getLengthLimit()); |
| ServerDebug("%sSQL Function : %ld", ind, |
| (Lng32) diags->getFunction()); |
| ServerDebug("%sSQL Function Name : %s", ind, |
| diags->getFunctionName()); |
| ServerDebug("%sNbr Warnings : %ld", ind, (Lng32) nbrW); |
| ServerDebug("%sNbr Errors : %ld", ind, (Lng32) nbrE); |
| |
| for (ii=1; ii <= nbrW; ii++) |
| { |
| cc = diags->getWarningEntry(ii); |
| ServerDebug("%sWarning(%ld) :", ind, (Lng32) ii); |
| dumpComCondition(cc, ind); |
| } |
| |
| for (ii=1; ii <= nbrE; ii++) |
| { |
| cc = diags->getErrorEntry(ii); |
| ServerDebug("%sError(%ld) :", ind, (Lng32) ii); |
| dumpComCondition(cc, ind); |
| } |
| |
| ServerDebug(" "); |
| return; |
| |
| // errors and warnings in order added |
| for (ii=1; ii <= nbrA; ii++) |
| { |
| ServerDebug("%sErrors/Warnings(%ld) :", ind, (Lng32) ii); |
| dumpComCondition(cc, ind); |
| } |
| |
| } // dumpDiagnostics |
| |
| const char *getDirectionName(ComColumnDirection d) |
| { |
| switch (d) |
| { |
| case COM_INPUT_COLUMN: return "IN"; |
| case COM_OUTPUT_COLUMN: return "OUT"; |
| case COM_INOUT_COLUMN: return "INOUT"; |
| } |
| return ComRtGetUnknownString((Int32) d); |
| } |
| |
| const char * getLmResultSetMode(const LmResultSetMode &rs) |
| { |
| switch (rs) |
| { |
| case RS_NONE: return "RS_NONE"; |
| case RS_SET: return "RS_SET"; |
| } |
| return ComRtGetUnknownString((Int32) rs); |
| } |
| |
| void ServerDebug(const char *formatString, ...) |
| { |
| static Int32 pid = getpid(); |
| fprintf(UdrTraceFile, "[%04d] ", pid); |
| va_list args; |
| va_start(args, formatString); |
| vfprintf(UdrTraceFile, formatString, args); |
| fprintf(UdrTraceFile, "\n"); |
| fflush(UdrTraceFile); |
| } |
| |
| void doMessageBox(UdrGlobals *UdrGlob, Int32 trLevel, |
| NABoolean moduleType, const char * moduleName) |
| { |
| if (UdrGlob && UdrGlob->traceLevel_ >= trLevel && moduleType) |
| { |
| MessageBox(NULL, moduleName , |
| UdrGlob->serverName_, MB_OK|MB_ICONINFORMATION); |
| } |
| } |
| |
| #ifdef _DEBUG |
| void sleepIfPropertySet(LmLanguageManager &lm, |
| const char *property, |
| ComDiagsArea *d) |
| { |
| Lng32 delay = 0; |
| if (getLmProperty(lm, property, delay, d) && delay > 0) |
| { |
| Sleep(delay * 1000); |
| } |
| } |
| |
| NABoolean getLmProperty(LmLanguageManager &lm, |
| const char *property, |
| Lng32 &result, |
| ComDiagsArea *diags) |
| { |
| NABoolean ok = FALSE; |
| char buf[100]; |
| NABoolean isSet = FALSE; |
| LmResult r = lm.getSystemProperty(property, buf, 100, isSet, diags); |
| if (r == LM_OK && isSet && buf[0] != 0) |
| { |
| result = atol(buf); |
| ok = TRUE; |
| } |
| return ok; |
| } |
| #endif // _DEBUG |
| |
| // This function is used by the signal/trap/exit handler code. |
| // It is moved from UdrFFDC.cpp file to avoid compilation errors. |
| // Inclusion of spinfo.h and TFDS header file cause some re-definitions. |
| void getActiveRoutineInfo(UdrGlobals *UdrGlob, |
| char *routineName, |
| char *routineType, |
| char *routineLanguage, |
| NABoolean &isRoutineActive) |
| { |
| SPInfo *currSP = NULL; |
| ComRoutineLanguage language; |
| |
| routineName[0] = '\0'; |
| routineType[0] = '\0'; |
| routineLanguage[0] = '\0'; |
| isRoutineActive = FALSE; |
| |
| currSP = (UdrGlob ? UdrGlob->getCurrSP() : NULL); |
| if (currSP == NULL) |
| return; |
| |
| strcpy (routineName, currSP->getSqlName()); |
| |
| language = currSP->getLanguage(); |
| |
| switch (language) |
| { |
| case COM_LANGUAGE_JAVA: |
| strcpy(routineLanguage, "JAVA"); |
| // following is a kluge until we propagate routine type from the plan |
| strcpy(routineType, "Stored Procedure"); |
| break; |
| |
| case COM_LANGUAGE_C: |
| strcpy(routineLanguage, "C"); |
| // following is a kluge until we propagate routine type from the plan |
| strcpy(routineType, "UDF"); |
| break; |
| |
| case COM_LANGUAGE_CPP: |
| strcpy(routineLanguage, "C++"); |
| // following is a kluge until we propagate routine type from the plan |
| strcpy(routineType, "UDF"); |
| break; |
| |
| default: |
| break; |
| } |
| |
| LmLanguageManager *lm = (UdrGlob ? UdrGlob->getLM(language) : NULL); |
| if (lm == NULL) |
| return; |
| |
| isRoutineActive = lm->isRoutineActive(); |
| |
| } |
| |
| |