short ExExeUtilAQRTcb::work() { // if no parent request, return if (qparent_.down->isEmpty()) return WORK_OK; ex_queue_entry * pentry_down = qparent_.down->getHeadEntry(); ExExeUtilPrivateState & pstate = *((ExExeUtilPrivateState*) pentry_down->pstate); ContextCli *currContext = getGlobals()->castToExExeStmtGlobals()->castToExMasterStmtGlobals()-> getStatement()->getContext(); AQRInfo * aqr = currContext->aqrInfo(); while (1) { switch (step_) { case EMPTY_: { if (aqrTdb().getTask() == ComTdbExeUtilAQR::GET_) { // GET aqr entries and display them aqr->position(); step_ = RETURN_HEADER_; } else { step_ = SET_ENTRY_; } } break; case SET_ENTRY_: { if (aqr->setAQREntry(aqrTdb().getTask(), aqrTdb().sqlcode_, aqrTdb().nskcode_, aqrTdb().retries_, aqrTdb().delay_, aqrTdb().type_, 0, NULL, 0, 0)) { // error step_ = HANDLE_ERROR_; break; } step_ = DONE_; } break; case RETURN_HEADER_: { // if no room in up queue for 4 display rows, // won't be able to return data/status. // Come back later. if ((qparent_.up->getSize() - qparent_.up->getLength()) < 5) return -1; moveRowToUpQueue(" "); moveRowToUpQueue(" SQLCODE PLATFORMERROR RETRIES DELAY TYPE "); moveRowToUpQueue("============================================================"); moveRowToUpQueue(" "); step_ = RETURNING_ENTRY_; } break; case RETURNING_ENTRY_: { // if no room in up queue, won't be able to return data/status. // Come back later. if (qparent_.up->isFull()) return WORK_OK; Lng32 sqlcode, nskcode, retries, delay, type, intAQR; Lng32 eof = 0; eof = aqr->getNextAQREntry(sqlcode, nskcode, retries, delay, type, intAQR); if (eof) { step_ = DONE_; break; } // internal aqr entry, no need to display if (intAQR) break; char formattedStr[400]; str_sprintf(formattedStr, "%9d %13d %9d %9d %9d", sqlcode, nskcode, retries, delay, type); moveRowToUpQueue(formattedStr); } break; case HANDLE_ERROR_: { if (qparent_.up->isFull()) return WORK_OK; ExHandleErrors(qparent_, pentry_down, 0, getGlobals(), NULL, (ExeErrorCode)8931, NULL, NULL ); step_ = DONE_; } break; case DONE_: { if (qparent_.up->isFull()) return WORK_OK; // all ok. Return EOF. ex_queue_entry * up_entry = qparent_.up->getTailEntry(); up_entry->upState.parentIndex = pentry_down->downState.parentIndex; up_entry->upState.setMatchNo(0); up_entry->upState.status = ex_queue::Q_NO_DATA; // insert into parent qparent_.up->insert(); step_ = EMPTY_; qparent_.down->removeHead(); return WORK_OK; } break; } // switch } return 0; }
short ExExeUtilTcb::executeQuery(char * task, char * object, char * query, NABoolean displayStartTime, NABoolean displayEndTime, short &rc, short * warning, Lng32 * ec, NABoolean moveErrorRow, NABoolean continueOnError, NABoolean monitorThis) { short retcode = 0; char buf[BUFFER_SIZE]; while (1) { switch (pqStep_) { case PROLOGUE_: { warning_ = 0; startTime_ = NA_JulianTimestamp(); elapsedTime_ = 0; if (displayStartTime) { getStatusString(task, "Started", object, buf); if (moveRowToUpQueue(buf, 0, &rc)) return 1; } pqStep_ = EXECUTE_; rc = WORK_RESCHEDULE_AND_RETURN; return 1; } break; case EXECUTE_: { retcode = cliInterface()->fetchRowsPrologue(query,FALSE,monitorThis); if (retcode < 0) { pqStep_ = ERROR_RETURN_; break; } pqStep_ = FETCH_ROW_; } break; case FETCH_ROW_: { retcode = (short)cliInterface()->fetch(); if (retcode < 0) { pqStep_ = ERROR_RETURN_; break; } if ((retcode > 0) && (retcode != 100)) warning_ = retcode; if ((retcode != 100) && (cliInterface()->outputBuf())) pqStep_ = RETURN_ROW_; else pqStep_ = CLOSE_; } break; case RETURN_ROW_: { char * ptr; Lng32 len; cliInterface()->getPtrAndLen(1, ptr, len); retcode = moveRowToUpQueue(ptr, len, &rc); if (retcode) return 1; pqStep_ = FETCH_ROW_; } break; case CLOSE_: { retcode = cliInterface()->fetchRowsEpilogue(""); if (retcode < 0) { pqStep_ = ERROR_RETURN_; break; } pqStep_ = EPILOGUE_; } break; case EPILOGUE_: { endTime_ = NA_JulianTimestamp(); elapsedTime_ = endTime_ - startTime_; if (displayEndTime) { char timeBuf[200]; getTimeAsString(elapsedTime_, timeBuf); getStatusString(task, "Ended", object, buf, timeBuf); if (moveRowToUpQueue(buf, 0, &rc)) return 1; } pqStep_ = ALL_DONE_; rc = WORK_RESCHEDULE_AND_RETURN; return 1; } break; case ERROR_RETURN_: { Lng32 sqlcode = 0; char * stringParam1 = NULL; Lng32 intParam1 = ComDiags_UnInitialized_Int; retcode = (short)cliInterface()->retrieveSQLDiagnostics(getDiagsArea()); if (moveErrorRow) { if (retcode == 0) { ComDiagsArea * da = getDiagsArea(); sqlcode = (short)da->mainSQLCODE(); ComCondition * cc; if (sqlcode < 0) cc = da->getErrorEntry(1); else cc = da->getWarningEntry(1); if (sqlcode < 0 && ec != NULL) *ec = sqlcode; if (cc->getOptionalStringCharSet(0) == CharInfo::ISO88591 || cc->getOptionalStringCharSet(0) == CharInfo::UTF8) stringParam1 = (char*)cc->getOptionalString(0); else stringParam1 = NULL; intParam1 = cc->getOptionalInteger(0); } else { sqlcode = retcode; } Lng32 errorBufLen = 200 + (stringParam1 ? strlen(stringParam1) : 0); char * errorBuf = new(getHeap()) char[errorBufLen]; str_sprintf(errorBuf, "%d", sqlcode); if (stringParam1) str_sprintf(&errorBuf[strlen(errorBuf)], ", %s", stringParam1); if (intParam1 != ComDiags_UnInitialized_Int) str_sprintf(&errorBuf[strlen(errorBuf)], ", %d", intParam1); char * outBuf = new(getHeap()) char[errorBufLen+400]; getStatusString(task, "Error", NULL, outBuf, NULL, NULL, errorBuf); NADELETEBASIC(errorBuf, getHeap()); if ((moveErrorRow) && (moveRowToUpQueue(outBuf, 0, &rc))) { NADELETEBASIC(outBuf, getHeap()); return 1; } NADELETEBASIC(outBuf, getHeap()); } // close cursor, etc. Ignore errors. cliInterface()->fetchRowsEpilogue(""); if (continueOnError) { pqStep_ = ALL_DONE_; rc = WORK_RESCHEDULE_AND_RETURN; return 1; } else { pqStep_ = PROLOGUE_; return -1; } } break; case ALL_DONE_: { pqStep_ = PROLOGUE_; if (warning) *warning = warning_; return 0; } break; } } }
ExWorkProcRetcode ExHbaseAccessGetTablesTcb::work() { Lng32 retcode = 0; short rc = 0; // if no parent request, return if (qparent_.down->isEmpty()) return WORK_OK; while (1) { switch (step_) { case NOT_STARTED: { matches_ = 0; step_ = GET_TABLE; } break; case GET_TABLE: { retcode = ehi_->getTable(table_); if (retcode == HBASE_ACCESS_EOD) { step_ = CLOSE; break; } if (setupError(retcode, "ExpHbaseInterface::getTable")) step_ = HANDLE_ERROR; else step_ = RETURN_ROW; } break; case RETURN_ROW: { char * ptr = table_.val; short len = (short)table_.len; if (moveRowToUpQueue(ptr, len, &rc, TRUE)) { return rc; } step_ = GET_TABLE; } break; case CLOSE: { step_ = DONE; } break; case HANDLE_ERROR: { if (handleError(rc)) return rc; step_ = DONE; } break; case DONE: { if (handleDone(rc)) return rc; step_ = NOT_STARTED; return WORK_OK; } break; }// switch } // while }