1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef _MORKTABLEROWCURSOR_
#define _MORKTABLEROWCURSOR_ 1
#ifndef _MORK_
#include "mork.h"
#endif
#ifndef _MORKCURSOR_
#include "morkCursor.h"
#endif
#ifndef _MORKMAP_
#include "morkMap.h"
#endif
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
class orkinTableRowCursor;
#define morkDerived_kTableRowCursor /*i*/ 0x7243 /* ascii 'rC' */
class morkTableRowCursor : public morkCursor, public nsIMdbTableRowCursor { // row iterator
// public: // slots inherited from morkObject (meant to inform only)
// nsIMdbHeap* mNode_Heap;
// mork_able mNode_Mutable; // can this node be modified?
// mork_load mNode_Load; // is this node clean or dirty?
// mork_base mNode_Base; // must equal morkBase_kNode
// mork_derived mNode_Derived; // depends on specific node subclass
// mork_access mNode_Access; // kOpen, kClosing, kShut, or kDead
// mork_usage mNode_Usage; // kHeap, kStack, kMember, kGlobal, kNone
// mork_uses mNode_Uses; // refcount for strong refs
// mork_refs mNode_Refs; // refcount for strong refs + weak refs
// morkFactory* mObject_Factory; // weak ref to suite factory
// mork_seed mCursor_Seed;
// mork_pos mCursor_Pos;
// mork_bool mCursor_DoFailOnSeedOutOfSync;
// mork_u1 mCursor_Pad[ 3 ]; // explicitly pad to u4 alignment
public: // state is public because the entire Mork system is private
morkTable* mTableRowCursor_Table; // weak ref to table
// { ===== begin morkNode interface =====
public: // morkNode virtual methods
virtual void CloseMorkNode(morkEnv* ev) override; // CloseTableRowCursor()
protected:
virtual ~morkTableRowCursor(); // assert that close executed earlier
public: // morkTableRowCursor construction & destruction
morkTableRowCursor(morkEnv* ev, const morkUsage& inUsage,
nsIMdbHeap* ioHeap, morkTable* ioTable, mork_pos inRowPos);
void CloseTableRowCursor(morkEnv* ev); // called by CloseMorkNode();
private: // copying is not allowed
morkTableRowCursor(const morkTableRowCursor& other);
morkTableRowCursor& operator=(const morkTableRowCursor& other);
public:
NS_DECL_ISUPPORTS_INHERITED
// { ----- begin attribute methods -----
NS_IMETHOD GetCount(nsIMdbEnv* ev, mdb_count* outCount) override; // readonly
NS_IMETHOD GetSeed(nsIMdbEnv* ev, mdb_seed* outSeed) override; // readonly
NS_IMETHOD SetPos(nsIMdbEnv* ev, mdb_pos inPos) override; // mutable
NS_IMETHOD GetPos(nsIMdbEnv* ev, mdb_pos* outPos) override;
NS_IMETHOD SetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool inFail) override;
NS_IMETHOD GetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool* outFail) override;
// } ----- end attribute methods -----
NS_IMETHOD GetTable(nsIMdbEnv* ev, nsIMdbTable** acqTable) override;
// } ----- end attribute methods -----
// { ----- begin duplicate row removal methods -----
NS_IMETHOD CanHaveDupRowMembers(nsIMdbEnv* ev, // cursor might hold dups?
mdb_bool* outCanHaveDups) override;
NS_IMETHOD MakeUniqueCursor( // clone cursor, removing duplicate rows
nsIMdbEnv* ev, // context
nsIMdbTableRowCursor** acqCursor) override; // acquire clone with no dups
// } ----- end duplicate row removal methods -----
// { ----- begin oid iteration methods -----
NS_IMETHOD NextRowOid( // get row id of next row in the table
nsIMdbEnv* ev, // context
mdbOid* outOid, // out row oid
mdb_pos* outRowPos) override; // zero-based position of the row in table
NS_IMETHOD PrevRowOid( // get row id of previous row in the table
nsIMdbEnv* ev, // context
mdbOid* outOid, // out row oid
mdb_pos* outRowPos) override; // zero-based position of the row in table
// } ----- end oid iteration methods -----
// { ----- begin row iteration methods -----
NS_IMETHOD NextRow( // get row cells from table for cells already in row
nsIMdbEnv* ev, // context
nsIMdbRow** acqRow, // acquire next row in table
mdb_pos* outRowPos) override; // zero-based position of the row in table
NS_IMETHOD PrevRow( // get row cells from table for cells already in row
nsIMdbEnv* ev, // context
nsIMdbRow** acqRow, // acquire previous row in table
mdb_pos* outRowPos) override; // zero-based position of the row in table
// } ----- end row iteration methods -----
public: // dynamic type identification
mork_bool IsTableRowCursor() const
{ return IsNode() && mNode_Derived == morkDerived_kTableRowCursor; }
// } ===== end morkNode methods =====
public: // typing
static void NonTableRowCursorTypeError(morkEnv* ev);
public: // oid only iteration
mdb_pos NextRowOid(morkEnv* ev, mdbOid* outOid);
mdb_pos PrevRowOid(morkEnv* ev, mdbOid* outOid);
public: // other table row cursor methods
virtual mork_bool CanHaveDupRowMembers(morkEnv* ev);
virtual mork_count GetMemberCount(morkEnv* ev);
virtual morkRow* NextRow(morkEnv* ev, mdbOid* outOid, mdb_pos* outPos);
virtual morkRow* PrevRow(morkEnv* ev, mdbOid* outOid, mdb_pos* outPos);
public: // typesafe refcounting inlines calling inherited morkNode methods
static void SlotWeakTableRowCursor(morkTableRowCursor* me,
morkEnv* ev, morkTableRowCursor** ioSlot)
{ morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
static void SlotStrongTableRowCursor(morkTableRowCursor* me,
morkEnv* ev, morkTableRowCursor** ioSlot)
{ morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
};
//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
#endif /* _MORKTABLEROWCURSOR_ */
|