Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh
[wine-gecko.git] / db / mork / src / orkinPortTableCursor.cpp
blob2f81807f659bca3da69f550e4d8e55ab1f11f643
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 1999
20 * the Initial Developer. All Rights Reserved.
22 * Contributor(s):
24 * Alternatively, the contents of this file may be used under the terms of
25 * either of the GNU General Public License Version 2 or later (the "GPL"),
26 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
38 #ifndef _MDB_
39 #include "mdb.h"
40 #endif
42 #ifndef _MORK_
43 #include "mork.h"
44 #endif
46 #ifndef _MORKNODE_
47 #include "morkNode.h"
48 #endif
50 #ifndef _MORKHANDLE_
51 #include "morkHandle.h"
52 #endif
54 #ifndef _MORKENV_
55 #include "morkEnv.h"
56 #endif
58 #ifndef _MORKSTORE_
59 #include "morkStore.h"
60 #endif
62 #ifndef _ORKINSTORE_
63 #include "orkinStore.h"
64 #endif
66 #ifndef _MORKPORTTABLECURSOR_
67 #include "morkPortTableCursor.h"
68 #endif
70 #ifndef _ORKINPORTTABLECURSOR_
71 #include "orkinPortTableCursor.h"
72 #endif
74 //3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
76 /* public virtual*/
77 orkinPortTableCursor:: ~orkinPortTableCursor() // morkHandle destructor does everything
81 /*protected non-poly construction*/
82 orkinPortTableCursor::orkinPortTableCursor(morkEnv* ev, // morkUsage is morkUsage_kPool
83 morkHandleFace* ioFace, // must not be nil, cookie for this handle
84 morkPortTableCursor* ioObject) // must not be nil, object for this handle
85 : morkHandle(ev, ioFace, ioObject,
86 morkMagic_kPortTableCursor)
88 // do not modify mNode_Derived; leave it equal to morkDerived_kHandle
92 /*static */ orkinPortTableCursor*
93 orkinPortTableCursor::MakePortTableCursor(morkEnv* ev,
94 morkPortTableCursor* ioObject)
96 mork_bool isEnv = ev->IsEnv();
97 MORK_ASSERT(isEnv);
98 if ( isEnv )
100 morkHandleFace* face = ev->NewHandle(sizeof(orkinPortTableCursor));
101 if ( face )
102 return new(face) orkinPortTableCursor(ev, face, ioObject);
103 else
104 ev->OutOfMemoryError();
107 return (orkinPortTableCursor*) 0;
110 morkEnv*
111 orkinPortTableCursor::CanUsePortTableCursor(nsIMdbEnv* mev,
112 mork_bool inMutable, mdb_err* outErr) const
114 morkEnv* outEnv = 0;
115 morkEnv* ev = morkEnv::FromMdbEnv(mev);
116 if ( ev )
118 morkPortTableCursor* self = (morkPortTableCursor*)
119 this->GetGoodHandleObject(ev, inMutable, morkMagic_kPortTableCursor,
120 /*inClosedOkay*/ morkBool_kFalse);
121 if ( self )
123 if ( self->IsPortTableCursor() )
124 outEnv = ev;
125 else
126 self->NonPortTableCursorTypeError(ev);
128 *outErr = ev->AsErr();
130 MORK_ASSERT(outEnv);
131 return outEnv;
134 // { ===== begin nsIMdbISupports methods =====
135 NS_IMPL_QUERY_INTERFACE0(orkinPortTableCursor)
137 /*virtual*/ nsrefcnt
138 orkinPortTableCursor::AddRef() // add strong ref with no
140 morkEnv* ev = mHandle_Env;
141 if ( ev && ev->IsEnv() )
142 return this->Handle_AddStrongRef(ev->AsMdbEnv());
143 else
144 return morkEnv_kNonEnvTypeError;
147 /*virtual*/ nsrefcnt
148 orkinPortTableCursor::Release() // cut strong ref
150 morkEnv* ev = mHandle_Env;
151 if ( ev && ev->IsEnv() )
152 return this->Handle_CutStrongRef(ev->AsMdbEnv());
153 else
154 return morkEnv_kNonEnvTypeError;
156 // } ===== end nsIMdbObject methods =====
159 // { ===== begin nsIMdbObject methods =====
161 // { ----- begin attribute methods -----
162 /*virtual*/ mdb_err
163 orkinPortTableCursor::IsFrozenMdbObject(nsIMdbEnv* mev, mdb_bool* outIsReadonly)
165 return this->Handle_IsFrozenMdbObject(mev, outIsReadonly);
167 // same as nsIMdbPort::GetIsPortReadonly() when this object is inside a port.
168 // } ----- end attribute methods -----
170 // { ----- begin factory methods -----
171 /*virtual*/ mdb_err
172 orkinPortTableCursor::GetMdbFactory(nsIMdbEnv* mev, nsIMdbFactory** acqFactory)
174 return this->Handle_GetMdbFactory(mev, acqFactory);
176 // } ----- end factory methods -----
178 // { ----- begin ref counting for well-behaved cyclic graphs -----
179 /*virtual*/ mdb_err
180 orkinPortTableCursor::GetWeakRefCount(nsIMdbEnv* mev, // weak refs
181 mdb_count* outCount)
183 return this->Handle_GetWeakRefCount(mev, outCount);
185 /*virtual*/ mdb_err
186 orkinPortTableCursor::GetStrongRefCount(nsIMdbEnv* mev, // strong refs
187 mdb_count* outCount)
189 return this->Handle_GetStrongRefCount(mev, outCount);
192 /*virtual*/ mdb_err
193 orkinPortTableCursor::AddWeakRef(nsIMdbEnv* mev)
195 return this->Handle_AddWeakRef(mev);
197 /*virtual*/ mdb_err
198 orkinPortTableCursor::AddStrongRef(nsIMdbEnv* mev)
200 return this->Handle_AddStrongRef(mev);
203 /*virtual*/ mdb_err
204 orkinPortTableCursor::CutWeakRef(nsIMdbEnv* mev)
206 return this->Handle_CutWeakRef(mev);
208 /*virtual*/ mdb_err
209 orkinPortTableCursor::CutStrongRef(nsIMdbEnv* mev)
211 return this->Handle_CutStrongRef(mev);
214 /*virtual*/ mdb_err
215 orkinPortTableCursor::CloseMdbObject(nsIMdbEnv* mev)
217 return this->Handle_CloseMdbObject(mev);
220 /*virtual*/ mdb_err
221 orkinPortTableCursor::IsOpenMdbObject(nsIMdbEnv* mev, mdb_bool* outOpen)
223 return this->Handle_IsOpenMdbObject(mev, outOpen);
225 // } ----- end ref counting -----
227 // } ===== end nsIMdbObject methods =====
229 // { ===== begin nsIMdbCursor methods =====
231 // { ----- begin attribute methods -----
232 /*virtual*/ mdb_err
233 orkinPortTableCursor::GetCount(nsIMdbEnv* mev, mdb_count* outCount)
235 mdb_err outErr = 0;
236 mdb_count count = 0;
237 morkEnv* ev =
238 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
239 if ( ev )
241 ev->StubMethodOnlyError();
242 outErr = ev->AsErr();
244 if ( outCount )
245 *outCount = count;
246 return outErr;
249 /*virtual*/ mdb_err
250 orkinPortTableCursor::GetSeed(nsIMdbEnv* mev, mdb_seed* outSeed)
252 mdb_err outErr = 0;
253 mdb_seed seed = 0;
254 morkEnv* ev =
255 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
256 if ( ev )
258 ev->StubMethodOnlyError();
259 outErr = ev->AsErr();
261 if ( outSeed )
262 *outSeed = seed;
263 return outErr;
266 /*virtual*/ mdb_err
267 orkinPortTableCursor::SetPos(nsIMdbEnv* mev, mdb_pos inPos)
269 MORK_USED_1(inPos);
270 mdb_err outErr = 0;
271 morkEnv* ev =
272 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
273 if ( ev )
275 ev->StubMethodOnlyError();
276 outErr = ev->AsErr();
278 return outErr;
281 /*virtual*/ mdb_err
282 orkinPortTableCursor::GetPos(nsIMdbEnv* mev, mdb_pos* outPos)
284 mdb_err outErr = 0;
285 mdb_pos pos = 0;
286 morkEnv* ev =
287 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
288 if ( ev )
290 ev->StubMethodOnlyError();
291 outErr = ev->AsErr();
293 if ( outPos )
294 *outPos = pos;
296 return outErr;
299 /*virtual*/ mdb_err
300 orkinPortTableCursor::SetDoFailOnSeedOutOfSync(nsIMdbEnv* mev, mdb_bool inFail)
302 MORK_USED_1(inFail);
303 mdb_err outErr = 0;
304 morkEnv* ev =
305 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
306 if ( ev )
308 ev->StubMethodOnlyError();
309 outErr = ev->AsErr();
311 return outErr;
314 /*virtual*/ mdb_err
315 orkinPortTableCursor::GetDoFailOnSeedOutOfSync(nsIMdbEnv* mev, mdb_bool* outFail)
317 mdb_err outErr = 0;
318 mdb_bool fail = 0;
319 morkEnv* ev =
320 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
321 if ( ev )
323 ev->StubMethodOnlyError();
324 outErr = ev->AsErr();
326 if ( outFail )
327 *outFail = fail;
328 return outErr;
330 // } ----- end attribute methods -----
332 // } ===== end nsIMdbCursor methods =====
334 // { ===== begin nsIMdbPortTableCursor methods =====
336 // { ----- begin attribute methods -----
337 /*virtual*/ mdb_err
338 orkinPortTableCursor::SetPort(nsIMdbEnv* mev, nsIMdbPort* ioPort)
340 MORK_USED_1(ioPort);
341 mdb_err outErr = 0;
342 morkEnv* ev =
343 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
344 if ( ev )
346 ev->StubMethodOnlyError();
347 outErr = ev->AsErr();
349 return outErr;
352 /*virtual*/ mdb_err
353 orkinPortTableCursor::GetPort(nsIMdbEnv* mev, nsIMdbPort** acqPort)
355 mdb_err outErr = 0;
356 nsIMdbPort* outPort = 0;
357 morkEnv* ev =
358 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
359 if ( ev )
361 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
362 morkStore* store = cursor->mPortTableCursor_Store;
363 if ( store )
364 outPort = store->AcquireStoreHandle(ev);
365 outErr = ev->AsErr();
367 if ( acqPort )
368 *acqPort = outPort;
369 return outErr;
372 /*virtual*/ mdb_err
373 orkinPortTableCursor::SetRowScope(nsIMdbEnv* mev, // sets pos to -1
374 mdb_scope inRowScope)
376 mdb_err outErr = 0;
377 morkEnv* ev =
378 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
379 if ( ev )
381 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
382 cursor->mCursor_Pos = -1;
384 cursor->SetRowScope(ev, inRowScope);
385 outErr = ev->AsErr();
387 return outErr;
390 /*virtual*/ mdb_err
391 orkinPortTableCursor::GetRowScope(nsIMdbEnv* mev, mdb_scope* outRowScope)
393 mdb_err outErr = 0;
394 mdb_scope rowScope = 0;
395 morkEnv* ev =
396 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
397 if ( ev )
399 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
400 rowScope = cursor->mPortTableCursor_RowScope;
401 outErr = ev->AsErr();
403 *outRowScope = rowScope;
404 return outErr;
406 // setting row scope to zero iterates over all row scopes in port
408 /*virtual*/ mdb_err
409 orkinPortTableCursor::SetTableKind(nsIMdbEnv* mev, // sets pos to -1
410 mdb_kind inTableKind)
412 mdb_err outErr = 0;
413 morkEnv* ev =
414 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
415 if ( ev )
417 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
418 cursor->mCursor_Pos = -1;
420 cursor->SetTableKind(ev, inTableKind);
421 outErr = ev->AsErr();
423 return outErr;
426 /*virtual*/ mdb_err
427 orkinPortTableCursor::GetTableKind(nsIMdbEnv* mev, mdb_kind* outTableKind)
428 // setting table kind to zero iterates over all table kinds in row scope
430 mdb_err outErr = 0;
431 mdb_kind tableKind = 0;
432 morkEnv* ev =
433 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
434 if ( ev )
436 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
437 tableKind = cursor->mPortTableCursor_TableKind;
438 outErr = ev->AsErr();
440 *outTableKind = tableKind;
441 return outErr;
443 // } ----- end attribute methods -----
445 // { ----- begin table iteration methods -----
446 /*virtual*/ mdb_err
447 orkinPortTableCursor::NextTable( // get table at next position in the db
448 nsIMdbEnv* mev, // context
449 nsIMdbTable** acqTable)
451 mdb_err outErr = 0;
452 nsIMdbTable* outTable = 0;
453 morkEnv* ev =
454 this->CanUsePortTableCursor(mev, /*inMutable*/ morkBool_kFalse, &outErr);
455 if ( ev )
457 morkPortTableCursor* cursor = (morkPortTableCursor*) mHandle_Object;
458 morkTable* table = cursor->NextTable(ev);
459 if ( table && ev->Good() )
460 outTable = table->AcquireTableHandle(ev);
462 outErr = ev->AsErr();
464 if ( acqTable )
465 *acqTable = outTable;
466 return outErr;
468 // } ----- end table iteration methods -----
470 // } ===== end nsIMdbPortTableCursor methods =====
473 //3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789