start implementing port table cursor

This commit is contained in:
bienvenu%netscape.com 1999-04-04 17:38:39 +00:00
parent 4d03ecb4a0
commit 37092c03a4
6 changed files with 134 additions and 6 deletions

View File

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

View File

@ -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,

View File

@ -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;
}

View File

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

View File

@ -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,

View File

@ -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;
}