summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/db/mork/morkRowObject.h
blob: 7af5642a3fbdc019a6cc82b7153b2152a84bf1e5 (plain)
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/* -*- 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 _MORKROWOBJECT_
#define _MORKROWOBJECT_ 1

#ifndef _MORK_
#  include "mork.h"
#endif

#ifndef _MORKOBJECT_
#  include "morkObject.h"
#endif

// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789

class nsIMdbRow;
#define morkDerived_kRowObject /*i*/ 0x724F /* ascii 'rO' */

class morkRowObject : public morkObject, public nsIMdbRow {  //

 public:  // state is public because the entire Mork system is private
  NS_DECL_ISUPPORTS_INHERITED

  morkRow* mRowObject_Row;      // non-refcounted alias to morkRow
  morkStore* mRowObject_Store;  // non-refcounted ptr to store containing row

  // { ===== begin morkNode interface =====
 public:  // morkNode virtual methods
  virtual void CloseMorkNode(
      morkEnv* ev) override;  // CloseRowObject() only if open

 public:  // morkRowObject construction & destruction
  morkRowObject(morkEnv* ev, const morkUsage& inUsage, nsIMdbHeap* ioHeap,
                morkRow* ioRow, morkStore* ioStore);
  void CloseRowObject(morkEnv* ev);  // called by CloseMorkNode();

  // { ===== begin nsIMdbCollection methods =====

  // { ----- begin attribute methods -----
  NS_IMETHOD GetSeed(nsIMdbEnv* ev,
                     mdb_seed* outSeed) override;  // member change count
  NS_IMETHOD GetCount(nsIMdbEnv* ev,
                      mdb_count* outCount) override;  // member count

  NS_IMETHOD GetPort(nsIMdbEnv* ev,
                     nsIMdbPort** acqPort) override;  // collection container
  // } ----- end attribute methods -----

  // { ----- begin cursor methods -----
  NS_IMETHOD GetCursor(     // make a cursor starting iter at inMemberPos
      nsIMdbEnv* ev,        // context
      mdb_pos inMemberPos,  // zero-based ordinal pos of member in collection
      nsIMdbCursor** acqCursor) override;  // acquire new cursor instance
  // } ----- end cursor methods -----

  // { ----- begin ID methods -----
  NS_IMETHOD GetOid(nsIMdbEnv* ev,
                    mdbOid* outOid) override;  // read object identity
  NS_IMETHOD BecomeContent(nsIMdbEnv* ev,
                           const mdbOid* inOid) override;  // exchange content
  // } ----- end ID methods -----

  // { ----- begin activity dropping methods -----
  NS_IMETHOD DropActivity(  // tell collection usage no longer expected
      nsIMdbEnv* ev) override;
  // } ----- end activity dropping methods -----

  // } ===== end nsIMdbCollection methods =====
  // { ===== begin nsIMdbRow methods =====

  // { ----- begin cursor methods -----
  NS_IMETHOD GetRowCellCursor(  // make a cursor starting iteration at inRowPos
      nsIMdbEnv* ev,            // context
      mdb_pos inRowPos,         // zero-based ordinal position of row in table
      nsIMdbRowCellCursor** acqCursor) override;  // acquire new cursor instance
  // } ----- end cursor methods -----

  // { ----- begin column methods -----
  NS_IMETHOD AddColumn(     // make sure a particular column is inside row
      nsIMdbEnv* ev,        // context
      mdb_column inColumn,  // column to add
      const mdbYarn* inYarn) override;  // cell value to install

  NS_IMETHOD CutColumn(  // make sure a column is absent from the row
      nsIMdbEnv* ev,     // context
      mdb_column inColumn) override;  // column to ensure absent from row

  NS_IMETHOD CutAllColumns(     // remove all columns from the row
      nsIMdbEnv* ev) override;  // context
  // } ----- end column methods -----

  // { ----- begin cell methods -----
  NS_IMETHOD NewCell(       // get cell for specified column, or add new one
      nsIMdbEnv* ev,        // context
      mdb_column inColumn,  // column to add
      nsIMdbCell** acqCell) override;  // cell column and value

  NS_IMETHOD AddCell(  // copy a cell from another row to this row
      nsIMdbEnv* ev,   // context
      const nsIMdbCell* inCell) override;  // cell column and value

  NS_IMETHOD GetCell(                  // find a cell in this row
      nsIMdbEnv* ev,                   // context
      mdb_column inColumn,             // column to find
      nsIMdbCell** acqCell) override;  // cell for specified column, or null

  NS_IMETHOD EmptyAllCells(     // make all cells in row empty of content
      nsIMdbEnv* ev) override;  // context
  // } ----- end cell methods -----

  // { ----- begin row methods -----
  NS_IMETHOD AddRow(  // add all cells in another row to this one
      nsIMdbEnv* ev,  // context
      nsIMdbRow* ioSourceRow) override;  // row to union with

  NS_IMETHOD SetRow(                     // make exact duplicate of another row
      nsIMdbEnv* ev,                     // context
      nsIMdbRow* ioSourceRow) override;  // row to duplicate
  // } ----- end row methods -----

  // { ----- begin blob methods -----
  NS_IMETHOD SetCellYarn(
      nsIMdbEnv* ev,                    // synonym for AddColumn()
      mdb_column inColumn,              // column to write
      const mdbYarn* inYarn) override;  // reads from yarn slots
  // make this text object contain content from the yarn's buffer

  NS_IMETHOD GetCellYarn(nsIMdbEnv* ev,
                         mdb_column inColumn,         // column to read
                         mdbYarn* outYarn) override;  // writes some yarn slots
  // copy content into the yarn buffer, and update mYarn_Fill and mYarn_Form

  NS_IMETHOD AliasCellYarn(nsIMdbEnv* ev,
                           mdb_column inColumn,         // column to alias
                           mdbYarn* outYarn) override;  // writes ALL yarn slots

  NS_IMETHOD NextCellYarn(nsIMdbEnv* ev,  // iterative version of GetCellYarn()
                          mdb_column* ioColumn,        // next column to read
                          mdbYarn* outYarn) override;  // writes some yarn slots
  // copy content into the yarn buffer, and update mYarn_Fill and mYarn_Form
  //
  // The ioColumn argument is an inout parameter which initially contains the
  // last column accessed and returns the next column corresponding to the
  // content read into the yarn.  Callers should start with a zero column
  // value to say 'no previous column', which causes the first column to be
  // read.  Then the value returned in ioColumn is perfect for the next call
  // to NextCellYarn(), since it will then be the previous column accessed.
  // Callers need only examine the column token returned to see which cell
  // in the row is being read into the yarn.  When no more columns remain,
  // and the iteration has ended, ioColumn will return a zero token again.
  // So iterating over cells starts and ends with a zero column token.

  NS_IMETHOD SeekCellYarn(         // resembles nsIMdbRowCellCursor::SeekCell()
      nsIMdbEnv* ev,               // context
      mdb_pos inPos,               // position of cell in row sequence
      mdb_column* outColumn,       // column for this particular cell
      mdbYarn* outYarn) override;  // writes some yarn slots
  // copy content into the yarn buffer, and update mYarn_Fill and mYarn_Form
  // Callers can pass nil for outYarn to indicate no interest in content, so
  // only the outColumn value is returned.  NOTE to subclasses: you must be
  // able to ignore outYarn when the pointer is nil; please do not crash.

  // } ----- end blob methods -----

  // } ===== end nsIMdbRow methods =====

 private:  // copying is not allowed
  morkRowObject(const morkRowObject& other);
  morkRowObject& operator=(const morkRowObject& other);
  virtual ~morkRowObject();  // assert that CloseRowObject() executed earlier

 public:  // dynamic type identification
  mork_bool IsRowObject() const {
    return IsNode() && mNode_Derived == morkDerived_kRowObject;
  }
  // } ===== end morkNode methods =====

 public:  // typing
  static void NonRowObjectTypeError(morkEnv* ev);
  static void NilRowError(morkEnv* ev);
  static void NilStoreError(morkEnv* ev);
  static void RowObjectRowNotSelfError(morkEnv* ev);

 public:                                     // other row node methods
  nsIMdbRow* AcquireRowHandle(morkEnv* ev);  // mObject_Handle

 public:  // typesafe refcounting inlines calling inherited morkNode methods
  static void SlotWeakRowObject(morkRowObject* me, morkEnv* ev,
                                morkRowObject** ioSlot) {
    morkNode::SlotWeakNode((morkNode*)me, ev, (morkNode**)ioSlot);
  }

  static void SlotStrongRowObject(morkRowObject* me, morkEnv* ev,
                                  morkRowObject** ioSlot) {
    morkNode::SlotStrongNode((morkNode*)me, ev, (morkNode**)ioSlot);
  }
};

// 456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789

#endif /* _MORKROWOBJECT_ */