From: <di...@us...> - 2010-07-13 12:31:43
|
Revision: 51337 http://firebird.svn.sourceforge.net/firebird/?rev=51337&view=rev Author: dimitr Date: 2010-07-13 12:31:35 +0000 (Tue, 13 Jul 2010) Log Message: ----------- Reworked the SEC$USERS implementation so that no new physical table type and data access method would be required. More changes are likely to follow soon. Modified Paths: -------------- firebird/trunk/builds/win32/msvc10/engine.vcxproj firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters firebird/trunk/builds/win32/msvc9/engine.vcproj firebird/trunk/builds/win32/msvc9/engine_classic.vcproj firebird/trunk/builds/win32/msvc9/engine_embed.vcproj firebird/trunk/src/jrd/Database.h firebird/trunk/src/jrd/DatabaseSnapshot.cpp firebird/trunk/src/jrd/DatabaseSnapshot.h firebird/trunk/src/jrd/Relation.h firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/UserManagement.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/opt.cpp firebird/trunk/src/jrd/recsrc/RecordSource.h firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp firebird/trunk/src/jrd/relations.h firebird/trunk/src/jrd/types.h Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc9/engine.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,10 +807,6 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,14 +807,10 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" + RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\WindowedStream.cpp" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_embed.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,14 +807,10 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" + RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\WindowedStream.cpp" > </File> Modified: firebird/trunk/src/jrd/Database.h =================================================================== --- firebird/trunk/src/jrd/Database.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/Database.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -54,7 +54,6 @@ #include "../common/classes/PublicHandle.h" #include "../common/classes/semaphore.h" #include "../common/utils_proto.h" -#include "../jrd/DatabaseSnapshot.h" #include "../jrd/RandomGenerator.h" #include "../jrd/os/guid.h" #include "../jrd/sbm.h" @@ -79,6 +78,7 @@ class BackupManager; class vcl; class ExternalFileDirectoryList; + class MonitoringData; typedef Firebird::ObjectsArray<Trigger> trig_vec; @@ -368,7 +368,7 @@ trig_vec* dbb_triggers[DB_TRIGGER_MAX]; trig_vec* dbb_ddl_triggers; - DatabaseSnapshot::SharedData* dbb_monitoring_data; // monitoring data + MonitoringData* dbb_monitoring_data; // monitoring data DatabaseModules dbb_modules; // external function/filter modules ExtEngineManager dbb_extManager; // external engine manager Modified: firebird/trunk/src/jrd/DatabaseSnapshot.cpp =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -71,9 +71,17 @@ using namespace Jrd; -// SharedData class +bool MonitoringTableScan::retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const +{ + DatabaseSnapshot* const snapshot = DatabaseSnapshot::create(tdbb); + return snapshot->getData(relation)->fetch(position, record); +} -DatabaseSnapshot::SharedData::SharedData(const Database* dbb) + +// MonitoringData class + +MonitoringData::MonitoringData(const Database* dbb) : process_id(getpid()), local_id(dbb->dbb_monitoring_id) { string name; @@ -91,10 +99,10 @@ } -DatabaseSnapshot::SharedData::~SharedData() +MonitoringData::~MonitoringData() { { // scope - DumpGuard guard(this); + Guard guard(this); cleanup(); if (sh_mem_header->used == sizeof(Header)) @@ -106,7 +114,7 @@ } -void DatabaseSnapshot::SharedData::acquire() +void MonitoringData::acquire() { mutexLock(); @@ -126,13 +134,13 @@ } -void DatabaseSnapshot::SharedData::release() +void MonitoringData::release() { mutexUnlock(); } -UCHAR* DatabaseSnapshot::SharedData::read(MemoryPool& pool, ULONG& resultSize) +UCHAR* MonitoringData::read(MemoryPool& pool, ULONG& resultSize) { ULONG self_dbb_offset = 0; @@ -198,7 +206,7 @@ } -ULONG DatabaseSnapshot::SharedData::setup() +ULONG MonitoringData::setup() { ensureSpace(sizeof(Element)); @@ -214,7 +222,7 @@ } -void DatabaseSnapshot::SharedData::write(ULONG offset, ULONG length, const void* buffer) +void MonitoringData::write(ULONG offset, ULONG length, const void* buffer) { ensureSpace(length); @@ -229,7 +237,7 @@ } -void DatabaseSnapshot::SharedData::cleanup() +void MonitoringData::cleanup() { // Remove information about our dbb for (ULONG offset = alignOffset(sizeof(Header)); offset < sh_mem_header->used;) @@ -252,7 +260,7 @@ } -void DatabaseSnapshot::SharedData::ensureSpace(ULONG length) +void MonitoringData::ensureSpace(ULONG length) { ULONG newSize = sh_mem_header->used + length; @@ -274,7 +282,7 @@ } -void DatabaseSnapshot::SharedData::mutexBug(int osErrorCode, const char* string) +void MonitoringData::mutexBug(int osErrorCode, const char* string) { gds__log("MONITOR: mutex %s error, status = %d", string, osErrorCode); @@ -283,7 +291,7 @@ } -bool DatabaseSnapshot::SharedData::initialize(bool initialize) +bool MonitoringData::initialize(bool initialize) { if (initialize) { @@ -299,11 +307,12 @@ } -ULONG DatabaseSnapshot::SharedData::alignOffset(ULONG unaligned) +ULONG MonitoringData::alignOffset(ULONG unaligned) { - return Firebird::MEM_ALIGN(unaligned); + return (ULONG) Firebird::MEM_ALIGN(unaligned); } + // DatabaseSnapshot class @@ -424,7 +433,7 @@ { // scope fb_assert(dbb->dbb_monitoring_data); - DumpGuard guard(dbb->dbb_monitoring_data); + MonitoringData::Guard guard(dbb->dbb_monitoring_data); dataPtr = dbb->dbb_monitoring_data->read(pool, dataSize); } @@ -589,7 +598,7 @@ jrd_rel* relation = MET_lookup_relation_id(tdbb, rel_id, false); fb_assert(relation); MET_scan_relation(tdbb, relation); - fb_assert(relation->isVirtual() && !relation->isUsers()); + fb_assert(relation->isVirtual()); Format* format = MET_current(tdbb, relation); fb_assert(format); @@ -613,7 +622,7 @@ void DataDump::putField(thread_db* tdbb, Record* record, const DumpField& field, - int& charset, bool set_charset) + int& charset, bool set_charset) { fb_assert(record); @@ -726,10 +735,10 @@ if (!dbb->dbb_monitoring_data) { - dbb->dbb_monitoring_data = FB_NEW(*dbb->dbb_permanent) SharedData(dbb); + dbb->dbb_monitoring_data = FB_NEW(*dbb->dbb_permanent) MonitoringData(dbb); } - DumpGuard guard(dbb->dbb_monitoring_data); + MonitoringData::Guard guard(dbb->dbb_monitoring_data); dbb->dbb_monitoring_data->cleanup(); Writer writer(dbb->dbb_monitoring_data); @@ -905,7 +914,7 @@ bool DatabaseSnapshot::putAttachment(thread_db* tdbb, const Jrd::Attachment* attachment, - Writer& writer, int stat_id) + Writer& writer, int stat_id) { fb_assert(attachment); Modified: firebird/trunk/src/jrd/DatabaseSnapshot.h =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -29,6 +29,7 @@ #include "../jrd/isc_s_proto.h" #include "../common/classes/timestamp.h" #include "../jrd/val.h" +#include "../jrd/recsrc/RecordSource.h" namespace Jrd { @@ -199,91 +200,103 @@ int idCounter; }; -class DatabaseSnapshot : public DataDump + +class MonitoringHeader : public MemoryHeader { - struct RelationData +public: + ULONG used; + ULONG allocated; +}; + +class MonitoringData : public SharedMemory<MonitoringHeader> +{ + static const ULONG MONITOR_VERSION = 3; + static const ULONG DEFAULT_SIZE = 1048576; + + typedef MonitoringHeader Header; + + struct Element { - int rel_id; - RecordBuffer* data; + SLONG processId; + SLONG localId; + ULONG length; }; + static ULONG alignOffset(ULONG absoluteOffset); + public: - class SnapshotHeader : public MemoryHeader + class Guard { public: - ULONG used; - ULONG allocated; - }; + explicit Guard(MonitoringData* ptr) + : data(ptr) + { + data->acquire(); + } - class SharedData : public SharedMemory<SnapshotHeader> - { - static const ULONG MONITOR_VERSION = 3; - static const ULONG DEFAULT_SIZE = 1048576; + ~Guard() + { + data->release(); + } - typedef SnapshotHeader Header; + private: + Guard(const Guard&); + Guard& operator=(const Guard&); - struct Element - { - SLONG processId; - SLONG localId; - ULONG length; - }; + MonitoringData* const data; + }; - static ULONG alignOffset(ULONG absoluteOffset); + explicit MonitoringData(const Database*); + ~MonitoringData(); - public: - explicit SharedData(const Database*); - ~SharedData(); + bool initialize(bool); + void mutexBug(int osErrorCode, const char* text); - bool initialize(bool); - void mutexBug(int osErrorCode, const char* text); + void acquire(); + void release(); - void acquire(); - void release(); + UCHAR* read(MemoryPool&, ULONG&); + ULONG setup(); + void write(ULONG, ULONG, const void*); - UCHAR* read(MemoryPool&, ULONG&); - ULONG setup(); - void write(ULONG, ULONG, const void*); + void cleanup(); - void cleanup(); +private: + // copying is prohibited + MonitoringData(const MonitoringData&); + MonitoringData& operator =(const MonitoringData&); - private: - // copying is prohibited - SharedData(const SharedData&); - SharedData& operator =(const SharedData&); + void ensureSpace(ULONG); - void ensureSpace(ULONG); + const SLONG process_id; + const SLONG local_id; +}; - const SLONG process_id; - const SLONG local_id; - }; -private: - class DumpGuard - { - public: - explicit DumpGuard(SharedData* ptr) - : data(ptr) - { - data->acquire(); - } +class MonitoringTableScan: public VirtualTableScan +{ +public: + MonitoringTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream) + : VirtualTableScan(csb, name, stream) + {} - ~DumpGuard() - { - data->release(); - } + bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record) const; +}; - private: - DumpGuard(const DumpGuard&); - DumpGuard& operator=(const DumpGuard&); - SharedData* const data; +class DatabaseSnapshot : public DataDump +{ + struct RelationData + { + int rel_id; + RecordBuffer* data; }; +private: class Writer { public: - explicit Writer(SharedData* data) + explicit Writer(MonitoringData* data) : dump(data) { fb_assert(dump); @@ -299,7 +312,7 @@ } private: - SharedData* dump; + MonitoringData* dump; ULONG offset; }; @@ -338,6 +351,7 @@ static DatabaseSnapshot* create(thread_db*); static int blockingAst(void*); + static bool getRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record); protected: DatabaseSnapshot(thread_db*, MemoryPool&); Modified: firebird/trunk/src/jrd/Relation.h =================================================================== --- firebird/trunk/src/jrd/Relation.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/Relation.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -219,7 +219,6 @@ bool isSystem() const; bool isTemporary() const; bool isVirtual() const; - bool isUsers() const; // global temporary relations attributes RelationPages* getPages(thread_db* tdbb, SLONG tran = -1, bool allocPages = true); @@ -299,7 +298,6 @@ const ULONG REL_temp_tran = 0x2000; // relation is a GTT delete rows const ULONG REL_temp_conn = 0x4000; // relation is a GTT preserve rows const ULONG REL_virtual = 0x8000; // relation is virtual -const ULONG REL_users = 0x00010000; // relation is users list inline bool jrd_rel::isSystem() const @@ -314,14 +312,9 @@ inline bool jrd_rel::isVirtual() const { - return (rel_flags & (REL_virtual | REL_users)); + return (rel_flags & REL_virtual); } -inline bool jrd_rel::isUsers() const -{ - return (rel_flags & REL_users); -} - inline RelationPages* jrd_rel::getPages(thread_db* tdbb, SLONG tran, bool allocPages) { if (!isTemporary()) Modified: firebird/trunk/src/jrd/UserManagement.cpp =================================================================== --- firebird/trunk/src/jrd/UserManagement.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/UserManagement.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -38,6 +38,14 @@ using namespace Firebird; +bool UsersTableScan::retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const +{ + jrd_tra* const transaction = tdbb->getTransaction(); + return transaction->getUserManagement()->getList(tdbb, relation)->fetch(position, record); +} + + UserManagement::UserManagement(jrd_tra* tra) : DataDump(*tra->tra_pool), database(0), transaction(0), buffer(0), threadDbb(NULL), realUser(NULL), commands(*tra->tra_pool) @@ -219,51 +227,44 @@ buffer->store(record); } -RecordBuffer* UserManagement::getList(thread_db* tdbb) +RecordBuffer* UserManagement::getList(thread_db* tdbb, jrd_rel* relation) { #ifdef EMBEDDED // this restriction for embedded is temporarty and will gone when new build system will be introduced status_exception::raise(Arg::Gds(isc_random) << "User management not supported in embedded library"); return 0; // keep the compiler happy #else - if (buffer) + if (!buffer) { - return buffer; - } + try + { + threadDbb = tdbb; - try - { - threadDbb = tdbb; + fb_assert(relation && relation->rel_id == rel_sec_users); - jrd_rel* relation = MET_lookup_relation_id(threadDbb, rel_sec_users, false); - fb_assert(relation); + MET_scan_relation(threadDbb, relation); - MET_scan_relation(threadDbb, relation); - fb_assert(relation->isUsers()); + Format* const format = MET_current(threadDbb, relation); + fb_assert(format); - Format* format = MET_current(threadDbb, relation); - fb_assert(format); + MemoryPool* const pool = threadDbb->getTransaction()->tra_pool; + fb_assert(pool); - MemoryPool* pool = threadDbb->getTransaction()->tra_pool; - fb_assert(pool); + buffer = FB_NEW(*pool) RecordBuffer(*pool, format); + fb_assert(buffer); - buffer = FB_NEW(*pool) RecordBuffer(*pool, format); - fb_assert(buffer); - - ISC_STATUS_ARRAY status; - internal_user_data u; - u.operation = DIS_OPER; - int errcode = SECURITY_exec_line(status, realUser, database, transaction, &u, display, this); - checkSecurityResult(errcode, status, u.user_name); - } - catch (const Exception&) - { - if (buffer) + ISC_STATUS_ARRAY status; + internal_user_data u; + u.operation = DIS_OPER; + int errcode = SECURITY_exec_line(status, realUser, database, transaction, &u, display, this); + checkSecurityResult(errcode, status, u.user_name); + } + catch (const Exception&) { delete buffer; buffer = NULL; + throw; } - throw; } return buffer; Modified: firebird/trunk/src/jrd/UserManagement.h =================================================================== --- firebird/trunk/src/jrd/UserManagement.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/UserManagement.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -28,6 +28,7 @@ #include "../common/classes/fb_string.h" #include "../jrd/ibase.h" #include "../jrd/DatabaseSnapshot.h" +#include "../jrd/recsrc/RecordSource.h" struct internal_user_data; @@ -37,6 +38,16 @@ class jrd_tra; class RecordBuffer; +class UsersTableScan: public VirtualTableScan +{ +public: + UsersTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream) + : VirtualTableScan(csb, name, stream) + {} + + bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record) const; +}; + // User management argument for deferred work class UserManagement : public DataDump { @@ -51,7 +62,7 @@ // commit transaction in security database void commit(); // return users list for SEC$USERS - RecordBuffer* getList(thread_db* tdbb); + RecordBuffer* getList(thread_db* tdbb, jrd_rel* relation); private: FB_API_HANDLE database, transaction; Modified: firebird/trunk/src/jrd/constants.h =================================================================== --- firebird/trunk/src/jrd/constants.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/constants.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -202,8 +202,7 @@ rel_external = 2, rel_virtual = 3, rel_global_temp_preserve = 4, - rel_global_temp_delete = 5, - rel_vrt_users = 6 + rel_global_temp_delete = 5 }; // procedure types Modified: firebird/trunk/src/jrd/met.epp =================================================================== --- firebird/trunk/src/jrd/met.epp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/met.epp 2010-07-13 12:31:35 UTC (rev 51337) @@ -3607,9 +3607,6 @@ case rel_view: fb_assert(relation->rel_view_rse); break; - case rel_vrt_users: - relation->rel_flags |= REL_users; - break; case rel_virtual: relation->rel_flags |= REL_virtual; break; Modified: firebird/trunk/src/jrd/opt.cpp =================================================================== --- firebird/trunk/src/jrd/opt.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/opt.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -56,6 +56,7 @@ #include "../jrd/btr.h" #include "../jrd/sort.h" #include "../jrd/rse.h" +#include "../jrd/ini.h" #include "../jrd/intl.h" #include "../jrd/gdsassert.h" #include "../jrd/btr_proto.h" @@ -76,6 +77,8 @@ #include "../jrd/dbg_proto.h" #include "../jrd/DataTypeUtil.h" #include "../jrd/VirtualTable.h" +#include "../jrd/DatabaseSnapshot.h" +#include "../jrd/UserManagement.h" #include "../common/classes/array.h" #include "../common/classes/objects_array.h" #include "../jrd/recsrc/RecordSource.h" @@ -3045,9 +3048,9 @@ DEV_BLKCHK(*return_boolean, type_nod); } - CompilerScratch* csb = opt->opt_csb; - CompilerScratch::csb_repeat* csb_tail = &csb->csb_rpt[stream]; - jrd_rel* relation = csb_tail->csb_relation; + CompilerScratch* const csb = opt->opt_csb; + CompilerScratch::csb_repeat* const csb_tail = &csb->csb_rpt[stream]; + jrd_rel* const relation = csb_tail->csb_relation; fb_assert(relation); @@ -3074,15 +3077,17 @@ // External table rsb = FB_NEW(*tdbb->getDefaultPool()) ExternalTableScan(csb, alias, stream); } - else if (relation->isUsers()) - { - // Users table - rsb = FB_NEW(*tdbb->getDefaultPool()) UsersTableScan(csb, alias, stream); - } else if (relation->isVirtual()) { - // Virtual table - rsb = FB_NEW(*tdbb->getDefaultPool()) VirtualTableScan(csb, alias, stream); + // Virtual table: monitoring or security + if (relation->rel_id == rel_sec_users) + { + rsb = FB_NEW(*tdbb->getDefaultPool()) UsersTableScan(csb, alias, stream); + } + else + { + rsb = FB_NEW(*tdbb->getDefaultPool()) MonitoringTableScan(csb, alias, stream); + } } else { Modified: firebird/trunk/src/jrd/recsrc/RecordSource.h =================================================================== --- firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -28,11 +28,6 @@ #include "../jrd/rse.h" #include "../jrd/inf_pub.h" -namespace Ods -{ - struct btree_page; -} - namespace Jrd { class thread_db; @@ -281,11 +276,6 @@ class VirtualTableScan : public RecordStream { - struct Impure : public RecordSource::Impure - { - RecordBuffer* irsb_record_buffer; - }; - public: VirtualTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream); @@ -298,29 +288,10 @@ void dump(thread_db* tdbb, Firebird::UCharBuffer& buffer) const; - private: - const Firebird::string m_name; - }; + protected: + virtual bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const = 0; - class UsersTableScan : public RecordStream - { - struct Impure : public RecordSource::Impure - { - RecordBuffer* irsb_record_buffer; - }; - - public: - UsersTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream); - - void open(thread_db* tdbb) const; - void close(thread_db* tdbb) const; - - bool getRecord(thread_db* tdbb) const; - bool refetchRecord(thread_db* tdbb) const; - bool lockRecord(thread_db* tdbb) const; - - void dump(thread_db* tdbb, Firebird::UCharBuffer& buffer) const; - private: const Firebird::string m_name; }; Modified: firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp =================================================================== --- firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -68,9 +68,6 @@ } rpb->rpb_number.setValue(BOF_NUMBER); - - DatabaseSnapshot* const snapshot = DatabaseSnapshot::create(tdbb); - impure->irsb_record_buffer = snapshot->getData(relation); } void VirtualTableScan::close(thread_db* tdbb) const @@ -84,7 +81,6 @@ if (impure->irsb_flags & irsb_open) { impure->irsb_flags &= ~irsb_open; - impure->irsb_record_buffer = NULL; } } @@ -102,9 +98,7 @@ rpb->rpb_number.increment(); - fb_assert(impure->irsb_record_buffer); - - if (impure->irsb_record_buffer->fetch(rpb->rpb_number.getValue(), rpb->rpb_record)) + if (retrieveRecord(tdbb, rpb->rpb_relation, rpb->rpb_number.getValue(), rpb->rpb_record)) { rpb->rpb_number.setValid(true); return true; Modified: firebird/trunk/src/jrd/relations.h =================================================================== --- firebird/trunk/src/jrd/relations.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/relations.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -606,7 +606,7 @@ END_RELATION // Relation 44 (SEC$USERS) -RELATION(nam_sec_users, rel_sec_users, ODS_12_0, rel_vrt_users) +RELATION(nam_sec_users, rel_sec_users, ODS_12_0, rel_virtual) FIELD(f_sec_user_name, nam_user_name, fld_user, 1, ODS_12_0) FIELD(f_sec_group_name, nam_group_name, fld_user, 1, ODS_12_0) FIELD(f_sec_uid, nam_uid, fld_uid, 1, ODS_12_0) Modified: firebird/trunk/src/jrd/types.h =================================================================== --- firebird/trunk/src/jrd/types.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/types.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -112,7 +112,6 @@ TYPE ("VIRTUAL", rel_virtual, nam_r_type) TYPE ("GLOBAL_TEMPORARY_PRESERVE", rel_global_temp_preserve, nam_r_type) TYPE ("GLOBAL_TEMPORARY_DELETE", rel_global_temp_delete, nam_r_type) -TYPE ("USERS LIST", rel_vrt_users, nam_r_type) TYPE ("LEGACY", prc_legacy, nam_prc_type) TYPE ("SELECTABLE", prc_selectable, nam_prc_type) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |