From: <ale...@us...> - 2014-08-27 09:24:44
|
Revision: 60002 http://sourceforge.net/p/firebird/code/60002 Author: alexpeshkoff Date: 2014-08-27 09:24:30 +0000 (Wed, 27 Aug 2014) Log Message: ----------- Divide IStatus information into 3 parts: errors, warnings and completion code. Errors and warnings are processed in IStatus independently. Completion code is moved away from IStatus and returned directly by appropriate functions. Replaced isSuccess() with more generic function getStatus(), which sets appropriate bits in returned value when errors/warnings are present. Also use same style when returning bytes' array and it's length in different interfaces. Modified Paths: -------------- firebird/trunk/examples/dbcrypt/CryptKeyHolder.cpp firebird/trunk/examples/dbcrypt/DbCrypt.cpp firebird/trunk/examples/interfaces/01.create.cpp firebird/trunk/examples/interfaces/02.update.cpp firebird/trunk/examples/interfaces/03.select.cpp firebird/trunk/examples/interfaces/04.print_table.cpp firebird/trunk/examples/udr/UdrCppExample.cpp firebird/trunk/src/auth/AuthDbg.cpp firebird/trunk/src/auth/SecureRemotePassword/Message.h firebird/trunk/src/auth/SecureRemotePassword/client/SrpClient.cpp firebird/trunk/src/auth/SecureRemotePassword/manage/SrpManagement.cpp firebird/trunk/src/auth/SecureRemotePassword/server/SrpServer.cpp firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.epp firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp firebird/trunk/src/common/BigInteger.cpp firebird/trunk/src/common/CsConvert.h firebird/trunk/src/common/MsgMetadata.h firebird/trunk/src/common/StatusArg.cpp firebird/trunk/src/common/StatusArg.h firebird/trunk/src/common/StatusHolder.cpp firebird/trunk/src/common/StatusHolder.h firebird/trunk/src/common/UtilSvc.cpp firebird/trunk/src/common/call_service.cpp firebird/trunk/src/common/classes/BlrReader.h firebird/trunk/src/common/classes/ImplementHelper.h firebird/trunk/src/common/cvt.cpp firebird/trunk/src/common/db_alias.cpp firebird/trunk/src/common/dsc.cpp firebird/trunk/src/common/fb_exception.cpp firebird/trunk/src/common/isc.cpp firebird/trunk/src/common/isc_proto.h firebird/trunk/src/common/os/os_utils.h firebird/trunk/src/common/unicode_util.cpp firebird/trunk/src/common/utils.cpp firebird/trunk/src/common/utils_proto.h firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/dsql.cpp firebird/trunk/src/gpre/obj_cxx.cpp firebird/trunk/src/include/fb_exception.h firebird/trunk/src/include/fb_types.h firebird/trunk/src/include/firebird/Auth.h firebird/trunk/src/include/firebird/Interface.h firebird/trunk/src/include/firebird/Provider.h firebird/trunk/src/include/firebird/UdrCppEngine.h firebird/trunk/src/isql/extract.epp firebird/trunk/src/isql/isql.epp firebird/trunk/src/isql/show.epp firebird/trunk/src/jrd/CryptoManager.cpp firebird/trunk/src/jrd/Database.cpp firebird/trunk/src/jrd/EngineInterface.h firebird/trunk/src/jrd/Mapping.cpp firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/extds/ExtDS.cpp firebird/trunk/src/jrd/extds/InternalDS.cpp firebird/trunk/src/jrd/jrd.cpp firebird/trunk/src/jrd/jrd.h firebird/trunk/src/jrd/tra.cpp firebird/trunk/src/jrd/trace/TraceManager.cpp firebird/trunk/src/plugins/udr_engine/UdrEngine.cpp firebird/trunk/src/remote/client/interface.cpp firebird/trunk/src/remote/inet.cpp firebird/trunk/src/remote/remote.cpp firebird/trunk/src/remote/remote.h firebird/trunk/src/remote/server/server.cpp firebird/trunk/src/utilities/fbsvcmgr/fbsvcmgr.cpp firebird/trunk/src/utilities/gsec/gsec.cpp firebird/trunk/src/yvalve/DistributedTransaction.cpp firebird/trunk/src/yvalve/PluginManager.cpp firebird/trunk/src/yvalve/YObjects.h firebird/trunk/src/yvalve/perf.cpp firebird/trunk/src/yvalve/preparse.cpp firebird/trunk/src/yvalve/utl.cpp firebird/trunk/src/yvalve/why.cpp Modified: firebird/trunk/examples/dbcrypt/CryptKeyHolder.cpp =================================================================== --- firebird/trunk/examples/dbcrypt/CryptKeyHolder.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/dbcrypt/CryptKeyHolder.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -197,7 +197,7 @@ vector[2] = isc_arg_string; vector[3] = (ISC_STATUS) "Key not set"; vector[4] = isc_arg_end; - status->set(vector); + status->setErrors(vector); } int FB_CARG CryptKeyHolder::keyCallback(IStatus* status, ICryptKeyCallback* callback) @@ -208,12 +208,12 @@ return 1; IConfig* def = config->getDefaultConfig(status); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) return 1; IConfigEntry* confEntry = def->find(status, "Auto"); def->release(); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) return 1; if (confEntry) Modified: firebird/trunk/examples/dbcrypt/DbCrypt.cpp =================================================================== --- firebird/trunk/examples/dbcrypt/DbCrypt.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/dbcrypt/DbCrypt.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -152,7 +152,7 @@ vector[2] = isc_arg_string; vector[3] = (ISC_STATUS)"Key not set"; vector[4] = isc_arg_end; - status->set(vector); + status->setErrors(vector); } void FB_CARG DbCrypt::encrypt(IStatus* status, unsigned int length, const void* from, void* to) @@ -201,11 +201,11 @@ return; IConfig* def = config->getDefaultConfig(status); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) return; IConfigEntry* confEntry = def->find(status, "Auto"); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { def->release(); return; @@ -238,7 +238,7 @@ for (unsigned n = 0; n < length; ++n) { ICryptKeyCallback* callback = sources[n]->keyHandle(status, "sample"); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) return; if (callback && callback->callback(0, NULL, 1, &key) == 1) Modified: firebird/trunk/examples/interfaces/01.create.cpp =================================================================== --- firebird/trunk/examples/interfaces/01.create.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/interfaces/01.create.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -49,7 +49,7 @@ // Probably not best way of error processing, but it's OK for a sample static void check(IStatus* s, const char* text) { - if (!s->isSuccess()) + if (s->getStatus() & IStatus::FB_HAS_ERRORS) throw text; } @@ -141,7 +141,7 @@ rc = 1; fprintf(stderr, "%s:\n", text); if (st) - isc_print_status(st->get()); + isc_print_status(st->getErrors()); } // release interfaces after error caught Modified: firebird/trunk/examples/interfaces/02.update.cpp =================================================================== --- firebird/trunk/examples/interfaces/02.update.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/interfaces/02.update.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -55,7 +55,7 @@ static void check(IStatus* s, const char* text) { - if (!s->isSuccess()) + if (s->getStatus() & IStatus::FB_HAS_ERRORS) throw text; } @@ -152,9 +152,9 @@ // Update the budget. stmt->execute(st, tra, meta, buffer, NULL, NULL); - if (!st->isSuccess()) + if (st->getStatus() & IStatus::FB_HAS_ERRORS) { - int sqlcode = isc_sqlcode(st->get()); + int sqlcode = isc_sqlcode(st->getErrors()); // Don't save the update, if the new budget exceeds the limit. if (sqlcode == -625) { @@ -198,7 +198,7 @@ rc = 1; fprintf(stderr, "%s:\n", text); if (st) - isc_print_status(st->get()); + isc_print_status(st->getErrors()); } // release interfaces after error caught Modified: firebird/trunk/examples/interfaces/03.select.cpp =================================================================== --- firebird/trunk/examples/interfaces/03.select.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/interfaces/03.select.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -46,7 +46,7 @@ static void check(IStatus* s, const char* text) { - if (!s->isSuccess()) + if (s->getStatus() & IStatus::FB_HAS_ERRORS) throw text; } @@ -156,7 +156,7 @@ unsigned char* buffer = new unsigned char[l]; // fetch records from cursor and print them - while (curs->fetchNext(st, buffer)) + while (curs->fetchNext(st, buffer) == IStatus::FB_OK) { for (unsigned j = 0; j < cols; ++j) { @@ -196,7 +196,7 @@ rc = 1; fprintf(stderr, "%s:\n", text); if (st) - isc_print_status(st->get()); + isc_print_status(st->getErrors()); } // release interfaces after error caught Modified: firebird/trunk/examples/interfaces/04.print_table.cpp =================================================================== --- firebird/trunk/examples/interfaces/04.print_table.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/interfaces/04.print_table.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -45,7 +45,7 @@ static void check(IStatus* s, const char* text) { - if (!s->isSuccess()) + if (s->getStatus() & IStatus::FB_HAS_ERRORS) throw text; } @@ -157,7 +157,7 @@ unsigned char* buffer = new unsigned char[l]; // fetch records from cursor - while (curs->fetchNext(st, buffer)) + while (curs->fetchNext(st, buffer) == IStatus::FB_OK) { for (unsigned j = 0; j < f; ++j) { @@ -190,7 +190,7 @@ fflush(stdout); fprintf(stderr, " %s:\n", text); if (st) - isc_print_status(st->get()); + isc_print_status(st->getErrors()); } if (meta) @@ -260,15 +260,14 @@ char segbuf[16]; unsigned len; // read data segment by segment - while ( (len = blob->getSegment(st, sizeof(segbuf), segbuf)) ) + for(;;) { - // to be reviewed after A1 - need better segment/eof handling - if (st->get()[1] != isc_segment) - check(st, "getSegment"); + int cc = blob->getSegment(st, sizeof(segbuf), segbuf, &len); + if (cc != IStatus::FB_OK && cc != IStatus::FB_SEGMENT) + break; fwrite(segbuf, sizeof(char), len, stdout); } - if (st->get()[1] != isc_segstr_eof) - check(st, "getSegment"); + check(st, "getSegment"); // close BLOB after receiving all data blob->close(st); Modified: firebird/trunk/examples/udr/UdrCppExample.cpp =================================================================== --- firebird/trunk/examples/udr/UdrCppExample.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/examples/udr/UdrCppExample.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -676,7 +676,7 @@ // This will not work if the table has computed fields. stmt->execute(status, transaction, triggerMetadata, newFields, NULL, NULL); - StatusException::check(status->get()); + StatusException::check(status->getErrors()); } AutoRelease<IMessageMetadata> triggerMetadata; @@ -785,7 +785,7 @@ ITransaction* transaction = StatusException::check(status, context->getTransaction(status)); stmt->execute(status, transaction, triggerMetadata, newFields, NULL, NULL); - StatusException::check(status->get()); + StatusException::check(status->getErrors()); } AutoRelease<IMessageMetadata> triggerMetadata; Modified: firebird/trunk/src/auth/AuthDbg.cpp =================================================================== --- firebird/trunk/src/auth/AuthDbg.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/AuthDbg.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -86,7 +86,7 @@ fprintf(stderr, "DebugServer::authenticate1: %s\n", str.c_str()); #endif sb->putData(status, str.length(), str.c_str()); - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } @@ -167,7 +167,7 @@ fprintf(stderr, "DebugClient::authenticate: sending %s\n", str.c_str()); #endif cb->putData(status, str.length(), str.c_str()); - if (! status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } Modified: firebird/trunk/src/auth/SecureRemotePassword/Message.h =================================================================== --- firebird/trunk/src/auth/SecureRemotePassword/Message.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecureRemotePassword/Message.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -27,9 +27,9 @@ { Firebird::LocalStatus st; Firebird::IMessageMetadata* m = out ? stmt->getOutputMetadata(&st) : stmt->getInputMetadata(&st); - if (!st.isSuccess()) + if (st.getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { - Firebird::status_exception::raise(st.get()); + Firebird::status_exception::raise(&st); } assignRefNoIncr(m); } @@ -171,13 +171,13 @@ static void check(Firebird::IStatus* status) { - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { #ifdef INTERNAL_FIREBIRD - Firebird::status_exception::raise(status->get()); + Firebird::status_exception::raise(status); #else char s[100]; - const ISC_STATUS* st = status->get(); + const ISC_STATUS* st = status->getErrors(); fb_interpret(s, sizeof(s), &st); fatalErrorHandler(s); #endif Modified: firebird/trunk/src/auth/SecureRemotePassword/client/SrpClient.cpp =================================================================== --- firebird/trunk/src/auth/SecureRemotePassword/client/SrpClient.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecureRemotePassword/client/SrpClient.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -75,7 +75,7 @@ client->genClientKey(data); dumpIt("Clnt: clientPubKey", data); cb->putData(status, data.length(), data.begin()); - return status->isSuccess() ? AUTH_MORE_DATA : AUTH_FAILED; + return status->getStatus() & IStatus::FB_HAS_ERRORS ? AUTH_FAILED : AUTH_MORE_DATA; } HANDSHAKE_DEBUG(fprintf(stderr, "Cli: SRP phase2\n")); @@ -125,7 +125,7 @@ cProof.getText(data); cb->putData(status, data.length(), data.c_str()); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } @@ -133,7 +133,7 @@ // output the key FbCryptKey cKey = {"Symmetric", sessionKey.begin(), NULL, sessionKey.getCount(), 0}; cb->putKey(status, &cKey); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } Modified: firebird/trunk/src/auth/SecureRemotePassword/manage/SrpManagement.cpp =================================================================== --- firebird/trunk/src/auth/SecureRemotePassword/manage/SrpManagement.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecureRemotePassword/manage/SrpManagement.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -153,7 +153,7 @@ selGrantor.c_str(), SQL_DIALECT_V6, NULL, NULL, out.getMetadata(), NULL); check(&s); - bool hasGrant = curs->fetchNext(&s, out.getBuffer()); + bool hasGrant = curs->fetchNext(&s, out.getBuffer()) == Firebird::IStatus::FB_OK; curs->close(&s); check(&s); @@ -212,8 +212,8 @@ Firebird::ClumpletWriter dpb(Firebird::ClumpletReader::dpbList, MAX_DPB_SIZE); dpb.insertByte(isc_dpb_sec_attach, TRUE); - const unsigned char* authBlock; - unsigned int authBlockSize = logonInfo->authBlock(&authBlock); + unsigned int authBlockSize; + const unsigned char* authBlock = logonInfo->authBlock(&authBlockSize); const char* str = logonInfo->role(); if (str && str[0]) @@ -297,16 +297,16 @@ for (unsigned repeat = 0; ; ++repeat) { stmt = att->prepare(status, tra, 0, insert, SQL_DIALECT_V6, Firebird::IStatement::PREPARE_PREFETCH_METADATA); - if (status->isSuccess()) + if (!(status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) { break; } else if (repeat > 0) { - Firebird::status_exception::raise(status->get()); + Firebird::status_exception::raise(status); } - if (fb_utils::containsErrorCode(status->get(), isc_dsql_relation_err)) + if (fb_utils::containsErrorCode(status->getErrors(), isc_dsql_relation_err)) { prepareDataStructures(); tra->commit(status); @@ -562,7 +562,7 @@ (par ? par->getBuffer() : NULL), om); check(status); - while (rs->fetchNext(status, di.getBuffer())) + while (rs->fetchNext(status, di.getBuffer()) == Firebird::IStatus::FB_OK) { listField(user->userName(), login); listField(user->firstName(), first); @@ -613,7 +613,7 @@ if (tra) { tra->commit(status); - if (status->isSuccess()) + if (!(status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) { tra = NULL; } @@ -625,7 +625,7 @@ if (tra) { tra->rollback(status); - if (status->isSuccess()) + if (!(status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) { tra = NULL; } @@ -641,7 +641,7 @@ if (att) { att->detach(&status); - if (status.isSuccess()) + if (!(status.getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) { att = NULL; } @@ -690,10 +690,10 @@ static void check(Firebird::IStatus* status) { - if (!status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { - checkStatusVectorForMissingTable(status->get()); - Firebird::status_exception::raise(status->get()); + checkStatusVectorForMissingTable(status->getErrors()); + Firebird::status_exception::raise(status); } } @@ -841,14 +841,14 @@ char segbuf[256]; unsigned len; - while ( (len = blob->getSegment(&st, sizeof(segbuf), segbuf)) ) + for (;;) { - if (st.get()[1] != isc_segment) - check(&st); + int cc = blob->getSegment(&st, sizeof(segbuf), segbuf, &len); + check(&st); + if (cc == Firebird::IStatus::FB_EOF) + break; s.append(segbuf, len); } - if (st.get()[1] != isc_segstr_eof) - check(&st); blob->close(&st); check(&st); Modified: firebird/trunk/src/auth/SecureRemotePassword/server/SrpServer.cpp =================================================================== --- firebird/trunk/src/auth/SecureRemotePassword/server/SrpServer.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecureRemotePassword/server/SrpServer.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -133,10 +133,7 @@ const char* providers = "Providers=" CURRENT_ENGINE; dpb.insertString(isc_dpb_config, providers, fb_strlen(providers)); att = p->attachDatabase(status, secDbName, dpb.getBufferLength(), dpb.getBuffer()); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); HANDSHAKE_DEBUG(fprintf(stderr, "Srv SRP: attached sec db %s\n", secDbName)); const UCHAR tpb[] = @@ -148,19 +145,16 @@ isc_tpb_wait }; tra = att->startTransaction(status, sizeof(tpb), tpb); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); HANDSHAKE_DEBUG(fprintf(stderr, "Srv: SRP1: started transaction\n")); const char* sql = "SELECT PLG$VERIFIER, PLG$SALT FROM PLG$SRP WHERE PLG$USER_NAME = ? AND PLG$ACTIVE"; stmt = att->prepare(status, tra, 0, sql, 3, IStatement::PREPARE_PREFETCH_METADATA); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { - checkStatusVectorForMissingTable(status->get()); - status_exception::raise(status->get()); + checkStatusVectorForMissingTable(status->getErrors()); + status_exception::raise(status); } Meta im(stmt, false); @@ -170,20 +164,14 @@ Meta om(stmt, true); Message dat(om); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); Field<Varying> verify(dat); Field<Varying> slt(dat); HANDSHAKE_DEBUG(fprintf(stderr, "Srv: SRP1: Ready to run statement with login '%s'\n", account.c_str())); stmt->execute(status, tra, par.getMetadata(), par.getBuffer(), dat.getMetadata(), dat.getBuffer()); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); HANDSHAKE_DEBUG(fprintf(stderr, "Srv: SRP1: Executed statement\n")); verifier.assign(reinterpret_cast<const UCHAR*>((const char*) verify), RemotePassword::SRP_VERIFIER_SIZE); @@ -194,24 +182,15 @@ dumpIt("Srv: salt", salt); stmt->free(status); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); stmt = NULL; tra->rollback(status); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); tra = NULL; att->detach(status); - if (!status->isSuccess()) - { - status_exception::raise(status->get()); - } + check(status); att = NULL; } catch(const Exception&) @@ -241,7 +220,7 @@ dumpIt("Srv: serverPubKey", serverPubKey); dumpBin("Srv: data", data); sb->putData(status, data.length(), data.c_str()); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } @@ -252,7 +231,7 @@ // output the key FbCryptKey cKey = {"Symmetric", sessionKey.begin(), NULL, sessionKey.getCount(), 0}; sb->putKey(status, &cKey); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } @@ -271,12 +250,12 @@ { MasterInterfacePtr()->upgradeInterface(writerInterface, FB_AUTH_WRITER_VERSION, upInfo); writerInterface->add(status, account.c_str()); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } writerInterface->setDb(status, secDbName); - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } Modified: firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp =================================================================== --- firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -46,7 +46,7 @@ TEXT pwt[Auth::MAX_LEGACY_PASSWORD_LENGTH + 2]; ENC_crypt(pwt, sizeof pwt, cb->getPassword(), Auth::LEGACY_PASSWORD_SALT); cb->putData(status, static_cast<unsigned>(strlen(&pwt[2])), &pwt[2]); - if (! status->isSuccess()) + if (status->getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { return AUTH_FAILED; } Modified: firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.epp =================================================================== --- firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.epp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.epp 2014-08-27 09:24:30 UTC (rev 60002) @@ -135,8 +135,8 @@ Firebird::ClumpletWriter dpb(Firebird::ClumpletReader::dpbList, MAX_DPB_SIZE); dpb.insertByte(isc_dpb_sec_attach, TRUE); - const unsigned char* authBlock; - unsigned int authBlockSize = logonInfo->authBlock(&authBlock); + unsigned int authBlockSize; + const unsigned char* authBlock = logonInfo->authBlock(&authBlockSize); if (authBlockSize) dpb.insertBytes(isc_dpb_auth_block, authBlock, authBlockSize); @@ -747,7 +747,7 @@ } } - st->set(isc_status); + fb_utils::setIStatus(st, isc_status); } catch (const Firebird::Exception& ex) { Modified: firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp =================================================================== --- firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/auth/SecurityDatabase/LegacyServer.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -509,7 +509,7 @@ #ifdef USE_ATT_RQ_CACHE LocalStatus s; TimerInterfacePtr()->start(&s, instance, 10 * 1000 * 1000); - if (!s.isSuccess()) + if (s.getStatus() & IStatus::FB_HAS_ERRORS) instance->handler(); #else instance->handler(); Modified: firebird/trunk/src/common/BigInteger.cpp =================================================================== --- firebird/trunk/src/common/BigInteger.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/BigInteger.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -33,6 +33,7 @@ #include "../common/BigInteger.h" #include "../common/os/guid.h" +#include "../common/StatusArg.h" #define CHECK_MP(a) check(a, #a) Modified: firebird/trunk/src/common/CsConvert.h =================================================================== --- firebird/trunk/src/common/CsConvert.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/CsConvert.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -32,6 +32,7 @@ #include "iberror.h" #include "../common/classes/array.h" +#include "../common/StatusArg.h" namespace Jrd { Modified: firebird/trunk/src/common/MsgMetadata.h =================================================================== --- firebird/trunk/src/common/MsgMetadata.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/MsgMetadata.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -267,8 +267,8 @@ private: void raiseIndexError(IStatus* status, unsigned index, const char* method) const { - status->set((Arg::Gds(isc_invalid_index_val) << - Arg::Num(index) << (string("IMessageMetadata::") + method)).value()); + (Arg::Gds(isc_invalid_index_val) << + Arg::Num(index) << (string("IMessageMetadata::") + method)).copyTo(status); } void assign(IMessageMetadata* from); Modified: firebird/trunk/src/common/StatusArg.cpp =================================================================== --- firebird/trunk/src/common/StatusArg.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/StatusArg.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -53,7 +53,7 @@ namespace Arg { -Base::Base(ISC_STATUS k, ISC_STATUS c) : +Base::Base(ISC_STATUS k, ISC_STATUS c) throw(Firebird::BadAlloc) : implementation(FB_NEW(*getDefaultMemoryPool()) ImplBase(k, c)) { } @@ -70,18 +70,36 @@ } } -StatusVector::StatusVector(ISC_STATUS k, ISC_STATUS c) : +StatusVector::ImplStatusVector::ImplStatusVector(const IStatus* s) throw() : Base::ImplBase(0, 0) +{ + fb_assert(s); + + clear(); + // special case - empty IStatus + if (s->getStatus() != 0) + { + append(s->getErrors(), FB_NELEM(m_status_vector) - 1); + append(s->getWarnings(), FB_NELEM(m_status_vector) - 1); + } +} + +StatusVector::StatusVector(ISC_STATUS k, ISC_STATUS c) throw(Firebird::BadAlloc) : Base(FB_NEW(*getDefaultMemoryPool()) ImplStatusVector(k, c)) { operator<<(*(static_cast<Base*>(this))); } -StatusVector::StatusVector(const ISC_STATUS* s) : +StatusVector::StatusVector(const ISC_STATUS* s) throw(Firebird::BadAlloc) : Base(FB_NEW(*getDefaultMemoryPool()) ImplStatusVector(s)) { } -StatusVector::StatusVector() : +StatusVector::StatusVector(const IStatus* s) throw(Firebird::BadAlloc) : + Base(FB_NEW(*getDefaultMemoryPool()) ImplStatusVector(s)) +{ +} + +StatusVector::StatusVector() throw(Firebird::BadAlloc) : Base(FB_NEW(*getDefaultMemoryPool()) ImplStatusVector(0, 0)) { } @@ -150,6 +168,19 @@ fb_utils::copyStatus(&m_status_vector[m_length], FB_NELEM(m_status_vector) - m_length, from, count); m_length += copied; + if (!m_warning) + { + for (unsigned n = 0; n < m_length; ) + { + if (m_status_vector[n] == isc_arg_warning) + { + m_warning = n; + break; + } + n += (m_status_vector[n] == isc_arg_cstring) ? 3 : 2; + } + } + return copied == count; } @@ -212,16 +243,23 @@ ISC_STATUS StatusVector::ImplStatusVector::copyTo(IStatus* dest) const throw() { + dest->init(); if (hasData()) { - dest->set(length() + 1u, value()); + const ISC_STATUS* v = m_status_vector; + unsigned int length = m_length; + unsigned int warning = m_warning; + + if (v[warning] == isc_arg_warning) + { + dest->setWarnings(length - warning, &v[warning]); + if (warning) + dest->setErrors(warning, v); + } + else + dest->setErrors(length, v); } - else - { - ISC_STATUS t[3] = {isc_arg_gds, FB_SUCCESS, isc_arg_end}; - dest->set(3, t); - } - return dest->get()[1]; + return m_status_vector[1]; } Gds::Gds(ISC_STATUS s) throw() : Modified: firebird/trunk/src/common/StatusArg.h =================================================================== --- firebird/trunk/src/common/StatusArg.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/StatusArg.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -29,6 +29,8 @@ #ifndef FB_STATUS_ARG #define FB_STATUS_ARG +#include "fb_exception.h" + namespace Firebird { class IStatus; @@ -82,9 +84,9 @@ virtual ~ImplBase() { } }; - Base(ISC_STATUS k, ISC_STATUS c);// : implementation(new ImplBase(k, c)) { } + Base(ISC_STATUS k, ISC_STATUS c) throw(Firebird::BadAlloc); explicit Base(ImplBase* i) throw() : implementation(i) { } - ~Base() { delete implementation; } + ~Base() throw() { delete implementation; } ImplBase* const implementation; @@ -130,13 +132,15 @@ } explicit ImplStatusVector(const ISC_STATUS* s) throw(); + explicit ImplStatusVector(const IStatus* s) throw(); }; - StatusVector(ISC_STATUS k, ISC_STATUS v); + StatusVector(ISC_STATUS k, ISC_STATUS v) throw(Firebird::BadAlloc); public: - explicit StatusVector(const ISC_STATUS* s); - StatusVector(); + explicit StatusVector(const ISC_STATUS* s) throw(Firebird::BadAlloc); + explicit StatusVector(const IStatus* s) throw(Firebird::BadAlloc); + StatusVector() throw(Firebird::BadAlloc); ~StatusVector() { } const ISC_STATUS* value() const throw() { return implementation->value(); } Modified: firebird/trunk/src/common/StatusHolder.cpp =================================================================== --- firebird/trunk/src/common/StatusHolder.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/StatusHolder.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -90,6 +90,13 @@ return m_status_vector[1]; } +ISC_STATUS DynamicStatusVector::save(const IStatus* status) +{ + ISC_STATUS_ARRAY tmp; + fb_utils::mergeStatus(tmp, FB_NELEM(tmp), status); + return save(tmp); +} + void DynamicStatusVector::clear() { ISC_STATUS *ptr = m_status_vector.begin(); @@ -129,7 +136,7 @@ fb_utils::init_status(m_status_vector.begin()); } -ISC_STATUS StatusHolder::save(const ISC_STATUS* status) +ISC_STATUS StatusHolder::save(IStatus* status) { fb_assert(isSuccess() || m_raised); if (m_raised) @@ -137,12 +144,15 @@ clear(); } - return m_status_vector.save(status); + m_error.save(status->getErrors()); + m_warning.save(status->getWarnings()); + return m_error.value()[1]; } void StatusHolder::clear() { - m_status_vector.clear(); + m_error.clear(); + m_warning.clear(); m_raised = false; } @@ -150,8 +160,10 @@ { if (getError()) { + Arg::StatusVector tmp(m_error.value()); + tmp << Arg::StatusVector(m_warning.value()); m_raised = true; - status_exception::raise(m_status_vector.value()); + tmp.raise(); } } Modified: firebird/trunk/src/common/StatusHolder.h =================================================================== --- firebird/trunk/src/common/StatusHolder.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/StatusHolder.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -40,45 +40,93 @@ { public: // IStatus implementation - virtual void FB_CARG set(const ISC_STATUS* value) + virtual void FB_CARG init() { - set(fb_utils::statusLength(value), value); + errors.init(); + warnings.init(); } - virtual void FB_CARG set(unsigned int length, const ISC_STATUS* value) + virtual void FB_CARG setErrors(const ISC_STATUS* value) { - fb_utils::copyStatus(vector, FB_NELEM(vector), value, length); + errors.set(fb_utils::statusLength(value), value); } - virtual void FB_CARG init() + virtual void FB_CARG setErrors(unsigned int length, const ISC_STATUS* value) { - fb_utils::init_status(vector); + errors.set(length, value); } - virtual const ISC_STATUS* FB_CARG get() const + virtual void FB_CARG setWarnings(const ISC_STATUS* value) { - return vector; + warnings.set(fb_utils::statusLength(value), value); } - virtual int FB_CARG isSuccess() const + virtual void FB_CARG setWarnings(unsigned int length, const ISC_STATUS* value) { - return vector[1] == 0; + warnings.set(length, value); } -public: - BaseStatus() + virtual const ISC_STATUS* FB_CARG getErrors() const { - init(); + return errors.get(); } + virtual const ISC_STATUS* FB_CARG getWarnings() const + { + return warnings.get(); + } + + virtual unsigned FB_CARG getStatus() const + { + return (errors.vector[1] ? FB_HAS_ERRORS : 0) | + (warnings.vector[1] ? FB_HAS_WARNINGS : 0); + } + +public: + BaseStatus() + { } + void check() { - if (!isSuccess()) - status_exception::raise(get()); + errors.check(); } private: - ISC_STATUS vector[40]; // FixMe - may be a kind of dynamic storage will be better? + class ErrorVector + { + public: + ErrorVector() + { + init(); + } + + ~ErrorVector() { } + + void set(unsigned int length, const ISC_STATUS* value) + { + fb_utils::copyStatus(vector, FB_NELEM(vector), value, length); + } + + virtual const ISC_STATUS* FB_CARG get() const + { + return vector; + } + + virtual void FB_CARG init() + { + fb_utils::init_status(vector); + } + + void check() + { + if (vector[1]) + status_exception::raise(get()); + } + + ISC_STATUS vector[40]; // FixMe - may be a kind of dynamic storage will be better? + }; + + ErrorVector errors, warnings; }; class LocalStatus : public AutoIface<BaseStatus, FB_STATUS_VERSION> @@ -97,16 +145,11 @@ class DynamicStatusVector { public: - explicit DynamicStatusVector(const ISC_STATUS* status = NULL) + DynamicStatusVector() : m_status_vector(*getDefaultMemoryPool()) { ISC_STATUS* s = m_status_vector.getBuffer(ISC_STATUS_LENGTH); fb_utils::init_status(s); - - if (status) - { - save(status); - } } ~DynamicStatusVector() @@ -115,8 +158,10 @@ } ISC_STATUS save(const ISC_STATUS* status); + ISC_STATUS save(const IStatus* status); void clear(); + ISC_STATUS getError() const { return value()[1]; @@ -145,25 +190,29 @@ class StatusHolder { public: - explicit StatusHolder(const ISC_STATUS* status = NULL) - : m_status_vector(status), m_raised(false) + StatusHolder() + : m_raised(false) { } - ISC_STATUS save(const ISC_STATUS* status); + ISC_STATUS save(IStatus* status); void clear(); void raise(); ISC_STATUS getError() { - return value()[1]; + return value()->getErrors()[1]; } - const ISC_STATUS* value() + const IStatus* value() { if (m_raised) { clear(); } - return m_status_vector.value(); + + m_rc.init(); + m_rc.setErrors(m_error.value()); + m_rc.setWarnings(m_warning.value()); + return &m_rc; } bool isSuccess() @@ -171,8 +220,17 @@ return getError() == 0; } + const StatusHolder& operator=(const StatusHolder& val) + { + m_error.save(val.m_error.value()); + m_warning.save(val.m_warning.value()); + m_raised = val.m_raised; + return *this; + } + private: - DynamicStatusVector m_status_vector; + DynamicStatusVector m_error, m_warning; + LocalStatus m_rc; bool m_raised; }; Modified: firebird/trunk/src/common/UtilSvc.cpp =================================================================== --- firebird/trunk/src/common/UtilSvc.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/UtilSvc.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -30,6 +30,7 @@ #include "firebird.h" #include "../common/UtilSvc.h" #include "../common/classes/alloc.h" +#include "../common/StatusArg.h" #include "iberror.h" #include <string.h> Modified: firebird/trunk/src/common/call_service.cpp =================================================================== --- firebird/trunk/src/common/call_service.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/call_service.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -334,7 +334,7 @@ setAttr(attr, "Uid", &u->u); setAttr(attr, "Gid", &u->g); u->attributes()->set(status, attr.c_str()); - if (!status->isSuccess()) + if (status->getStatus() && IStatus::FB_HAS_ERRORS) return; u->attributes()->setEntered(status, attr.hasData()); } Modified: firebird/trunk/src/common/classes/BlrReader.h =================================================================== --- firebird/trunk/src/common/classes/BlrReader.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/classes/BlrReader.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -24,6 +24,7 @@ #define COMMON_CLASSES_BLR_READER_H #include "iberror.h" +#include "../common/StatusArg.h" namespace Firebird { Modified: firebird/trunk/src/common/classes/ImplementHelper.h =================================================================== --- firebird/trunk/src/common/classes/ImplementHelper.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/classes/ImplementHelper.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -38,6 +38,7 @@ #include "../common/classes/init.h" #include "../common/classes/auto.h" #include "../common/classes/RefCounted.h" +#include "../common/StatusArg.h" #include "consts_pub.h" namespace Firebird { @@ -368,9 +369,9 @@ // Generic status checker inline void check(IStatus* status) { - if (!status->isSuccess()) + if (status->getStatus() & IStatus::FB_HAS_ERRORS) { - status_exception::raise(status->get()); + status_exception::raise(status); } } Modified: firebird/trunk/src/common/cvt.cpp =================================================================== --- firebird/trunk/src/common/cvt.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/cvt.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -50,6 +50,7 @@ #include "../common/classes/FpeControl.h" #include "../common/dsc_proto.h" #include "../common/utils_proto.h" +#include "../common/StatusArg.h" #ifdef HAVE_SYS_TYPES_H Modified: firebird/trunk/src/common/db_alias.cpp =================================================================== --- firebird/trunk/src/common/db_alias.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/db_alias.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -32,6 +32,7 @@ #include "../common/utils_proto.h" #include "../common/classes/Hash.h" #include "../common/isc_f_proto.h" +#include "../common/StatusArg.h" #include <ctype.h> using namespace Firebird; Modified: firebird/trunk/src/common/dsc.cpp =================================================================== --- firebird/trunk/src/common/dsc.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/dsc.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -32,6 +32,7 @@ #include "../yvalve/gds_proto.h" #include "../common/gdsassert.h" #include "../common/dsc_proto.h" +#include "../common/StatusArg.h" using namespace Firebird; Modified: firebird/trunk/src/common/fb_exception.cpp =================================================================== --- firebird/trunk/src/common/fb_exception.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/fb_exception.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -85,8 +85,7 @@ { LocalStatus status; stuffException(&status); - const ISC_STATUS* s = status.get(); - fb_utils::copyStatus(status_vector, ISC_STATUS_LENGTH, s, fb_utils::statusLength(s)); + fb_utils::mergeStatus(status_vector, ISC_STATUS_LENGTH, &status); return status_vector[1]; } @@ -129,6 +128,13 @@ throw status_exception(status_vector); } +void status_exception::raise(const IStatus* status) +{ + ISC_STATUS_ARRAY status_vector; + fb_utils::mergeStatus(status_vector, ISC_STATUS_LENGTH, status); + throw status_exception(status_vector); +} + void status_exception::raise(const Arg::StatusVector& statusVector) { throw status_exception(statusVector.value()); @@ -138,7 +144,7 @@ { if (status) { - status->set(value()); + fb_utils::setIStatus(status, value()); } return value()[1]; @@ -157,7 +163,7 @@ if (status) { - status->set(FB_NELEM(sv), sv); + status->setErrors(FB_NELEM(sv), sv); } return sv[1]; @@ -181,7 +187,7 @@ if (status) { - status->set(FB_NELEM(sv), sv); + status->setErrors(FB_NELEM(sv), sv); } return sv[1]; Modified: firebird/trunk/src/common/isc.cpp =================================================================== --- firebird/trunk/src/common/isc.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/isc.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -583,6 +583,14 @@ } +void iscLogStatus(const TEXT* text, Firebird::IStatus* status) +{ + ISC_STATUS_BIG_ARRAY tmp; + fb_utils::mergeStatus(tmp, FB_NELEM(tmp), status); + iscLogStatus(text, tmp); +} + + void iscLogException(const char* text, const Firebird::Exception& e) { /************************************** Modified: firebird/trunk/src/common/isc_proto.h =================================================================== --- firebird/trunk/src/common/isc_proto.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/isc_proto.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -25,6 +25,7 @@ #define JRD_ISC_PROTO_H #include "../common/classes/fb_string.h" +#include "firebird/Interface.h" bool ISC_check_process_existence(SLONG); TEXT* ISC_get_host(TEXT *, USHORT); @@ -34,6 +35,7 @@ // Does not add word "Database" in the beginning like gds__log_status void iscLogStatus(const TEXT* text, const ISC_STATUS* status_vector); +void iscLogStatus(const TEXT* text, Firebird::IStatus* status); void iscLogException(const TEXT* text, const Firebird::Exception& e); #ifdef WIN9X_SUPPORT Modified: firebird/trunk/src/common/os/os_utils.h =================================================================== --- firebird/trunk/src/common/os/os_utils.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/os/os_utils.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -33,6 +33,7 @@ #endif #include "../common/classes/fb_string.h" +#include "../common/StatusArg.h" namespace os_utils { Modified: firebird/trunk/src/common/unicode_util.cpp =================================================================== --- firebird/trunk/src/common/unicode_util.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/unicode_util.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -1141,10 +1141,10 @@ } } - if (!lastError.isSuccess()) + if (lastError.getStatus() & Firebird::IStatus::FB_HAS_ERRORS) { (Arg::Gds(isc_random) << "Could not find acceptable ICU library" - << Arg::StatusVector(lastError.get())).raise(); + << Arg::StatusVector(lastError.getErrors())).raise(); } else (Arg::Gds(isc_random) << "Could not find acceptable ICU library").raise(); Modified: firebird/trunk/src/common/utils.cpp =================================================================== --- firebird/trunk/src/common/utils.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/utils.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -48,6 +48,7 @@ #include "../jrd/align.h" #include "../common/os/path_utils.h" #include "../common/os/fbsyslog.h" +#include "../common/StatusArg.h" #ifdef WIN_NT #include <direct.h> @@ -1129,6 +1130,47 @@ return copied; } +unsigned int mergeStatus(ISC_STATUS* to, unsigned int space, + const Firebird::IStatus* from) throw() +{ + const ISC_STATUS* s; + unsigned int copied = 0; + int state = from->getStatus(); + + if (state & Firebird::IStatus::FB_HAS_ERRORS) + { + s = from->getErrors(); + copied = copyStatus(to, space, s, statusLength(s)); + + to += copied; + space -= copied; + } + + if (state & Firebird::IStatus::FB_HAS_WARNINGS) + { + s = from->getWarnings(); + copied += copyStatus(to, space, s, statusLength(s)); + } + + if (!copied) + init_status(to); + + return copied; +} + +void setIStatus(Firebird::IStatus* to, const ISC_STATUS* from) throw() +{ + try + { + Firebird::Arg::StatusVector sv(from); + sv.copyTo(to); + } + catch(const Firebird::BadAlloc& ex) + { + ex.stuffException(to); + } +} + unsigned int statusLength(const ISC_STATUS* const status) throw() { unsigned int l = 0; Modified: firebird/trunk/src/common/utils_proto.h =================================================================== --- firebird/trunk/src/common/utils_proto.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/common/utils_proto.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -123,6 +123,10 @@ unsigned int copyStatus(ISC_STATUS* const to, const unsigned int space, const ISC_STATUS* const from, const unsigned int count) throw(); + unsigned int mergeStatus(ISC_STATUS* to, unsigned int space, const Firebird::IStatus* from) throw(); + + void setIStatus(Firebird::IStatus* to, const ISC_STATUS* from) throw(); + unsigned int statusLength(const ISC_STATUS* const status) throw(); enum FetchPassResult { Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/dsql/DdlNodes.epp 2014-08-27 09:24:30 UTC (rev 60002) @@ -9669,15 +9669,6 @@ LocalStatus st; LocalStatus s2; // we will use it in DDL case and remember IStatus* s = &st; - class Check - { - public: - static void status(IStatus* s) - { - if (!s->isSuccess()) - status_exception::raise(s->get()); - } - }; SecDbContext* secDbContext = transaction->getSecDbContext(); if (!secDbContext) @@ -9688,10 +9679,10 @@ tdbb->getAttachment()->att_user->populateDpb(dpb); IAttachment* att = DispatcherPtr()->attachDatabase(s, secDb, dpb.getBufferLength(), dpb.getBuffer()); - Check::status(s); + check(s); ITransaction* tra = att->startTransaction(s, 0, NULL); - Check::status(s); + check(s); secDbContext = transaction->setSecDbContext(att, tra); } @@ -9701,7 +9692,7 @@ savePoint.printf("GLOBALMAP%d", secDbContext->savePoint++); secDbContext->att->execute(s, secDbContext->tra, 0, ("SAVEPOINT " + savePoint).c_str(), SQL_DIALECT_V6, NULL, NULL, NULL, NULL); - Check::status(s); + check(s); try { @@ -9786,13 +9777,13 @@ secDbContext->att->execute(&s2, secDbContext->tra, 0, ddl.c_str(), SQL_DIALECT_V6, NULL, NULL, NULL, NULL); - if (!s2.isSuccess()) + if (s2.getStatus() & IStatus::FB_HAS_ERRORS) { // try direct access to rdb$auth_mapping table in secure db // check presence of such record in the table - Message check; - Field<Varying> nm(check, 1); + Message msgCheck; + Field<Varying> nm(msgCheck, 1); nm = name.c_str(); Message result; @@ -9801,8 +9792,8 @@ const char* checkSql = "select count(*) from RDB$AUTH_MAPPING where RDB$MAP_NAME = ?"; secDbContext->att->execute(s, secDbContext->tra, 0, checkSql, SQL_DIALECT_V6, - check.getMetadata(), check.getBuffer(), result.getMetadata(), result.getBuffer()); - Check::status(s); + msgCheck.getMetadata(), msgCheck.getBuffer(), result.getMetadata(), result.getBuffer()); + check(s); if (cnt > 1 && op != MAP_DROP) ERRD_bugcheck("Database mapping misconfigured"); @@ -9870,7 +9861,7 @@ break; case MAP_DROP: sql = "delete from RDBAUTH_MAPPING where RDB$MAP_NAME = ?"; - msg = ✓ + msg = &msgCheck; break; } @@ -9878,12 +9869,12 @@ fb_assert(sql && msg); secDbContext->att->execute(s, secDbContext->tra, 0, sql, SQL_DIALECT_V6, msg->getMetadata(), msg->getBuffer(), NULL, NULL); - Check::status(s); + check(s); secDbContext->att->execute(s, secDbContext->tra, 0, ("RELEASE SAVEPOINT " + savePoint).c_str(), SQL_DIALECT_V6, NULL, NULL, NULL, NULL); savePoint.erase(); - Check::status(s); + check(s); } } catch (const Exception&) @@ -9894,11 +9885,11 @@ SQL_DIALECT_V6, NULL, NULL, NULL, NULL); } - if (!s2.isSuccess()) + if (s2.getStatus() & IStatus::FB_HAS_ERRORS) { - const ISC_STATUS* stat2 = s2.get(); + const ISC_STATUS* stat2 = s2.getErrors(); if (stat2[1] != isc_dsql_token_unk_err) - status_exception::raise(stat2); + status_exception::raise(&s2); } throw; Modified: firebird/trunk/src/dsql/dsql.cpp =================================================================== --- firebird/trunk/src/dsql/dsql.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/dsql/dsql.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -1362,9 +1362,9 @@ // raise error if one present static void checkD(IStatus* st) { - if (!st->isSuccess()) + if (st->getStatus() & IStatus::FB_HAS_ERRORS) { - ERRD_post(Arg::StatusVector(st->get())); + ERRD_post(Arg::StatusVector(st)); } } Modified: firebird/trunk/src/gpre/obj_cxx.cpp =================================================================== --- firebird/trunk/src/gpre/obj_cxx.cpp 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/gpre/obj_cxx.cpp 2014-08-27 09:24:30 UTC (rev 60002) @@ -157,10 +157,16 @@ printa(column, "}"); } +static inline void success(const int column, bool ok, const char* status_name, const char* post = "") +{ + printa(column, "if (%s%s->getStatus() & Firebird::IStatus::FB_HAS_ERRORS%s)%s", + ok ? "!(" : "", global_status_name, ok ? ")" : "", post); +} + static inline void set_sqlcode(const act* action, const int column) { if (action->act_flags & ACT_sql) - printa(column, "SQLCODE = isc_sqlcode(%s->get());", global_status_name); + printa(column, "SQLCODE = isc_sqlcode(%s->getErrors());", global_status_name); } static inline void ObjectNotImplemented() @@ -985,7 +991,7 @@ static void gen_blob_for( const act* action, USHORT column) { PAT args; - const TEXT* pattern1 = "%IFif (%S1->isSuccess()) {\n\ + const TEXT* pattern1 = "%IFif (!(%S1->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) {\n\ %ENwhile (1)\n\ {"; @@ -995,8 +1001,8 @@ PATTERN_expand(column, pattern1, &args); column += INDENT; gen_get_segment(action, column); - printa(column, "if ((!%s->isSuccess()) && (%s->get()[1] != isc_segment)) break;", - global_status_name, global_status_name); + printa(column, "if (fbIStatus == Firebird::IStatus::FB_ERROR || " + "fbIStatus == Firebird::IStatus::FB_EOF) break;"); } @@ -1299,7 +1305,7 @@ } request = action->act_request; - printa(column, "if (%s->isSuccess())", global_status_name); + success(column, true, global_status_name); column += INDENT; begin(column); printa(column, @@ -1312,10 +1318,10 @@ request->req_database->dbb_name->sym_string, status_vector(action), trname, request->req_length, request->req_ident); column -= INDENT; - printa(column, "if (%s->isSuccess())", global_status_name); + success(column, true, global_status_name); printa(column + INDENT, "%s->commit(%s);", trname, status_vector(action)); - printa(column, "if (!%s->isSuccess())", global_status_name); + success(column, false, global_status_name); printa(column + INDENT, "%s->rollback(%s);", trname, status_vector(NULL)); set_sqlcode(action, column); @@ -1472,6 +1478,7 @@ scope, global_status_name, all_extern ? "" : " = fbMaster->getStatus();"); printa(column, "%sFirebird::IStatus* %s2%s;\t/* status vector */", scope, global_status_name, all_extern ? "" : " = fbMaster->getStatus();"); + printa(column, "%sint fbIStatus;\t/* last completion code */", scope); for (db = gpreGlob.isc_databases; db; db = db->dbb_next) for (const tpb* tpb_iterator = db->dbb_tpbs; tpb_iterator; @@ -1550,10 +1557,10 @@ if (gpreGlob.sw_auto) { column -= INDENT; - printa(column, "if (%s->isSuccess())", global_status_name); + success(column, true, global_status_name); printa(column + INDENT, "%s->commit(%s);", gpreGlob.transaction_name, status_vector(action)); - printa(column, "if (!%s->isSuccess())", global_status_name); + success(column, false, global_status_name); printa(column + INDENT, "%s->rollback(%s);", gpreGlob.transaction_name, status_vector(NULL)); } @@ -2221,7 +2228,7 @@ { if ((action->act_error || (action->act_flags & ACT_sql)) && db != gpreGlob.isc_databases) { - printa(column, "if (%s && %s->isSuccess()) ", db->dbb_name->sym_string, global_status_name); + printa(column, "if (%s && !(%s->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) ", db->dbb_name->sym_string, global_status_name); } else printa(column, "if (%s)", db->dbb_name->sym_string); @@ -2245,7 +2252,7 @@ const gpre_req* request = action->act_request; if (action->act_error || (action->act_flags & ACT_sql)) - printa(column, "if (%s->isSuccess()) {", global_status_name); + success(column, true, global_status_name, " {"); printa(column, "while (1)"); column += INDENT; @@ -2254,7 +2261,7 @@ TEXT s[MAX_REF_SIZE]; if (action->act_error || (action->act_flags & ACT_sql)) - printa(column, "if (!%s || (!%s->isSuccess())) break;", + printa(column, "if (!%s || (%s->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)) break;", gen_name(s, request->req_eof, true), global_status_name); else printa(column, "if (!%s) break;", gen_name(s, request->req_eof, true)); @@ -2444,7 +2451,7 @@ { ObjectNotImplemented(); const TEXT* pattern1 = - "%IF%S1 [1] = %ENisc_get_segment (%V1, &%BH, &%I1, (short) sizeof(%I2), %I2);"; + "fbIStatus = %BH->getSegment(%V1, sizeof(%I2), %I2, &%I1);"; if (action->act_error && (action->act_type != ACT_blob_for)) begin(column); @@ -2468,7 +2475,7 @@ { const ref* into = action->act_object; set_sqlcode(action, column); - printa(column, "if (!SQLCODE || SQLCODE == 101)"); + printa(column, "if (fbIStatus == Firebird::IStatus::FB_OK || fbIStatus == Firebird::IStatus::FB_SEGMENT)"); column += INDENT; begin(column); align(column); @@ -2538,19 +2545,7 @@ static void gen_on_error( const act* action, USHORT column) { - const act* err_action = (const act*) action->act_object; - switch (err_action->act_type) - { - case ACT_get_segment: - case ACT_put_segment: - case ACT_endblob: - printa(column, - "if ((!%s->isSuccess()) && (%s->get()[1] != isc_segment) && (%s->get()[1] != isc_segstr_eof))", - global_status_name, global_status_name, global_status_name); - break; - default: - printa(column, "if (!%s->isSuccess())", global_status_name); - } + success(column, false, global_status_name); column += INDENT; begin(column); } @@ -2709,7 +2704,7 @@ if ((action->act_error || (action->act_flags & ACT_sql)) && ready != (rdy*) action->act_object) { - printa(column, "if (%s->isSuccess()) {", global_status_name); + success(column, true, global_status_name, " {"); } make_ready(db, filename, vector, (USHORT) column, ready->rdy_request); if ((action->act_error || (action->act_flags & ACT_sql)) && @@ -3045,7 +3040,7 @@ if (action->act_error || (action->act_flags & ACT_sql)) column -= INDENT; - const TEXT* pattern1 = "if (%V1->get()[1] == isc_bad_req_handle) { %RH->release(); %RH = NULL; }"; + const TEXT* pattern1 = "if (%V1->getErrors()[1] == isc_bad_req_handle) { %RH->release(); %RH = NULL; }"; PAT args; args.pat_request = action->act_request; args.pat_vector1 = status_vector(action); @@ -3933,7 +3928,7 @@ align(column); fprintf(gpreGlob.out_file, "if (!%s", db->dbb_name->sym_string); if (stat && buffer[0]) - fprintf(gpreGlob.out_file, " && %s->isSuccess()", vector); + fprintf(gpreGlob.out_file, " && !(%s->getStatus() & Firebird::IStatus::FB_HAS_ERRORS)", vector); fprintf(gpreGlob.out_file, ")"); make_ready(db, filename, vector, (USHORT) (column + INDENT), 0); if (buffer[0]) Modified: firebird/trunk/src/include/fb_exception.h =================================================================== --- firebird/trunk/src/include/fb_exception.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/include/fb_exception.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -42,7 +42,6 @@ #endif #include "fb_types.h" -#include "../common/StatusArg.h" #include "../common/ThreadStart.h" namespace Firebird @@ -106,6 +105,7 @@ static void raise(const ISC_STATUS *status_vector); static void raise(const Arg::StatusVector& statusVector); + static void raise(const IStatus* status); protected: // Create exception with undefined status vector, this constructor allows Modified: firebird/trunk/src/include/fb_types.h =================================================================== --- firebird/trunk/src/include/fb_types.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/include/fb_types.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -156,4 +156,7 @@ return (T) ((((uintptr_t) n) + b - 1) & ~(b - 1)); } +// Big array for holding long temporal vectors from/to IStatus +typedef ISC_STATUS ISC_STATUS_BIG_ARRAY[ISC_STATUS_LENGTH * 3]; + #endif /* INCLUDE_FB_TYPES_H */ Modified: firebird/trunk/src/include/firebird/Auth.h =================================================================== --- firebird/trunk/src/include/firebird/Auth.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/include/firebird/Auth.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -152,7 +152,7 @@ virtual const char* FB_CARG role() = 0; virtual const char* FB_CARG networkProtocol() = 0; virtual const char* FB_CARG remoteAddress() = 0; - virtual unsigned int FB_CARG authBlock(const unsigned char** bytes) = 0; + virtual const unsigned char* FB_CARG authBlock(unsigned* length) = 0; }; #define FB_AUTH_LOGON_INFO_VERSION (FB_VERSIONED_VERSION + 5) Modified: firebird/trunk/src/include/firebird/Interface.h =================================================================== --- firebird/trunk/src/include/firebird/Interface.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/include/firebird/Interface.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -72,19 +72,29 @@ #define FB_DISPOSABLE_VERSION (FB_VERSIONED_VERSION + 1) // Interface to work with status vector -// Created by master interface by request -// Also may be implemented on stack by internal FB code class IStatus : public IDisposable { public: - virtual void FB_CARG set(unsigned int length, const ISC_STATUS* value) = 0; - virtual void FB_CARG set(const ISC_STATUS* value) = 0; + static const unsigned FB_HAS_WARNINGS = 0x01; + static const unsigned FB_HAS_ERRORS = 0x02; + + static const int FB_ERROR = -1; + static const int FB_OK = 0; + static const int FB_EOF = 1; + static const int FB_SEGMENT = 2; + virtual void FB_CARG init() = 0; + virtual unsigned FB_CARG getStatus() const = 0; - virtual const ISC_STATUS* FB_CARG get() const = 0; - virtual int FB_CARG isSuccess() const = 0; + virtual void FB_CARG setErrors(unsigned int length, const ISC_STATUS* value) = 0; + virtual void FB_CARG setWarnings(unsigned int length, const ISC_STATUS* value) = 0; + virtual void FB_CARG setErrors(const ISC_STATUS* value) = 0; + virtual void FB_CARG setWarnings(const ISC_STATUS* value) = 0; + + virtual const ISC_STATUS* FB_CARG getErrors() const = 0; + virtual const ISC_STATUS* FB_CARG getWarnings() const = 0; }; -#define FB_STATUS_VERSION (FB_DISPOSABLE_VERSION + 5) +#define FB_STATUS_VERSION (FB_DISPOSABLE_VERSION + 8) class IProvider; class IUtl; Modified: firebird/trunk/src/include/firebird/Provider.h =================================================================== --- firebird/trunk/src/include/firebird/Provider.h 2014-08-27 01:23:06 UTC (rev 60001) +++ firebird/trunk/src/include/firebird/Provider.h 2014-08-27 09:24:30 UTC (rev 60002) @@ -53,8 +53,8 @@ virtual void FB_CARG getInfo(IStatus* status, unsigned int itemsLength, const unsigned char* items, unsigned int bufferLength, unsigned char* buffer) = 0; - virtual unsigned int FB_CARG getSegment(IStatus* status, unsigned int length, - void* buffer) = 0; // returns real length + virtual int FB_CARG getSegment(IStatus* status, unsigned int bufferLength, + void* buffer, unsigned int* segmentLength) = 0; virtual void FB_CARG putSegment(IStatus* status, unsigned int length, const void*... [truncated message content] |