|
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.
|