Mapping.cpp (Firebird-3.0.2.32703-0.tar.bz2) | : | Mapping.cpp (Firebird-3.0.4.33054-0.tar.bz2) | ||
---|---|---|---|---|
skipping to change at line 480 | skipping to change at line 480 | |||
dataFlag = false; | dataFlag = false; | |||
cleanup(eraseEntry); | cleanup(eraseEntry); | |||
} | } | |||
public: | public: | |||
SyncObject syncObject; | SyncObject syncObject; | |||
NoCaseString alias, name; | NoCaseString alias, name; | |||
bool dataFlag, downFlag; | bool dataFlag, downFlag; | |||
}; | }; | |||
typedef GenericMap<Pair<Left<NoCaseString, Cache*> > > CacheTree; | typedef GenericMap<Pair<Left<NoCaseString, AutoPtr<Cache> > > > CacheTree; | |||
InitInstance<CacheTree> tree; | InitInstance<CacheTree> tree; | |||
GlobalPtr<Mutex> treeMutex; | GlobalPtr<Mutex> treeMutex; | |||
void setupIpc(); | void setupIpc(); | |||
Cache* locate(const NoCaseString& target) | Cache* locate(const NoCaseString& target) | |||
{ | { | |||
fb_assert(treeMutex->locked()); | fb_assert(treeMutex->locked()); | |||
Cache* c; | AutoPtr<Cache> *c = tree().get(target); | |||
return tree().get(target, c) ? c : NULL; | return c ? c->get() : NULL; | |||
} | } | |||
Cache* locate(const NoCaseString& alias, const NoCaseString& target) | Cache* locate(const NoCaseString& alias, const NoCaseString& target) | |||
{ | { | |||
fb_assert(treeMutex->locked()); | fb_assert(treeMutex->locked()); | |||
Cache* c = locate(target); | Cache* c = locate(target); | |||
if (!c) | if (!c) | |||
{ | { | |||
c = FB_NEW Cache(alias, target); | c = FB_NEW Cache(alias, target); | |||
*(tree().put(target)) = c; | *(tree().put(target)) = c; | |||
setupIpc(); | setupIpc(); | |||
} | } | |||
return c; | return c; | |||
} | } | |||
class Found | class Found | |||
{ | { | |||
public: | public: | |||
enum What {FND_NOTHING, FND_SEC, FND_DB}; | enum What {FND_NOTHING, FND_PLUG, FND_SEC, FND_DB}; | |||
Found() | Found() | |||
: found(FND_NOTHING) | : found(FND_NOTHING) | |||
{ } | { } | |||
void set(What find, const AuthReader::Info& val) | void set(What find, const AuthReader::Info& val) | |||
{ | { | |||
fb_assert(find != FND_NOTHING); | ||||
if (val.plugin.hasData()) | ||||
find = FND_PLUG; | ||||
if (find == found && value != val.name) | if (find == found && value != val.name) | |||
Arg::Gds(isc_map_undefined).raise(); | Arg::Gds(isc_map_undefined).raise(); | |||
if (find > found) | if (find > found) | |||
{ | { | |||
found = find; | found = find; | |||
value = val.name; | value = val.name; | |||
if (val.plugin.hasData()) | if (val.plugin.hasData()) | |||
method = val.plugin; | method = val.plugin; | |||
else | else | |||
method = "Mapped from " + val.origPlug; | method = "Mapped from " + val.origPlug; | |||
} | } | |||
} | } | |||
skipping to change at line 688 | skipping to change at line 693 | |||
p->flags |= MappingHeader::FLAG_DELIVER; | p->flags |= MappingHeader::FLAG_DELIVER; | |||
if (sharedMemory->eventPost(&p->notifyEvent) != FB_SUCCES S) | if (sharedMemory->eventPost(&p->notifyEvent) != FB_SUCCES S) | |||
{ | { | |||
(Arg::Gds(isc_random) << "Error posting notifyEve nt in mapping shared memory").raise(); | (Arg::Gds(isc_random) << "Error posting notifyEve nt in mapping shared memory").raise(); | |||
} | } | |||
while (sharedMemory->eventWait(¤t->callbackEvent, v alue, 10000) != FB_SUCCESS) | while (sharedMemory->eventWait(¤t->callbackEvent, v alue, 10000) != FB_SUCCESS) | |||
{ | { | |||
if (!ISC_check_process_existence(p->id)) | if (!ISC_check_process_existence(p->id)) | |||
{ | { | |||
p->flags &= ~MappingHeader::FLAG_ACTIVE; | p->flags &= ~MappingHeader::FLAG_ACTIVE; | |||
sharedMemory->eventFini(&sMem->process[pr | sharedMemory->eventFini(&p->notifyEvent); | |||
ocess].notifyEvent); | sharedMemory->eventFini(&p->callbackEvent | |||
sharedMemory->eventFini(&sMem->process[pr | ); | |||
ocess].callbackEvent); | ||||
break; | break; | |||
} | } | |||
} | } | |||
MAP_DEBUG(fprintf(stderr, "Notified pid %d about reset ma p %s\n", p->id, sMem->databaseForReset)); | MAP_DEBUG(fprintf(stderr, "Notified pid %d about reset ma p %s\n", p->id, sMem->databaseForReset)); | |||
} | } | |||
} | } | |||
void setup() | void setup() | |||
{ | { | |||
if (sharedMemory) | if (sharedMemory) | |||
skipping to change at line 727 | skipping to change at line 732 | |||
fb_assert(sharedMemory->getHeader()->mhb_version == MAPPING_VERSI ON); | fb_assert(sharedMemory->getHeader()->mhb_version == MAPPING_VERSI ON); | |||
Guard gShared(this); | Guard gShared(this); | |||
MappingHeader* sMem = sharedMemory->getHeader(); | MappingHeader* sMem = sharedMemory->getHeader(); | |||
for (process = 0; process < sMem->processes; ++process) | for (process = 0; process < sMem->processes; ++process) | |||
{ | { | |||
if (!(sMem->process[process].flags & MappingHeader::FLAG_ ACTIVE)) | if (!(sMem->process[process].flags & MappingHeader::FLAG_ ACTIVE)) | |||
break; | break; | |||
if (!ISC_check_process_existence(processId)) | if (!ISC_check_process_existence(sMem->process[process].i d)) | |||
{ | { | |||
sharedMemory->eventFini(&sMem->process[process].n otifyEvent); | sharedMemory->eventFini(&sMem->process[process].n otifyEvent); | |||
sharedMemory->eventFini(&sMem->process[process].c allbackEvent); | sharedMemory->eventFini(&sMem->process[process].c allbackEvent); | |||
break; | break; | |||
} | } | |||
} | } | |||
if (process >= sMem->processes) | if (process >= sMem->processes) | |||
{ | { | |||
sMem->processes++; | sMem->processes++; | |||
skipping to change at line 888 | skipping to change at line 893 | |||
ThreadFinishSync<MappingIpc*> cleanupSync; | ThreadFinishSync<MappingIpc*> cleanupSync; | |||
}; | }; | |||
GlobalPtr<MappingIpc, InstanceControl::PRIORITY_DELETE_FIRST> mappingIpc; | GlobalPtr<MappingIpc, InstanceControl::PRIORITY_DELETE_FIRST> mappingIpc; | |||
void setupIpc() | void setupIpc() | |||
{ | { | |||
mappingIpc->setup(); | mappingIpc->setup(); | |||
} | } | |||
class DbHandle : public AutoPtr<IAttachment, SimpleRelease<IAttachment> > | class DbHandle : public AutoPtr<IAttachment, SimpleRelease> | |||
{ | { | |||
public: | public: | |||
DbHandle() | DbHandle() | |||
: AutoPtr() | : AutoPtr() | |||
{ } | { } | |||
DbHandle(IAttachment* att) | DbHandle(IAttachment* att) | |||
: AutoPtr(att) | : AutoPtr(att) | |||
{ | { | |||
if (att) | if (att) | |||
skipping to change at line 919 | skipping to change at line 924 | |||
DispatcherPtr prov; | DispatcherPtr prov; | |||
if (cryptCb) | if (cryptCb) | |||
{ | { | |||
prov->setDbCryptCallback(&st, cryptCb); | prov->setDbCryptCallback(&st, cryptCb); | |||
check("IProvider::setDbCryptCallback", &st); | check("IProvider::setDbCryptCallback", &st); | |||
} | } | |||
ClumpletWriter embeddedSysdba(ClumpletWriter::Tagged, 1024, isc_d pb_version1); | ClumpletWriter embeddedSysdba(ClumpletWriter::Tagged, 1024, isc_d pb_version1); | |||
embeddedSysdba.insertString(isc_dpb_user_name, SYSDBA_USER_NAME, fb_strlen(SYSDBA_USER_NAME)); | embeddedSysdba.insertString(isc_dpb_user_name, SYSDBA_USER_NAME, fb_strlen(SYSDBA_USER_NAME)); | |||
embeddedSysdba.insertByte(isc_dpb_sec_attach, TRUE); | embeddedSysdba.insertByte(isc_dpb_sec_attach, TRUE); | |||
embeddedSysdba.insertString(isc_dpb_config, EMBEDDED_PROVIDERS, f b_strlen(EMBEDDED_PROVIDERS)); | ||||
embeddedSysdba.insertByte(isc_dpb_map_attach, TRUE); | embeddedSysdba.insertByte(isc_dpb_map_attach, TRUE); | |||
embeddedSysdba.insertByte(isc_dpb_no_db_triggers, TRUE); | embeddedSysdba.insertByte(isc_dpb_no_db_triggers, TRUE); | |||
MAP_DEBUG(fprintf(stderr, "Attach %s\n", aliasDb)); | MAP_DEBUG(fprintf(stderr, "Attach %s\n", aliasDb)); | |||
IAttachment* att = prov->attachDatabase(&st, aliasDb, | IAttachment* att = prov->attachDatabase(&st, aliasDb, | |||
embeddedSysdba.getBufferLength(), embeddedSysdba.getBuffe r()); | embeddedSysdba.getBufferLength(), embeddedSysdba.getBuffe r()); | |||
if (st->getState() & IStatus::STATE_ERRORS) | if (st->getState() & IStatus::STATE_ERRORS) | |||
{ | { | |||
const ISC_STATUS* s = st->getErrors(); | const ISC_STATUS* s = st->getErrors(); | |||
skipping to change at line 984 | skipping to change at line 990 | |||
// expand security database name (db is expected to be expanded, alias - original) | // expand security database name (db is expected to be expanded, alias - original) | |||
PathName secExpanded; | PathName secExpanded; | |||
expandDatabaseName(securityAlias, secExpanded, NULL); | expandDatabaseName(securityAlias, secExpanded, NULL); | |||
const char* securityDb = secExpanded.c_str(); | const char* securityDb = secExpanded.c_str(); | |||
bool secDown = false; | bool secDown = false; | |||
bool dbDown = false; | bool dbDown = false; | |||
// Create new writer | // Create new writer | |||
AuthWriter newBlock; | AuthWriter newBlock; | |||
// detect presence of this databases mapping in authBlock | // detect presence of non-plugin databases mapping in authBlock | |||
// in that case mapUser was already invoked for it | // in that case mapUser was already invoked for it | |||
unsigned flags = db ? 0 : FLAG_DB; | unsigned flags = db ? 0 : FLAG_DB; | |||
for (AuthReader rdr(authBlock); rdr.getInfo(info); rdr.moveNext()) | for (AuthReader rdr(authBlock); rdr.getInfo(info); rdr.moveNext()) | |||
{ | { | |||
if (db && info.secDb == db) | MAP_DEBUG(fprintf(stderr, "info.plugin=%s info.secDb=%s db=%s sec | |||
flags |= FLAG_DB; | urityDb=%s\n", | |||
if (info.secDb == securityDb) | info.plugin.c_str(), info.secDb.c_str(), db ? db : "NULL" | |||
flags |= FLAG_SEC; | , securityDb)); | |||
if (info.plugin.isEmpty()) | ||||
{ | ||||
if (db && info.secDb == db) | ||||
flags |= FLAG_DB; | ||||
if (info.secDb == securityDb) | ||||
flags |= FLAG_SEC; | ||||
} | ||||
} | } | |||
// Perform lock & map only when needed | // Perform lock & map only when needed | |||
if ((flags != (FLAG_DB | FLAG_SEC)) && authBlock.hasData()) | if ((flags != (FLAG_DB | FLAG_SEC)) && authBlock.hasData()) | |||
{ | { | |||
AuthReader::Info info; | AuthReader::Info info; | |||
SyncType syncType = SYNC_SHARED; | SyncType syncType = SYNC_SHARED; | |||
FbLocalStatus st; | FbLocalStatus st; | |||
DbHandle iSec; | DbHandle iSec; | |||
DbHandle iDb(att); | DbHandle iDb(att); | |||
skipping to change at line 1215 | skipping to change at line 1227 | |||
ITransaction* tra = NULL; | ITransaction* tra = NULL; | |||
IResultSet* curs = NULL; | IResultSet* curs = NULL; | |||
try | try | |||
{ | { | |||
ClumpletWriter embeddedSysdba(ClumpletWriter::Tagged, | ClumpletWriter embeddedSysdba(ClumpletWriter::Tagged, | |||
MAX_DPB_SIZE, isc_dpb_version1); | MAX_DPB_SIZE, isc_dpb_version1); | |||
embeddedSysdba.insertString(isc_dpb_user_name, SYSDBA_USER_NAME, | embeddedSysdba.insertString(isc_dpb_user_name, SYSDBA_USER_NAME, | |||
fb_strlen(SYSDBA_USER_NAME)); | fb_strlen(SYSDBA_USER_NAME)); | |||
embeddedSysdba.insertByte(isc_dpb_sec_attach, TRUE); | embeddedSysdba.insertByte(isc_dpb_sec_attach, TRUE); | |||
embeddedSysdba.insertString(isc_dpb_config, EMBEDDED_PROVIDERS, f b_strlen(EMBEDDED_PROVIDERS)); | ||||
embeddedSysdba.insertByte(isc_dpb_no_db_triggers, TRUE); | embeddedSysdba.insertByte(isc_dpb_no_db_triggers, TRUE); | |||
const char* dbName = tdbb->getDatabase()->dbb_config->getSecurity Database(); | const char* dbName = tdbb->getDatabase()->dbb_config->getSecurity Database(); | |||
att = prov->attachDatabase(&st, dbName, | att = prov->attachDatabase(&st, dbName, | |||
embeddedSysdba.getBufferLength(), embeddedSysdba.getBuffe r()); | embeddedSysdba.getBufferLength(), embeddedSysdba.getBuffe r()); | |||
if (st->getState() & IStatus::STATE_ERRORS) | if (st->getState() & IStatus::STATE_ERRORS) | |||
{ | { | |||
if (!fb_utils::containsErrorCode(st->getErrors(), isc_io_ error)) | if (!fb_utils::containsErrorCode(st->getErrors(), isc_io_ error)) | |||
check("IProvider::attachDatabase", &st); | check("IProvider::attachDatabase", &st); | |||
End of changes. 12 change blocks. | ||||
15 lines changed or deleted | 29 lines changed or added |