mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
start implementing port table cursor
This commit is contained in:
parent
4d03ecb4a0
commit
37092c03a4
@ -77,6 +77,8 @@ morkPortTableCursor::morkPortTableCursor(morkEnv* ev,
|
||||
mdb_kind inTableKind, nsIMdbHeap* ioSlotHeap)
|
||||
: morkCursor(ev, inUsage, ioHeap)
|
||||
, mPortTableCursor_Store( 0 )
|
||||
, mPortTableCursor_RowSpace( 0 )
|
||||
, mPortTableCursor_LastTable ( 0 )
|
||||
, mPortTableCursor_RowScope( inRowScope )
|
||||
, mPortTableCursor_TableKind( inTableKind )
|
||||
{
|
||||
@ -105,6 +107,7 @@ morkPortTableCursor::ClosePortTableCursor(morkEnv* ev)
|
||||
mCursor_Pos = -1;
|
||||
mCursor_Seed = 0;
|
||||
morkStore::SlotWeakStore((morkStore*) 0, ev, &mPortTableCursor_Store);
|
||||
morkRowSpace::SlotStrongRowSpace((morkRowSpace*) 0, ev, &mPortTableCursor_RowSpace);
|
||||
this->CloseCursor(ev);
|
||||
this->MarkShut();
|
||||
}
|
||||
@ -141,5 +144,52 @@ morkPortTableCursor::AcquirePortTableCursorHandle(morkEnv* ev)
|
||||
return outCursor;
|
||||
}
|
||||
|
||||
morkTable *
|
||||
morkPortTableCursor::NextTable(morkEnv* ev)
|
||||
{
|
||||
if (!mPortTableCursor_RowScope)
|
||||
{
|
||||
morkStore* store = mPortTableCursor_Store;
|
||||
morkRowSpaceMapIter* rsi = &mPortTableCursor_SpaceIter;
|
||||
rsi->InitRowSpaceMapIter(ev, &store->mStore_RowSpaces);
|
||||
}
|
||||
|
||||
|
||||
morkStore* store = mPortTableCursor_Store;
|
||||
mdb_scope scope = mPortTableCursor_RowScope;
|
||||
if (!mPortTableCursor_RowSpace)
|
||||
{
|
||||
morkRowSpace* rowSpace = store->LazyGetRowSpace(ev, scope);
|
||||
morkRowSpace::SlotStrongRowSpace(rowSpace, ev, &mPortTableCursor_RowSpace);
|
||||
if ( rowSpace && ev->Good() )
|
||||
{
|
||||
morkTableMapIter* ti = &mPortTableCursor_TableIter;
|
||||
ti->InitTableMapIter(ev, &rowSpace->mRowSpace_Tables);
|
||||
}
|
||||
}
|
||||
mork_tid* key = 0; // ignore keys in table map
|
||||
morkTable* table = 0; // old value table in the map
|
||||
morkTableMapIter* ti = &mPortTableCursor_TableIter;
|
||||
|
||||
mork_change* c = ( mPortTableCursor_LastTable )?
|
||||
ti->NextTable(ev, key, &table) : c = ti->FirstTable(ev, key, &table);
|
||||
|
||||
for ( ; c && ev->Good(); c = ti->NextTable(ev, key, &table) )
|
||||
{
|
||||
if ( table && table->IsTable() )
|
||||
{
|
||||
if ( table->mTable_Kind == mPortTableCursor_TableKind )
|
||||
{
|
||||
mPortTableCursor_LastTable = table;
|
||||
return table;
|
||||
}
|
||||
}
|
||||
else
|
||||
table->NonTableTypeWarning(ev);
|
||||
}
|
||||
morkRowSpace::SlotStrongRowSpace(0, ev, &mPortTableCursor_RowSpace);
|
||||
|
||||
return (morkTable*) 0;
|
||||
}
|
||||
|
||||
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
|
||||
|
@ -27,6 +27,10 @@
|
||||
#include "morkCursor.h"
|
||||
#endif
|
||||
|
||||
#ifndef _MORKROWSPACE_
|
||||
#include "morkRowSpace.h"
|
||||
#endif
|
||||
|
||||
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
|
||||
|
||||
class orkinPortTableCursor;
|
||||
@ -59,7 +63,11 @@ public: // state is public because the entire Mork system is private
|
||||
mdb_kind mPortTableCursor_TableKind;
|
||||
|
||||
// $$$ need use a map iter for covering tables in port map (hash table)
|
||||
|
||||
morkTable* mPortTableCursor_LastTable; // nil or last table
|
||||
morkRowSpace* mPortTableCursor_RowSpace; // current space in store
|
||||
|
||||
morkRowSpaceMapIter mPortTableCursor_SpaceIter; // iter over spaces
|
||||
morkTableMapIter mPortTableCursor_TableIter; // iter over tables
|
||||
// { ===== begin morkNode interface =====
|
||||
public: // morkNode virtual methods
|
||||
virtual void CloseMorkNode(morkEnv* ev); // ClosePortTableCursor()
|
||||
@ -85,6 +93,7 @@ public: // other cell cursor methods
|
||||
static void NonPortTableCursorTypeError(morkEnv* ev);
|
||||
|
||||
orkinPortTableCursor* AcquirePortTableCursorHandle(morkEnv* ev);
|
||||
morkTable *NextTable(morkEnv* ev);
|
||||
|
||||
public: // typesafe refcounting inlines calling inherited morkNode methods
|
||||
static void SlotWeakPortTableCursor(morkPortTableCursor* me,
|
||||
|
@ -417,8 +417,13 @@ orkinPortTableCursor::NextTable( // get table at next position in the db
|
||||
this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
|
||||
if ( ev )
|
||||
{
|
||||
ev->StubMethodOnlyError();
|
||||
outErr = ev->AsErr();
|
||||
|
||||
morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
|
||||
morkTable* table = cursor->NextTable(ev);
|
||||
if ( table && ev->Good() )
|
||||
*acqTable = table->AcquireTableHandle(ev);
|
||||
|
||||
outErr = ev->AsErr();
|
||||
}
|
||||
return outErr;
|
||||
}
|
||||
|
@ -77,6 +77,8 @@ morkPortTableCursor::morkPortTableCursor(morkEnv* ev,
|
||||
mdb_kind inTableKind, nsIMdbHeap* ioSlotHeap)
|
||||
: morkCursor(ev, inUsage, ioHeap)
|
||||
, mPortTableCursor_Store( 0 )
|
||||
, mPortTableCursor_RowSpace( 0 )
|
||||
, mPortTableCursor_LastTable ( 0 )
|
||||
, mPortTableCursor_RowScope( inRowScope )
|
||||
, mPortTableCursor_TableKind( inTableKind )
|
||||
{
|
||||
@ -105,6 +107,7 @@ morkPortTableCursor::ClosePortTableCursor(morkEnv* ev)
|
||||
mCursor_Pos = -1;
|
||||
mCursor_Seed = 0;
|
||||
morkStore::SlotWeakStore((morkStore*) 0, ev, &mPortTableCursor_Store);
|
||||
morkRowSpace::SlotStrongRowSpace((morkRowSpace*) 0, ev, &mPortTableCursor_RowSpace);
|
||||
this->CloseCursor(ev);
|
||||
this->MarkShut();
|
||||
}
|
||||
@ -141,5 +144,52 @@ morkPortTableCursor::AcquirePortTableCursorHandle(morkEnv* ev)
|
||||
return outCursor;
|
||||
}
|
||||
|
||||
morkTable *
|
||||
morkPortTableCursor::NextTable(morkEnv* ev)
|
||||
{
|
||||
if (!mPortTableCursor_RowScope)
|
||||
{
|
||||
morkStore* store = mPortTableCursor_Store;
|
||||
morkRowSpaceMapIter* rsi = &mPortTableCursor_SpaceIter;
|
||||
rsi->InitRowSpaceMapIter(ev, &store->mStore_RowSpaces);
|
||||
}
|
||||
|
||||
|
||||
morkStore* store = mPortTableCursor_Store;
|
||||
mdb_scope scope = mPortTableCursor_RowScope;
|
||||
if (!mPortTableCursor_RowSpace)
|
||||
{
|
||||
morkRowSpace* rowSpace = store->LazyGetRowSpace(ev, scope);
|
||||
morkRowSpace::SlotStrongRowSpace(rowSpace, ev, &mPortTableCursor_RowSpace);
|
||||
if ( rowSpace && ev->Good() )
|
||||
{
|
||||
morkTableMapIter* ti = &mPortTableCursor_TableIter;
|
||||
ti->InitTableMapIter(ev, &rowSpace->mRowSpace_Tables);
|
||||
}
|
||||
}
|
||||
mork_tid* key = 0; // ignore keys in table map
|
||||
morkTable* table = 0; // old value table in the map
|
||||
morkTableMapIter* ti = &mPortTableCursor_TableIter;
|
||||
|
||||
mork_change* c = ( mPortTableCursor_LastTable )?
|
||||
ti->NextTable(ev, key, &table) : c = ti->FirstTable(ev, key, &table);
|
||||
|
||||
for ( ; c && ev->Good(); c = ti->NextTable(ev, key, &table) )
|
||||
{
|
||||
if ( table && table->IsTable() )
|
||||
{
|
||||
if ( table->mTable_Kind == mPortTableCursor_TableKind )
|
||||
{
|
||||
mPortTableCursor_LastTable = table;
|
||||
return table;
|
||||
}
|
||||
}
|
||||
else
|
||||
table->NonTableTypeWarning(ev);
|
||||
}
|
||||
morkRowSpace::SlotStrongRowSpace(0, ev, &mPortTableCursor_RowSpace);
|
||||
|
||||
return (morkTable*) 0;
|
||||
}
|
||||
|
||||
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
|
||||
|
@ -27,6 +27,10 @@
|
||||
#include "morkCursor.h"
|
||||
#endif
|
||||
|
||||
#ifndef _MORKROWSPACE_
|
||||
#include "morkRowSpace.h"
|
||||
#endif
|
||||
|
||||
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
|
||||
|
||||
class orkinPortTableCursor;
|
||||
@ -59,7 +63,11 @@ public: // state is public because the entire Mork system is private
|
||||
mdb_kind mPortTableCursor_TableKind;
|
||||
|
||||
// $$$ need use a map iter for covering tables in port map (hash table)
|
||||
|
||||
morkTable* mPortTableCursor_LastTable; // nil or last table
|
||||
morkRowSpace* mPortTableCursor_RowSpace; // current space in store
|
||||
|
||||
morkRowSpaceMapIter mPortTableCursor_SpaceIter; // iter over spaces
|
||||
morkTableMapIter mPortTableCursor_TableIter; // iter over tables
|
||||
// { ===== begin morkNode interface =====
|
||||
public: // morkNode virtual methods
|
||||
virtual void CloseMorkNode(morkEnv* ev); // ClosePortTableCursor()
|
||||
@ -85,6 +93,7 @@ public: // other cell cursor methods
|
||||
static void NonPortTableCursorTypeError(morkEnv* ev);
|
||||
|
||||
orkinPortTableCursor* AcquirePortTableCursorHandle(morkEnv* ev);
|
||||
morkTable *NextTable(morkEnv* ev);
|
||||
|
||||
public: // typesafe refcounting inlines calling inherited morkNode methods
|
||||
static void SlotWeakPortTableCursor(morkPortTableCursor* me,
|
||||
|
@ -417,8 +417,13 @@ orkinPortTableCursor::NextTable( // get table at next position in the db
|
||||
this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
|
||||
if ( ev )
|
||||
{
|
||||
ev->StubMethodOnlyError();
|
||||
outErr = ev->AsErr();
|
||||
|
||||
morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
|
||||
morkTable* table = cursor->NextTable(ev);
|
||||
if ( table && ev->Good() )
|
||||
*acqTable = table->AcquireTableHandle(ev);
|
||||
|
||||
outErr = ev->AsErr();
|
||||
}
|
||||
return outErr;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user