"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/jrd/Mapping.cpp" between
Firebird-3.0.2.32703-0.tar.bz2 and Firebird-3.0.4.33054-0.tar.bz2

About: Firebird is a relational database offering many ANSI SQL standard features.

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(&current->callbackEvent, v alue, 10000) != FB_SUCCESS) while (sharedMemory->eventWait(&current->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> &gt; 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

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)