Bug 669040 part 2: Nuke mork and morkreader. r=mak
authorMatheus Kerschbaum <matjk7@gmail.com>
Sat, 06 Aug 2011 17:25:21 +0200
changeset 73962 8e73650ecc3ec0b1482bd017ee2fd84e2e9dd6fe
parent 73961 f2a50910befcf29eaa1a29dc088a8a33e64a609a
child 73963 b0d6e197c741da6c00f53b1a6ec99277f24f70e9
push id2
push userbsmedberg@mozilla.com
push dateFri, 19 Aug 2011 14:38:13 +0000
reviewersmak
bugs669040
milestone8.0a1
Bug 669040 part 2: Nuke mork and morkreader. r=mak
db/README.html
db/mdb/Makefile.in
db/mdb/public/Makefile.in
db/mdb/public/mdb.h
db/mork/Makefile.in
db/mork/build/Makefile.in
db/mork/build/nsIMdbFactoryFactory.h
db/mork/build/nsMorkCID.h
db/mork/build/nsMorkFactory.cpp
db/mork/src/Makefile.in
db/mork/src/mork.h
db/mork/src/morkArray.cpp
db/mork/src/morkArray.h
db/mork/src/morkAtom.cpp
db/mork/src/morkAtom.h
db/mork/src/morkAtomMap.cpp
db/mork/src/morkAtomMap.h
db/mork/src/morkAtomSpace.cpp
db/mork/src/morkAtomSpace.h
db/mork/src/morkBead.cpp
db/mork/src/morkBead.h
db/mork/src/morkBlob.cpp
db/mork/src/morkBlob.h
db/mork/src/morkBuilder.cpp
db/mork/src/morkBuilder.h
db/mork/src/morkCell.cpp
db/mork/src/morkCell.h
db/mork/src/morkCellObject.cpp
db/mork/src/morkCellObject.h
db/mork/src/morkCh.cpp
db/mork/src/morkCh.h
db/mork/src/morkConfig.cpp
db/mork/src/morkConfig.h
db/mork/src/morkCursor.cpp
db/mork/src/morkCursor.h
db/mork/src/morkDeque.cpp
db/mork/src/morkDeque.h
db/mork/src/morkEnv.cpp
db/mork/src/morkEnv.h
db/mork/src/morkFactory.cpp
db/mork/src/morkFactory.h
db/mork/src/morkFile.cpp
db/mork/src/morkFile.h
db/mork/src/morkHandle.cpp
db/mork/src/morkHandle.h
db/mork/src/morkIntMap.cpp
db/mork/src/morkIntMap.h
db/mork/src/morkMap.cpp
db/mork/src/morkMap.h
db/mork/src/morkNode.cpp
db/mork/src/morkNode.h
db/mork/src/morkNodeMap.cpp
db/mork/src/morkNodeMap.h
db/mork/src/morkObject.cpp
db/mork/src/morkObject.h
db/mork/src/morkParser.cpp
db/mork/src/morkParser.h
db/mork/src/morkPool.cpp
db/mork/src/morkPool.h
db/mork/src/morkPortTableCursor.cpp
db/mork/src/morkPortTableCursor.h
db/mork/src/morkProbeMap.cpp
db/mork/src/morkProbeMap.h
db/mork/src/morkQuickSort.cpp
db/mork/src/morkQuickSort.h
db/mork/src/morkRow.cpp
db/mork/src/morkRow.h
db/mork/src/morkRowCellCursor.cpp
db/mork/src/morkRowCellCursor.h
db/mork/src/morkRowMap.cpp
db/mork/src/morkRowMap.h
db/mork/src/morkRowObject.cpp
db/mork/src/morkRowObject.h
db/mork/src/morkRowSpace.cpp
db/mork/src/morkRowSpace.h
db/mork/src/morkSearchRowCursor.cpp
db/mork/src/morkSearchRowCursor.h
db/mork/src/morkSink.cpp
db/mork/src/morkSink.h
db/mork/src/morkSpace.cpp
db/mork/src/morkSpace.h
db/mork/src/morkStore.cpp
db/mork/src/morkStore.h
db/mork/src/morkStream.cpp
db/mork/src/morkStream.h
db/mork/src/morkTable.cpp
db/mork/src/morkTable.h
db/mork/src/morkTableRowCursor.cpp
db/mork/src/morkTableRowCursor.h
db/mork/src/morkThumb.cpp
db/mork/src/morkThumb.h
db/mork/src/morkUniqRowCursor.h
db/mork/src/morkWriter.cpp
db/mork/src/morkWriter.h
db/mork/src/morkYarn.cpp
db/mork/src/morkYarn.h
db/mork/src/morkZone.cpp
db/mork/src/morkZone.h
db/mork/src/orkinHeap.cpp
db/mork/src/orkinHeap.h
db/morkreader/Makefile.in
db/morkreader/external/Makefile.in
db/morkreader/nsMorkReader.cpp
db/morkreader/nsMorkReader.h
toolkit/components/places/nsMorkHistoryImporter.cpp
toolkit/components/places/nsNoMorkStubImporter.cpp
deleted file mode 100644
--- a/db/README.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html>
-<!-- ***** BEGIN LICENSE BLOCK *****
-   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
-   -
-   - The contents of this file are subject to the Mozilla Public License Version
-   - 1.1 (the "License"); you may not use this file except in compliance with
-   - the License. You may obtain a copy of the License at
-   - http://www.mozilla.org/MPL/
-   -
-   - Software distributed under the License is distributed on an "AS IS" basis,
-   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-   - for the specific language governing rights and limitations under the
-   - License.
-   -
-   - The Original Code is mozilla.org code.
-   -
-   - The Initial Developer of the Original Code is
-   - Netscape Communications Corporation.
-   - Portions created by the Initial Developer are Copyright (C) 1998-1999
-   - the Initial Developer. All Rights Reserved.
-   -
-   - Contributor(s):
-   -   Daniel Howard
-   -
-   - Alternatively, the contents of this file may be used under the terms of
-   - either the GNU General Public License Version 2 or later (the "GPL"), or
-   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-   - in which case the provisions of the GPL or the LGPL are applicable instead
-   - of those above. If you wish to allow use of your version of this file only
-   - under the terms of either the GPL or the LGPL, and not to allow others to
-   - use your version of this file under the terms of the MPL, indicate your
-   - decision by deleting the provisions above and replace them with the notice
-   - and other provisions required by the GPL or the LGPL. If you do not delete
-   - the provisions above, a recipient may use your version of this file under
-   - the terms of any one of the MPL, the GPL or the LGPL.
-   -
-   - ***** END LICENSE BLOCK ***** -->
-<body>
-<h1>
-<span CLASS=LXRSHORTDESC>
-mdb/Mork general-purpose database<p>
-</span>
-</h1>
-<span CLASS=LXRLONGDESC>
-db contains C++ code for the mdb/Mork database which is a low-level,
-general-purpose and cross-platform file library. It is used to store
-mail box data, news data and global history data.
-</span>
-</body>
-</html>
deleted file mode 100644
--- a/db/mdb/Makefile.in
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-DEPTH		= ../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-DIRS		= public
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/db/mdb/public/Makefile.in
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1999
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-DEPTH		= ../../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-MODULE		= mork
-XPIDL_MODULE	= msgmdb
-
-EXPORTS		= mdb.h
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/db/mdb/public/mdb.h
+++ /dev/null
@@ -1,2569 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Blake Ross (blake@blakeross.com)
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#define _MDB_ 1
-
-#include "nscore.h"
-#include "nsISupports.h"
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// { %%%%% begin scalar typedefs %%%%%
-typedef unsigned char  mdb_u1;  // make sure this is one byte
-typedef unsigned short mdb_u2;  // make sure this is two bytes
-typedef short          mdb_i2;  // make sure this is two bytes
-typedef PRUint32       mdb_u4;  // make sure this is four bytes
-typedef PRInt32        mdb_i4;  // make sure this is four bytes
-typedef PRWord         mdb_ip;  // make sure sizeof(mdb_ip) == sizeof(void*)
-
-typedef mdb_u1 mdb_bool;  // unsigned byte with zero=false, nonzero=true
-
-/* canonical boolean constants provided only for code clarity: */
-#define mdbBool_kTrue  ((mdb_bool) 1) /* actually any nonzero means true */
-#define mdbBool_kFalse ((mdb_bool) 0) /* only zero means false */
-
-typedef mdb_u4 mdb_id;    // unsigned object identity in a scope
-typedef mdb_id mdb_rid;          // unsigned row identity inside scope
-typedef mdb_id mdb_tid;          // unsigned table identity inside scope
-typedef mdb_u4 mdb_token; // unsigned token for atomized string
-typedef mdb_token mdb_scope;     // token used to id scope for rows
-typedef mdb_token mdb_kind;      // token used to id kind for tables
-typedef mdb_token mdb_column;    // token used to id columns for rows
-typedef mdb_token mdb_cscode;    // token used to id charset names
-typedef mdb_u4 mdb_seed;  // unsigned collection change counter
-typedef mdb_u4 mdb_count; // unsigned collection member count
-typedef mdb_u4 mdb_size;  // unsigned physical media size
-typedef mdb_u4 mdb_fill;  // unsigned logical content size
-typedef mdb_u4 mdb_more;  // more available bytes for larger buffer
-
-#define mdbId_kNone ((mdb_id) -1) /* never a valid Mork object ID */
-
-typedef mdb_u4 mdb_percent; // 0..100, with values >100 same as 100
-
-typedef mdb_u1 mdb_priority; // 0..9, for a total of ten different values
-
-// temporary substitute for NS_RESULT, for mdb.h standalone compilation:
-typedef nsresult mdb_err;   // equivalent to NS_RESULT
-
-// sequence position is signed; negative is useful to mean "before first":
-typedef mdb_i4 mdb_pos; // signed zero-based ordinal collection position
-
-#define mdbPos_kBeforeFirst ((mdb_pos) -1) /* any negative is before zero */
-
-// order is also signed, so we can use three states for comparison order:
-typedef mdb_i4 mdb_order; // neg:lessthan, zero:equalto, pos:greaterthan 
-
-typedef mdb_order (* mdbAny_Order)(const void* inA, const void* inB, 
-  const void* inClosure);
-
-// } %%%%% end scalar typedefs %%%%%
-
-// { %%%%% begin C structs %%%%%
-
-#ifndef mdbScopeStringSet_typedef
-typedef struct mdbScopeStringSet mdbScopeStringSet;
-#define mdbScopeStringSet_typedef 1
-#endif
-
-/*| mdbScopeStringSet: a set of null-terminated C strings that enumerate some
-**| names of row scopes, so that row scopes intended for use by an application
-**| can be declared by an app when trying to open or create a database file.
-**| (We use strings and not tokens because we cannot know the tokens for any
-**| particular db without having first opened the db.)  The goal is to inform
-**| a db runtime that scopes not appearing in this list can be given relatively
-**| short shrift in runtime representation, with the expectation that other
-**| scopes will not actually be used.  However, a db should still be prepared
-**| to handle accessing row scopes not in this list, rather than raising errors.
-**| But it could be quite expensive to access a row scope not on the list.
-**| Note a zero count for the string set means no such string set is being
-**| specified, and that a db should handle all row scopes efficiently. 
-**| (It does NOT mean an app plans to use no content whatsoever.)
-|*/
-#ifndef mdbScopeStringSet_struct
-#define mdbScopeStringSet_struct 1
-struct mdbScopeStringSet { // vector of scopes for use in db opening policy
-  // when mScopeStringSet_Count is zero, this means no scope constraints 
-  mdb_count     mScopeStringSet_Count;    // number of strings in vector below
-  const char**  mScopeStringSet_Strings;  // null-ended ascii scope strings
-};
-#endif /*mdbScopeStringSet_struct*/
-
-#ifndef mdbOpenPolicy_typedef
-typedef struct mdbOpenPolicy mdbOpenPolicy;
-#define mdbOpenPolicy_typedef 1
-#endif
-
-#ifndef mdbOpenPolicy_struct
-#define mdbOpenPolicy_struct 1
-struct mdbOpenPolicy { // policies affecting db usage for ports and stores
-  mdbScopeStringSet  mOpenPolicy_ScopePlan; // predeclare scope usage plan
-  mdb_bool           mOpenPolicy_MaxLazy;   // nonzero: do least work
-  mdb_bool           mOpenPolicy_MinMemory; // nonzero: use least memory
-};
-#endif /*mdbOpenPolicy_struct*/
-
-#ifndef mdbTokenSet_typedef
-typedef struct mdbTokenSet mdbTokenSet;
-#define mdbTokenSet_typedef 1
-#endif
-
-#ifndef mdbTokenSet_struct
-#define mdbTokenSet_struct 1
-struct mdbTokenSet { // array for a set of tokens, and actual slots used
-  mdb_count   mTokenSet_Count;   // number of token slots in the array
-  mdb_fill    mTokenSet_Fill;    // the subset of count slots actually used
-  mdb_more    mTokenSet_More;    // more tokens available for bigger array
-  mdb_token*  mTokenSet_Tokens;  // array of count mdb_token instances
-};
-#endif /*mdbTokenSet_struct*/
-
-#ifndef mdbUsagePolicy_typedef
-typedef struct mdbUsagePolicy mdbUsagePolicy;
-#define mdbUsagePolicy_typedef 1
-#endif
-
-/*| mdbUsagePolicy: another version of mdbOpenPolicy which uses tokens instead
-**| of scope strings, because usage policies can be constructed for use with a
-**| db that is already open, while an open policy must be constructed before a
-**| db has yet been opened.
-|*/
-#ifndef mdbUsagePolicy_struct
-#define mdbUsagePolicy_struct 1
-struct mdbUsagePolicy { // policies affecting db usage for ports and stores
-  mdbTokenSet  mUsagePolicy_ScopePlan; // current scope usage plan
-  mdb_bool     mUsagePolicy_MaxLazy;   // nonzero: do least work
-  mdb_bool     mUsagePolicy_MinMemory; // nonzero: use least memory
-};
-#endif /*mdbUsagePolicy_struct*/
-
-#ifndef mdbOid_typedef
-typedef struct mdbOid mdbOid;
-#define mdbOid_typedef 1
-#endif
-
-#ifndef mdbOid_struct
-#define mdbOid_struct 1
-struct mdbOid { // identity of some row or table inside a database
-  mdb_scope   mOid_Scope;  // scope token for an id's namespace
-  mdb_id      mOid_Id;     // identity of object inside scope namespace
-};
-#endif /*mdbOid_struct*/
-
-#ifndef mdbRange_typedef
-typedef struct mdbRange mdbRange;
-#define mdbRange_typedef 1
-#endif
-
-#ifndef mdbRange_struct
-#define mdbRange_struct 1
-struct mdbRange { // range of row positions in a table
-  mdb_pos   mRange_FirstPos;  // position of first row
-  mdb_pos   mRange_LastPos;   // position of last row
-};
-#endif /*mdbRange_struct*/
-
-#ifndef mdbColumnSet_typedef
-typedef struct mdbColumnSet mdbColumnSet;
-#define mdbColumnSet_typedef 1
-#endif
-
-#ifndef mdbColumnSet_struct
-#define mdbColumnSet_struct 1
-struct mdbColumnSet { // array of column tokens (just the same as mdbTokenSet)
-  mdb_count    mColumnSet_Count;    // number of columns
-  mdb_column*  mColumnSet_Columns;  // count mdb_column instances
-};
-#endif /*mdbColumnSet_struct*/
-
-#ifndef mdbYarn_typedef
-typedef struct mdbYarn mdbYarn;
-#define mdbYarn_typedef 1
-#endif
-
-#ifdef MDB_BEGIN_C_LINKAGE_define
-#define MDB_BEGIN_C_LINKAGE_define 1
-#define MDB_BEGIN_C_LINKAGE extern "C" {
-#define MDB_END_C_LINKAGE }
-#endif /*MDB_BEGIN_C_LINKAGE_define*/
-
-/*| mdbYarn_mGrow: an abstract API for growing the size of a mdbYarn
-**| instance.  With respect to a specific API that requires a caller
-**| to supply a string (mdbYarn) that a callee fills with content
-**| that might exceed the specified size, mdbYarn_mGrow is a caller-
-**| supplied means of letting a callee attempt to increase the string
-**| size to become large enough to receive all content available.
-**|
-**|| Grow(): a method for requesting that a yarn instance be made
-**| larger in size.  Note that such requests need not be honored, and
-**| need not be honored in full if only partial size growth is desired.
-**| (Note that no nsIMdbEnv instance is passed as argument, although one
-**| might be needed in some circumstances.  So if an nsIMdbEnv is needed,
-**| a reference to one might be held inside a mdbYarn member slot.)
-**|
-**|| self: a yarn instance to be grown.  Presumably this yarn is
-**| the instance which holds the mYarn_Grow method pointer.  Yarn
-**| instancesshould only be passed to grow methods which they were
-**| specifically designed to fit, as indicated by the mYarn_Grow slot.
-**|
-**|| inNewSize: the new desired value for slot mYarn_Size in self.
-**| If mYarn_Size is already this big, then nothing should be done.
-**| If inNewSize is larger than seems feasible or desirable to honor,
-**| then any size restriction policy can be used to grow to some size
-**| greater than mYarn_Size.  (Grow() might even grow to a size
-**| greater than inNewSize in order to make the increase in size seem
-**| worthwhile, rather than growing in many smaller steps over time.)
-|*/
-typedef void (* mdbYarn_mGrow)(mdbYarn* self, mdb_size inNewSize);
-// mdbYarn_mGrow methods must be declared with C linkage in C++
-
-/*| mdbYarn: a variable length "string" of arbitrary binary bytes,
-**| whose length is mYarn_Fill, inside a buffer mYarn_Buf that has
-**| at most mYarn_Size byte of physical space.
-**|
-**|| mYarn_Buf: a pointer to space containing content.  This slot
-**| might never be nil when mYarn_Size is nonzero, but checks for nil
-**| are recommended anyway.
-**| (Implementations of mdbYarn_mGrow methods should take care to
-**| ensure the existence of a replacement before dropping old Bufs.)
-**| Content in Buf can be anything in any format, but the mYarn_Form
-**| implies the actual format by some caller-to-callee convention.
-**| mYarn_Form==0 implies US-ASCII iso-8859-1 Latin1 string content.
-**|
-**|| mYarn_Size: the physical size of Buf in bytes.  Note that if one
-**| intends to terminate a string with a null byte, that it must not
-**| be written at or after mYarn_Buf[mYarn_Size] because this is after
-**| the last byte in the physical buffer space.  Size can be zero,
-**| which means the string has no content whatsoever; note that when
-**| Size is zero, this is a suitable reason for Buf==nil as well.
-**|
-**|| mYarn_Fill: the logical content in Buf in bytes, where Fill must
-**| never exceed mYarn_Size.  Note that yarn strings might not have a
-**| terminating null byte (since they might not even be C strings), but
-**| when they do, such terminating nulls are considered part of content
-**| and therefore Fill will count such null bytes.  So an "empty" C
-**| string will have Fill==1, because content includes one null byte.
-**| Fill does not mean "length" when applied to C strings for this
-**| reason.  However, clients using yarns to hold C strings can infer
-**| that length is equal to Fill-1 (but should take care to handle the
-**| case where Fill==0).  To be paranoid, one can always copy to a
-**| destination with size exceeding Fill, and place a redundant null
-**| byte in the Fill position when this simplifies matters.
-**|
-**|| mYarn_Form: a designation of content format within mYarn_Buf.
-**| The semantics of this slot are the least well defined, since the
-**| actual meaning is context dependent, to the extent that callers
-**| and callees must agree on format encoding conventions when such
-**| are not standardized in many computing contexts.  However, in the
-**| context of a specific mdb database, mYarn_Form is a token for an
-**| atomized string in that database that typically names a preferred
-**| mime type charset designation.  If and when mdbYarn is used for
-**| other purposes away from the mdb interface, folks can use another
-**| convention system for encoding content formats.  However, in all
-**| contexts is it useful to maintain the convention that Form==0
-**| implies Buf contains US-ASCII iso-8859-1 Latin1 string content.
-**|
-**|| mYarn_Grow: either a mdbYarn_mGrow method, or else nil.  When
-**| a mdbYarn_mGrow method is provided, this method can be used to
-**| request a yarn buf size increase.  A caller who constructs the 
-**| original mdbYarn instance decides whether a grow method is necessary
-**| or desirable, and uses only grow methods suitable for the buffering
-**| nature of a specific mdbYarn instance.  (For example, Buf might be a
-**| staticly allocated string space which switches to something heap-based
-**| when grown, and subsequent calls to grow the yarn must distinguish the
-**| original static string from heap allocated space, etc.) Note that the
-**| method stored in mYarn_Grow can change, and this might be a common way
-**| to track memory managent changes in policy for mYarn_Buf.
-|*/
-#ifndef mdbYarn_struct
-#define mdbYarn_struct 1
-struct mdbYarn { // buffer with caller space allocation semantics
-  void*         mYarn_Buf;   // space for holding any binary content
-  mdb_fill      mYarn_Fill;  // logical content in Buf in bytes
-  mdb_size      mYarn_Size;  // physical size of Buf in bytes
-  mdb_more      mYarn_More;  // more available bytes if Buf is bigger
-  mdb_cscode    mYarn_Form;  // charset format encoding
-  mdbYarn_mGrow mYarn_Grow;  // optional method to grow mYarn_Buf
-  
-  // Subclasses might add further slots after mYarn_Grow in order to
-  // maintain bookkeeping needs, such as state info about mYarn_Buf.
-};
-#endif /*mdbYarn_struct*/
-
-// } %%%%% end C structs %%%%%
-
-// { %%%%% begin class forward defines %%%%%
-class nsIMdbEnv;
-class nsIMdbObject;
-class nsIMdbErrorHook;
-class nsIMdbCompare;
-class nsIMdbThumb;
-class nsIMdbFactory;
-class nsIMdbFile;
-class nsIMdbPort;
-class nsIMdbStore;
-class nsIMdbCursor;
-class nsIMdbPortTableCursor;
-class nsIMdbCollection;
-class nsIMdbTable;
-class nsIMdbTableRowCursor;
-class nsIMdbRow;
-class nsIMdbRowCellCursor;
-class nsIMdbBlob;
-class nsIMdbCell;
-class nsIMdbSorting;
-// } %%%%% end class forward defines %%%%%
-
-
-// { %%%%% begin C++ abstract class interfaces %%%%%
-
-/*| nsIMdbObject: base class for all message db class interfaces
-**|
-**|| factory: all nsIMdbObjects from the same code suite have the same factory
-**|
-**|| refcounting: both strong and weak references, to ensure strong refs are
-**| acyclic, while weak refs can cause cycles.  CloseMdbObject() is
-**| called when (strong) use counts hit zero, but clients can call this close
-**| method early for some reason, if absolutely necessary even though it will
-**| thwart the other uses of the same object.  Note that implementations must
-**| cope with close methods being called arbitrary numbers of times.  The COM
-**| calls to AddRef() and release ref map directly to strong use ref calls,
-**| but the total ref count for COM objects is the sum of weak & strong refs.
-|*/
-
-#define NS_IMDBOBJECT_IID_STR "5533ea4b-14c3-4bef-ac60-22f9e9a49084"
-
-#define NS_IMDBOBJECT_IID \
-{0x5533ea4b, 0x14c3, 0x4bef, \
-{ 0xac, 0x60, 0x22, 0xf9, 0xe9, 0xa4, 0x90, 0x84}}
-
-class nsIMdbObject : public nsISupports { // msg db base class
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBOBJECT_IID)
-// { ===== begin nsIMdbObject methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD IsFrozenMdbObject(nsIMdbEnv* ev, mdb_bool* outIsReadonly) = 0;
-  // same as nsIMdbPort::GetIsPortReadonly() when this object is inside a port.
-  // } ----- end attribute methods -----
-
-  // { ----- begin factory methods -----
-  NS_IMETHOD GetMdbFactory(nsIMdbEnv* ev, nsIMdbFactory** acqFactory) = 0; 
-  // } ----- end factory methods -----
-
-  // { ----- begin ref counting for well-behaved cyclic graphs -----
-  NS_IMETHOD GetWeakRefCount(nsIMdbEnv* ev, // weak refs
-    mdb_count* outCount) = 0;  
-  NS_IMETHOD GetStrongRefCount(nsIMdbEnv* ev, // strong refs
-    mdb_count* outCount) = 0;
-
-  NS_IMETHOD AddWeakRef(nsIMdbEnv* ev) = 0;
-  NS_IMETHOD AddStrongRef(nsIMdbEnv* ev) = 0;
-
-  NS_IMETHOD CutWeakRef(nsIMdbEnv* ev) = 0;
-  NS_IMETHOD CutStrongRef(nsIMdbEnv* ev) = 0;
-  
-  NS_IMETHOD CloseMdbObject(nsIMdbEnv* ev) = 0; // called at strong refs zero
-  NS_IMETHOD IsOpenMdbObject(nsIMdbEnv* ev, mdb_bool* outOpen) = 0;
-  // } ----- end ref counting -----
-  
-// } ===== end nsIMdbObject methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbObject, NS_IMDBOBJECT_IID)
-
-/*| nsIMdbErrorHook: a base class for clients of this API to subclass, in order
-**| to provide a callback installable in nsIMdbEnv for error notifications. If
-**| apps that subclass nsIMdbErrorHook wish to maintain a reference to the env
-**| that contains the hook, then this should be a weak ref to avoid cycles.
-**|
-**|| OnError: when nsIMdbEnv has an error condition that causes the total count
-**| of errors to increase, then nsIMdbEnv should call OnError() to report the
-**| error in some fashion when an instance of nsIMdbErrorHook is installed.  The
-**| variety of string flavors is currently due to the uncertainty here in the
-**| nsIMdbBlob and nsIMdbCell interfaces.  (Note that overloading by using the
-**| same method name is not necessary here, and potentially less clear.)
-|*/
-class nsIMdbErrorHook : public nsISupports{ // env callback handler to report errors
-public:
-
-// { ===== begin error methods =====
-  NS_IMETHOD OnErrorString(nsIMdbEnv* ev, const char* inAscii) = 0;
-  NS_IMETHOD OnErrorYarn(nsIMdbEnv* ev, const mdbYarn* inYarn) = 0;
-// } ===== end error methods =====
-
-// { ===== begin warning methods =====
-  NS_IMETHOD OnWarningString(nsIMdbEnv* ev, const char* inAscii) = 0;
-  NS_IMETHOD OnWarningYarn(nsIMdbEnv* ev, const mdbYarn* inYarn) = 0;
-// } ===== end warning methods =====
-
-// { ===== begin abort hint methods =====
-  NS_IMETHOD OnAbortHintString(nsIMdbEnv* ev, const char* inAscii) = 0;
-  NS_IMETHOD OnAbortHintYarn(nsIMdbEnv* ev, const mdbYarn* inYarn) = 0;
-// } ===== end abort hint methods =====
-};
-
-/*| nsIMdbCompare: a caller-supplied yarn comparison interface.  When two yarns
-**| are compared to each other with Order(), this method should return a signed
-**| long integer denoting relation R between the 1st and 2nd yarn instances
-**| such that (First R Second), where negative is less than, zero is equal to,
-**| and positive is greater than.  Note that both yarns are readonly, and the
-**| Order() method should make no attempt to modify the yarn content.
-|*/
-class nsIMdbCompare { // caller-supplied yarn comparison
-public:
-
-// { ===== begin nsIMdbCompare methods =====
-  NS_IMETHOD Order(nsIMdbEnv* ev,      // compare first to second yarn
-    const mdbYarn* inFirst,   // first yarn in comparison
-    const mdbYarn* inSecond,  // second yarn in comparison
-    mdb_order* outOrder) = 0; // negative="<", zero="=", positive=">"
-    
-  NS_IMETHOD AddStrongRef(nsIMdbEnv* ev) = 0; // does nothing
-  NS_IMETHOD CutStrongRef(nsIMdbEnv* ev) = 0; // does nothing
-// } ===== end nsIMdbCompare methods =====
-  
-};
-
-/*| nsIMdbHeap: abstract memory allocation interface. 
-**|
-**|| Alloc: return a block at least inSize bytes in size with alignment
-**| suitable for any native type (such as long integers).  When no such
-**| block can be allocated, failure is indicated by a null address in
-**| addition to reporting an error in the environment.
-**|
-**|| Free: deallocate a block allocated or resized earlier by the same
-**| heap instance.  If the inBlock parameter is nil, the heap should do
-**| nothing (and crashing is strongly discouraged).
-|*/
-class nsIMdbHeap { // caller-supplied memory management interface
-public:
-// { ===== begin nsIMdbHeap methods =====
-  NS_IMETHOD Alloc(nsIMdbEnv* ev, // allocate a piece of memory
-    mdb_size inSize,        // requested byte size of new memory block 
-    void** outBlock) = 0;   // memory block of inSize bytes, or nil
-    
-  NS_IMETHOD Free(nsIMdbEnv* ev, // free block from Alloc or Resize()
-    void* ioBlock) = 0;     // block to be destroyed/deallocated
-    
-  NS_IMETHOD HeapAddStrongRef(nsIMdbEnv* ev) = 0;
-  NS_IMETHOD HeapCutStrongRef(nsIMdbEnv* ev) = 0;
-    
-// } ===== end nsIMdbHeap methods =====
-};
-
-/*| nsIMdbCPlusHeap: Alloc() with global ::new(), Free() with global ::delete(). 
-**| Resize() is done by ::new() followed by ::delete().
-|*/
-class nsIMdbCPlusHeap { // caller-supplied memory management interface
-public:
-// { ===== begin nsIMdbHeap methods =====
-  NS_IMETHOD Alloc(nsIMdbEnv* ev, // allocate a piece of memory
-    mdb_size inSize,   // requested size of new memory block 
-    void** outBlock);  // memory block of inSize bytes, or nil
-    
-  NS_IMETHOD Free(nsIMdbEnv* ev, // free block allocated earlier by Alloc()
-    void* inBlock);
-    
-  NS_IMETHOD HeapAddStrongRef(nsIMdbEnv* ev);
-  NS_IMETHOD HeapCutStrongRef(nsIMdbEnv* ev);
-// } ===== end nsIMdbHeap methods =====
-};
-
-/*| nsIMdbThumb: 
-|*/
-
-
-#define NS_IMDBTHUMB_IID_STR "6d3ad7c1-a809-4e74-8577-49fa9a4562fa"
-
-#define NS_IMDBTHUMB_IID \
-{0x6d3ad7c1, 0xa809, 0x4e74, \
-{ 0x85, 0x77, 0x49, 0xfa, 0x9a, 0x45, 0x62, 0xfa}}
-
-
-class nsIMdbThumb : public nsISupports { // closure for repeating incremental method
-public:
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBTHUMB_IID)
-
-// { ===== begin nsIMdbThumb methods =====
-  NS_IMETHOD GetProgress(nsIMdbEnv* ev,
-    mdb_count* outTotal,    // total somethings to do in operation
-    mdb_count* outCurrent,  // subportion of total completed so far
-    mdb_bool* outDone,      // is operation finished?
-    mdb_bool* outBroken     // is operation irreparably dead and broken?
-  ) = 0;
-  
-  NS_IMETHOD DoMore(nsIMdbEnv* ev,
-    mdb_count* outTotal,    // total somethings to do in operation
-    mdb_count* outCurrent,  // subportion of total completed so far
-    mdb_bool* outDone,      // is operation finished?
-    mdb_bool* outBroken     // is operation irreparably dead and broken?
-  ) = 0;
-  
-  NS_IMETHOD CancelAndBreakThumb( // cancel pending operation
-    nsIMdbEnv* ev) = 0;
-// } ===== end nsIMdbThumb methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbThumb, NS_IMDBTHUMB_IID)
-
-/*| nsIMdbEnv: a context parameter used when calling most abstract db methods.
-**| The main purpose of such an object is to permit a database implementation
-**| to avoid the use of globals to share information between various parts of
-**| the implementation behind the abstract db interface.  An environment acts
-**| like a session object for a given calling thread, and callers should use
-**| at least one different nsIMdbEnv instance for each thread calling the API.
-**| While the database implementation might not be threaded, it is highly
-**| desirable that the db be thread-safe if calling threads use distinct
-**| instances of nsIMdbEnv.  Callers can stop at one nsIMdbEnv per thread, or they
-**| might decide to make on nsIMdbEnv instance for every nsIMdbPort opened, so that
-**| error information is segregated by database instance.  Callers create
-**| instances of nsIMdbEnv by calling the MakeEnv() method in nsIMdbFactory. 
-**|
-**|| tracing: an environment might support some kind of tracing, and this
-**| boolean attribute permits such activity to be enabled or disabled.
-**|
-**|| errors: when a call to the abstract db interface returns, a caller might
-**| check the number of outstanding errors to see whether the operation did
-**| actually succeed. Each nsIMdbEnv should have all its errors cleared by a
-**| call to ClearErrors() before making each call to the abstract db API,
-**| because outstanding errors might disable further database actions.  (This
-**| is not done inside the db interface, because the db cannot in general know
-**| when a call originates from inside or outside -- only the app knows this.)
-**|
-**|| error hook: callers can install an instance of nsIMdbErrorHook to receive
-**| error notifications whenever the error count increases.  The hook can
-**| be uninstalled by passing a null pointer.
-**|
-|*/
-
-#define NS_IMDBENV_IID_STR "a765e46b-efb6-41e6-b75b-c5d6bd710594"
-
-#define NS_IMDBENV_IID \
-{0xa765e46b, 0xefb6, 0x41e6, \
-{ 0xb7, 0x5b, 0xc5, 0xd6, 0xbd, 0x71, 0x05, 0x94}}
-
-class nsIMdbEnv : public nsISupports { // db specific context parameter
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBENV_IID)
-// { ===== begin nsIMdbEnv methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD GetErrorCount(mdb_count* outCount,
-    mdb_bool* outShouldAbort) = 0;
-  NS_IMETHOD GetWarningCount(mdb_count* outCount,
-    mdb_bool* outShouldAbort) = 0;
-  
-  NS_IMETHOD GetEnvBeVerbose(mdb_bool* outBeVerbose) = 0;
-  NS_IMETHOD SetEnvBeVerbose(mdb_bool inBeVerbose) = 0;
-  
-  NS_IMETHOD GetDoTrace(mdb_bool* outDoTrace) = 0;
-  NS_IMETHOD SetDoTrace(mdb_bool inDoTrace) = 0;
-  
-  NS_IMETHOD GetAutoClear(mdb_bool* outAutoClear) = 0;
-  NS_IMETHOD SetAutoClear(mdb_bool inAutoClear) = 0;
-  
-  NS_IMETHOD GetErrorHook(nsIMdbErrorHook** acqErrorHook) = 0;
-  NS_IMETHOD SetErrorHook(
-    nsIMdbErrorHook* ioErrorHook) = 0; // becomes referenced
-  
-  NS_IMETHOD GetHeap(nsIMdbHeap** acqHeap) = 0;
-  NS_IMETHOD SetHeap(
-    nsIMdbHeap* ioHeap) = 0; // becomes referenced
-  // } ----- end attribute methods -----
-  
-  NS_IMETHOD ClearErrors() = 0; // clear errors beore re-entering db API
-  NS_IMETHOD ClearWarnings() = 0; // clear warnings
-  NS_IMETHOD ClearErrorsAndWarnings() = 0; // clear both errors & warnings
-// } ===== end nsIMdbEnv methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbEnv, NS_IMDBENV_IID)
-
-/*| nsIMdbFactory: the main entry points to the abstract db interface.  A DLL
-**| that supports this mdb interface need only have a single exported method
-**| that will return an instance of nsIMdbFactory, so that further methods in
-**| the suite can be accessed from objects returned by nsIMdbFactory methods.
-**|
-**|| mdbYarn: note all nsIMdbFactory subclasses must guarantee null
-**| termination of all strings written into mdbYarn instances, as long as
-**| mYarn_Size and mYarn_Buf are nonzero.  Even truncated string values must
-**| be null terminated.  This is more strict behavior than mdbYarn requires,
-**| but it is part of the nsIMdbFactory interface.
-**|
-**|| envs: an environment instance is required as per-thread context for
-**| most of the db method calls, so nsIMdbFactory creates such instances.
-**|
-**|| rows: callers must be able to create row instances that are independent
-**| of storage space that is part of the db content graph.  Many interfaces
-**| for data exchange have strictly copy semantics, so that a row instance
-**| has no specific identity inside the db content model, and the text in
-**| cells are an independenty copy of unexposed content inside the db model.
-**| Callers are expected to maintain one or more row instances as a buffer
-**| for staging cell content copied into or out of a table inside the db.
-**| Callers are urged to use an instance of nsIMdbRow created by the nsIMdbFactory
-**| code suite, because reading and writing might be much more efficient than
-**| when using a hand-rolled nsIMdbRow subclass with no relation to the suite.
-**|
-**|| ports: a port is a readonly interface to a specific database file. Most
-**| of the methods to access a db file are suitable for a readonly interface,
-**| so a port is the basic minimum for accessing content.  This makes it
-**| possible to read other external formats for import purposes, without
-**| needing the code or competence necessary to write every such format.  So
-**| we can write generic import code just once, as long as every format can
-**| show a face based on nsIMdbPort. (However, same suite import can be faster.)
-**| Given a file name and the first 512 bytes of a file, a factory can say if
-**| a port can be opened by this factory.  Presumably an app maintains chains
-**| of factories for different suites, and asks each in turn about opening a
-**| a prospective file for reading (as a port) or writing (as a store).  I'm
-**| not ready to tackle issues of format fidelity and factory chain ordering.
-**|
-**|| stores: a store is a mutable interface to a specific database file, and
-**| includes the port interface plus any methods particular to writing, which
-**| are few in number.  Presumably the set of files that can be opened as
-**| stores is a subset of the set of files that can be opened as ports.  A
-**| new store can be created with CreateNewFileStore() by supplying a new
-**| file name which does not yet exist (callers are always responsible for
-**| destroying any existing files before calling this method). 
-|*/
-
-#define NS_IMDBFACTORY_IID_STR "2b80395c-b91e-4990-b1a7-023e99ab14e9"
-
-#define NS_IMDBFACTORY_IID \
-{0xf04aa4ab, 0x1fe, 0x4115, \
-{ 0xa4, 0xa5, 0x68, 0x19, 0xdf, 0xf1, 0x10, 0x3d}}
-
-
-class nsIMdbFactory : public nsISupports { // suite entry points
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBFACTORY_IID)
-// { ===== begin nsIMdbFactory methods =====
-
-  // { ----- begin file methods -----
-  NS_IMETHOD OpenOldFile(nsIMdbEnv* ev, nsIMdbHeap* ioHeap,
-    const char* inFilePath,
-    mdb_bool inFrozen, nsIMdbFile** acqFile) = 0;
-  // Choose some subclass of nsIMdbFile to instantiate, in order to read
-  // (and write if not frozen) the file known by inFilePath.  The file
-  // returned should be open and ready for use, and presumably positioned
-  // at the first byte position of the file.  The exact manner in which
-  // files must be opened is considered a subclass specific detail, and
-  // other portions or Mork source code don't want to know how it's done.
-
-  NS_IMETHOD CreateNewFile(nsIMdbEnv* ev, nsIMdbHeap* ioHeap,
-    const char* inFilePath,
-    nsIMdbFile** acqFile) = 0;
-  // Choose some subclass of nsIMdbFile to instantiate, in order to read
-  // (and write if not frozen) the file known by inFilePath.  The file
-  // returned should be created and ready for use, and presumably positioned
-  // at the first byte position of the file.  The exact manner in which
-  // files must be opened is considered a subclass specific detail, and
-  // other portions or Mork source code don't want to know how it's done.
-  // } ----- end file methods -----
-
-  // { ----- begin env methods -----
-  NS_IMETHOD MakeEnv(nsIMdbHeap* ioHeap, nsIMdbEnv** acqEnv) = 0; // acquire new env
-  // ioHeap can be nil, causing a MakeHeap() style heap instance to be used
-  // } ----- end env methods -----
-
-  // { ----- begin heap methods -----
-  NS_IMETHOD MakeHeap(nsIMdbEnv* ev, nsIMdbHeap** acqHeap) = 0; // acquire new heap
-  // } ----- end heap methods -----
-
-  // { ----- begin compare methods -----
-  NS_IMETHOD MakeCompare(nsIMdbEnv* ev, nsIMdbCompare** acqCompare) = 0; // ASCII
-  // } ----- end compare methods -----
-
-  // { ----- begin row methods -----
-  NS_IMETHOD MakeRow(nsIMdbEnv* ev, nsIMdbHeap* ioHeap, nsIMdbRow** acqRow) = 0; // new row
-  // ioHeap can be nil, causing the heap associated with ev to be used
-  // } ----- end row methods -----
-  
-  // { ----- begin port methods -----
-  NS_IMETHOD CanOpenFilePort(
-    nsIMdbEnv* ev, // context
-    // const char* inFilePath, // the file to investigate
-    // const mdbYarn* inFirst512Bytes,
-    nsIMdbFile* ioFile, // db abstract file interface
-    mdb_bool* outCanOpen, // whether OpenFilePort() might succeed
-    mdbYarn* outFormatVersion) = 0; // informal file format description
-    
-  NS_IMETHOD OpenFilePort(
-    nsIMdbEnv* ev, // context
-    nsIMdbHeap* ioHeap, // can be nil to cause ev's heap attribute to be used
-    // const char* inFilePath, // the file to open for readonly import
-    nsIMdbFile* ioFile, // db abstract file interface
-    const mdbOpenPolicy* inOpenPolicy, // runtime policies for using db
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental port open
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then call nsIMdbFactory::ThumbToOpenPort() to get the port instance.
-
-  NS_IMETHOD ThumbToOpenPort( // redeeming a completed thumb from OpenFilePort()
-    nsIMdbEnv* ev, // context
-    nsIMdbThumb* ioThumb, // thumb from OpenFilePort() with done status
-    nsIMdbPort** acqPort) = 0; // acquire new port object
-  // } ----- end port methods -----
-  
-  // { ----- begin store methods -----
-  NS_IMETHOD CanOpenFileStore(
-    nsIMdbEnv* ev, // context
-    // const char* inFilePath, // the file to investigate
-    // const mdbYarn* inFirst512Bytes,
-    nsIMdbFile* ioFile, // db abstract file interface
-    mdb_bool* outCanOpenAsStore, // whether OpenFileStore() might succeed
-    mdb_bool* outCanOpenAsPort, // whether OpenFilePort() might succeed
-    mdbYarn* outFormatVersion) = 0; // informal file format description
-    
-  NS_IMETHOD OpenFileStore( // open an existing database
-    nsIMdbEnv* ev, // context
-    nsIMdbHeap* ioHeap, // can be nil to cause ev's heap attribute to be used
-    // const char* inFilePath, // the file to open for general db usage
-    nsIMdbFile* ioFile, // db abstract file interface
-    const mdbOpenPolicy* inOpenPolicy, // runtime policies for using db
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental store open
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then call nsIMdbFactory::ThumbToOpenStore() to get the store instance.
-    
-  NS_IMETHOD
-  ThumbToOpenStore( // redeem completed thumb from OpenFileStore()
-    nsIMdbEnv* ev, // context
-    nsIMdbThumb* ioThumb, // thumb from OpenFileStore() with done status
-    nsIMdbStore** acqStore) = 0; // acquire new db store object
-  
-  NS_IMETHOD CreateNewFileStore( // create a new db with minimal content
-    nsIMdbEnv* ev, // context
-    nsIMdbHeap* ioHeap, // can be nil to cause ev's heap attribute to be used
-    // const char* inFilePath, // name of file which should not yet exist
-    nsIMdbFile* ioFile, // db abstract file interface
-    const mdbOpenPolicy* inOpenPolicy, // runtime policies for using db
-    nsIMdbStore** acqStore) = 0; // acquire new db store object
-  // } ----- end store methods -----
-
-// } ===== end nsIMdbFactory methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbFactory, NS_IMDBFACTORY_IID)
-
-extern "C" nsIMdbFactory* MakeMdbFactory(); 
-
-/*| nsIMdbFile: abstract file interface resembling the original morkFile
-**| abstract interface (which was in turn modeled on the file interface
-**| from public domain IronDoc).  The design of this file interface is
-**| complicated by the fact that some DB's will not find this interface
-**| adequate for all runtime requirements (even though this file API is
-**| enough to implement text-based DB's like Mork).  For this reason,
-**| more methods have been added to let a DB library force the file to
-**| become closed so the DB can reopen the file in some other manner.
-**| Folks are encouraged to suggest ways to tune this interface to suit
-**| DB's that cannot manage to pull their maneuvers even given this API.
-**|
-**|| Tell: get the current i/o position in file
-**|
-**|| Seek: change the current i/o position in file
-**|
-**|| Eof: return file's total length in bytes
-**|
-**|| Read: input inSize bytes into outBuf, returning actual transfer size
-**|
-**|| Get: read starting at specific file offset (e.g. Seek(); Read();)
-**|
-**|| Write: output inSize bytes from inBuf, returning actual transfer size
-**|
-**|| Put: write starting at specific file offset (e.g. Seek(); Write();)
-**|
-**|| Flush: if written bytes are buffered, push them to final destination
-**|
-**|| Path: get file path in some string representation.  This is intended
-**| either to support the display of file name in a user presentation, or
-**| to support the closing and reopening of the file when the DB needs more
-**| exotic file access than is presented by the nsIMdbFile interface.
-**|
-**|| Steal: tell this file to close any associated i/o stream in the file
-**| system, because the file ioThief intends to reopen the file in order
-**| to provide the MDB implementation with more exotic file access than is
-**| offered by the nsIMdbFile alone.  Presumably the thief knows enough
-**| from Path() in order to know which file to reopen.  If Steal() is
-**| successful, this file should probably delegate all future calls to
-**| the nsIMdbFile interface down to the thief files, so that even after
-**| the file has been stolen, it can still be read, written, or forcibly
-**| closed (by a call to CloseMdbObject()).
-**|
-**|| Thief: acquire and return thief passed to an earlier call to Steal().
-|*/
-
-#define NS_IMDBFILE_IID_STR "f04aa4ab-1fe7-4115-a4a5-6819dff1103d"
-
-#define NS_IMDBFILE_IID \
-{0xf04aa4ab, 0x1fe, 0x4115, \
-{ 0xa4, 0xa5, 0x68, 0x19, 0xdf, 0xf1, 0x10, 0x3d}}
-
-class nsIMdbFile : public nsISupports { // minimal file interface
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBFILE_IID)
-// { ===== begin nsIMdbFile methods =====
-
-  // { ----- begin pos methods -----
-  NS_IMETHOD Tell(nsIMdbEnv* ev, mdb_pos* outPos) const = 0;
-  NS_IMETHOD Seek(nsIMdbEnv* ev, mdb_pos inPos, mdb_pos *outPos) = 0;
-  NS_IMETHOD Eof(nsIMdbEnv* ev, mdb_pos* outPos) = 0;
-  // } ----- end pos methods -----
-
-  // { ----- begin read methods -----
-  NS_IMETHOD Read(nsIMdbEnv* ev, void* outBuf, mdb_size inSize,
-    mdb_size* outActualSize) = 0;
-  NS_IMETHOD Get(nsIMdbEnv* ev, void* outBuf, mdb_size inSize,
-    mdb_pos inPos, mdb_size* outActualSize) = 0;
-  // } ----- end read methods -----
-    
-  // { ----- begin write methods -----
-  NS_IMETHOD  Write(nsIMdbEnv* ev, const void* inBuf, mdb_size inSize,
-    mdb_size* outActualSize) = 0;
-  NS_IMETHOD  Put(nsIMdbEnv* ev, const void* inBuf, mdb_size inSize,
-    mdb_pos inPos, mdb_size* outActualSize) = 0;
-  NS_IMETHOD  Flush(nsIMdbEnv* ev) = 0;
-  // } ----- end attribute methods -----
-    
-  // { ----- begin path methods -----
-  NS_IMETHOD  Path(nsIMdbEnv* ev, mdbYarn* outFilePath) = 0;
-  // } ----- end path methods -----
-    
-  // { ----- begin replacement methods -----
-  NS_IMETHOD  Steal(nsIMdbEnv* ev, nsIMdbFile* ioThief) = 0;
-  NS_IMETHOD  Thief(nsIMdbEnv* ev, nsIMdbFile** acqThief) = 0;
-  // } ----- end replacement methods -----
-
-  // { ----- begin versioning methods -----
-  NS_IMETHOD BecomeTrunk(nsIMdbEnv* ev) = 0;
-  // If this file is a file version branch created by calling AcquireBud(),
-  // BecomeTrunk() causes this file's content to replace the original
-  // file's content, typically by assuming the original file's identity.
-  // This default implementation of BecomeTrunk() does nothing, and this
-  // is appropriate behavior for files which are not branches, and is
-  // also the right behavior for files returned from AcquireBud() which are
-  // in fact the original file that has been truncated down to zero length.
-
-  NS_IMETHOD AcquireBud(nsIMdbEnv* ev, nsIMdbHeap* ioHeap,
-    nsIMdbFile** acqBud) = 0; // acquired file for new version of content
-  // AcquireBud() starts a new "branch" version of the file, empty of content,
-  // so that a new version of the file can be written.  This new file
-  // can later be told to BecomeTrunk() the original file, so the branch
-  // created by budding the file will replace the original file.  Some
-  // file subclasses might initially take the unsafe but expedient
-  // approach of simply truncating this file down to zero length, and
-  // then returning the same morkFile pointer as this, with an extra
-  // reference count increment.  Note that the caller of AcquireBud() is
-  // expected to eventually call CutStrongRef() on the returned file
-  // in order to release the strong reference.  High quality versions
-  // of morkFile subclasses will create entirely new files which later
-  // are renamed to become the old file, so that better transactional
-  // behavior is exhibited by the file, so crashes protect old files.
-  // Note that AcquireBud() is an illegal operation on readonly files.
-  // } ----- end versioning methods -----
-
-// } ===== end nsIMdbFile methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbFile, NS_IMDBFILE_IID)
-
-/*| nsIMdbPort: a readonly interface to a specific database file. The mutable
-**| nsIMdbStore interface is a subclass that includes writing behavior, but
-**| most of the needed db methods appear in the readonly nsIMdbPort interface.
-**|
-**|| mdbYarn: note all nsIMdbPort and nsIMdbStore subclasses must guarantee null
-**| termination of all strings written into mdbYarn instances, as long as
-**| mYarn_Size and mYarn_Buf are nonzero.  Even truncated string values must
-**| be null terminated.  This is more strict behavior than mdbYarn requires,
-**| but it is part of the nsIMdbPort and nsIMdbStore interface.
-**|
-**|| attributes: methods are provided to distinguish a readonly port from a
-**| mutable store, and whether a mutable store actually has any dirty content.
-**|
-**|| filepath: the file path used to open the port from the nsIMdbFactory can be
-**| queried and discovered by GetPortFilePath(), which includes format info.
-**|
-**|| export: a port can write itself in other formats, with perhaps a typical
-**| emphasis on text interchange formats used by other systems.  A port can be
-**| queried to determine its preferred export interchange format, and a port
-**| can be queried to see whether a specific export format is supported.  And
-**| actually exporting a port requires a new destination file name and format.
-**|
-**|| tokens: a port supports queries about atomized strings to map tokens to
-**| strings or strings to token integers.  (All atomized strings must be in
-**| US-ASCII iso-8859-1 Latin1 charset encoding.)  When a port is actually a
-**| mutable store and a string has not yet been atomized, then StringToToken()
-**| will actually do so and modify the store.  The QueryToken() method will not
-**| atomize a string if it has not already been atomized yet, even in stores.
-**|
-**|| tables: other than string tokens, all port content is presented through
-**| tables, which are ordered collections of rows.  Tables are identified by
-**| row scope and table kind, which might or might not be unique in a port,
-**| depending on app convention.  When tables are effectively unique, then
-**| queries for specific scope and kind pairs will find those tables.  To see
-**| all tables that match specific row scope and table kind patterns, even in
-**| the presence of duplicates, every port supports a GetPortTableCursor()
-**| method that returns an iterator over all matching tables.  Table kind is
-**| considered scoped inside row scope, so passing a zero for table kind will
-**| find all table kinds for some nonzero row scope.  Passing a zero for row
-**| scope will iterate over all tables in the port, in some undefined order.
-**| (A new table can be added to a port using nsIMdbStore::NewTable(), even when
-**| the requested scope and kind combination is already used by other tables.)
-**|
-**|| memory: callers can request that a database use less memory footprint in
-**| several flavors, from an inconsequential idle flavor to a rather drastic
-**| panic flavor. Callers might perform an idle purge very frequently if desired
-**| with very little cost, since only normally scheduled memory management will
-**| be conducted, such as freeing resources for objects scheduled to be dropped.
-**| Callers should perform session memory purges infrequently because they might
-**| involve costly scanning of data structures to removed cached content, and
-**| session purges are recommended only when a caller experiences memory crunch.
-**| Callers should only rarely perform a panic purge, in response to dire memory
-**| straits, since this is likely to make db operations much more expensive
-**| than they would be otherwise.  A panic purge asks a database to free as much
-**| memory as possible while staying effective and operational, because a caller
-**| thinks application failure might otherwise occur.  (Apps might better close
-**| an open db, so panic purges only make sense when a db is urgently needed.)
-|*/
-class nsIMdbPort : public nsISupports {
-public:
-
-// { ===== begin nsIMdbPort methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD GetIsPortReadonly(nsIMdbEnv* ev, mdb_bool* outBool) = 0;
-  NS_IMETHOD GetIsStore(nsIMdbEnv* ev, mdb_bool* outBool) = 0;
-  NS_IMETHOD GetIsStoreAndDirty(nsIMdbEnv* ev, mdb_bool* outBool) = 0;
-
-  NS_IMETHOD GetUsagePolicy(nsIMdbEnv* ev, 
-    mdbUsagePolicy* ioUsagePolicy) = 0;
-
-  NS_IMETHOD SetUsagePolicy(nsIMdbEnv* ev, 
-    const mdbUsagePolicy* inUsagePolicy) = 0;
-  // } ----- end attribute methods -----
-
-  // { ----- begin memory policy methods -----  
-  NS_IMETHOD IdleMemoryPurge( // do memory management already scheduled
-    nsIMdbEnv* ev, // context
-    mdb_size* outEstimatedBytesFreed) = 0; // approximate bytes actually freed
-
-  NS_IMETHOD SessionMemoryPurge( // request specific footprint decrease
-    nsIMdbEnv* ev, // context
-    mdb_size inDesiredBytesFreed, // approximate number of bytes wanted
-    mdb_size* outEstimatedBytesFreed) = 0; // approximate bytes actually freed
-
-  NS_IMETHOD PanicMemoryPurge( // desperately free all possible memory
-    nsIMdbEnv* ev, // context
-    mdb_size* outEstimatedBytesFreed) = 0; // approximate bytes actually freed
-  // } ----- end memory policy methods -----
-
-  // { ----- begin filepath methods -----
-  NS_IMETHOD GetPortFilePath(
-    nsIMdbEnv* ev, // context
-    mdbYarn* outFilePath, // name of file holding port content
-    mdbYarn* outFormatVersion) = 0; // file format description
-    
-  NS_IMETHOD GetPortFile(
-    nsIMdbEnv* ev, // context
-    nsIMdbFile** acqFile) = 0; // acquire file used by port or store
-  // } ----- end filepath methods -----
-
-  // { ----- begin export methods -----
-  NS_IMETHOD BestExportFormat( // determine preferred export format
-    nsIMdbEnv* ev, // context
-    mdbYarn* outFormatVersion) = 0; // file format description
-
-  // some tentative suggested import/export formats
-  // "ns:msg:db:port:format:ldif:ns4.0:passthrough" // necessary
-  // "ns:msg:db:port:format:ldif:ns4.5:utf8"        // necessary
-  // "ns:msg:db:port:format:ldif:ns4.5:tabbed"
-  // "ns:msg:db:port:format:ldif:ns4.5:binary"      // necessary
-  // "ns:msg:db:port:format:html:ns3.0:addressbook" // necessary
-  // "ns:msg:db:port:format:html:display:verbose"
-  // "ns:msg:db:port:format:html:display:concise"
-  // "ns:msg:db:port:format:mork:zany:verbose"      // necessary
-  // "ns:msg:db:port:format:mork:zany:atomized"     // necessary
-  // "ns:msg:db:port:format:rdf:xml"
-  // "ns:msg:db:port:format:xml:mork"
-  // "ns:msg:db:port:format:xml:display:verbose"
-  // "ns:msg:db:port:format:xml:display:concise"
-  // "ns:msg:db:port:format:xml:print:verbose"      // recommended
-  // "ns:msg:db:port:format:xml:print:concise"
-
-  NS_IMETHOD
-  CanExportToFormat( // can export content in given specific format?
-    nsIMdbEnv* ev, // context
-    const char* inFormatVersion, // file format description
-    mdb_bool* outCanExport) = 0; // whether ExportSource() might succeed
-
-  NS_IMETHOD ExportToFormat( // export content in given specific format
-    nsIMdbEnv* ev, // context
-    // const char* inFilePath, // the file to receive exported content
-    nsIMdbFile* ioFile, // destination abstract file interface
-    const char* inFormatVersion, // file format description
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental export
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the export will be finished.
-
-  // } ----- end export methods -----
-
-  // { ----- begin token methods -----
-  NS_IMETHOD TokenToString( // return a string name for an integer token
-    nsIMdbEnv* ev, // context
-    mdb_token inToken, // token for inTokenName inside this port
-    mdbYarn* outTokenName) = 0; // the type of table to access
-  
-  NS_IMETHOD StringToToken( // return an integer token for scope name
-    nsIMdbEnv* ev, // context
-    const char* inTokenName, // Latin1 string to tokenize if possible
-    mdb_token* outToken) = 0; // token for inTokenName inside this port
-    
-  // String token zero is never used and never supported. If the port
-  // is a mutable store, then StringToToken() to create a new
-  // association of inTokenName with a new integer token if possible.
-  // But a readonly port will return zero for an unknown scope name.
-
-  NS_IMETHOD QueryToken( // like StringToToken(), but without adding
-    nsIMdbEnv* ev, // context
-    const char* inTokenName, // Latin1 string to tokenize if possible
-    mdb_token* outToken) = 0; // token for inTokenName inside this port
-  
-  // QueryToken() will return a string token if one already exists,
-  // but unlike StringToToken(), will not assign a new token if not
-  // already in use.
-
-  // } ----- end token methods -----
-
-  // { ----- begin row methods -----  
-  NS_IMETHOD HasRow( // contains a row with the specified oid?
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // hypothetical row oid
-    mdb_bool* outHasRow) = 0; // whether GetRow() might succeed
-
-  NS_IMETHOD GetRowRefCount( // get number of tables that contain a row 
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // hypothetical row oid
-    mdb_count* outRefCount) = 0; // number of tables containing inRowKey 
-    
-  NS_IMETHOD GetRow( // access one row with specific oid
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // hypothetical row oid
-    nsIMdbRow** acqRow) = 0; // acquire specific row (or null)
-    
-  // NS_IMETHOD
-  // GetPortRowCursor( // get cursor for all rows in specific scope
-  //   nsIMdbEnv* ev, // context
-  //   mdb_scope inRowScope, // row scope for row ids
-  //   nsIMdbPortRowCursor** acqCursor) = 0; // all such rows in the port
-
-  NS_IMETHOD FindRow(nsIMdbEnv* ev, // search for row with matching cell
-    mdb_scope inRowScope,   // row scope for row ids
-    mdb_column inColumn,   // the column to search (and maintain an index)
-    const mdbYarn* inTargetCellValue, // cell value for which to search
-    mdbOid* outRowOid, // out row oid on match (or {0,-1} for no match)
-    nsIMdbRow** acqRow) = 0; // acquire matching row (or nil for no match)
-                             // can be null if you only want the oid
-  // FindRow() searches for one row that has a cell in column inColumn with
-  // a contained value with the same form (i.e. charset) and is byte-wise
-  // identical to the blob described by yarn inTargetCellValue.  Both content
-  // and form of the yarn must be an exact match to find a matching row.
-  //
-  // (In other words, both a yarn's blob bytes and form are significant.  The
-  // form is not expected to vary in columns used for identity anyway.  This
-  // is intended to make the cost of FindRow() cheaper for MDB implementors,
-  // since any cell value atomization performed internally must necessarily
-  // make yarn form significant in order to avoid data loss in atomization.)
-  //
-  // FindRow() can lazily create an index on attribute inColumn for all rows
-  // with that attribute in row space scope inRowScope, so that subsequent
-  // calls to FindRow() will perform faster.  Such an index might or might
-  // not be persistent (but this seems desirable if it is cheap to do so).
-  // Note that lazy index creation in readonly DBs is not very feasible.
-  //
-  // This FindRow() interface assumes that attribute inColumn is effectively
-  // an alternative means of unique identification for a row in a rowspace,
-  // so correct behavior is only guaranteed when no duplicates for this col
-  // appear in the given set of rows.  (If more than one row has the same cell
-  // value in this column, no more than one will be found; and cutting one of
-  // two duplicate rows can cause the index to assume no other such row lives
-  // in the row space, so future calls return nil for negative search results
-  // even though some duplicate row might still live within the rowspace.)
-  //
-  // In other words, the FindRow() implementation is allowed to assume simple
-  // hash tables mapping unqiue column keys to associated row values will be
-  // sufficient, where any duplication is not recorded because only one copy
-  // of a given key need be remembered.  Implementors are not required to sort
-  // all rows by the specified column.
-  // } ----- end row methods -----
-
-  // { ----- begin table methods -----  
-  NS_IMETHOD HasTable( // supports a table with the specified oid?
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // hypothetical table oid
-    mdb_bool* outHasTable) = 0; // whether GetTable() might succeed
-    
-  NS_IMETHOD GetTable( // access one table with specific oid
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // hypothetical table oid
-    nsIMdbTable** acqTable) = 0; // acquire specific table (or null)
-  
-  NS_IMETHOD HasTableKind( // supports a table of the specified type?
-    nsIMdbEnv* ev, // context
-    mdb_scope inRowScope, // rid scope for row ids
-    mdb_kind inTableKind, // the type of table to access
-    mdb_count* outTableCount, // current number of such tables
-    mdb_bool* outSupportsTable) = 0; // whether GetTableKind() might succeed
-    
-  // row scopes to be supported include the following suggestions:
-  // "ns:msg:db:row:scope:address:cards:all"
-  // "ns:msg:db:row:scope:mail:messages:all"
-  // "ns:msg:db:row:scope:news:articles:all"
- 
-  // table kinds to be supported include the following suggestions:
-  // "ns:msg:db:table:kind:address:cards:main"
-  // "ns:msg:db:table:kind:address:lists:all" 
-  // "ns:msg:db:table:kind:address:list" 
-  // "ns:msg:db:table:kind:news:threads:all" 
-  // "ns:msg:db:table:kind:news:thread" 
-  // "ns:msg:db:table:kind:mail:threads:all"
-  // "ns:msg:db:table:kind:mail:thread"
-    
-  NS_IMETHOD GetTableKind( // access one (random) table of specific type
-    nsIMdbEnv* ev, // context
-    mdb_scope inRowScope,      // row scope for row ids
-    mdb_kind inTableKind,      // the type of table to access
-    mdb_count* outTableCount, // current number of such tables
-    mdb_bool* outMustBeUnique, // whether port can hold only one of these
-    nsIMdbTable** acqTable) = 0;       // acquire scoped collection of rows
-    
-  NS_IMETHOD
-  GetPortTableCursor( // get cursor for all tables of specific type
-    nsIMdbEnv* ev, // context
-    mdb_scope inRowScope, // row scope for row ids
-    mdb_kind inTableKind, // the type of table to access
-    nsIMdbPortTableCursor** acqCursor) = 0; // all such tables in the port
-  // } ----- end table methods -----
-
-
-  // { ----- begin commit methods -----
-
-  NS_IMETHOD ShouldCompress( // store wastes at least inPercentWaste?
-    nsIMdbEnv* ev, // context
-    mdb_percent inPercentWaste, // 0..100 percent file size waste threshold
-    mdb_percent* outActualWaste, // 0..100 percent of file actually wasted
-    mdb_bool* outShould) = 0; // true when about inPercentWaste% is wasted
-  // ShouldCompress() returns true if the store can determine that the file
-  // will shrink by an estimated percentage of inPercentWaste% (or more) if
-  // CompressCommit() is called, because that percentage of the file seems
-  // to be recoverable free space.  The granularity is only in terms of 
-  // percentage points, and any value over 100 is considered equal to 100.
-  //
-  // If a store only has an approximate idea how much space might be saved
-  // during a compress, then a best guess should be made.  For example, the
-  // Mork implementation might keep track of how much file space began with
-  // text content before the first updating transaction, and then consider
-  // all content following the start of the first transaction as potentially
-  // wasted space if it is all updates and not just new content.  (This is
-  // a safe assumption in the sense that behavior will stabilize on a low
-  // estimate of wastage after a commit removes all transaction updates.)
-  //
-  // Some db formats might attempt to keep a very accurate reckoning of free
-  // space size, so a very accurate determination can be made.  But other db
-  // formats might have difficulty determining size of free space, and might
-  // require some lengthy calculation to answer.  This is the reason for
-  // passing in the percentage threshold of interest, so that such lengthy
-  // computations can terminate early as soon as at least inPercentWaste is
-  // found, so that the entire file need not be groveled when unnecessary.
-  // However, we hope implementations will always favor fast but imprecise
-  // heuristic answers instead of extremely slow but very precise answers.
-  //
-  // If the outActualWaste parameter is non-nil, it will be used to return
-  // the actual estimated space wasted as a percentage of file size.  (This
-  // parameter is provided so callers need not call repeatedly with altered
-  // inPercentWaste values to isolate the actual wastage figure.)  Note the
-  // actual wastage figure returned can exactly equal inPercentWaste even
-  // when this grossly underestimates the real figure involved, if the db
-  // finds it very expensive to determine the extent of wastage after it is
-  // known to at least exceed inPercentWaste.  Note we expect that whenever
-  // outShould returns true, that outActualWaste returns >= inPercentWaste.
-  //
-  // The effect of different inPercentWaste values is not very uniform over
-  // the permitted range.  For example, 50 represents 50% wastage, or a file
-  // that is about double what it should be ideally.  But 99 represents 99%
-  // wastage, or a file that is about ninety-nine times as big as it should
-  // be ideally.  In the smaller direction, 25 represents 25% wastage, or
-  // a file that is only 33% larger than it should be ideally.
-  //
-  // Callers can determine what policy they want to use for considering when
-  // a file holds too much wasted space, and express this as a percentage
-  // of total file size to pass as in the inPercentWaste parameter.  A zero
-  // likely returns always trivially true, and 100 always trivially false.
-  // The great majority of callers are expected to use values from 25 to 75,
-  // since most plausible thresholds for compressing might fall between the
-  // extremes of 133% of ideal size and 400% of ideal size.  (Presumably the
-  // larger a file gets, the more important the percentage waste involved, so
-  // a sliding scale for compress thresholds might use smaller numbers for
-  // much bigger file sizes.)
-  
-  // } ----- end commit methods -----
-
-// } ===== end nsIMdbPort methods =====
-};
-
-/*| nsIMdbStore: a mutable interface to a specific database file.
-**|
-**|| tables: one can force a new table to exist in a store with NewTable()
-**| and nonzero values for both row scope and table kind.  (If one wishes only
-**| one table of a certain kind, then one might look for it first using the
-**| GetTableKind() method).  One can pass inMustBeUnique to force future
-**| users of this store to be unable to create other tables with the same pair
-**| of scope and kind attributes.  When inMustBeUnique is true, and the table
-**| with the given scope and kind pair already exists, then the existing one
-**| is returned instead of making a new table.  Similarly, if one passes false
-**| for inMustBeUnique, but the table kind has already been marked unique by a
-**| previous user of the store, then the existing unique table is returned.
-**|
-**|| import: all or some of another port's content can be imported by calling
-**| AddPortContent() with a row scope identifying the extent of content to
-**| be imported.  A zero row scope will import everything.  A nonzero row
-**| scope will only import tables with a matching row scope.  Note that one
-**| must somehow find a way to negotiate possible conflicts between existing
-**| row content and imported row content, and this involves a specific kind of
-**| definition for row identity involving either row IDs or unique attributes,
-**| or some combination of these two.  At the moment I am just going to wave
-**| my hands, and say the default behavior is to assign all new row identities
-**| to all imported content, which will result in no merging of content; this
-**| must change later because it is unacceptable in some contexts.
-**|
-**|| commits: to manage modifications in a mutable store, very few methods are
-**| really needed to indicate global policy choices that are independent of 
-**| the actual modifications that happen in objects at the level of tables,
-**| rows, and cells, etc.  The most important policy to specify is which sets
-**| of changes are considered associated in a manner such that they should be
-**| applied together atomically to a given store.  We call each such group of
-**| changes a transaction.  We handle three different grades of transaction,
-**| but they differ only in semantic significance to the application, and are
-**| not intended to nest.  (If small transactions were nested inside large
-**| transactions, that would imply that a single large transaction must be
-**| atomic over all the contained small transactions; but actually we intend
-**| smalls transaction never be undone once commited due to, say, aborting a
-**| transaction of greater significance.)  The small, large, and session level
-**| commits have equal granularity, and differ only in risk of loss from the
-**| perspective of an application.  Small commits characterize changes that
-**| can be lost with relatively small risk, so small transactions can delay
-**| until later if they are expensive or impractical to commit.  Large commits
-**| involve changes that would probably inconvenience users if lost, so the
-**| need to pay costs of writing is rather greater than with small commits.
-**| Session commits are last ditch attempts to save outstanding changes before
-**| stopping the use of a particular database, so there will be no later point
-**| in time to save changes that have been delayed due to possible high cost.
-**| If large commits are never delayed, then a session commit has about the
-**| same performance effect as another large commit; but if small and large
-**| commits are always delayed, then a session commit is likely to be rather
-**| expensive as a runtime cost compared to any earlier database usage.
-**|
-**|| aborts: the only way to abort changes to a store is by closing the store.
-**| So there is no specific method for causing any abort.  Stores must discard
-**| all changes made that are uncommited when a store is closed.  This design
-**| choice makes the implementations of tables, rows, and cells much less
-**| complex because they need not maintain a record of undobable changes.  When
-**| a store is closed, presumably this precipitates the closure of all tables,
-**| rows, and cells in the store as well.   So an application can revert the
-**| state of a store in the user interface by quietly closing and reopening a
-**| store, because this will discard uncommited changes and show old content.
-**| This implies an app that closes a store will need to send a "scramble"
-**| event notification to any views that depend on old discarded content.
-|*/
-
-#define NS_IMDBSTORE_IID_STR "726618d3-f15b-49b9-9f4a-efcc9db53d0d"
-
-#define NS_IMDBSTORE_IID \
-{0x726618d3, 0xf15b, 0x49b9, \
-{0x9f, 0x4a, 0xef, 0xcc, 0x9d, 0xb5, 0x3d, 0x0d}}
-
-class nsIMdbStore : public nsIMdbPort {
-public:
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBSTORE_IID)
-
-// { ===== begin nsIMdbStore methods =====
-
-  // { ----- begin table methods -----
-  NS_IMETHOD NewTable( // make one new table of specific type
-    nsIMdbEnv* ev, // context
-    mdb_scope inRowScope,    // row scope for row ids
-    mdb_kind inTableKind,    // the type of table to access
-    mdb_bool inMustBeUnique, // whether store can hold only one of these
-    const mdbOid* inOptionalMetaRowOid, // can be nil to avoid specifying
-    nsIMdbTable** acqTable) = 0;     // acquire scoped collection of rows
-    
-  NS_IMETHOD NewTableWithOid( // make one new table of specific type
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,   // caller assigned oid
-    mdb_kind inTableKind,    // the type of table to access
-    mdb_bool inMustBeUnique, // whether store can hold only one of these
-    const mdbOid* inOptionalMetaRowOid, // can be nil to avoid specifying 
-    nsIMdbTable** acqTable) = 0;     // acquire scoped collection of rows
-  // } ----- end table methods -----
-
-  // { ----- begin row scope methods -----
-  NS_IMETHOD RowScopeHasAssignedIds(nsIMdbEnv* ev,
-    mdb_scope inRowScope,   // row scope for row ids
-    mdb_bool* outCallerAssigned, // nonzero if caller assigned specified
-    mdb_bool* outStoreAssigned) = 0; // nonzero if store db assigned specified
-
-  NS_IMETHOD SetCallerAssignedIds(nsIMdbEnv* ev,
-    mdb_scope inRowScope,   // row scope for row ids
-    mdb_bool* outCallerAssigned, // nonzero if caller assigned specified
-    mdb_bool* outStoreAssigned) = 0; // nonzero if store db assigned specified
-
-  NS_IMETHOD SetStoreAssignedIds(nsIMdbEnv* ev,
-    mdb_scope inRowScope,   // row scope for row ids
-    mdb_bool* outCallerAssigned, // nonzero if caller assigned specified
-    mdb_bool* outStoreAssigned) = 0; // nonzero if store db assigned specified
-  // } ----- end row scope methods -----
-
-  // { ----- begin row methods -----
-  NS_IMETHOD NewRowWithOid(nsIMdbEnv* ev, // new row w/ caller assigned oid
-    const mdbOid* inOid,   // caller assigned oid
-    nsIMdbRow** acqRow) = 0; // create new row
-
-  NS_IMETHOD NewRow(nsIMdbEnv* ev, // new row with db assigned oid
-    mdb_scope inRowScope,   // row scope for row ids
-    nsIMdbRow** acqRow) = 0; // create new row
-  // Note this row must be added to some table or cell child before the
-  // store is closed in order to make this row persist across sesssions.
-
-  // } ----- end row methods -----
-
-  // { ----- begin inport/export methods -----
-  NS_IMETHOD ImportContent( // import content from port
-    nsIMdbEnv* ev, // context
-    mdb_scope inRowScope, // scope for rows (or zero for all?)
-    nsIMdbPort* ioPort, // the port with content to add to store
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental import
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the import will be finished.
-
-  NS_IMETHOD ImportFile( // import content from port
-    nsIMdbEnv* ev, // context
-    nsIMdbFile* ioFile, // the file with content to add to store
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental import
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the import will be finished.
-  // } ----- end inport/export methods -----
-
-  // { ----- begin hinting methods -----
-  NS_IMETHOD
-  ShareAtomColumnsHint( // advise re shared column content atomizing
-    nsIMdbEnv* ev, // context
-    mdb_scope inScopeHint, // zero, or suggested shared namespace
-    const mdbColumnSet* inColumnSet) = 0; // cols desired tokenized together
-
-  NS_IMETHOD
-  AvoidAtomColumnsHint( // advise column with poor atomizing prospects
-    nsIMdbEnv* ev, // context
-    const mdbColumnSet* inColumnSet) = 0; // cols with poor atomizing prospects
-  // } ----- end hinting methods -----
-
-  // { ----- begin commit methods -----
-  NS_IMETHOD SmallCommit( // save minor changes if convenient and uncostly
-    nsIMdbEnv* ev) = 0; // context
-  
-  NS_IMETHOD LargeCommit( // save important changes if at all possible
-    nsIMdbEnv* ev, // context
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental commit
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the commit will be finished.  Note the store is effectively write
-  // locked until commit is finished or canceled through the thumb instance.
-  // Until the commit is done, the store will report it has readonly status.
-
-  NS_IMETHOD SessionCommit( // save all changes if large commits delayed
-    nsIMdbEnv* ev, // context
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental commit
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the commit will be finished.  Note the store is effectively write
-  // locked until commit is finished or canceled through the thumb instance.
-  // Until the commit is done, the store will report it has readonly status.
-
-  NS_IMETHOD
-  CompressCommit( // commit and make db physically smaller if possible
-    nsIMdbEnv* ev, // context
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental commit
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the commit will be finished.  Note the store is effectively write
-  // locked until commit is finished or canceled through the thumb instance.
-  // Until the commit is done, the store will report it has readonly status.
-  
-  // } ----- end commit methods -----
-
-// } ===== end nsIMdbStore methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbStore, NS_IMDBSTORE_IID)
-
-/*| nsIMdbCursor: base cursor class for iterating row cells and table rows
-**|
-**|| count: the number of elements in the collection (table or row)
-**|
-**|| seed: the change count in the underlying collection, which is synced
-**| with the collection when the iteration position is set, and henceforth
-**| acts to show whether the iter has lost collection synchronization, in
-**| case it matters to clients whether any change happens during iteration.
-**|
-**|| pos: the position of the current element in the collection.  Negative
-**| means a position logically before the first element.  A positive value
-**| equal to count (or larger) implies a position after the last element.
-**| To iterate over all elements, set the position to negative, so subsequent
-**| calls to any 'next' method will access the first collection element.
-**|
-**|| doFailOnSeedOutOfSync: whether a cursor should return an error if the
-**| cursor's snapshot of a table's seed becomes stale with respect the table's
-**| current seed value (which implies the iteration is less than total) in
-**| between to cursor calls that actually access collection content.  By
-**| default, a cursor should assume this attribute is false until specified,
-**| so that iterations quietly try to re-sync when they lose coherence.
-|*/
-
-#define NS_IMDBCURSOR_IID_STR "a0c37337-6ebc-474c-90db-e65ea0b850aa"
-
-#define NS_IMDBCURSOR_IID \
-{0xa0c37337, 0x6ebc, 0x474c, \
-{0x90, 0xdb, 0xe6, 0x5e, 0xa0, 0xb8, 0x50, 0xaa}}
-
-class nsIMdbCursor  : public nsISupports  { // collection iterator
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBCURSOR_IID)
-// { ===== begin nsIMdbCursor methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD GetCount(nsIMdbEnv* ev, mdb_count* outCount) = 0; // readonly
-  NS_IMETHOD GetSeed(nsIMdbEnv* ev, mdb_seed* outSeed) = 0;    // readonly
-  
-  NS_IMETHOD SetPos(nsIMdbEnv* ev, mdb_pos inPos) = 0;   // mutable
-  NS_IMETHOD GetPos(nsIMdbEnv* ev, mdb_pos* outPos) = 0;
-  
-  NS_IMETHOD SetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool inFail) = 0;
-  NS_IMETHOD GetDoFailOnSeedOutOfSync(nsIMdbEnv* ev, mdb_bool* outFail) = 0;
-  // } ----- end attribute methods -----
-
-// } ===== end nsIMdbCursor methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbCursor, NS_IMDBCURSOR_IID)
-
-#define NS_IMDBPORTTABLECURSOR_IID_STR = "f181a41e-933d-49b3-af93-20d3634b8b78"
-
-#define NS_IMDBPORTTABLECURSOR_IID \
-{0xf181a41e, 0x933d, 0x49b3, \
-{0xaf, 0x93, 0x20, 0xd3, 0x63, 0x4b, 0x8b, 0x78}}
-
-/*| nsIMdbPortTableCursor: cursor class for iterating port tables
-**|
-**|| port: the cursor is associated with a specific port, which can be
-**| set to a different port (which resets the position to -1 so the
-**| next table acquired is the first in the port.
-**|
-|*/
-class nsIMdbPortTableCursor : public nsISupports { // table collection iterator
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBPORTTABLECURSOR_IID)
-// { ===== begin nsIMdbPortTableCursor methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD SetPort(nsIMdbEnv* ev, nsIMdbPort* ioPort) = 0; // sets pos to -1
-  NS_IMETHOD GetPort(nsIMdbEnv* ev, nsIMdbPort** acqPort) = 0;
-  
-  NS_IMETHOD SetRowScope(nsIMdbEnv* ev, // sets pos to -1
-    mdb_scope inRowScope) = 0;
-  NS_IMETHOD GetRowScope(nsIMdbEnv* ev, mdb_scope* outRowScope) = 0; 
-  // setting row scope to zero iterates over all row scopes in port
-    
-  NS_IMETHOD SetTableKind(nsIMdbEnv* ev, // sets pos to -1
-    mdb_kind inTableKind) = 0;
-  NS_IMETHOD GetTableKind(nsIMdbEnv* ev, mdb_kind* outTableKind) = 0;
-  // setting table kind to zero iterates over all table kinds in row scope
-  // } ----- end attribute methods -----
-
-  // { ----- begin table iteration methods -----
-  NS_IMETHOD NextTable( // get table at next position in the db
-    nsIMdbEnv* ev, // context
-    nsIMdbTable** acqTable) = 0; // the next table in the iteration
-  // } ----- end table iteration methods -----
-
-// } ===== end nsIMdbPortTableCursor methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbPortTableCursor,
-                              NS_IMDBPORTTABLECURSOR_IID)
-
-/*| nsIMdbCollection: an object that collects a set of other objects as members.
-**| The main purpose of this base class is to unify the perceived semantics
-**| of tables and rows where their collection behavior is similar.  This helps
-**| isolate the mechanics of collection behavior from the other semantics that
-**| are more characteristic of rows and tables.
-**|
-**|| count: the number of objects in a collection is the member count. (Some
-**| collection interfaces call this attribute the 'size', but that can be a
-**| little ambiguous, and counting actual members is harder to confuse.)
-**|
-**|| seed: the seed of a collection is a counter for changes in membership in
-**| a specific collection.  This seed should change when members are added to
-**| or removed from a collection, but not when a member changes internal state.
-**| The seed should also change whenever the internal collection of members has
-**| a complex state change that reorders member positions (say by sorting) that
-**| would affect the nature of an iteration over that collection of members.
-**| The purpose of a seed is to inform any outstanding collection cursors that
-**| they might be stale, without incurring the cost of broadcasting an event
-**| notification to such cursors, which would need more data structure support.
-**| Presumably a cursor in a particular mdb code suite has much more direct
-**| access to a collection seed member slot that this abstract COM interface,
-**| so this information is intended more for clients outside mdb that want to
-**| make inferences similar to those made by the collection cursors.  The seed
-**| value as an integer magnitude is not very important, and callers should not
-**| assume meaningful information can be derived from an integer value beyond
-**| whether it is equal or different from a previous inspection.  A seed uses
-**| integers of many bits in order to make the odds of wrapping and becoming
-**| equal to an earlier seed value have probability that is vanishingly small.
-**|
-**|| port: every collection is associated with a specific database instance.
-**|
-**|| cursor: a subclass of nsIMdbCursor suitable for this specific collection
-**| subclass.  The ability to GetCursor() from the base nsIMdbCollection class
-**| is not really as useful as getting a more specifically typed cursor more
-**| directly from the base class without any casting involved.  So including
-**| this method here is more for conceptual illustration.
-**|
-**|| oid: every collection has an identity that persists from session to
-**| session. Implementations are probably able to distinguish row IDs from
-**| table IDs, but we don't specify anything official in this regard.  A
-**| collection has the same identity for the lifetime of the collection,
-**| unless identity is swapped with another collection by means of a call to
-**| BecomeContent(), which is considered a way to swap a new representation
-**| for an old well-known object.  (Even so, only content appears to change,
-**| while the identity seems to stay the same.)
-**|
-**|| become: developers can effectively cause two objects to swap identities,
-**| in order to effect a complete swap between what persistent content is
-**| represented by two oids.  The caller should consider this a content swap,
-**| and not identity wap, because identities will seem to stay the same while
-**| only content changes.  However, implementations will likely do this
-**| internally by swapping identities.  Callers must swap content only
-**| between objects of similar type, such as a row with another row, and a
-**| table with another table, because implementations need not support
-**| cross-object swapping because it might break object name spaces.
-**|
-**|| dropping: when a caller expects a row or table will no longer be used, the
-**| caller can tell the collection to 'drop activity', which means the runtime
-**| object can have its internal representation purged to save memory or any
-**| other resource that is being consumed by the collection's representation.
-**| This has no effect on the collection's persistent content or semantics,
-**| and is only considered a runtime effect.  After a collection drops
-**| activity, the object should still be as usable as before (because it has
-**| NOT been closed), but further usage can be expensive to re-instate because
-**| it might involve reallocating space and/or re-reading disk space.  But
-**| since this future usage is not expected, the caller does not expect to
-**| pay the extra expense.  An implementation can choose to implement
-**| 'dropping activity' in different ways, or even not at all if this
-**| operation is not really feasible.  Callers cannot ask objects whether they
-**| are 'dropped' or not, so this should be transparent. (Note that
-**| implementors might fear callers do not really know whether future
-**| usage will occur, and therefore might delay the act of dropping until
-**| the near future, until seeing whether the object is used again
-**| immediately elsewhere. Such use soon after the drop request might cause
-**| the drop to be cancelled.)
-|*/
-class nsIMdbCollection : public nsISupports { // sequence of objects
-public:
-
-// { ===== begin nsIMdbCollection methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD GetSeed(nsIMdbEnv* ev,
-    mdb_seed* outSeed) = 0;    // member change count
-  NS_IMETHOD GetCount(nsIMdbEnv* ev,
-    mdb_count* outCount) = 0; // member count
-
-  NS_IMETHOD GetPort(nsIMdbEnv* ev,
-    nsIMdbPort** acqPort) = 0; // 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) = 0; // acquire new cursor instance
-  // } ----- end cursor methods -----
-
-  // { ----- begin ID methods -----
-  NS_IMETHOD GetOid(nsIMdbEnv* ev,
-    mdbOid* outOid) = 0; // read object identity
-  NS_IMETHOD BecomeContent(nsIMdbEnv* ev,
-    const mdbOid* inOid) = 0; // exchange content
-  // } ----- end ID methods -----
-
-  // { ----- begin activity dropping methods -----
-  NS_IMETHOD DropActivity( // tell collection usage no longer expected
-    nsIMdbEnv* ev) = 0;
-  // } ----- end activity dropping methods -----
-
-// } ===== end nsIMdbCollection methods =====
-};
-
-/*| nsIMdbTable: an ordered collection of rows
-**|
-**|| row scope: an integer token for an atomized string in this database
-**| that names a space for row IDs.  This attribute of a table is intended
-**| as guidance metainformation that helps with searching a database for
-**| tables that operate on collections of rows of the specific type.  By
-**| convention, a table with a specific row scope is expected to focus on
-**| containing rows that belong to that scope, however exceptions are easily
-**| allowed because all rows in a table are known by both row ID and scope.
-**| (A table with zero row scope is never allowed because this would make it
-**| ambiguous to use a zero row scope when iterating over tables in a port to
-**| indicate that all row scopes should be seen by a cursor.)
-**|
-**|| table kind: an integer token for an atomized string in this database
-**| that names a kind of table as a subset of the associated row scope. This
-**| attribute is intended as guidance metainformation to clarify the role of
-**| this table with respect to other tables in the same row scope, and this
-**| also helps search for such tables in a database.  By convention, a table
-**| with a specific table kind has a consistent role for containing rows with
-**| respect to other collections of such rows in the same row scope.  Also by
-**| convention, at least one table in a row scope has a table kind purporting
-**| to contain ALL the rows that belong in that row scope, so that at least
-**| one table exists that allows all rows in a scope to be interated over.
-**| (A table with zero table kind is never allowed because this would make it
-**| ambiguous to use a zero table kind when iterating over tables in a port to
-**| indicate that all table kinds in a row scope should be seen by a cursor.)
-**|
-**|| port: every table is considered part of some port that contains the
-**| table, so that closing the containing port will cause the table to be
-**| indirectly closed as well.  We make it easy to get the containing port for
-**| a table, because the port supports important semantic interfaces that will
-**| affect how content in table is presented; the most important port context
-**| that affects a table is specified by the set of token to string mappings
-**| that affect all tokens used throughout the database, and which drive the
-**| meanings of row scope, table kind, cell columns, etc.
-**|
-**|| cursor: a cursor that iterates over the rows in this table, where rows
-**| have zero-based index positions from zero to count-1.  Making a cursor
-**| with negative position will next iterate over the first row in the table.
-**|
-**|| position: given any position from zero to count-1, a table will return
-**| the row ID and row scope for the row at that position.  (One can use the
-**| GetRowAllCells() method to read that row, or else use a row cursor to both
-**| get the row at some position and read its content at the same time.)  The
-**| position depends on whether a table is sorted, and upon the actual sort.
-**| Note that moving a row's position is only possible in unsorted tables.
-**|
-**|| row set: every table contains a collection of rows, where a member row is
-**| referenced by the table using the row ID and row scope for the row.  No
-**| single table owns a given row instance, because rows are effectively ref-
-**| counted and destroyed only when the last table removes a reference to that
-**| particular row.  (But a row can be emptied of all content no matter how
-**| many refs exist, and this might be the next best thing to destruction.)
-**| Once a row exists in a least one table (after NewRow() is called), then it
-**| can be added to any other table by calling AddRow(), or removed from any
-**| table by calling CutRow(), or queried as a member by calling HasRow().  A
-**| row can only be added to a table once, and further additions do nothing and
-**| complain not at all.  Cutting a row from a table only does something when
-**| the row was actually a member, and otherwise does nothing silently.
-**|
-**|| row ref count: one can query the number of tables (and/or cells)
-**| containing a row as a member or a child.
-**|
-**|| row content: one can access or modify the cell content in a table's row
-**| by moving content to or from an instance of nsIMdbRow.  Note that nsIMdbRow
-**| never represents the actual row inside a table, and this is the reason
-**| why nsIMdbRow instances do not have row IDs or row scopes.  So an instance
-**| of nsIMdbRow always and only contains a snapshot of some or all content in
-**| past, present, or future persistent row inside a table.  This means that
-**| reading and writing rows in tables has strictly copy semantics, and we
-**| currently do not plan any exceptions for specific performance reasons.
-**|
-**|| sorting: note all rows are assumed sorted by row ID as a secondary
-**| sort following the primary column sort, when table rows are sorted.
-**|
-**|| indexes:
-|*/
-
-
-#define NS_IMDBTABLE_IID_STR = "fe11bc98-d02b-4128-9fac-87042fdf9639"
-
-#define NS_IMDBTABLE_IID \
-{0xfe11bc98, 0xd02b, 0x4128, \
-{0x9f, 0xac, 0x87, 0x04, 0x2f, 0xdf, 0x96, 0x39}}
-
-class nsIMdbTable : public nsIMdbCollection { // a collection of rows
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBTABLE_IID)
-// { ===== begin nsIMdbTable methods =====
-
-  // { ----- begin meta attribute methods -----
-  NS_IMETHOD SetTablePriority(nsIMdbEnv* ev, mdb_priority inPrio) = 0;
-  NS_IMETHOD GetTablePriority(nsIMdbEnv* ev, mdb_priority* outPrio) = 0;
-  
-  NS_IMETHOD GetTableBeVerbose(nsIMdbEnv* ev, mdb_bool* outBeVerbose) = 0;
-  NS_IMETHOD SetTableBeVerbose(nsIMdbEnv* ev, mdb_bool inBeVerbose) = 0;
-  
-  NS_IMETHOD GetTableIsUnique(nsIMdbEnv* ev, mdb_bool* outIsUnique) = 0;
-  
-  NS_IMETHOD GetTableKind(nsIMdbEnv* ev, mdb_kind* outTableKind) = 0;
-  NS_IMETHOD GetRowScope(nsIMdbEnv* ev, mdb_scope* outRowScope) = 0;
-  
-  NS_IMETHOD GetMetaRow(
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOptionalMetaRowOid, // can be nil to avoid specifying 
-    mdbOid* outOid, // output meta row oid, can be nil to suppress output
-    nsIMdbRow** acqRow) = 0; // acquire table's unique singleton meta row
-    // The purpose of a meta row is to support the persistent recording of
-    // meta info about a table as cells put into the distinguished meta row.
-    // Each table has exactly one meta row, which is not considered a member
-    // of the collection of rows inside the table.  The only way to tell
-    // whether a row is a meta row is by the fact that it is returned by this
-    // GetMetaRow() method from some table. Otherwise nothing distinguishes
-    // a meta row from any other row.  A meta row can be used anyplace that
-    // any other row can be used, and can even be put into other tables (or
-    // the same table) as a table member, if this is useful for some reason.
-    // The first attempt to access a table's meta row using GetMetaRow() will
-    // cause the meta row to be created if it did not already exist.  When the
-    // meta row is created, it will have the row oid that was previously
-    // requested for this table's meta row; or if no oid was ever explicitly
-    // specified for this meta row, then a unique oid will be generated in
-    // the row scope named "m" (so obviously MDB clients should not
-    // manually allocate any row IDs from that special meta scope namespace).
-    // The meta row oid can be specified either when the table is created, or
-    // else the first time that GetMetaRow() is called, by passing a non-nil
-    // pointer to an oid for parameter inOptionalMetaRowOid.  The meta row's
-    // actual oid is returned in outOid (if this is a non-nil pointer), and
-    // it will be different from inOptionalMetaRowOid when the meta row was
-    // already given a different oid earlier.
-  // } ----- end meta attribute methods -----
-
-
-  // { ----- begin cursor methods -----
-  NS_IMETHOD GetTableRowCursor( // make a cursor, starting iteration at inRowPos
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    nsIMdbTableRowCursor** acqCursor) = 0; // acquire new cursor instance
-  // } ----- end row position methods -----
-
-  // { ----- begin row position methods -----
-  NS_IMETHOD PosToOid( // get row member for a table position
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    mdbOid* outOid) = 0; // row oid at the specified position
-
-  NS_IMETHOD OidToPos( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid, // row to find in table
-    mdb_pos* outPos) = 0; // zero-based ordinal position of row in table
-    
-  NS_IMETHOD PosToRow( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    nsIMdbRow** acqRow) = 0; // acquire row at table position inRowPos
-    
-  NS_IMETHOD RowToPos( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow, // row to find in table
-    mdb_pos* outPos) = 0; // zero-based ordinal position of row in table
-  // } ----- end row position methods -----
-
-  // { ----- begin oid set methods -----
-  NS_IMETHOD AddOid( // make sure the row with inOid is a table member 
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid) = 0; // row to ensure membership in table
-
-  NS_IMETHOD HasOid( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid, // row to find in table
-    mdb_bool* outHasOid) = 0; // whether inOid is a member row
-
-  NS_IMETHOD CutOid( // make sure the row with inOid is not a member 
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid) = 0; // row to remove from table
-  // } ----- end oid set methods -----
-
-  // { ----- begin row set methods -----
-  NS_IMETHOD NewRow( // create a new row instance in table
-    nsIMdbEnv* ev, // context
-    mdbOid* ioOid, // please use minus one (unbound) rowId for db-assigned IDs
-    nsIMdbRow** acqRow) = 0; // create new row
-
-  NS_IMETHOD AddRow( // make sure the row with inOid is a table member 
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow) = 0; // row to ensure membership in table
-
-  NS_IMETHOD HasRow( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow, // row to find in table
-    mdb_bool* outHasRow) = 0; // whether row is a table member
-
-  NS_IMETHOD CutRow( // make sure the row with inOid is not a member 
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow) = 0; // row to remove from table
-
-  NS_IMETHOD CutAllRows( // remove all rows from the table
-    nsIMdbEnv* ev) = 0; // context
-  // } ----- end row set methods -----
-
-  // { ----- begin hinting methods -----
-  NS_IMETHOD SearchColumnsHint( // advise re future expected search cols  
-    nsIMdbEnv* ev, // context
-    const mdbColumnSet* inColumnSet) = 0; // columns likely to be searched
-    
-  NS_IMETHOD SortColumnsHint( // advise re future expected sort columns  
-    nsIMdbEnv* ev, // context
-    const mdbColumnSet* inColumnSet) = 0; // columns for likely sort requests
-    
-  NS_IMETHOD StartBatchChangeHint( // advise before many adds and cuts  
-    nsIMdbEnv* ev, // context
-    const void* inLabel) = 0; // intend unique address to match end call
-    // If batch starts nest by virtue of nesting calls in the stack, then
-    // the address of a local variable makes a good batch start label that
-    // can be used at batch end time, and such addresses remain unique.
-    
-  NS_IMETHOD EndBatchChangeHint( // advise before many adds and cuts  
-    nsIMdbEnv* ev, // context
-    const void* inLabel) = 0; // label matching start label
-    // Suppose a table is maintaining one or many sort orders for a table,
-    // so that every row added to the table must be inserted in each sort,
-    // and every row cut must be removed from each sort.  If a db client
-    // intends to make many such changes before needing any information
-    // about the order or positions of rows inside a table, then a client
-    // might tell the table to start batch changes in order to disable
-    // sorting of rows for the interim.  Presumably a table will then do
-    // a full sort of all rows at need when the batch changes end, or when
-    // a surprise request occurs for row position during batch changes.
-  // } ----- end hinting methods -----
-
-  // { ----- begin searching methods -----
-  NS_IMETHOD FindRowMatches( // search variable number of sorted cols
-    nsIMdbEnv* ev, // context
-    const mdbYarn* inPrefix, // content to find as prefix in row's column cell
-    nsIMdbTableRowCursor** acqCursor) = 0; // set of matching rows
-    
-  NS_IMETHOD GetSearchColumns( // query columns used by FindRowMatches()
-    nsIMdbEnv* ev, // context
-    mdb_count* outCount, // context
-    mdbColumnSet* outColSet) = 0; // caller supplied space to put columns
-    // GetSearchColumns() returns the columns actually searched when the
-    // FindRowMatches() method is called.  No more than mColumnSet_Count
-    // slots of mColumnSet_Columns will be written, since mColumnSet_Count
-    // indicates how many slots are present in the column array.  The
-    // actual number of search column used by the table is returned in
-    // the outCount parameter; if this number exceeds mColumnSet_Count,
-    // then a caller needs a bigger array to read the entire column set.
-    // The minimum of mColumnSet_Count and outCount is the number slots
-    // in mColumnSet_Columns that were actually written by this method.
-    //
-    // Callers are expected to change this set of columns by calls to
-    // nsIMdbTable::SearchColumnsHint() or SetSearchSorting(), or both.
-  // } ----- end searching methods -----
-
-  // { ----- begin sorting methods -----
-  // sorting: note all rows are assumed sorted by row ID as a secondary
-  // sort following the primary column sort, when table rows are sorted.
-
-  NS_IMETHOD
-  CanSortColumn( // query which column is currently used for sorting
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // column to query sorting potential
-    mdb_bool* outCanSort) = 0; // whether the column can be sorted
-    
-  NS_IMETHOD GetSorting( // view same table in particular sorting
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // requested new column for sorting table
-    nsIMdbSorting** acqSorting) = 0; // acquire sorting for column
-    
-  NS_IMETHOD SetSearchSorting( // use this sorting in FindRowMatches()
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // often same as nsIMdbSorting::GetSortColumn()
-    nsIMdbSorting* ioSorting) = 0; // requested sorting for some column
-    // SetSearchSorting() attempts to inform the table that ioSorting
-    // should be used during calls to FindRowMatches() for searching
-    // the column which is actually sorted by ioSorting.  This method
-    // is most useful in conjunction with nsIMdbSorting::SetCompare(),
-    // because otherwise a caller would not be able to override the
-    // comparison ordering method used during searchs.  Note that some
-    // database implementations might be unable to use an arbitrarily
-    // specified sort order, either due to schema or runtime interface
-    // constraints, in which case ioSorting might not actually be used.
-    // Presumably ioSorting is an instance that was returned from some
-    // earlier call to nsIMdbTable::GetSorting().  A caller can also
-    // use nsIMdbTable::SearchColumnsHint() to specify desired change
-    // in which columns are sorted and searched by FindRowMatches().
-    //
-    // A caller can pass a nil pointer for ioSorting to request that
-    // column inColumn no longer be used at all by FindRowMatches().
-    // But when ioSorting is non-nil, then inColumn should match the
-    // column actually sorted by ioSorting; when these do not agree,
-    // implementations are instructed to give precedence to the column
-    // specified by ioSorting (so this means callers might just pass
-    // zero for inColumn when ioSorting is also provided, since then
-    // inColumn is both redundant and ignored).
-  // } ----- end sorting methods -----
-
-  // { ----- begin moving methods -----
-  // moving a row does nothing unless a table is currently unsorted
-  
-  NS_IMETHOD MoveOid( // change position of row in unsorted table
-    nsIMdbEnv* ev, // context
-    const mdbOid* inOid,  // row oid to find in table
-    mdb_pos inHintFromPos, // suggested hint regarding start position
-    mdb_pos inToPos,       // desired new position for row inRowId
-    mdb_pos* outActualPos) = 0; // actual new position of row in table
-
-  NS_IMETHOD MoveRow( // change position of row in unsorted table
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow,  // row oid to find in table
-    mdb_pos inHintFromPos, // suggested hint regarding start position
-    mdb_pos inToPos,       // desired new position for row inRowId
-    mdb_pos* outActualPos) = 0; // actual new position of row in table
-  // } ----- end moving methods -----
-  
-  // { ----- begin index methods -----
-  NS_IMETHOD AddIndex( // create a sorting index for column if possible
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // the column to sort by index
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental index building
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the index addition will be finished.
-  
-  NS_IMETHOD CutIndex( // stop supporting a specific column index
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // the column with index to be removed
-    nsIMdbThumb** acqThumb) = 0; // acquire thumb for incremental index destroy
-  // Call nsIMdbThumb::DoMore() until done, or until the thumb is broken, and
-  // then the index removal will be finished.
-  
-  NS_IMETHOD HasIndex( // query for current presence of a column index
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // the column to investigate
-    mdb_bool* outHasIndex) = 0; // whether column has index for this column
-
-  
-  NS_IMETHOD EnableIndexOnSort( // create an index for col on first sort
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn) = 0; // the column to index if ever sorted
-  
-  NS_IMETHOD QueryIndexOnSort( // check whether index on sort is enabled
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // the column to investigate
-    mdb_bool* outIndexOnSort) = 0; // whether column has index-on-sort enabled
-  
-  NS_IMETHOD DisableIndexOnSort( // prevent future index creation on sort
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn) = 0; // the column to index if ever sorted
-  // } ----- end index methods -----
-
-// } ===== end nsIMdbTable methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbTable, NS_IMDBTABLE_IID)
-
-/*| nsIMdbSorting: a view of a table in some particular sort order.  This
-**| row order closely resembles a readonly array of rows with the same row
-**| membership as the underlying table, but in a different order than the
-**| table's explicit row order.  But the sorting's row membership changes
-**| whenever the table's membership changes (without any notification, so
-**| keep this in mind when modifying the table).
-**|
-**|| table: every sorting is associated with a particular table.  You
-**| cannot change which table is used by a sorting (just ask some new
-**| table for a suitable sorting instance instead).
-**|
-**|| compare: the ordering method used by a sorting, wrapped up in a
-**| abstract plug-in interface.  When this was never installed by an
-**| explicit call to SetNewCompare(), a compare object is still returned,
-**| and it might match the compare instance returned by the factory method
-**| nsIMdbFactory::MakeCompare(), which represents a default sort order
-**| (which we fervently hope is consistently ASCII byte ordering).
-**|
-**|| cursor: in case callers are more comfortable with a cursor style
-**| of accessing row members, each sorting will happily return a cursor
-**| instance with behavior very similar to a cursor returned from a call
-**| to nsIMdbTable::GetTableRowCursor(), but with different row order.
-**| A cursor should show exactly the same information as the pos methods.
-**|
-**|| pos: the PosToOid() and PosToRow() methods are just like the table
-**| methods of the same name, except they show rows in the sort order of 
-**| the sorting, rather than that of the table.  These methods are like
-**| readonly array position accessor's, or like a C++ operator[].
-|*/
-class nsIMdbSorting : public nsIMdbObject { // sorting of some table
-public:
-// { ===== begin nsIMdbSorting methods =====
-
-  // { ----- begin attribute methods -----
-  // sorting: note all rows are assumed sorted by row ID as a secondary
-  // sort following the primary column sort, when table rows are sorted.
-  
-  NS_IMETHOD GetTable(nsIMdbEnv* ev, nsIMdbTable** acqTable) = 0;
-  NS_IMETHOD GetSortColumn( // query which col is currently sorted
-    nsIMdbEnv* ev, // context
-    mdb_column* outColumn) = 0; // col the table uses for sorting (or zero)
-
-  NS_IMETHOD SetNewCompare(nsIMdbEnv* ev,
-    nsIMdbCompare* ioNewCompare) = 0;
-    // Setting the sorting's compare object will typically cause the rows
-    // to be resorted, presumably in a lazy fashion when the sorting is
-    // next required to be in a valid row ordering state, such as when a
-    // call to PosToOid() happens.  ioNewCompare can be nil, in which case
-    // implementations should revert to the default sort order, which must
-    // be equivalent to whatever is used by nsIMdbFactory::MakeCompare().
-
-  NS_IMETHOD GetOldCompare(nsIMdbEnv* ev,
-    nsIMdbCompare** acqOldCompare) = 0;
-    // Get this sorting instance's compare object, which handles the
-    // ordering of rows in the sorting, by comparing yarns from the cells
-    // in the column being sorted.  Since nsIMdbCompare has no interface
-    // to query the state of the compare object, it is not clear what you
-    // would do with this object when returned, except maybe compare it
-    // as a pointer address to some other instance, to check identities.
-  
-  // } ----- end attribute methods -----
-
-  // { ----- begin cursor methods -----
-  NS_IMETHOD GetSortingRowCursor( // make a cursor, starting at inRowPos
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    nsIMdbTableRowCursor** acqCursor) = 0; // acquire new cursor instance
-    // A cursor interface turning same info as PosToOid() or PosToRow().
-  // } ----- end row position methods -----
-
-  // { ----- begin row position methods -----
-  NS_IMETHOD PosToOid( // get row member for a table position
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    mdbOid* outOid) = 0; // row oid at the specified position
-    
-  NS_IMETHOD PosToRow( // test for the table position of a row member
-    nsIMdbEnv* ev, // context
-    mdb_pos inRowPos, // zero-based ordinal position of row in table
-    nsIMdbRow** acqRow) = 0; // acquire row at table position inRowPos
-  // } ----- end row position methods -----
-
-// } ===== end nsIMdbSorting methods =====
-};
-
-/*| nsIMdbTableRowCursor: cursor class for iterating table rows
-**|
-**|| table: the cursor is associated with a specific table, which can be
-**| set to a different table (which resets the position to -1 so the
-**| next row acquired is the first in the table.
-**|
-**|| NextRowId: the rows in the table can be iterated by identity alone,
-**| without actually reading the cells of any row with this method.
-**|
-**|| NextRowCells: read the next row in the table, but only read cells
-**| from the table which are already present in the row (so no new cells
-**| are added to the row, even if they are present in the table).  All the
-**| cells will have content specified, even it is the empty string.  No
-**| columns will be removed, even if missing from the row (because missing
-**| and empty are semantically equivalent).
-**|
-**|| NextRowAllCells: read the next row in the table, and access all the
-**| cells for this row in the table, adding any missing columns to the row
-**| as needed until all cells are represented.  All the
-**| cells will have content specified, even it is the empty string.  No
-**| columns will be removed, even if missing from the row (because missing
-**| and empty are semantically equivalent).
-**|
-|*/
-
-#define NS_IMDBTABLEROWCURSOR_IID_STR = "4f325dad-0385-4b62-a992-c914ab93587e"
-
-#define NS_IMDBTABLEROWCURSOR_IID \
-{0x4f325dad, 0x0385, 0x4b62, \
-{0xa9, 0x92, 0xc9, 0x14, 0xab, 0x93, 0x58, 0x7e}}
-
-
-
-class nsIMdbTableRowCursor : public nsISupports { // table row iterator
-public:
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBTABLEROWCURSOR_IID)
-
-// { ===== begin nsIMdbTableRowCursor methods =====
-
-  // { ----- begin attribute methods -----
-  // NS_IMETHOD SetTable(nsIMdbEnv* ev, nsIMdbTable* ioTable) = 0; // sets pos to -1
-  // Method SetTable() cut and made obsolete in keeping with new sorting methods.
-  
-  NS_IMETHOD GetTable(nsIMdbEnv* ev, nsIMdbTable** acqTable) = 0;
-  // } ----- end attribute methods -----
-
-  // { ----- begin duplicate row removal methods -----
-  NS_IMETHOD CanHaveDupRowMembers(nsIMdbEnv* ev, // cursor might hold dups?
-    mdb_bool* outCanHaveDups) = 0;
-    
-  NS_IMETHOD MakeUniqueCursor( // clone cursor, removing duplicate rows
-    nsIMdbEnv* ev, // context
-    nsIMdbTableRowCursor** acqCursor) = 0;    // acquire clone with no dups
-    // Note that MakeUniqueCursor() is never necessary for a cursor which was
-    // created by table method nsIMdbTable::GetTableRowCursor(), because a table
-    // never contains the same row as a member more than once.  However, a cursor
-    // created by table method nsIMdbTable::FindRowMatches() might contain the
-    // same row more than once, because the same row can generate a hit by more
-    // than one column with a matching string prefix.  Note this method can
-    // return the very same cursor instance with just an incremented refcount,
-    // when the original cursor could not contain any duplicate rows (calling
-    // CanHaveDupRowMembers() shows this case on a false return).  Otherwise
-    // this method returns a different cursor instance.  Callers should not use
-    // this MakeUniqueCursor() method lightly, because it tends to defeat the
-    // purpose of lazy programming techniques, since it can force creation of
-    // an explicit row collection in a new cursor's representation, in order to
-    // inspect the row membership and remove any duplicates; this can have big
-    // impact if a collection holds tens of thousands of rows or more, when
-    // the original cursor with dups simply referenced rows indirectly by row
-    // position ranges, without using an explicit row set representation.
-    // Callers are encouraged to use nsIMdbCursor::GetCount() to determine
-    // whether the row collection is very large (tens of thousands), and to
-    // delay calling MakeUniqueCursor() when possible, until a user interface
-    // element actually demands the creation of an explicit set representation.
-  // } ----- 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) = 0;    // 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) = 0;    // 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) = 0;    // zero-based position of the row in table
-  // } ----- end oid iteration methods -----
-
-  // { ----- begin row iteration methods -----
-  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) = 0;    // zero-based position of the row in table
-
-  // } ----- end row iteration methods -----
-
-  // { ----- begin copy iteration methods -----
-  // NS_IMETHOD NextRowCopy( // put row cells into sink only when already in sink
-  //   nsIMdbEnv* ev, // context
-  //   nsIMdbRow* ioSinkRow, // sink for row cells read from next row
-  //   mdbOid* outOid, // out row oid
-  //   mdb_pos* outRowPos) = 0;    // zero-based position of the row in table
-  // 
-  // NS_IMETHOD NextRowCopyAll( // put all row cells into sink, adding to sink
-  //   nsIMdbEnv* ev, // context
-  //   nsIMdbRow* ioSinkRow, // sink for row cells read from next row
-  //   mdbOid* outOid, // out row oid
-  //   mdb_pos* outRowPos) = 0;    // zero-based position of the row in table
-  // } ----- end copy iteration methods -----
-
-// } ===== end nsIMdbTableRowCursor methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbTableRowCursor, NS_IMDBTABLEROWCURSOR_IID)
-
-/*| nsIMdbRow: a collection of cells
-**|
-|*/
-
-#define NS_IMDBROW_IID_STR "271e8d6e-183a-40e3-9f18-36913b4c7853"
-
-
-#define NS_IMDBROW_IID \
-{0x271e8d6e, 0x183a, 0x40e3, \
-{0x9f, 0x18, 0x36, 0x91, 0x3b, 0x4c, 0x78, 0x53}}
-
-
-class nsIMdbRow : public nsIMdbCollection { // cell tuple
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBROW_IID)
-// { ===== begin nsIMdbRow methods =====
-
-  // { ----- begin cursor methods -----
-  NS_IMETHOD GetRowCellCursor( // make a cursor starting iteration at inCellPos
-    nsIMdbEnv* ev, // context
-    mdb_pos inCellPos, // zero-based ordinal position of cell in row
-    nsIMdbRowCellCursor** acqCursor) = 0; // 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) = 0; // cell value to install
-
-  NS_IMETHOD CutColumn( // make sure a column is absent from the row
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn) = 0; // column to ensure absent from row
-
-  NS_IMETHOD CutAllColumns( // remove all columns from the row
-    nsIMdbEnv* ev) = 0; // 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) = 0; // cell column and value
-    
-  NS_IMETHOD AddCell( // copy a cell from another row to this row
-    nsIMdbEnv* ev, // context
-    const nsIMdbCell* inCell) = 0; // cell column and value
-    
-  NS_IMETHOD GetCell( // find a cell in this row
-    nsIMdbEnv* ev, // context
-    mdb_column inColumn, // column to find
-    nsIMdbCell** acqCell) = 0; // cell for specified column, or null
-    
-  NS_IMETHOD EmptyAllCells( // make all cells in row empty of content
-    nsIMdbEnv* ev) = 0; // context
-  // } ----- end cell methods -----
-
-  // { ----- begin row methods -----
-  NS_IMETHOD AddRow( // add all cells in another row to this one
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioSourceRow) = 0; // row to union with
-    
-  NS_IMETHOD SetRow( // make exact duplicate of another row
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioSourceRow) = 0; // 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) = 0;   // 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) = 0;  // 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) = 0; // writes ALL yarn slots
-  
-  NS_IMETHOD NextCellYarn(nsIMdbEnv* ev, // iterative version of GetCellYarn()
-    mdb_column* ioColumn, // next column to read
-    mdbYarn* outYarn) = 0;  // 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) = 0; // 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 =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbRow, NS_IMDBROW_IID)
-
-/*| nsIMdbRowCellCursor: cursor class for iterating row cells
-**|
-**|| row: the cursor is associated with a specific row, which can be
-**| set to a different row (which resets the position to -1 so the
-**| next cell acquired is the first in the row.
-**|
-**|| NextCell: get the next cell in the row and return its position and
-**| a new instance of a nsIMdbCell to represent this next cell.
-|*/
-
-#define NS_IMDBROWCELLCURSOR_IID_STR "b33371a7-5d63-4d10-85a8-e44dffe75c28"
-
-
-#define NS_IMDBROWCELLCURSOR_IID \
-{0x271e8d6e, 0x5d63, 0x4d10 , \
-{0x85, 0xa8, 0xe4, 0x4d, 0xff, 0xe7, 0x5c, 0x28}}
-
-
-class nsIMdbRowCellCursor : public nsISupports{ // cell collection iterator
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBROWCELLCURSOR_IID)
-// { ===== begin nsIMdbRowCellCursor methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD SetRow(nsIMdbEnv* ev, nsIMdbRow* ioRow) = 0; // sets pos to -1
-  NS_IMETHOD GetRow(nsIMdbEnv* ev, nsIMdbRow** acqRow) = 0;
-  // } ----- end attribute methods -----
-
-  // { ----- begin cell creation methods -----
-  NS_IMETHOD MakeCell( // get cell at current pos in the row
-    nsIMdbEnv* ev, // context
-    mdb_column* outColumn, // column for this particular cell
-    mdb_pos* outPos, // position of cell in row sequence
-    nsIMdbCell** acqCell) = 0; // the cell at inPos
-  // } ----- end cell creation methods -----
-
-  // { ----- begin cell seeking methods -----
-  NS_IMETHOD SeekCell( // same as SetRow() followed by MakeCell()
-    nsIMdbEnv* ev, // context
-    mdb_pos inPos, // position of cell in row sequence
-    mdb_column* outColumn, // column for this particular cell
-    nsIMdbCell** acqCell) = 0; // the cell at inPos
-  // } ----- end cell seeking methods -----
-
-  // { ----- begin cell iteration methods -----
-  NS_IMETHOD NextCell( // get next cell in the row
-    nsIMdbEnv* ev, // context
-    nsIMdbCell** acqCell, // changes to the next cell in the iteration
-    mdb_column* outColumn, // column for this particular cell
-    mdb_pos* outPos) = 0; // position of cell in row sequence
-    
-  NS_IMETHOD PickNextCell( // get next cell in row within filter set
-    nsIMdbEnv* ev, // context
-    nsIMdbCell* ioCell, // changes to the next cell in the iteration
-    const mdbColumnSet* inFilterSet, // col set of actual caller interest
-    mdb_column* outColumn, // column for this particular cell
-    mdb_pos* outPos) = 0; // position of cell in row sequence
-
-  // Note that inFilterSet should not have too many (many more than 10?)
-  // cols, since this might imply a potential excessive consumption of time
-  // over many cursor calls when looking for column and filter intersection.
-  // } ----- end cell iteration methods -----
-
-// } ===== end nsIMdbRowCellCursor methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbRowCellCursor, NS_IMDBROWCELLCURSOR_IID)
-
-/*| nsIMdbBlob: a base class for objects composed mainly of byte sequence state.
-**| (This provides a base class for nsIMdbCell, so that cells themselves can
-**| be used to set state in another cell, without extracting a buffer.)
-|*/
-class nsIMdbBlob : public nsISupports { // a string with associated charset
-public:
-
-// { ===== begin nsIMdbBlob methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD SetBlob(nsIMdbEnv* ev,
-    nsIMdbBlob* ioBlob) = 0; // reads inBlob slots
-  // when inBlob is in the same suite, this might be fastest cell-to-cell
-  
-  NS_IMETHOD ClearBlob( // make empty (so content has zero length)
-    nsIMdbEnv* ev) = 0;
-  // clearing a yarn is like SetYarn() with empty yarn instance content
-  
-  NS_IMETHOD GetBlobFill(nsIMdbEnv* ev,
-    mdb_fill* outFill) = 0;  // size of blob 
-  // Same value that would be put into mYarn_Fill, if one called GetYarn()
-  // with a yarn instance that had mYarn_Buf==nil and mYarn_Size==0.
-  
-  NS_IMETHOD SetYarn(nsIMdbEnv* ev, 
-    const mdbYarn* inYarn) = 0;   // reads from yarn slots
-  // make this text object contain content from the yarn's buffer
-  
-  NS_IMETHOD GetYarn(nsIMdbEnv* ev, 
-    mdbYarn* outYarn) = 0;  // writes some yarn slots 
-  // copy content into the yarn buffer, and update mYarn_Fill and mYarn_Form
-  
-  NS_IMETHOD AliasYarn(nsIMdbEnv* ev, 
-    mdbYarn* outYarn) = 0; // writes ALL yarn slots
-  // AliasYarn() reveals sensitive internal text buffer state to the caller
-  // by setting mYarn_Buf to point into the guts of this text implementation.
-  //
-  // The caller must take great care to avoid writing on this space, and to
-  // avoid calling any method that would cause the state of this text object
-  // to change (say by directly or indirectly setting the text to hold more
-  // content that might grow the size of the buffer and free the old buffer).
-  // In particular, callers should scrupulously avoid making calls into the
-  // mdb interface to write any content while using the buffer pointer found
-  // in the returned yarn instance.  Best safe usage involves copying content
-  // into some other kind of external content representation beyond mdb.
-  //
-  // (The original design of this method a week earlier included the concept
-  // of very fast and efficient cooperative locking via a pointer to some lock
-  // member slot.  But let's ignore that complexity in the current design.)
-  //
-  // AliasYarn() is specifically intended as the first step in transferring
-  // content from nsIMdbBlob to a nsString representation, without forcing extra
-  // allocations and/or memory copies. (A standard nsIMdbBlob_AsString() utility
-  // will use AliasYarn() as the first step in setting a nsString instance.)
-  //
-  // This is an alternative to the GetYarn() method, which has copy semantics
-  // only; AliasYarn() relaxes a robust safety principle only for performance
-  // reasons, to accomodate the need for callers to transform text content to
-  // some other canonical representation that would necessitate an additional
-  // copy and transformation when such is incompatible with the mdbYarn format.
-  //
-  // The implementation of AliasYarn() should have extremely little overhead
-  // besides the virtual dispatch to the method implementation, and the code
-  // necessary to populate all the mdbYarn member slots with internal buffer
-  // address and metainformation that describes the buffer content.  Note that
-  // mYarn_Grow must always be set to nil to indicate no resizing is allowed.
-  
-  // } ----- end attribute methods -----
-
-// } ===== end nsIMdbBlob methods =====
-};
-
-/*| nsIMdbCell: the text in a single column of a row.  The base nsIMdbBlob
-**| class provides all the interface related to accessing cell text.
-**|
-**|| column: each cell in a row appears in a specific column, where this
-**| column is identified by the an integer mdb_scope value (generated by
-**| the StringToScopeToken() method in the containing nsIMdbPort instance).
-**| Because a row cannot have more than one cell with the same column,
-**| something must give if one calls SetColumn() with an existing column
-**| in the same row. When this happens, the other cell is replaced with
-**| this cell (and the old cell is closed if it has outstanding refs).
-**|
-**|| row: every cell instance is a part of some row, and every cell knows
-**| which row is the parent row.  (Note this should be represented by a
-**| weak backpointer, so that outstanding cell references cannot keep a
-**| row open that should be closed. Otherwise we'd have ref graph cycles.)
-**|
-**|| text: a cell can either be text, or it can have a child row or table,
-**| but not both at once.  If text is read from a cell with a child, the text
-**| content should be empty (for AliasYarn()) or a description of the type
-**| of child (perhaps "mdb:cell:child:row" or "mdb:cell:child:table").
-**|
-**|| child: a cell might reference another row or a table, rather than text.
-**| The interface for putting and getting children rows and tables was first
-**| defined in the nsIMdbTable interface, but then this was moved to this cell
-**| interface as more natural. 
-|*/
-
-
-
-#define NS_IMDBCELL_IID \
-{0xa3b62f71, 0xa181, 0x4a91, \
-{0xb6, 0x6b, 0x27, 0x10, 0x9b, 0x88, 0x98, 0x35}}
-
-#define NS_IMDBCELL_IID_STR = "a3b62f71-a181-4a91-b66b-27109b889835"
-
-class nsIMdbCell : public nsIMdbBlob { // text attribute in row with column scope
-public:
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBTABLEROWCURSOR_IID)
-// { ===== begin nsIMdbCell methods =====
-
-  // { ----- begin attribute methods -----
-  NS_IMETHOD SetColumn(nsIMdbEnv* ev, mdb_column inColumn) = 0; 
-  NS_IMETHOD GetColumn(nsIMdbEnv* ev, mdb_column* outColumn) = 0;
-  
-  NS_IMETHOD GetCellInfo(  // all cell metainfo except actual content
-    nsIMdbEnv* ev, 
-    mdb_column* outColumn,           // the column in the containing row
-    mdb_fill*   outBlobFill,         // the size of text content in bytes
-    mdbOid*     outChildOid,         // oid of possible row or table child
-    mdb_bool*   outIsRowChild) = 0;  // nonzero if child, and a row child
-
-  // Checking all cell metainfo is a good way to avoid forcing a large cell
-  // in to memory when you don't actually want to use the content.
-  
-  NS_IMETHOD GetRow(nsIMdbEnv* ev, // parent row for this cell
-    nsIMdbRow** acqRow) = 0;
-  NS_IMETHOD GetPort(nsIMdbEnv* ev, // port containing cell
-    nsIMdbPort** acqPort) = 0;
-  // } ----- end attribute methods -----
-
-  // { ----- begin children methods -----
-  NS_IMETHOD HasAnyChild( // does cell have a child instead of text?
-    nsIMdbEnv* ev,
-    mdbOid* outOid,  // out id of row or table (or unbound if no child)
-    mdb_bool* outIsRow) = 0; // nonzero if child is a row (rather than a table)
-
-  NS_IMETHOD GetAnyChild( // access table of specific attribute
-    nsIMdbEnv* ev, // context
-    nsIMdbRow** acqRow, // child row (or null)
-    nsIMdbTable** acqTable) = 0; // child table (or null)
-
-
-  NS_IMETHOD SetChildRow( // access table of specific attribute
-    nsIMdbEnv* ev, // context
-    nsIMdbRow* ioRow) = 0; // inRow must be bound inside this same db port
-
-  NS_IMETHOD GetChildRow( // access row of specific attribute
-    nsIMdbEnv* ev, // context
-    nsIMdbRow** acqRow) = 0; // acquire child row (or nil if no child)
-
-
-  NS_IMETHOD SetChildTable( // access table of specific attribute
-    nsIMdbEnv* ev, // context
-    nsIMdbTable* inTable) = 0; // table must be bound inside this same db port
-
-  NS_IMETHOD GetChildTable( // access table of specific attribute
-    nsIMdbEnv* ev, // context
-    nsIMdbTable** acqTable) = 0; // acquire child table (or nil if no child)
-  // } ----- end children methods -----
-
-// } ===== end nsIMdbCell methods =====
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbCell, NS_IMDBTABLEROWCURSOR_IID)
-
-// } %%%%% end C++ abstract class interfaces %%%%%
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MDB_ */
-
deleted file mode 100644
--- a/db/mork/Makefile.in
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-DEPTH		= ../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-DIRS		= src build
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/db/mork/build/Makefile.in
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-DEPTH		= ../../..
-topsrcdir	= @top_srcdir@
-VPATH		= @srcdir@
-srcdir		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-MODULE		= mork
-LIBRARY_NAME	= mork
-EXPORT_LIBRARY = 1
-IS_COMPONENT	= 1
-MODULE_NAME	= nsMorkModule
-LIBXUL_LIBRARY = 1
-
-
-CPPSRCS		= nsMorkFactory.cpp
-
-EXPORTS		= \
-		nsMorkCID.h \
-		nsIMdbFactoryFactory.h \
-		$(NULL)
-
-SHARED_LIBRARY_LIBS = ../src/$(LIB_PREFIX)msgmork_s.$(LIB_SUFFIX)
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/db/mork/build/nsIMdbFactoryFactory.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef nsIMdbFactoryFactory_h__
-#define nsIMdbFactoryFactory_h__
-
-#include "nsISupports.h"
-#include "nsIFactory.h"
-#include "nsIComponentManager.h"
-
-class nsIMdbFactory;
-
-// 2794D0B7-E740-47a4-91C0-3E4FCB95B806
-#define NS_IMDBFACTORYFACTORY_IID          \
-{ 0x2794d0b7, 0xe740, 0x47a4, { 0x91, 0xc0, 0x3e, 0x4f, 0xcb, 0x95, 0xb8, 0x6 } }
-
-// because Mork doesn't support XPCOM, we have to wrap the mdb factory interface
-// with an interface that gives you an mdb factory.
-class nsIMdbFactoryService : public nsISupports
-{
-public:
-  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IMDBFACTORYFACTORY_IID)
-  NS_IMETHOD GetMdbFactory(nsIMdbFactory **aFactory) = 0;
-};
-
-NS_DEFINE_STATIC_IID_ACCESSOR(nsIMdbFactoryService, NS_IMDBFACTORYFACTORY_IID)
-
-#endif
deleted file mode 100644
--- a/db/mork/build/nsMorkCID.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef nsMorkCID_h__
-#define nsMorkCID_h__
-
-#include "nsISupports.h"
-#include "nsIFactory.h"
-#include "nsIComponentManager.h"
-
-#define NS_MORK_CONTRACTID \
-  "@mozilla.org/db/mork;1"
-
-// 36d90300-27f5-11d3-8d74-00805f8a6617
-#define NS_MORK_CID                      \
-{ 0x36d90300, 0x27f5, 0x11d3,                  \
-    { 0x8d, 0x74, 0x00, 0x80, 0x5f, 0x8a, 0x66, 0x17 } }
-
-#endif
deleted file mode 100644
--- a/db/mork/build/nsMorkFactory.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Pierre Phaneuf <pp@ludusdesign.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "mozilla/ModuleUtils.h"
-#include "nsCOMPtr.h"
-#include "nsMorkCID.h"
-#include "nsIMdbFactoryFactory.h"
-#include "mdb.h"
-
-class nsMorkFactoryService : public nsIMdbFactoryService
-{
-public:
-  nsMorkFactoryService() {};
-  // nsISupports methods
-  NS_DECL_ISUPPORTS 
-
-  NS_IMETHOD GetMdbFactory(nsIMdbFactory **aFactory);
-
-protected:
-  nsCOMPtr<nsIMdbFactory> mMdbFactory;
-};
-
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsMorkFactoryService)
-
-NS_DEFINE_NAMED_CID(NS_MORK_CID);
-
-const mozilla::Module::CIDEntry kMorkCIDs[] = {
-  { &kNS_MORK_CID, false, NULL, nsMorkFactoryServiceConstructor },
-  { NULL }
-};
-
-const mozilla::Module::ContractIDEntry kMorkContracts[] = {
-  { NS_MORK_CONTRACTID, &kNS_MORK_CID },
-  { NULL }
-};
-
-static const mozilla::Module kMorkModule = {
-  mozilla::Module::kVersion,
-  kMorkCIDs,
-  kMorkContracts
-};
-
-NSMODULE_DEFN(nsMorkModule) = &kMorkModule;
-
-NS_IMPL_ISUPPORTS1(nsMorkFactoryService, nsIMdbFactoryService)
-
-NS_IMETHODIMP nsMorkFactoryService::GetMdbFactory(nsIMdbFactory **aFactory)
-{
-  if (!mMdbFactory)
-    mMdbFactory = MakeMdbFactory();
-  NS_IF_ADDREF(*aFactory = mMdbFactory);
-  return *aFactory ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
-}
deleted file mode 100644
--- a/db/mork/src/Makefile.in
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-DEPTH		= ../../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-MODULE		= mork
-LIBRARY_NAME	= msgmork_s
-FORCE_STATIC_LIB=1
-LIBXUL_LIBRARY	= 1
-
-CPPSRCS		= \
-		orkinHeap.cpp \
-		morkArray.cpp \
-		morkAtom.cpp \
-		morkAtomMap.cpp \
-		morkAtomSpace.cpp \
-		morkBlob.cpp \
-		morkBuilder.cpp \
-		morkCell.cpp \
-		morkCellObject.cpp \
-		morkCh.cpp \
-		morkConfig.cpp \
-		morkCursor.cpp \
-		morkDeque.cpp \
-		morkEnv.cpp \
-		morkFactory.cpp \
-		morkFile.cpp \
-		morkHandle.cpp \
-		morkIntMap.cpp \
-		morkMap.cpp \
-		morkNode.cpp \
-		morkNodeMap.cpp \
-		morkObject.cpp \
-		morkParser.cpp \
-		morkPool.cpp \
-		morkRow.cpp \
-		morkRowCellCursor.cpp \
-		morkRowMap.cpp \
-		morkRowObject.cpp \
-		morkRowSpace.cpp \
-		morkSink.cpp \
-		morkSpace.cpp \
-		morkStore.cpp \
-		morkStream.cpp \
-		morkTable.cpp \
-		morkPortTableCursor.cpp \
-		morkTableRowCursor.cpp \
-		morkThumb.cpp \
-		morkWriter.cpp \
-		morkYarn.cpp \
-		morkBead.cpp \
-		morkProbeMap.cpp \
-		morkZone.cpp \
-		$(NULL)
-
-ifeq ($(OS_ARCH),WINNT)
-CPPSRCS		+= morkSearchRowCursor.cpp
-endif
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/db/mork/src/mork.h
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORK_
-#define _MORK_ 1
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#include "nscore.h"
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
-// { %%%%% begin disable unused param warnings %%%%%
-#define MORK_USED_1(x) (void)(&x)
-#define MORK_USED_2(x,y) (void)(&x);(void)(&y);
-#define MORK_USED_3(x,y,z) (void)(&x);(void)(&y);(void)(&z);
-#define MORK_USED_4(w,x,y,z) (void)(&w);(void)(&x);(void)(&y);(void)(&z);
-
-// } %%%%% end disable unused param warnings %%%%%
-
-// { %%%%% begin macro for finding class member offset %%%%%
-
-/*| OffsetOf: the unsigned integer offset of a class or struct
-**| field from the beginning of that class or struct.  This is
-**| the same as the similarly named public domain IronDoc macro,
-**| and is also the same as another macro appearing in stdlib.h.
-**| We want these offsets so we can correctly convert pointers
-**| to member slots back into pointers to enclosing objects, and
-**| have this exactly match what the compiler thinks is true.
-**|
-**|| Bascially we are asking the compiler to determine the offset at
-**| compile time, and we use the definition of address artithmetic
-**| to do this.  By casting integer zero to a pointer of type obj*,
-**| we can reference the address of a slot in such an object that
-**| is hypothetically physically placed at address zero, but without
-**| actually dereferencing a memory location.  The absolute address
-**| of slot is the same as offset of that slot, when the object is
-**| placed at address zero.
-|*/
-#define mork_OffsetOf(obj,slot) ((unsigned int)&((obj*) 0)->slot)
-
-// } %%%%% end macro for finding class member offset %%%%%
-
-// { %%%%% begin specific-size integer scalar typedefs %%%%%
-typedef unsigned char  mork_u1;  // make sure this is one byte
-typedef unsigned short mork_u2;  // make sure this is two bytes
-typedef short          mork_i2;  // make sure this is two bytes
-typedef PRUint32       mork_u4;  // make sure this is four bytes
-typedef PRInt32        mork_i4;  // make sure this is four bytes
-typedef PRWord         mork_ip;  // make sure sizeof(mork_ip) == sizeof(void*)
-
-typedef mork_u1 mork_ch;    // small byte-sized character (never wide)
-typedef mork_u1 mork_flags;  // one byte's worth of predicate bit flags
-
-typedef mork_u2 mork_base;    // 2-byte magic class signature slot in object
-typedef mork_u2 mork_derived; // 2-byte magic class signature slot in object
-typedef mork_u2 mork_uses;    // 2-byte strong uses count
-typedef mork_u2 mork_refs;    // 2-byte actual reference count
-
-typedef mork_u4 mork_token;      // unsigned token for atomized string
-typedef mork_token mork_scope;   // token used to id scope for rows
-typedef mork_token mork_kind;    // token used to id kind for tables
-typedef mork_token mork_cscode;  // token used to id charset names
-typedef mork_token mork_aid;     // token used to id atomize cell values
-
-typedef mork_token mork_column;  // token used to id columns for rows
-typedef mork_column mork_delta;  // mork_column plus mork_change 
-
-typedef mork_token mork_color;   // bead ID
-#define morkColor_kNone ((mork_color) 0)
-
-typedef mork_u4 mork_magic;      // unsigned magic signature
-
-typedef mork_u4 mork_seed;       // unsigned collection change counter
-typedef mork_u4 mork_count;      // unsigned collection member count
-typedef mork_count mork_num;     // synonym for count
-typedef mork_u4 mork_size;       // unsigned physical media size
-typedef mork_u4 mork_fill;       // unsigned logical content size
-typedef mork_u4 mork_more;       // more available bytes for larger buffer
-
-typedef mdb_u4 mork_percent; // 0..100, with values >100 same as 100
-
-typedef mork_i4 mork_pos; // negative means "before first" (at zero pos)
-typedef mork_i4 mork_line; // negative means "before first line in file"
-
-typedef mork_u1 mork_usage;   // 1-byte magic usage signature slot in object
-typedef mork_u1 mork_access;  // 1-byte magic access signature slot in object
-
-typedef mork_u1 mork_change; // add, cut, put, set, nil
-typedef mork_u1 mork_priority; // 0..9, for a total of ten different values
-
-typedef mork_u1 mork_able; // on, off, asleep (clone IronDoc's fe_able)
-typedef mork_u1 mork_load; // dirty or clean (clone IronDoc's fe_load)
-// } %%%%% end specific-size integer scalar typedefs %%%%%
-
-// 'test' is a public domain Mithril for key equality tests in probe maps
-typedef mork_i2 mork_test; /* neg=>kVoid, zero=>kHit, pos=>kMiss */
-
-#define morkTest_kVoid ((mork_test) -1) /* -1: nil key slot, no key order */
-#define morkTest_kHit  ((mork_test) 0)  /*  0: keys are equal, a map hit */
-#define morkTest_kMiss ((mork_test) 1)  /*  1: keys not equal, a map miss */
-
-// { %%%%% begin constants for Mork scalar types %%%%%
-#define morkPriority_kHi  ((mork_priority) 0) /* best priority */
-#define morkPriority_kMin ((mork_priority) 0) /* best priority is smallest */
-
-#define morkPriority_kLo  ((mork_priority) 9) /* worst priority */
-#define morkPriority_kMax ((mork_priority) 9) /* worst priority is biggest */
-
-#define morkPriority_kCount 10 /* number of distinct priority values */
-
-#define morkAble_kEnabled  ((mork_able) 0x55) /* same as IronDoc constant */
-#define morkAble_kDisabled ((mork_able) 0xAA) /* same as IronDoc constant */
-#define morkAble_kAsleep   ((mork_able) 0x5A) /* same as IronDoc constant */
-
-#define morkChange_kAdd 'a' /* add member */
-#define morkChange_kCut 'c' /* cut member */
-#define morkChange_kPut 'p' /* put member */
-#define morkChange_kSet 's' /* set all members */
-#define morkChange_kNil 0   /* no change in this member */
-#define morkChange_kDup 'd' /* duplicate changes have no effect */
-// kDup is intended to replace another change constant in an object as a
-// conclusion about change feasibility while staging intended alterations.
-
-#define morkLoad_kDirty ((mork_load) 0xDD) /* same as IronDoc constant */
-#define morkLoad_kClean ((mork_load) 0x22) /* same as IronDoc constant */
-
-#define morkAccess_kOpen    'o'
-#define morkAccess_kClosing 'c'
-#define morkAccess_kShut    's'
-#define morkAccess_kDead    'd'
-// } %%%%% end constants for Mork scalar types %%%%%
-
-// { %%%%% begin non-specific-size integer scalar typedefs %%%%%
-typedef int mork_char; // nominal type for ints used to hold input byte
-#define morkChar_IsWhite(c) \
-  ((c) == 0xA || (c) == 0x9 || (c) == 0xD || (c) == ' ')
-// } %%%%% end non-specific-size integer scalar typedefs %%%%%
-
-// { %%%%% begin mdb-driven scalar typedefs %%%%%
-// easier to define bool exactly the same as mdb:
-typedef mdb_bool mork_bool; // unsigned byte with zero=false, nonzero=true
-
-/* canonical boolean constants provided only for code clarity: */
-#define morkBool_kTrue  ((mork_bool) 1) /* actually any nonzero means true */
-#define morkBool_kFalse ((mork_bool) 0) /* only zero means false */
-
-// mdb clients can assign these, so we cannot pick maximum size:
-typedef mdb_id mork_id;    // unsigned object identity in a scope
-typedef mork_id mork_rid;  // unsigned row identity inside scope
-typedef mork_id mork_tid;  // unsigned table identity inside scope
-typedef mork_id mork_gid;  // unsigned group identity without any scope
-
-// we only care about neg, zero, pos -- so we don't care about size:
-typedef mdb_order mork_order; // neg:lessthan, zero:equalto, pos:greaterthan 
-// } %%%%% end mdb-driven scalar typedefs %%%%%
-
-#define morkId_kMinusOne ((mdb_id) -1)
-
-// { %%%%% begin class forward defines %%%%%
-// try to put these in alphabetical order for easier examination:
-class morkMid;
-class morkAtom;
-class morkAtomSpace;
-class morkBookAtom;
-class morkBuf;
-class morkBuilder;
-class morkCell;
-class morkCellObject;
-class morkCursor;
-class morkEnv;
-class morkFactory;
-class morkFile;
-class morkHandle;
-class morkHandleFace; // just an opaque cookie type
-class morkHandleFrame;
-class morkHashArrays;
-class morkMap;
-class morkNode;
-class morkObject;
-class morkOidAtom;
-class morkParser;
-class morkPool;
-class morkPlace;
-class morkPort;
-class morkPortTableCursor;
-class morkProbeMap;
-class morkRow;
-class morkRowCellCursor;
-class morkRowObject;
-class morkRowSpace;
-class morkSorting;
-class morkSortingRowCursor;
-class morkSpace;
-class morkSpan;
-class morkStore;
-class morkStream;
-class morkTable;
-class morkTableChange;
-class morkTableRowCursor;
-class morkThumb;
-class morkWriter;
-class morkZone;
-// } %%%%% end class forward defines %%%%%
-
-// include this config file last for platform & environment specific stuff:
-#ifndef _MORKCONFIG_
-#include "morkConfig.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORK_ */
deleted file mode 100644
--- a/db/mork/src/morkArray.cpp
+++ /dev/null
@@ -1,334 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nscore.h"
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKARRAY_
-#include "morkArray.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkArray::CloseMorkNode(morkEnv* ev) // CloseTable() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseArray(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkArray::~morkArray() // assert CloseTable() executed earlier
-{
-  MORK_ASSERT(this->IsShutNode());
-  MORK_ASSERT(mArray_Slots==0);
-}
-
-/*public non-poly*/
-morkArray::morkArray(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, mork_size inSize, nsIMdbHeap* ioSlotHeap)
-: morkNode(ev, inUsage, ioHeap)
-, mArray_Slots( 0 )
-, mArray_Heap( 0 )
-, mArray_Fill( 0 )
-, mArray_Size( 0 )
-, mArray_Seed( (mork_u4)NS_PTR_TO_INT32(this) ) // "random" integer assignment
-{
-  if ( ev->Good() )
-  {
-    if ( ioSlotHeap )
-    {
-      nsIMdbHeap_SlotStrongHeap(ioSlotHeap, ev, &mArray_Heap);
-      if ( ev->Good() )
-      {
-        if ( inSize < 3 )
-          inSize = 3;
-        mdb_size byteSize = inSize * sizeof(void*);
-        void** block = 0;
-        ioSlotHeap->Alloc(ev->AsMdbEnv(), byteSize, (void**) &block);
-        if ( block && ev->Good() )
-        {
-          mArray_Slots = block;
-          mArray_Size = inSize;
-          MORK_MEMSET(mArray_Slots, 0, byteSize);
-          if ( ev->Good() )
-            mNode_Derived = morkDerived_kArray;
-        }
-      }
-    }
-    else
-      ev->NilPointerError();
-  }
-}
-
-/*public non-poly*/ void
-morkArray::CloseArray(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      if ( mArray_Heap && mArray_Slots )
-        mArray_Heap->Free(ev->AsMdbEnv(), mArray_Slots);
-        
-      mArray_Slots = 0;
-      mArray_Size = 0;
-      mArray_Fill = 0;
-      ++mArray_Seed;
-      nsIMdbHeap_SlotStrongHeap((nsIMdbHeap*) 0, ev, &mArray_Heap);
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-/*static*/ void
-morkArray::NonArrayTypeError(morkEnv* ev)
-{
-  ev->NewError("non morkArray");
-}
-
-/*static*/ void
-morkArray::IndexBeyondEndError(morkEnv* ev)
-{
-  ev->NewError("array index beyond end");
-}
-
-/*static*/ void
-morkArray::NilSlotsAddressError(morkEnv* ev)
-{
-  ev->NewError("nil mArray_Slots");
-}
-
-/*static*/ void
-morkArray::FillBeyondSizeError(morkEnv* ev)
-{
-  ev->NewError("mArray_Fill > mArray_Size");
-}
-
-mork_bool
-morkArray::Grow(morkEnv* ev, mork_size inNewSize)
-// Grow() returns true if capacity becomes >= inNewSize and ev->Good()
-{
-  if ( ev->Good() && inNewSize > mArray_Size ) // make array larger?
-  {
-    if ( mArray_Fill <= mArray_Size ) // fill and size fit the invariant?
-    {
-      if (mArray_Size <= 3)
-        inNewSize = mArray_Size + 3;
-      else
-        inNewSize = mArray_Size  * 2;// + 3;  // try doubling size here - used to grow by 3
-        
-      mdb_size newByteSize = inNewSize * sizeof(void*);
-      void** newBlock = 0;
-      mArray_Heap->Alloc(ev->AsMdbEnv(), newByteSize, (void**) &newBlock);
-      if ( newBlock && ev->Good() ) // okay new block?
-      {
-        void** oldSlots = mArray_Slots;
-        void** oldEnd = oldSlots + mArray_Fill;
-        
-        void** newSlots = newBlock;
-        void** newEnd = newBlock + inNewSize;
-        
-        while ( oldSlots < oldEnd )
-          *newSlots++ = *oldSlots++;
-          
-        while ( newSlots < newEnd )
-          *newSlots++ = (void*) 0;
-
-        oldSlots = mArray_Slots;
-        mArray_Size = inNewSize;
-        mArray_Slots = newBlock;
-        mArray_Heap->Free(ev->AsMdbEnv(), oldSlots);
-      }
-    }
-    else
-      this->FillBeyondSizeError(ev);
-  }
-  ++mArray_Seed; // always modify seed, since caller intends to add slots
-  return ( ev->Good() && mArray_Size >= inNewSize );
-}
-
-void*
-morkArray::SafeAt(morkEnv* ev, mork_pos inPos)
-{
-  if ( mArray_Slots )
-  {
-    if ( inPos >= 0 && inPos < (mork_pos) mArray_Fill )
-      return mArray_Slots[ inPos ];
-    else
-      this->IndexBeyondEndError(ev);
-  }
-  else
-    this->NilSlotsAddressError(ev);
-    
-  return (void*) 0;
-}
-
-void
-morkArray::SafeAtPut(morkEnv* ev, mork_pos inPos, void* ioSlot)
-{
-  if ( mArray_Slots )
-  {
-    if ( inPos >= 0 && inPos < (mork_pos) mArray_Fill )
-    {
-      mArray_Slots[ inPos ] = ioSlot;
-      ++mArray_Seed;
-    }
-    else
-      this->IndexBeyondEndError(ev);
-  }
-  else
-    this->NilSlotsAddressError(ev);
-}
-
-mork_pos
-morkArray::AppendSlot(morkEnv* ev, void* ioSlot)
-{
-  mork_pos outPos = -1;
-  if ( mArray_Slots )
-  {
-    mork_fill fill = mArray_Fill;
-    if ( this->Grow(ev, fill+1) )
-    {
-      outPos = (mork_pos) fill;
-      mArray_Slots[ fill ] = ioSlot;
-      mArray_Fill = fill + 1;
-      // note Grow() increments mArray_Seed
-    }
-  }
-  else
-    this->NilSlotsAddressError(ev);
-    
-  return outPos;
-}
-
-void
-morkArray::AddSlot(morkEnv* ev, mork_pos inPos, void* ioSlot)
-{
-  if ( mArray_Slots )
-  {
-    mork_fill fill = mArray_Fill;
-    if ( this->Grow(ev, fill+1) )
-    {
-      void** slot = mArray_Slots; // the slot vector
-      void** end = slot + fill; // one past the last used array slot
-      slot += inPos; // the slot to be added
-
-      while ( --end >= slot ) // another slot to move upward?
-        end[ 1 ] = *end;
-
-      *slot = ioSlot;
-      mArray_Fill = fill + 1;
-      // note Grow() increments mArray_Seed
-    }
-  }
-  else
-    this->NilSlotsAddressError(ev);
-}
-
-void
-morkArray::CutSlot(morkEnv* ev, mork_pos inPos)
-{
-  MORK_USED_1(ev);
-  mork_fill fill = mArray_Fill;
-  if ( inPos >= 0 && inPos < (mork_pos) fill ) // cutting slot in used array portion?
-  {
-    void** slot = mArray_Slots; // the slot vector
-    void** end = slot + fill; // one past the last used array slot
-    slot += inPos; // the slot to be cut
-    
-    while ( ++slot < end ) // another slot to move downward?
-      slot[ -1 ] = *slot;
-      
-    slot[ -1 ] = 0; // clear the last used slot which is now unused
-    
-    // note inPos<fill implies fill>0, so fill-1 must be nonnegative:
-    mArray_Fill = fill - 1;
-    ++mArray_Seed;
-  }
-}
-
-void
-morkArray::CutAllSlots(morkEnv* ev)
-{
-  if ( mArray_Slots )
-  {
-    if ( mArray_Fill <= mArray_Size )
-    {
-      mdb_size oldByteSize = mArray_Fill * sizeof(void*);
-      MORK_MEMSET(mArray_Slots, 0, oldByteSize);
-    }
-    else
-      this->FillBeyondSizeError(ev);
-  }
-  else
-    this->NilSlotsAddressError(ev);
-
-  ++mArray_Seed;
-  mArray_Fill = 0;
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
deleted file mode 100644
--- a/db/mork/src/morkArray.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKARRAY_
-#define _MORKARRAY_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kArray  /*i*/ 0x4179 /* ascii 'Ay' */
-
-class morkArray : public morkNode { // 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
-
-public: // state is public because the entire Mork system is private
-  void**       mArray_Slots; // array of pointers
-  nsIMdbHeap*  mArray_Heap;  // required heap for allocating mArray_Slots
-  mork_fill    mArray_Fill;  // logical count of used slots in mArray_Slots
-  mork_size    mArray_Size;  // physical count of mArray_Slots ( >= Fill)
-  mork_seed    mArray_Seed;  // change counter for syncing with iterators
-  
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseArray()
-  virtual ~morkArray(); // assert that close executed earlier
-  
-public: // morkArray construction & destruction
-  morkArray(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, mork_size inSize, nsIMdbHeap* ioSlotHeap);
-  void CloseArray(morkEnv* ev); // called by CloseMorkNode();
-
-private: // copying is not allowed
-  morkArray(const morkArray& other);
-  morkArray& operator=(const morkArray& other);
-
-public: // dynamic type identification
-  mork_bool IsArray() const
-  { return IsNode() && mNode_Derived == morkDerived_kArray; }
-// } ===== end morkNode methods =====
-
-public: // typing & errors
-  static void NonArrayTypeError(morkEnv* ev);
-  static void IndexBeyondEndError(morkEnv* ev);
-  static void NilSlotsAddressError(morkEnv* ev);
-  static void FillBeyondSizeError(morkEnv* ev);
-
-public: // other table row cursor methods
-
-  mork_fill  Length() const { return mArray_Fill; }
-  mork_size  Capacity() const { return mArray_Size; }
-  
-  mork_bool  Grow(morkEnv* ev, mork_size inNewSize);
-  // Grow() returns true if capacity becomes >= inNewSize and ev->Good()
-  
-  void*      At(mork_pos inPos) const { return mArray_Slots[ inPos ]; }
-  void       AtPut(mork_pos inPos, void* ioSlot)
-  { mArray_Slots[ inPos ] = ioSlot; }
-  
-  void*      SafeAt(morkEnv* ev, mork_pos inPos);
-  void       SafeAtPut(morkEnv* ev, mork_pos inPos, void* ioSlot);
-  
-  mork_pos   AppendSlot(morkEnv* ev, void* ioSlot);
-  void       AddSlot(morkEnv* ev, mork_pos inPos, void* ioSlot);
-  void       CutSlot(morkEnv* ev, mork_pos inPos);
-  void       CutAllSlots(morkEnv* ev);
-
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakArray(morkArray* me,
-    morkEnv* ev, morkArray** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongArray(morkArray* me,
-    morkEnv* ev, morkArray** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKTABLEROWCURSOR_ */
deleted file mode 100644
--- a/db/mork/src/morkAtom.cpp
+++ /dev/null
@@ -1,604 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKBLOB_
-#include "morkBlob.h"
-#endif
-
-#ifndef _MORKATOM_
-#include "morkAtom.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKATOMSPACE_
-#include "morkAtomSpace.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-mork_bool
-morkAtom::GetYarn(mdbYarn* outYarn) const
-{
-  const void* source = 0;  
-  mdb_fill fill = 0; 
-  mdb_cscode form = 0;
-  outYarn->mYarn_More = 0;
-
-  if ( this )
-  {
-    if ( this->IsWeeBook() )
-    {
-      morkWeeBookAtom* weeBook = (morkWeeBookAtom*) this;
-      source = weeBook->mWeeBookAtom_Body;
-      fill = weeBook->mAtom_Size;
-    }
-    else if ( this->IsBigBook() )
-    {
-      morkBigBookAtom* bigBook = (morkBigBookAtom*) this;
-      source = bigBook->mBigBookAtom_Body;
-      fill = bigBook->mBigBookAtom_Size;
-      form = bigBook->mBigBookAtom_Form;
-    }
-    else if ( this->IsWeeAnon() )
-    {
-      morkWeeAnonAtom* weeAnon = (morkWeeAnonAtom*) this;
-      source = weeAnon->mWeeAnonAtom_Body;
-      fill = weeAnon->mAtom_Size;
-    }
-    else if ( this->IsBigAnon() )
-    {
-      morkBigAnonAtom* bigAnon = (morkBigAnonAtom*) this;
-      source = bigAnon->mBigAnonAtom_Body;
-      fill = bigAnon->mBigAnonAtom_Size;
-      form = bigAnon->mBigAnonAtom_Form;
-    }
-  }
-  if ( source && fill ) // have an atom with nonempty content?
-  {
-    // if we have too many bytes, and yarn seems growable:
-    if ( fill > outYarn->mYarn_Size && outYarn->mYarn_Grow ) // try grow?
-      (*outYarn->mYarn_Grow)(outYarn, (mdb_size) fill); // request bigger
-      
-    mdb_size size = outYarn->mYarn_Size; // max dest size
-    if ( fill > size ) // too much atom content?
-    {
-      outYarn->mYarn_More = fill - size; // extra atom bytes omitted
-      fill = size; // copy no more bytes than size of yarn buffer
-    }
-    void* dest = outYarn->mYarn_Buf; // where bytes are going
-    if ( !dest ) // nil destination address buffer?
-      fill = 0; // we can't write any content at all
-      
-    if ( fill ) // anything to copy?
-      MORK_MEMCPY(dest, source, fill); // copy fill bytes to yarn
-      
-    outYarn->mYarn_Fill = fill; // tell yarn size of copied content
-  }
-  else // no content to put into the yarn
-  {
-    outYarn->mYarn_Fill = 0; // tell yarn that atom has no bytes
-  }
-  outYarn->mYarn_Form = form; // always update the form slot
-  
-  return ( source != 0 );
-}
-
-mork_bool
-morkAtom::AsBuf(morkBuf& outBuf) const
-{
-  const morkAtom* atom = this;
-  if ( atom )
-  {
-    if ( atom->IsWeeBook() )
-    {
-      morkWeeBookAtom* weeBook = (morkWeeBookAtom*) atom;
-      outBuf.mBuf_Body = weeBook->mWeeBookAtom_Body;
-      outBuf.mBuf_Fill = weeBook->mAtom_Size;
-    }
-    else if ( atom->IsBigBook() )
-    {
-      morkBigBookAtom* bigBook = (morkBigBookAtom*) atom;
-      outBuf.mBuf_Body = bigBook->mBigBookAtom_Body;
-      outBuf.mBuf_Fill = bigBook->mBigBookAtom_Size;
-    }
-    else if ( atom->IsWeeAnon() )
-    {
-      morkWeeAnonAtom* weeAnon = (morkWeeAnonAtom*) atom;
-      outBuf.mBuf_Body = weeAnon->mWeeAnonAtom_Body;
-      outBuf.mBuf_Fill = weeAnon->mAtom_Size;
-    }
-    else if ( atom->IsBigAnon() )
-    {
-      morkBigAnonAtom* bigAnon = (morkBigAnonAtom*) atom;
-      outBuf.mBuf_Body = bigAnon->mBigAnonAtom_Body;
-      outBuf.mBuf_Fill = bigAnon->mBigAnonAtom_Size;
-    }
-    else
-      atom = 0; // show desire to put empty content in yarn
-  }
-  
-  if ( !atom ) // empty content for yarn?
-  {
-    outBuf.mBuf_Body = 0;
-    outBuf.mBuf_Fill = 0;
-  }
-  return ( atom != 0 );
-}
-
-mork_bool
-morkAtom::AliasYarn(mdbYarn* outYarn) const
-{
-  outYarn->mYarn_More = 0;
-  outYarn->mYarn_Form = 0;
-  const morkAtom* atom = this;
-  
-  if ( atom )
-  {
-    if ( atom->IsWeeBook() )
-    {
-      morkWeeBookAtom* weeBook = (morkWeeBookAtom*) atom;
-      outYarn->mYarn_Buf = weeBook->mWeeBookAtom_Body;
-      outYarn->mYarn_Fill = weeBook->mAtom_Size;
-      outYarn->mYarn_Size = weeBook->mAtom_Size;
-    }
-    else if ( atom->IsBigBook() )
-    {
-      morkBigBookAtom* bigBook = (morkBigBookAtom*) atom;
-      outYarn->mYarn_Buf = bigBook->mBigBookAtom_Body;
-      outYarn->mYarn_Fill = bigBook->mBigBookAtom_Size;
-      outYarn->mYarn_Size = bigBook->mBigBookAtom_Size;
-      outYarn->mYarn_Form = bigBook->mBigBookAtom_Form;
-    }
-    else if ( atom->IsWeeAnon() )
-    {
-      morkWeeAnonAtom* weeAnon = (morkWeeAnonAtom*) atom;
-      outYarn->mYarn_Buf = weeAnon->mWeeAnonAtom_Body;
-      outYarn->mYarn_Fill = weeAnon->mAtom_Size;
-      outYarn->mYarn_Size = weeAnon->mAtom_Size;
-    }
-    else if ( atom->IsBigAnon() )
-    {
-      morkBigAnonAtom* bigAnon = (morkBigAnonAtom*) atom;
-      outYarn->mYarn_Buf = bigAnon->mBigAnonAtom_Body;
-      outYarn->mYarn_Fill = bigAnon->mBigAnonAtom_Size;
-      outYarn->mYarn_Size = bigAnon->mBigAnonAtom_Size;
-      outYarn->mYarn_Form = bigAnon->mBigAnonAtom_Form;
-    }
-    else
-      atom = 0; // show desire to put empty content in yarn
-  }
-  
-  if ( !atom ) // empty content for yarn?
-  {
-    outYarn->mYarn_Buf = 0;
-    outYarn->mYarn_Fill = 0;
-    outYarn->mYarn_Size = 0;
-    // outYarn->mYarn_Grow = 0; // please don't modify the Grow slot
-  }
-  return ( atom != 0 );
-}
-
-mork_aid
-morkAtom::GetBookAtomAid() const // zero or book atom's ID
-{
-  return ( this->IsBook() )? ((morkBookAtom*) this)->mBookAtom_Id : 0;
-}
-
-mork_scope
-morkAtom::GetBookAtomSpaceScope(morkEnv* ev) const // zero or book's space's scope
-{
-  mork_scope outScope = 0;
-  if ( this->IsBook() )
-  {
-    const morkBookAtom* bookAtom = (const morkBookAtom*) this;
-    morkAtomSpace* space = bookAtom->mBookAtom_Space;
-    if ( space->IsAtomSpace() )
-      outScope = space->SpaceScope();
-    else
-      space->NonAtomSpaceTypeError(ev);
-  }
-  
-  return outScope;
-}
-
-void
-morkAtom::MakeCellUseForever(morkEnv* ev)
-{
-  MORK_USED_1(ev); 
-  mAtom_CellUses = morkAtom_kForeverCellUses;
-}
-
-mork_u1
-morkAtom::AddCellUse(morkEnv* ev)
-{
-  MORK_USED_1(ev); 
-  if ( mAtom_CellUses < morkAtom_kMaxCellUses ) // not already maxed out?
-    ++mAtom_CellUses;
-    
-  return mAtom_CellUses;
-}
-
-mork_u1
-morkAtom::CutCellUse(morkEnv* ev)
-{
-  if ( mAtom_CellUses ) // any outstanding uses to cut?
-  {
-    if ( mAtom_CellUses < morkAtom_kMaxCellUses ) // not frozen at max?
-      --mAtom_CellUses;
-  }
-  else
-    this->CellUsesUnderflowWarning(ev);
-    
-  return mAtom_CellUses;
-}
-
-/*static*/ void
-morkAtom::CellUsesUnderflowWarning(morkEnv* ev)
-{
-  ev->NewWarning("mAtom_CellUses underflow");
-}
-
-/*static*/ void
-morkAtom::BadAtomKindError(morkEnv* ev)
-{
-  ev->NewError("bad mAtom_Kind");
-}
-
-/*static*/ void
-morkAtom::ZeroAidError(morkEnv* ev)
-{
-  ev->NewError("zero atom ID");
-}
-
-/*static*/ void
-morkAtom::AtomSizeOverflowError(morkEnv* ev)
-{
-  ev->NewError("atom mAtom_Size overflow");
-}
-
-void
-morkOidAtom::InitRowOidAtom(morkEnv* ev, const mdbOid& inOid)
-{
-  MORK_USED_1(ev); 
-  mAtom_CellUses = 0;
-  mAtom_Kind = morkAtom_kKindRowOid;
-  mAtom_Change = morkChange_kNil;
-  mAtom_Size = 0;
-  mOidAtom_Oid = inOid; // bitwise copy
-}
-
-void
-morkOidAtom::InitTableOidAtom(morkEnv* ev, const mdbOid& inOid)
-{
-  MORK_USED_1(ev); 
-  mAtom_CellUses = 0;
-  mAtom_Kind = morkAtom_kKindTableOid;
-  mAtom_Change = morkChange_kNil;
-  mAtom_Size = 0;
-  mOidAtom_Oid = inOid; // bitwise copy
-}
-
-void
-morkWeeAnonAtom::InitWeeAnonAtom(morkEnv* ev, const morkBuf& inBuf)
-{
-  mAtom_Kind = 0;
-  mAtom_Change = morkChange_kNil;
-  if ( inBuf.mBuf_Fill <= morkAtom_kMaxByteSize )
-  {
-    mAtom_CellUses = 0;
-    mAtom_Kind = morkAtom_kKindWeeAnon;
-    mork_size size = inBuf.mBuf_Fill;
-    mAtom_Size = (mork_u1) size;
-    if ( size && inBuf.mBuf_Body )
-      MORK_MEMCPY(mWeeAnonAtom_Body, inBuf.mBuf_Body, size);
-        
-    mWeeAnonAtom_Body[ size ] = 0;
-  }
-  else
-    this->AtomSizeOverflowError(ev);
-}
-
-void
-morkBigAnonAtom::InitBigAnonAtom(morkEnv* ev, const morkBuf& inBuf,
-  mork_cscode inForm)
-{
-  MORK_USED_1(ev); 
-  mAtom_CellUses = 0;
-  mAtom_Kind = morkAtom_kKindBigAnon;
-  mAtom_Change = morkChange_kNil;
-  mAtom_Size = 0;
-  mBigAnonAtom_Form = inForm;
-  mork_size size = inBuf.mBuf_Fill;
-  mBigAnonAtom_Size = size;
-  if ( size && inBuf.mBuf_Body )
-    MORK_MEMCPY(mBigAnonAtom_Body, inBuf.mBuf_Body, size);
-        
-  mBigAnonAtom_Body[ size ] = 0;
-}
-
-/*static*/ void
-morkBookAtom::NonBookAtomTypeError(morkEnv* ev)
-{
-  ev->NewError("non morkBookAtom");
-}
-
-mork_u4
-morkBookAtom::HashFormAndBody(morkEnv* ev) const
-{
-  // This hash is obviously a variation of the dragon book string hash.
-  // (I won't bother to explain or rationalize this usage for you.)
-  
-  register mork_u4 outHash = 0; // hash value returned
-  register unsigned char c; // next character
-  register const mork_u1* body; // body of bytes to hash
-  mork_size size = 0; // the number of bytes to hash
-
-  if ( this->IsWeeBook() )
-  {
-    size = mAtom_Size;
-    body = ((const morkWeeBookAtom*) this)->mWeeBookAtom_Body;
-  }
-  else if ( this->IsBigBook() )
-  {
-    size = ((const morkBigBookAtom*) this)->mBigBookAtom_Size;
-    body = ((const morkBigBookAtom*) this)->mBigBookAtom_Body;
-  }
-  else if ( this->IsFarBook() )
-  {
-    size = ((const morkFarBookAtom*) this)->mFarBookAtom_Size;
-    body = ((const morkFarBookAtom*) this)->mFarBookAtom_Body;
-  }
-  else
-  {
-    this->NonBookAtomTypeError(ev);
-    return 0;
-  }
-  
-  const mork_u1* end = body + size;
-  while ( body < end )
-  {
-    c = *body++;
-    outHash <<= 4;
-    outHash += c;
-    mork_u4 top = outHash & 0xF0000000L; // top four bits
-    if ( top ) // any of high four bits equal to one? 
-    {
-      outHash ^= (top >> 24); // fold down high bits
-      outHash ^= top; // zero top four bits
-    }
-  }
-    
-  return outHash;
-}
-
-mork_bool
-morkBookAtom::EqualFormAndBody(morkEnv* ev, const morkBookAtom* inAtom) const
-{
-  mork_bool outEqual = morkBool_kFalse;
-  
-  const mork_u1* body = 0; // body of inAtom bytes to compare
-  mork_size size; // the number of inAtom bytes to compare
-  mork_cscode form; // nominal charset for ioAtom
-
-  if ( inAtom->IsWeeBook() )
-  {
-    size = inAtom->mAtom_Size;
-    body = ((const morkWeeBookAtom*) inAtom)->mWeeBookAtom_Body;
-    form = 0;
-  }
-  else if ( inAtom->IsBigBook() )
-  {
-    size = ((const morkBigBookAtom*) inAtom)->mBigBookAtom_Size;
-    body = ((const morkBigBookAtom*) inAtom)->mBigBookAtom_Body;
-    form = ((const morkBigBookAtom*) inAtom)->mBigBookAtom_Form;
-  }
-  else if ( inAtom->IsFarBook() )
-  {
-    size = ((const morkFarBookAtom*) inAtom)->mFarBookAtom_Size;
-    body = ((const morkFarBookAtom*) inAtom)->mFarBookAtom_Body;
-    form = ((const morkFarBookAtom*) inAtom)->mFarBookAtom_Form;
-  }
-  else
-  {
-    inAtom->NonBookAtomTypeError(ev);
-    return morkBool_kFalse;
-  }
-
-  const mork_u1* thisBody = 0; // body of bytes in this to compare
-  mork_size thisSize; // the number of bytes in this to compare
-  mork_cscode thisForm; // nominal charset for this atom
-  
-  if ( this->IsWeeBook() )
-  {
-    thisSize = mAtom_Size;
-    thisBody = ((const morkWeeBookAtom*) this)->mWeeBookAtom_Body;
-    thisForm = 0;
-  }
-  else if ( this->IsBigBook() )
-  {
-    thisSize = ((const morkBigBookAtom*) this)->mBigBookAtom_Size;
-    thisBody = ((const morkBigBookAtom*) this)->mBigBookAtom_Body;
-    thisForm = ((const morkBigBookAtom*) this)->mBigBookAtom_Form;
-  }
-  else if ( this->IsFarBook() )
-  {
-    thisSize = ((const morkFarBookAtom*) this)->mFarBookAtom_Size;
-    thisBody = ((const morkFarBookAtom*) this)->mFarBookAtom_Body;
-    thisForm = ((const morkFarBookAtom*) this)->mFarBookAtom_Form;
-  }
-  else
-  {
-    this->NonBookAtomTypeError(ev);
-    return morkBool_kFalse;
-  }
-  
-  // if atoms are empty, form is irrelevant
-  if ( body && thisBody && size == thisSize && (!size || form == thisForm ))
-    outEqual = (MORK_MEMCMP(body, thisBody, size) == 0);
-  
-  return outEqual;
-}
-
-
-void
-morkBookAtom::CutBookAtomFromSpace(morkEnv* ev)
-{
-  morkAtomSpace* space = mBookAtom_Space;
-  if ( space )
-  {
-    mBookAtom_Space = 0;
-    space->mAtomSpace_AtomBodies.CutAtom(ev, this);
-    space->mAtomSpace_AtomAids.CutAtom(ev, this);
-  }
-  else
-    ev->NilPointerError();
-}
-
-morkWeeBookAtom::morkWeeBookAtom(mork_aid inAid)
-{
-  mAtom_Kind = morkAtom_kKindWeeBook;
-  mAtom_CellUses = 0;
-  mAtom_Change = morkChange_kNil;
-  mAtom_Size = 0;
-
-  mBookAtom_Space = 0;
-  mBookAtom_Id = inAid;
-
-  mWeeBookAtom_Body[ 0 ] = 0;
-}
-
-void
-morkWeeBookAtom::InitWeeBookAtom(morkEnv* ev, const morkBuf& inBuf,
-  morkAtomSpace* ioSpace, mork_aid inAid)
-{
-  mAtom_Kind = 0;
-  mAtom_Change = morkChange_kNil;
-  if ( ioSpace )
-  {
-    if ( inAid )
-    {
-      if ( inBuf.mBuf_Fill <= morkAtom_kMaxByteSize )
-      {
-        mAtom_CellUses = 0;
-        mAtom_Kind = morkAtom_kKindWeeBook;
-        mBookAtom_Space = ioSpace;
-        mBookAtom_Id = inAid;
-        mork_size size = inBuf.mBuf_Fill;
-        mAtom_Size = (mork_u1) size;
-        if ( size && inBuf.mBuf_Body )
-          MORK_MEMCPY(mWeeBookAtom_Body, inBuf.mBuf_Body, size);
-        
-        mWeeBookAtom_Body[ size ] = 0;
-      }
-      else
-        this->AtomSizeOverflowError(ev);
-    }
-    else
-      this->ZeroAidError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-void
-morkBigBookAtom::InitBigBookAtom(morkEnv* ev, const morkBuf& inBuf,
-  mork_cscode inForm, morkAtomSpace* ioSpace, mork_aid inAid)
-{
-  mAtom_Kind = 0;
-  mAtom_Change = morkChange_kNil;
-  if ( ioSpace )
-  {
-    if ( inAid )
-    {
-      mAtom_CellUses = 0;
-      mAtom_Kind = morkAtom_kKindBigBook;
-      mAtom_Size = 0;
-      mBookAtom_Space = ioSpace;
-      mBookAtom_Id = inAid;
-      mBigBookAtom_Form = inForm;
-      mork_size size = inBuf.mBuf_Fill;
-      mBigBookAtom_Size = size;
-      if ( size && inBuf.mBuf_Body )
-        MORK_MEMCPY(mBigBookAtom_Body, inBuf.mBuf_Body, size);
-        
-      mBigBookAtom_Body[ size ] = 0;
-    }
-    else
-      this->ZeroAidError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-void morkFarBookAtom::InitFarBookAtom(morkEnv* ev, const morkBuf& inBuf,
-  mork_cscode inForm, morkAtomSpace* ioSpace, mork_aid inAid)
-{
-  mAtom_Kind = 0;
-  mAtom_Change = morkChange_kNil;
-  if ( ioSpace )
-  {
-    if ( inAid )
-    {
-      mAtom_CellUses = 0;
-      mAtom_Kind = morkAtom_kKindFarBook;
-      mAtom_Size = 0;
-      mBookAtom_Space = ioSpace;
-      mBookAtom_Id = inAid;
-      mFarBookAtom_Form = inForm;
-      mFarBookAtom_Size = inBuf.mBuf_Fill;
-      mFarBookAtom_Body = (mork_u1*) inBuf.mBuf_Body;
-    }
-    else
-      this->ZeroAidError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
deleted file mode 100644
--- a/db/mork/src/morkAtom.h
+++ /dev/null
@@ -1,398 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKATOM_
-#define _MORKATOM_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
-#define morkAtom_kMaxByteSize 255 /* max for 8-bit integer */
-#define morkAtom_kForeverCellUses 0x0FF /* max for 8-bit integer */
-#define morkAtom_kMaxCellUses 0x07F /* max for 7-bit integer */
-
-#define morkAtom_kKindWeeAnon  'a'  /* means morkWeeAnonAtom subclass */
-#define morkAtom_kKindBigAnon  'A'  /* means morkBigAnonAtom subclass */
-#define morkAtom_kKindWeeBook  'b'  /* means morkWeeBookAtom subclass */
-#define morkAtom_kKindBigBook  'B'  /* means morkBigBookAtom subclass */
-#define morkAtom_kKindFarBook  'f'  /* means morkFarBookAtom subclass */
-#define morkAtom_kKindRowOid   'r'  /* means morkOidAtom subclass */
-#define morkAtom_kKindTableOid 't'  /* means morkOidAtom subclass */
-
-/*| Atom: .
-|*/
-class morkAtom { //
- 
-public: 
-
-  mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  mork_change   mAtom_Change;    // how has this atom been changed?
-  mork_u1       mAtom_Size;      // only for atoms smaller than 256 bytes
-
-public: 
-  morkAtom(mork_aid inAid, mork_u1 inKind);
-  
-  mork_bool IsWeeAnon() const { return mAtom_Kind == morkAtom_kKindWeeAnon; }
-  mork_bool IsBigAnon() const { return mAtom_Kind == morkAtom_kKindBigAnon; }
-  mork_bool IsWeeBook() const { return mAtom_Kind == morkAtom_kKindWeeBook; }
-  mork_bool IsBigBook() const { return mAtom_Kind == morkAtom_kKindBigBook; }
-  mork_bool IsFarBook() const { return mAtom_Kind == morkAtom_kKindFarBook; }
-  mork_bool IsRowOid() const { return mAtom_Kind == morkAtom_kKindRowOid; }
-  mork_bool IsTableOid() const { return mAtom_Kind == morkAtom_kKindTableOid; }
-
-  mork_bool IsBook() const { return this->IsWeeBook() || this->IsBigBook(); }
-
-public: // clean vs dirty
-
-  void SetAtomClean() { mAtom_Change = morkChange_kNil; }
-  void SetAtomDirty() { mAtom_Change = morkChange_kAdd; }
-  
-  mork_bool IsAtomClean() const { return mAtom_Change == morkChange_kNil; }
-  mork_bool IsAtomDirty() const { return mAtom_Change == morkChange_kAdd; }
-
-public: // atom space scope if IsBook() is true, or else zero:
-
-  mork_scope GetBookAtomSpaceScope(morkEnv* ev) const;
-  // zero or book's space's scope
-
-  mork_aid   GetBookAtomAid() const;
-  // zero or book atom's ID
- 
-public: // empty construction does nothing
-  morkAtom() { }
-
-public: // one-byte refcounting, freezing at maximum
-  void       MakeCellUseForever(morkEnv* ev);
-  mork_u1    AddCellUse(morkEnv* ev);
-  mork_u1    CutCellUse(morkEnv* ev);
-  
-  mork_bool  IsCellUseForever() const 
-  { return mAtom_CellUses == morkAtom_kForeverCellUses; }
-  
-private: // warnings
-
-  static void CellUsesUnderflowWarning(morkEnv* ev);
-
-public: // errors
-
-  static void BadAtomKindError(morkEnv* ev);
-  static void ZeroAidError(morkEnv* ev);
-  static void AtomSizeOverflowError(morkEnv* ev);
-
-public: // yarns
-  
-  mork_bool   AsBuf(morkBuf& outBuf) const;
-  mork_bool   AliasYarn(mdbYarn* outYarn) const;
-  mork_bool   GetYarn(mdbYarn* outYarn) const;
-
-private: // copying is not allowed
-  morkAtom(const morkAtom& other);
-  morkAtom& operator=(const morkAtom& other);
-};
-
-/*| OidAtom: an atom that references a row or table by identity.
-|*/
-class morkOidAtom : public morkAtom { //
-
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // NOT USED IN "BIG" format atoms
- 
-public:
-  mdbOid           mOidAtom_Oid;       // identity of referenced object
-
-public: // empty construction does nothing
-  morkOidAtom() { }
-  void InitRowOidAtom(morkEnv* ev, const mdbOid& inOid);
-  void InitTableOidAtom(morkEnv* ev, const mdbOid& inOid);
-
-private: // copying is not allowed
-  morkOidAtom(const morkOidAtom& other);
-  morkOidAtom& operator=(const morkOidAtom& other);
-};
-
-/*| WeeAnonAtom: an atom whose content immediately follows morkAtom slots
-**| in an inline fashion, so that morkWeeAnonAtom contains both leading
-**| atom slots and then the content bytes without further overhead.  Note
-**| that charset encoding is not indicated, so zero is implied for Latin1.
-**| (Non-Latin1 content must be stored in a morkBigAnonAtom with a charset.)
-**|
-**|| An anon (anonymous) atom has no identity, with no associated bookkeeping
-**| for lookup needed for sharing like a book atom.
-**|
-**|| A wee anon atom is immediate but not shared with any other users of this
-**| atom, so no bookkeeping for sharing is needed.  This means the atom has
-**| no ID, because the atom has no identity other than this immediate content,
-**| and no hash table is needed to look up this particular atom.  This also
-**| applies to the larger format morkBigAnonAtom, which has more slots.
-|*/
-class morkWeeAnonAtom : public morkAtom { //
-
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // only for atoms smaller than 256 bytes
-  
-public:
-  mork_u1 mWeeAnonAtom_Body[ 1 ]; // 1st byte of immediate content vector
-
-public: // empty construction does nothing
-  morkWeeAnonAtom() { }
-  void InitWeeAnonAtom(morkEnv* ev, const morkBuf& inBuf);
-  
-  // allow extra trailing byte for a null byte:
-  static mork_size SizeForFill(mork_fill inFill)
-  { return sizeof(morkWeeAnonAtom) + inFill; }
-
-private: // copying is not allowed
-  morkWeeAnonAtom(const morkWeeAnonAtom& other);
-  morkWeeAnonAtom& operator=(const morkWeeAnonAtom& other);
-};
-
-/*| BigAnonAtom: another immediate atom that cannot be encoded as the smaller
-**| morkWeeAnonAtom format because either the size is too great, and/or the
-**| charset is not the default zero for Latin1 and must be explicitly noted.
-**|
-**|| An anon (anonymous) atom has no identity, with no associated bookkeeping
-**| for lookup needed for sharing like a book atom.
-|*/
-class morkBigAnonAtom : public morkAtom { //
-
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // NOT USED IN "BIG" format atoms
- 
-public:
-  mork_cscode   mBigAnonAtom_Form;      // charset format encoding
-  mork_size     mBigAnonAtom_Size;      // size of content vector
-  mork_u1       mBigAnonAtom_Body[ 1 ]; // 1st byte of immed content vector
-
-public: // empty construction does nothing
-  morkBigAnonAtom() { }
-  void InitBigAnonAtom(morkEnv* ev, const morkBuf& inBuf, mork_cscode inForm);
-  
-  // allow extra trailing byte for a null byte:
-  static mork_size SizeForFill(mork_fill inFill)
-  { return sizeof(morkBigAnonAtom) + inFill; }
-
-private: // copying is not allowed
-  morkBigAnonAtom(const morkBigAnonAtom& other);
-  morkBigAnonAtom& operator=(const morkBigAnonAtom& other);
-};
-
-#define morkBookAtom_kMaxBodySize 1024 /* if larger, cannot be shared */
-
-/*| BookAtom: the common subportion of wee book atoms and big book atoms that
-**| includes the atom ID and the pointer to the space referencing this atom
-**| through a hash table.
-|*/
-class morkBookAtom : public morkAtom { //
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // only for atoms smaller than 256 bytes
-  
-public:
-  morkAtomSpace* mBookAtom_Space; // mBookAtom_Space->SpaceScope() is atom scope 
-  mork_aid       mBookAtom_Id;    // identity token for this shared atom
-
-public: // empty construction does nothing
-  morkBookAtom() { }
-
-  static void NonBookAtomTypeError(morkEnv* ev);
-
-public: // Hash() and Equal() for atom ID maps are same for all subclasses:
-
-  mork_u4 HashAid() const { return mBookAtom_Id; }
-  mork_bool EqualAid(const morkBookAtom* inAtom) const
-  { return ( mBookAtom_Id == inAtom->mBookAtom_Id); }
-
-public: // Hash() and Equal() for atom body maps know about subclasses:
-  
-  // YOU CANNOT SUBCLASS morkBookAtom WITHOUT FIXING Hash and Equal METHODS:
-
-  mork_u4 HashFormAndBody(morkEnv* ev) const;
-  mork_bool EqualFormAndBody(morkEnv* ev, const morkBookAtom* inAtom) const;
-  
-public: // separation from containing space
-
-  void CutBookAtomFromSpace(morkEnv* ev);
-
-private: // copying is not allowed
-  morkBookAtom(const morkBookAtom& other);
-  morkBookAtom& operator=(const morkBookAtom& other);
-};
-
-/*| FarBookAtom: this alternative format for book atoms was introduced
-**| in May 2000 in order to support finding atoms in hash tables without
-**| first copying the strings from original parsing buffers into a new
-**| atom format.  This was consuming too much time.  However, we can
-**| use morkFarBookAtom to stage a hash table query, as long as we then
-**| fix HashFormAndBody() and EqualFormAndBody() to use morkFarBookAtom
-**| correctly.
-**|
-**|| Note we do NOT intend that instances of morkFarBookAtom will ever
-**| be installed in hash tables, because this is not space efficient.
-**| We only expect to create temp instances for table lookups.
-|*/
-class morkFarBookAtom : public morkBookAtom { //
-  
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // NOT USED IN "BIG" format atoms
-
-  // morkAtomSpace* mBookAtom_Space; // mBookAtom_Space->SpaceScope() is scope 
-  // mork_aid       mBookAtom_Id;    // identity token for this shared atom
-  
-public:
-  mork_cscode   mFarBookAtom_Form;      // charset format encoding
-  mork_size     mFarBookAtom_Size;      // size of content vector
-  mork_u1*      mFarBookAtom_Body;      // bytes are elsewere, out of line
-
-public: // empty construction does nothing
-  morkFarBookAtom() { }
-  void InitFarBookAtom(morkEnv* ev, const morkBuf& inBuf,
-    mork_cscode inForm, morkAtomSpace* ioSpace, mork_aid inAid);
-  
-private: // copying is not allowed
-  morkFarBookAtom(const morkFarBookAtom& other);
-  morkFarBookAtom& operator=(const morkFarBookAtom& other);
-};
-
-/*| WeeBookAtom: .
-|*/
-class morkWeeBookAtom : public morkBookAtom { //
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // only for atoms smaller than 256 bytes
-
-  // morkAtomSpace* mBookAtom_Space; // mBookAtom_Space->SpaceScope() is scope 
-  // mork_aid       mBookAtom_Id;    // identity token for this shared atom
-  
-public:
-  mork_u1     mWeeBookAtom_Body[ 1 ]; // 1st byte of immed content vector
-
-public: // empty construction does nothing
-  morkWeeBookAtom() { }
-  morkWeeBookAtom(mork_aid inAid);
-  
-  void InitWeeBookAtom(morkEnv* ev, const morkBuf& inBuf,
-    morkAtomSpace* ioSpace, mork_aid inAid);
-  
-  // allow extra trailing byte for a null byte:
-  static mork_size SizeForFill(mork_fill inFill)
-  { return sizeof(morkWeeBookAtom) + inFill; }
-
-private: // copying is not allowed
-  morkWeeBookAtom(const morkWeeBookAtom& other);
-  morkWeeBookAtom& operator=(const morkWeeBookAtom& other);
-};
-
-/*| BigBookAtom: .
-|*/
-class morkBigBookAtom : public morkBookAtom { //
-  
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // NOT USED IN "BIG" format atoms
-
-  // morkAtomSpace* mBookAtom_Space; // mBookAtom_Space->SpaceScope() is scope 
-  // mork_aid       mBookAtom_Id;    // identity token for this shared atom
-  
-public:
-  mork_cscode   mBigBookAtom_Form;      // charset format encoding
-  mork_size     mBigBookAtom_Size;      // size of content vector
-  mork_u1       mBigBookAtom_Body[ 1 ]; // 1st byte of immed content vector
-
-public: // empty construction does nothing
-  morkBigBookAtom() { }
-  void InitBigBookAtom(morkEnv* ev, const morkBuf& inBuf,
-    mork_cscode inForm, morkAtomSpace* ioSpace, mork_aid inAid);
-  
-  // allow extra trailing byte for a null byte:
-  static mork_size SizeForFill(mork_fill inFill)
-  { return sizeof(morkBigBookAtom) + inFill; }
-
-private: // copying is not allowed
-  morkBigBookAtom(const morkBigBookAtom& other);
-  morkBigBookAtom& operator=(const morkBigBookAtom& other);
-};
-
-/*| MaxBookAtom: .
-|*/
-class morkMaxBookAtom : public morkBigBookAtom { //
-  
-  // mork_u1       mAtom_Kind;      // identifies a specific atom subclass
-  // mork_u1       mAtom_CellUses;  // number of persistent uses in a cell
-  // mork_change   mAtom_Change;    // how has this atom been changed?
-  // mork_u1       mAtom_Size;      // NOT USED IN "BIG" format atoms
-
-  // morkAtomSpace* mBookAtom_Space; // mBookAtom_Space->SpaceScope() is scope 
-  // mork_aid       mBookAtom_Id;    // identity token for this shared atom
-
-  // mork_cscode   mBigBookAtom_Form;      // charset format encoding
-  // mork_size     mBigBookAtom_Size;      // size of content vector
-  // mork_u1       mBigBookAtom_Body[ 1 ]; // 1st byte of immed content vector
-  
-public:
-  mork_u1 mMaxBookAtom_Body[ morkBookAtom_kMaxBodySize + 3 ]; // max bytes
-
-public: // empty construction does nothing
-  morkMaxBookAtom() { }
-  void InitMaxBookAtom(morkEnv* ev, const morkBuf& inBuf,
-    mork_cscode inForm, morkAtomSpace* ioSpace, mork_aid inAid)
-  { this->InitBigBookAtom(ev, inBuf, inForm, ioSpace, inAid); }
-
-private: // copying is not allowed
-  morkMaxBookAtom(const morkMaxBookAtom& other);
-  morkMaxBookAtom& operator=(const morkMaxBookAtom& other);
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKATOM_ */
-
deleted file mode 100644
--- a/db/mork/src/morkAtomMap.cpp
+++ /dev/null
@@ -1,469 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKMAP_
-#include "morkMap.h"
-#endif
-
-#ifndef _MORKATOMMAP_
-#include "morkAtomMap.h"
-#endif
-
-#ifndef _MORKATOM_
-#include "morkAtom.h"
-#endif
-
-#ifndef _MORKINTMAP_
-#include "morkIntMap.h"
-#endif
-
-#ifndef _MORKROW_
-#include "morkRow.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkAtomAidMap::CloseMorkNode(morkEnv* ev) // CloseAtomAidMap() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseAtomAidMap(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkAtomAidMap::~morkAtomAidMap() // assert CloseAtomAidMap() executed earlier
-{
-  MORK_ASSERT(this->IsShutNode());
-}
-
-
-/*public non-poly*/
-morkAtomAidMap::morkAtomAidMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-#ifdef MORK_ENABLE_PROBE_MAPS
-: morkProbeMap(ev, inUsage,  ioHeap,
-  /*inKeySize*/ sizeof(morkBookAtom*), /*inValSize*/ 0,
-  ioSlotHeap, morkAtomAidMap_kStartSlotCount, 
-  /*inZeroIsClearKey*/ morkBool_kTrue)
-#else /*MORK_ENABLE_PROBE_MAPS*/
-: morkMap(ev, inUsage,  ioHeap,
-  /*inKeySize*/ sizeof(morkBookAtom*), /*inValSize*/ 0,
-  morkAtomAidMap_kStartSlotCount, ioSlotHeap,
-  /*inHoldChanges*/ morkBool_kFalse)
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kAtomAidMap;
-}
-
-/*public non-poly*/ void
-morkAtomAidMap::CloseAtomAidMap(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-#ifdef MORK_ENABLE_PROBE_MAPS
-      this->CloseProbeMap(ev);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-      this->CloseMap(ev);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-
-  /*virtual*/ mork_test // hit(a,b) implies hash(a) == hash(b)
-  morkAtomAidMap::MapTest(morkEnv* ev, const void* inMapKey,
-    const void* inAppKey) const
-  {
-    MORK_USED_1(ev);
-    const morkBookAtom* key = *(const morkBookAtom**) inMapKey;
-    if ( key )
-    {
-      mork_bool hit = key->EqualAid(*(const morkBookAtom**) inAppKey);
-      return ( hit ) ? morkTest_kHit : morkTest_kMiss;
-    }
-    else
-      return morkTest_kVoid;
-  }
-
-  /*virtual*/ mork_u4 // hit(a,b) implies hash(a) == hash(b)
-  morkAtomAidMap::MapHash(morkEnv* ev, const void* inAppKey) const
-  {
-    const morkBookAtom* key = *(const morkBookAtom**) inAppKey;
-    if ( key )
-      return key->HashAid();
-    else
-    {
-      ev->NilPointerWarning();
-      return 0;
-    }
-  }
-
-  /*virtual*/ mork_u4 
-  morkAtomAidMap::ProbeMapHashMapKey(morkEnv* ev,
-    const void* inMapKey) const
-  {
-    const morkBookAtom* key = *(const morkBookAtom**) inMapKey;
-    if ( key )
-      return key->HashAid();
-    else
-    {
-      ev->NilPointerWarning();
-      return 0;
-    }
-  }
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  // { ===== begin morkMap poly interface =====
-  /*virtual*/ mork_bool // 
-  morkAtomAidMap::Equal(morkEnv* ev, const void* inKeyA,
-    const void* inKeyB) const
-  {
-    MORK_USED_1(ev);
-    return (*(const morkBookAtom**) inKeyA)->EqualAid(
-      *(const morkBookAtom**) inKeyB);
-  }
-
-  /*virtual*/ mork_u4 // 
-  morkAtomAidMap::Hash(morkEnv* ev, const void* inKey) const
-  {
-    MORK_USED_1(ev);
-    return (*(const morkBookAtom**) inKey)->HashAid();
-  }
-  // } ===== end morkMap poly interface =====
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-
-mork_bool
-morkAtomAidMap::AddAtom(morkEnv* ev, morkBookAtom* ioAtom)
-{
-  if ( ev->Good() )
-  {
-#ifdef MORK_ENABLE_PROBE_MAPS
-    this->MapAtPut(ev, &ioAtom, /*val*/ (void*) 0, 
-      /*key*/ (void*) 0, /*val*/ (void*) 0);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-    this->Put(ev, &ioAtom, /*val*/ (void*) 0, 
-      /*key*/ (void*) 0, /*val*/ (void*) 0, (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  }
-  return ev->Good();
-}
-
-morkBookAtom*
-morkAtomAidMap::CutAtom(morkEnv* ev, const morkBookAtom* inAtom)
-{
-  morkBookAtom* oldKey = 0;
-  
-#ifdef MORK_ENABLE_PROBE_MAPS
-  MORK_USED_1(inAtom);
-  morkProbeMap::ProbeMapCutError(ev);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  this->Cut(ev, &inAtom, &oldKey, /*val*/ (void*) 0,
-    (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-    
-  return oldKey;
-}
-
-morkBookAtom*
-morkAtomAidMap::GetAtom(morkEnv* ev, const morkBookAtom* inAtom)
-{
-  morkBookAtom* key = 0; // old val in the map
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-  this->MapAt(ev, &inAtom, &key, /*val*/ (void*) 0);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  this->Get(ev, &inAtom, &key, /*val*/ (void*) 0, (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  
-  return key;
-}
-
-morkBookAtom*
-morkAtomAidMap::GetAid(morkEnv* ev, mork_aid inAid)
-{
-  morkWeeBookAtom weeAtom(inAid);
-  morkBookAtom* key = &weeAtom; // we need a pointer
-  morkBookAtom* oldKey = 0; // old key in the map
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-  this->MapAt(ev, &key, &oldKey, /*val*/ (void*) 0);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  this->Get(ev, &key, &oldKey, /*val*/ (void*) 0, (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  
-  return oldKey;
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkAtomBodyMap::CloseMorkNode(morkEnv* ev) // CloseAtomBodyMap() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseAtomBodyMap(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkAtomBodyMap::~morkAtomBodyMap() // assert CloseAtomBodyMap() executed earlier
-{
-  MORK_ASSERT(this->IsShutNode());
-}
-
-
-/*public non-poly*/
-morkAtomBodyMap::morkAtomBodyMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-#ifdef MORK_ENABLE_PROBE_MAPS
-: morkProbeMap(ev, inUsage,  ioHeap,
-  /*inKeySize*/ sizeof(morkBookAtom*), /*inValSize*/ 0,
-  ioSlotHeap, morkAtomBodyMap_kStartSlotCount, 
-  /*inZeroIsClearKey*/ morkBool_kTrue)
-#else /*MORK_ENABLE_PROBE_MAPS*/
-: morkMap(ev, inUsage,  ioHeap,
-  /*inKeySize*/ sizeof(morkBookAtom*), /*inValSize*/ 0,
-  morkAtomBodyMap_kStartSlotCount, ioSlotHeap,
-  /*inHoldChanges*/ morkBool_kFalse)
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kAtomBodyMap;
-}
-
-/*public non-poly*/ void
-morkAtomBodyMap::CloseAtomBodyMap(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-#ifdef MORK_ENABLE_PROBE_MAPS
-      this->CloseProbeMap(ev);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-      this->CloseMap(ev);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-#ifdef MORK_ENABLE_PROBE_MAPS
-
-  /*virtual*/ mork_test // hit(a,b) implies hash(a) == hash(b)
-  morkAtomBodyMap::MapTest(morkEnv* ev, const void* inMapKey,
-    const void* inAppKey) const
-  {
-    const morkBookAtom* key = *(const morkBookAtom**) inMapKey;
-    if ( key )
-    {
-      return ( key->EqualFormAndBody(ev, *(const morkBookAtom**) inAppKey) ) ?
-        morkTest_kHit : morkTest_kMiss;
-    }
-    else
-      return morkTest_kVoid;
-  }
-
-  /*virtual*/ mork_u4 // hit(a,b) implies hash(a) == hash(b)
-  morkAtomBodyMap::MapHash(morkEnv* ev, const void* inAppKey) const
-  {
-    const morkBookAtom* key = *(const morkBookAtom**) inAppKey;
-    if ( key )
-      return key->HashFormAndBody(ev);
-    else
-      return 0;
-  }
-
-  /*virtual*/ mork_u4 
-  morkAtomBodyMap::ProbeMapHashMapKey(morkEnv* ev, const void* inMapKey) const
-  {
-    const morkBookAtom* key = *(const morkBookAtom**) inMapKey;
-    if ( key )
-      return key->HashFormAndBody(ev);
-    else
-      return 0;
-  }
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  // { ===== begin morkMap poly interface =====
-  /*virtual*/ mork_bool // 
-  morkAtomBodyMap::Equal(morkEnv* ev, const void* inKeyA,
-    const void* inKeyB) const
-  {
-    return (*(const morkBookAtom**) inKeyA)->EqualFormAndBody(ev,
-      *(const morkBookAtom**) inKeyB);
-  }
-
-  /*virtual*/ mork_u4 // 
-  morkAtomBodyMap::Hash(morkEnv* ev, const void* inKey) const
-  {
-    return (*(const morkBookAtom**) inKey)->HashFormAndBody(ev);
-  }
-  // } ===== end morkMap poly interface =====
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-
-mork_bool
-morkAtomBodyMap::AddAtom(morkEnv* ev, morkBookAtom* ioAtom)
-{
-  if ( ev->Good() )
-  {
-#ifdef MORK_ENABLE_PROBE_MAPS
-    this->MapAtPut(ev, &ioAtom, /*val*/ (void*) 0, 
-      /*key*/ (void*) 0, /*val*/ (void*) 0);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-    this->Put(ev, &ioAtom, /*val*/ (void*) 0, 
-      /*key*/ (void*) 0, /*val*/ (void*) 0, (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  }
-  return ev->Good();
-}
-
-morkBookAtom*
-morkAtomBodyMap::CutAtom(morkEnv* ev, const morkBookAtom* inAtom)
-{
-  morkBookAtom* oldKey = 0;
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-  MORK_USED_1(inAtom);
-  morkProbeMap::ProbeMapCutError(ev);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  this->Cut(ev, &inAtom, &oldKey, /*val*/ (void*) 0,
-    (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-    
-  return oldKey;
-}
-
-morkBookAtom*
-morkAtomBodyMap::GetAtom(morkEnv* ev, const morkBookAtom* inAtom)
-{
-  morkBookAtom* key = 0; // old val in the map
-#ifdef MORK_ENABLE_PROBE_MAPS
-  this->MapAt(ev, &inAtom, &key, /*val*/ (void*) 0);
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  this->Get(ev, &inAtom, &key, /*val*/ (void*) 0, (mork_change**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  
-  return key;
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-morkAtomRowMap::~morkAtomRowMap()
-{
-}
-
-// I changed to sizeof(mork_ip) from sizeof(mork_aid) to fix a crash on
-// 64 bit machines.  I am not sure it was the right way to fix the problem,
-// but it does stop the crash.  Perhaps we should be using the
-// morkPointerMap instead?
-morkAtomRowMap::morkAtomRowMap(morkEnv* ev, const morkUsage& inUsage,
-  nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap, mork_column inIndexColumn)
-  : morkIntMap(ev, inUsage, sizeof(mork_ip), ioHeap, ioSlotHeap,
-    /*inHoldChanges*/ morkBool_kFalse)
-, mAtomRowMap_IndexColumn( inIndexColumn )
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kAtomRowMap;
-}
-
-void morkAtomRowMap::AddRow(morkEnv* ev, morkRow* ioRow)
-// add ioRow only if it contains a cell in mAtomRowMap_IndexColumn. 
-{
-  mork_aid aid = ioRow->GetCellAtomAid(ev, mAtomRowMap_IndexColumn);
-  if ( aid )
-    this->AddAid(ev, aid, ioRow);
-}
-
-void morkAtomRowMap::CutRow(morkEnv* ev, morkRow* ioRow)
-// cut ioRow only if it contains a cell in mAtomRowMap_IndexColumn. 
-{
-  mork_aid aid = ioRow->GetCellAtomAid(ev, mAtomRowMap_IndexColumn);
-  if ( aid )
-    this->CutAid(ev, aid);
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
deleted file mode 100644
--- a/db/mork/src/morkAtomMap.h
+++ /dev/null
@@ -1,397 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKATOMMAP_
-#define _MORKATOMMAP_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKMAP_
-#include "morkMap.h"
-#endif
-
-#ifndef _MORKPROBEMAP_
-#include "morkProbeMap.h"
-#endif
-
-#ifndef _MORKINTMAP_
-#include "morkIntMap.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kAtomAidMap  /*i*/ 0x6141 /* ascii 'aA' */
-
-#define morkAtomAidMap_kStartSlotCount 23
-
-/*| morkAtomAidMap: keys of morkBookAtom organized by atom ID
-|*/
-#ifdef MORK_ENABLE_PROBE_MAPS
-class morkAtomAidMap : public morkProbeMap { // for mapping tokens to maps
-#else /*MORK_ENABLE_PROBE_MAPS*/
-class morkAtomAidMap : public morkMap { // for mapping tokens to maps
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseAtomAidMap() only if open
-  virtual ~morkAtomAidMap(); // assert that CloseAtomAidMap() executed earlier
-  
-public: // morkMap construction & destruction
-  morkAtomAidMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap);
-  void CloseAtomAidMap(morkEnv* ev); // called by CloseMorkNode();
-
-public: // dynamic type identification
-  mork_bool IsAtomAidMap() const
-  { return IsNode() && mNode_Derived == morkDerived_kAtomAidMap; }
-// } ===== end morkNode methods =====
-
-public:
-#ifdef MORK_ENABLE_PROBE_MAPS
-  // { ===== begin morkProbeMap methods =====
-  virtual mork_test // hit(a,b) implies hash(a) == hash(b)
-  MapTest(morkEnv* ev, const void* inMapKey, const void* inAppKey) const;
-
-  virtual mork_u4 // hit(a,b) implies hash(a) == hash(b)
-  MapHash(morkEnv* ev, const void* inAppKey) const;
-
-  virtual mork_u4 ProbeMapHashMapKey(morkEnv* ev, const void* inMapKey) const;
-
-  // virtual mork_bool ProbeMapIsKeyNil(morkEnv* ev, void* ioMapKey);
-
-  // virtual void ProbeMapClearKey(morkEnv* ev, // put 'nil' alls keys inside map
-  //   void* ioMapKey, mork_count inKeyCount); // array of keys inside map
-
-  // virtual void ProbeMapPushIn(morkEnv* ev, // move (key,val) into the map
-  //   const void* inAppKey, const void* inAppVal, // (key,val) outside map
-  //   void* outMapKey, void* outMapVal);      // (key,val) inside map
-
-  // virtual void ProbeMapPullOut(morkEnv* ev, // move (key,val) out from the map
-  //   const void* inMapKey, const void* inMapVal, // (key,val) inside map
-  //   void* outAppKey, void* outAppVal) const;    // (key,val) outside map
-  // } ===== end morkProbeMap methods =====
-#else /*MORK_ENABLE_PROBE_MAPS*/
-// { ===== begin morkMap poly interface =====
-  virtual mork_bool // note: equal(a,b) implies hash(a) == hash(b)
-  Equal(morkEnv* ev, const void* inKeyA, const void* inKeyB) const;
-  // implemented using morkBookAtom::HashAid()
-
-  virtual mork_u4 // note: equal(a,b) implies hash(a) == hash(b)
-  Hash(morkEnv* ev, const void* inKey) const;
-  // implemented using morkBookAtom::EqualAid()
-// } ===== end morkMap poly interface =====
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-public: // other map methods
-
-  mork_bool      AddAtom(morkEnv* ev, morkBookAtom* ioAtom);
-  // AddAtom() returns ev->Good()
-
-  morkBookAtom*  CutAtom(morkEnv* ev, const morkBookAtom* inAtom);
-  // CutAtom() returns the atom removed equal to inAtom, if there was one
-  
-  morkBookAtom*  GetAtom(morkEnv* ev, const morkBookAtom* inAtom);
-  // GetAtom() returns the atom equal to inAtom, or else nil
-
-  morkBookAtom*  GetAid(morkEnv* ev, mork_aid inAid);
-  // GetAid() returns the atom equal to inAid, or else nil
-
-  // note the atoms are owned elsewhere, usuall by morkAtomSpace
-
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakAtomAidMap(morkAtomAidMap* me,
-    morkEnv* ev, morkAtomAidMap** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongAtomAidMap(morkAtomAidMap* me,
-    morkEnv* ev, morkAtomAidMap** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-class morkAtomAidMapIter: public morkProbeMapIter { // typesafe wrapper class
-#else /*MORK_ENABLE_PROBE_MAPS*/
-class morkAtomAidMapIter: public morkMapIter { // typesafe wrapper class
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-public:
-#ifdef MORK_ENABLE_PROBE_MAPS
-  morkAtomAidMapIter(morkEnv* ev, morkAtomAidMap* ioMap)
-  : morkProbeMapIter(ev, ioMap) { }
- 
-  morkAtomAidMapIter( ) : morkProbeMapIter()  { }
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  morkAtomAidMapIter(morkEnv* ev, morkAtomAidMap* ioMap)
-  : morkMapIter(ev, ioMap) { }
- 
-  morkAtomAidMapIter( ) : morkMapIter()  { }
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-  void InitAtomAidMapIter(morkEnv* ev, morkAtomAidMap* ioMap)
-  { this->InitMapIter(ev, ioMap); }
-   
-  mork_change* FirstAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->First(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* NextAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->Next(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* HereAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->Here(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* CutHereAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->CutHere(ev, outAtomPtr, /*val*/ (void*) 0); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kAtomBodyMap  /*i*/ 0x6142 /* ascii 'aB' */
-
-#define morkAtomBodyMap_kStartSlotCount 23
-
-/*| morkAtomBodyMap: keys of morkBookAtom organized by body bytes
-|*/
-#ifdef MORK_ENABLE_PROBE_MAPS
-class morkAtomBodyMap : public morkProbeMap { // for mapping tokens to maps
-#else /*MORK_ENABLE_PROBE_MAPS*/
-class morkAtomBodyMap : public morkMap { // for mapping tokens to maps
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseAtomBodyMap() only if open
-  virtual ~morkAtomBodyMap(); // assert CloseAtomBodyMap() executed earlier
-  
-public: // morkMap construction & destruction
-  morkAtomBodyMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap);
-  void CloseAtomBodyMap(morkEnv* ev); // called by CloseMorkNode();
-
-public: // dynamic type identification
-  mork_bool IsAtomBodyMap() const
-  { return IsNode() && mNode_Derived == morkDerived_kAtomBodyMap; }
-// } ===== end morkNode methods =====
-
-public:
-#ifdef MORK_ENABLE_PROBE_MAPS
-  // { ===== begin morkProbeMap methods =====
-  virtual mork_test // hit(a,b) implies hash(a) == hash(b)
-  MapTest(morkEnv* ev, const void* inMapKey, const void* inAppKey) const;
-
-  virtual mork_u4 // hit(a,b) implies hash(a) == hash(b)
-  MapHash(morkEnv* ev, const void* inAppKey) const;
-
-  virtual mork_u4 ProbeMapHashMapKey(morkEnv* ev, const void* inMapKey) const;
-
-  // virtual mork_bool ProbeMapIsKeyNil(morkEnv* ev, void* ioMapKey);
-
-  // virtual void ProbeMapClearKey(morkEnv* ev, // put 'nil' alls keys inside map
-  //   void* ioMapKey, mork_count inKeyCount); // array of keys inside map
-
-  // virtual void ProbeMapPushIn(morkEnv* ev, // move (key,val) into the map
-  //   const void* inAppKey, const void* inAppVal, // (key,val) outside map
-  //   void* outMapKey, void* outMapVal);      // (key,val) inside map
-
-  // virtual void ProbeMapPullOut(morkEnv* ev, // move (key,val) out from the map
-  //   const void* inMapKey, const void* inMapVal, // (key,val) inside map
-  //   void* outAppKey, void* outAppVal) const;    // (key,val) outside map
-  // } ===== end morkProbeMap methods =====
-#else /*MORK_ENABLE_PROBE_MAPS*/
-// { ===== begin morkMap poly interface =====
-  virtual mork_bool // note: equal(a,b) implies hash(a) == hash(b)
-  Equal(morkEnv* ev, const void* inKeyA, const void* inKeyB) const;
-  // implemented using morkBookAtom::EqualFormAndBody()
-
-  virtual mork_u4 // note: equal(a,b) implies hash(a) == hash(b)
-  Hash(morkEnv* ev, const void* inKey) const;
-  // implemented using morkBookAtom::HashFormAndBody()
-// } ===== end morkMap poly interface =====
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-public: // other map methods
-
-  mork_bool      AddAtom(morkEnv* ev, morkBookAtom* ioAtom);
-  // AddAtom() returns ev->Good()
-
-  morkBookAtom*  CutAtom(morkEnv* ev, const morkBookAtom* inAtom);
-  // CutAtom() returns the atom removed equal to inAtom, if there was one
-  
-  morkBookAtom*  GetAtom(morkEnv* ev, const morkBookAtom* inAtom);
-  // GetAtom() returns the atom equal to inAtom, or else nil
-
-  // note the atoms are owned elsewhere, usuall by morkAtomSpace
-
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakAtomBodyMap(morkAtomBodyMap* me,
-    morkEnv* ev, morkAtomBodyMap** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongAtomBodyMap(morkAtomBodyMap* me,
-    morkEnv* ev, morkAtomBodyMap** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-class morkAtomBodyMapIter: public morkProbeMapIter{ // typesafe wrapper class
-#else /*MORK_ENABLE_PROBE_MAPS*/
-class morkAtomBodyMapIter: public morkMapIter{ // typesafe wrapper class
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-
-public:
-#ifdef MORK_ENABLE_PROBE_MAPS
-  morkAtomBodyMapIter(morkEnv* ev, morkAtomBodyMap* ioMap)
-  : morkProbeMapIter(ev, ioMap) { }
- 
-  morkAtomBodyMapIter( ) : morkProbeMapIter()  { }
-#else /*MORK_ENABLE_PROBE_MAPS*/
-  morkAtomBodyMapIter(morkEnv* ev, morkAtomBodyMap* ioMap)
-  : morkMapIter(ev, ioMap) { }
- 
-  morkAtomBodyMapIter( ) : morkMapIter()  { }
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  
-  void InitAtomBodyMapIter(morkEnv* ev, morkAtomBodyMap* ioMap)
-  { this->InitMapIter(ev, ioMap); }
-   
-  mork_change* FirstAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->First(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* NextAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->Next(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* HereAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->Here(ev, outAtomPtr, /*val*/ (void*) 0); }
-  
-  mork_change* CutHereAtom(morkEnv* ev, morkBookAtom** outAtomPtr)
-  { return this->CutHere(ev, outAtomPtr, /*val*/ (void*) 0); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kAtomRowMap  /*i*/ 0x6152 /* ascii 'aR' */
-
-/*| morkAtomRowMap: maps morkAtom* -> morkRow*
-|*/
-class morkAtomRowMap : public morkIntMap { // for mapping atoms to rows
-
-public:
-  mork_column mAtomRowMap_IndexColumn; // row column being indexed
-
-public:
-
-  virtual ~morkAtomRowMap();
-  morkAtomRowMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap, mork_column inIndexColumn);
-
-public: // adding and cutting from morkRow instance candidate
-
-  void  AddRow(morkEnv* ev, morkRow* ioRow);
-  // add ioRow only if it contains a cell in mAtomRowMap_IndexColumn. 
-
-  void  CutRow(morkEnv* ev, morkRow* ioRow);
-  // cut ioRow only if it contains a cell in mAtomRowMap_IndexColumn. 
-
-public: // other map methods
-
-  mork_bool  AddAid(morkEnv* ev, mork_aid inAid, morkRow* ioRow)
-  { return this->AddInt(ev, inAid, ioRow); }
-  // the AddAid() boolean return equals ev->Good().
-
-  mork_bool  CutAid(morkEnv* ev, mork_aid inAid)
-  { return this->CutInt(ev, inAid); }
-  // The CutAid() boolean return indicates whether removal happened. 
-  
-  morkRow*   GetAid(morkEnv* ev, mork_aid inAid)
-  { return (morkRow*) this->GetInt(ev, inAid); }
-  // Note the returned space does NOT have an increase in refcount for this.
-  
-public: // dynamic type identification
-  mork_bool IsAtomRowMap() const
-  { return IsNode() && mNode_Derived == morkDerived_kAtomRowMap; }
-
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakAtomRowMap(morkAtomRowMap* me,
-    morkEnv* ev, morkAtomRowMap** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongAtomRowMap(morkAtomRowMap* me,
-    morkEnv* ev, morkAtomRowMap** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-
-};
-
-class morkAtomRowMapIter: public morkMapIter{ // typesafe wrapper class
-
-public:
-  morkAtomRowMapIter(morkEnv* ev, morkAtomRowMap* ioMap)
-  : morkMapIter(ev, ioMap) { }
- 
-  morkAtomRowMapIter( ) : morkMapIter()  { }
-  void InitAtomRowMapIter(morkEnv* ev, morkAtomRowMap* ioMap)
-  { this->InitMapIter(ev, ioMap); }
-   
-  mork_change*
-  FirstAtomAndRow(morkEnv* ev, morkAtom** outAtom, morkRow** outRow)
-  { return this->First(ev, outAtom, outRow); }
-  
-  mork_change*
-  NextAtomAndRow(morkEnv* ev, morkAtom** outAtom, morkRow** outRow)
-  { return this->Next(ev, outAtom, outRow); }
-  
-  mork_change*
-  HereAtomAndRow(morkEnv* ev, morkAtom** outAtom, morkRow** outRow)
-  { return this->Here(ev, outAtom, outRow); }
-  
-  mork_change*
-  CutHereAtomAndRow(morkEnv* ev, morkAtom** outAtom, morkRow** outRow)
-  { return this->CutHere(ev, outAtom, outRow); }
-};
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKATOMMAP_ */
deleted file mode 100644
--- a/db/mork/src/morkAtomSpace.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKMAP_
-#include "morkMap.h"
-#endif
-
-#ifndef _MORKSPACE_
-#include "morkSpace.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKSPACE_
-#include "morkSpace.h"
-#endif
-
-#ifndef _MORKATOMSPACE_
-#include "morkAtomSpace.h"
-#endif
-
-#ifndef _MORKPOOL_
-#include "morkPool.h"
-#endif
-
-#ifndef _MORKSTORE_
-#include "morkStore.h"
-#endif
-
-#ifndef _MORKATOM_
-#include "morkAtom.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkAtomSpace::CloseMorkNode(morkEnv* ev) // CloseAtomSpace() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseAtomSpace(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkAtomSpace::~morkAtomSpace() // assert CloseAtomSpace() executed earlier
-{
-  MORK_ASSERT(mAtomSpace_HighUnderId==0);
-  MORK_ASSERT(mAtomSpace_HighOverId==0);
-  MORK_ASSERT(this->IsShutNode());
-  MORK_ASSERT(mAtomSpace_AtomAids.IsShutNode());
-  MORK_ASSERT(mAtomSpace_AtomBodies.IsShutNode());
-}
-
-/*public non-poly*/
-morkAtomSpace::morkAtomSpace(morkEnv* ev, const morkUsage& inUsage,
-  mork_scope inScope, morkStore* ioStore,
-  nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-: morkSpace(ev, inUsage, inScope, ioStore, ioHeap, ioSlotHeap)
-, mAtomSpace_HighUnderId( morkAtomSpace_kMinUnderId )
-, mAtomSpace_HighOverId( morkAtomSpace_kMinOverId )
-, mAtomSpace_AtomAids(ev, morkUsage::kMember, (nsIMdbHeap*) 0, ioSlotHeap)
-, mAtomSpace_AtomBodies(ev, morkUsage::kMember, (nsIMdbHeap*) 0, ioSlotHeap)
-{
-  // the morkSpace base constructor handles any dirty propagation
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kAtomSpace;
-}
-
-/*public non-poly*/ void
-morkAtomSpace::CloseAtomSpace(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      mAtomSpace_AtomBodies.CloseMorkNode(ev);
-      morkStore* store = mSpace_Store;
-      if ( store )
-        this->CutAllAtoms(ev, &store->mStore_Pool);
-      
-      mAtomSpace_AtomAids.CloseMorkNode(ev);
-      this->CloseSpace(ev);
-      mAtomSpace_HighUnderId = 0;
-      mAtomSpace_HighOverId = 0;
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-/*static*/ void
-morkAtomSpace::NonAtomSpaceTypeError(morkEnv* ev)
-{
-  ev->NewError("non morkAtomSpace");
-}
-
-mork_num
-morkAtomSpace::CutAllAtoms(morkEnv* ev, morkPool* ioPool)
-{
-#ifdef MORK_ENABLE_ZONE_ARENAS
-  MORK_USED_2(ev, ioPool);
-  return 0;
-#else /*MORK_ENABLE_ZONE_ARENAS*/
-  if ( this->IsAtomSpaceClean() )
-    this->MaybeDirtyStoreAndSpace();
-  
-  mork_num outSlots = mAtomSpace_AtomAids.MapFill();
-  morkBookAtom* a = 0; // old key atom in the map
-  
-  morkStore* store = mSpace_Store;
-  mork_change* c = 0;
-  morkAtomAidMapIter i(ev, &mAtomSpace_AtomAids);
-  for ( c = i.FirstAtom(ev, &a); c ; c = i.NextAtom(ev, &a) )
-  {
-    if ( a )
-      ioPool->ZapAtom(ev, a, &store->mStore_Zone);
-
-#ifdef MORK_ENABLE_PROBE_MAPS
-    // do not cut anything from the map
-#else /*MORK_ENABLE_PROBE_MAPS*/
-    i.CutHereAtom(ev, /*key*/ (morkBookAtom**) 0);
-#endif /*MORK_ENABLE_PROBE_MAPS*/
-  }
-  
-  return outSlots;
-#endif /*MORK_ENABLE_ZONE_ARENAS*/
-}
-
-
-morkBookAtom*
-morkAtomSpace::MakeBookAtomCopyWithAid(morkEnv* ev,
-   const morkFarBookAtom& inAtom,  mork_aid inAid)
-// Make copy of inAtom and put it in both maps, using specified ID.
-{
-  morkBookAtom* outAtom = 0;
-  morkStore* store = mSpace_Store;
-  if ( ev->Good() && store )
-  {
-    morkPool* pool = this->GetSpaceStorePool();
-    outAtom = pool->NewFarBookAtomCopy(ev, inAtom, &store->mStore_Zone);
-    if ( outAtom )
-    {
-      if ( store->mStore_CanDirty )
-      {
-        outAtom->SetAtomDirty();
-        if ( this->IsAtomSpaceClean() )
-          this->MaybeDirtyStoreAndSpace();
-      }
-  
-      outAtom->mBookAtom_Id = inAid;
-      outAtom->mBookAtom_Space = this;
-      mAtomSpace_AtomAids.AddAtom(ev, outAtom);
-      mAtomSpace_AtomBodies.AddAtom(ev, outAtom);
-      if ( this->SpaceScope() == morkAtomSpace_kColumnScope )
-        outAtom->MakeCellUseForever(ev);
-
-      if ( mAtomSpace_HighUnderId <= inAid )
-        mAtomSpace_HighUnderId = inAid + 1;
-    }
-  }
-  return outAtom;
-}
-
-morkBookAtom*
-morkAtomSpace::MakeBookAtomCopy(morkEnv* ev, const morkFarBookAtom& inAtom)
-// make copy of inAtom and put it in both maps, using a new ID as needed.
-{
-  morkBookAtom* outAtom = 0;
-  morkStore* store = mSpace_Store;
-  if ( ev->Good() && store )
-  {
-    if ( store->mStore_CanAutoAssignAtomIdentity )
-    {
-      morkPool* pool = this->GetSpaceStorePool();
-      morkBookAtom* atom = pool->NewFarBookAtomCopy(ev, inAtom, &mSpace_Store->mStore_Zone);
-      if ( atom )
-      {
-        mork_aid id = this->MakeNewAtomId(ev, atom);
-        if ( id )
-        {
-          if ( store->mStore_CanDirty )
-          {
-            atom->SetAtomDirty();
-            if ( this->IsAtomSpaceClean() )
-              this->MaybeDirtyStoreAndSpace();
-          }
-            
-          outAtom = atom; 
-          atom->mBookAtom_Space = this;
-          mAtomSpace_AtomAids.AddAtom(ev, atom);
-          mAtomSpace_AtomBodies.AddAtom(ev, atom);
-          if ( this->SpaceScope() == morkAtomSpace_kColumnScope )
-            outAtom->MakeCellUseForever(ev);
-        }
-        else
-          pool->ZapAtom(ev, atom, &mSpace_Store->mStore_Zone);
-      }
-    }
-    else
-      mSpace_Store->CannotAutoAssignAtomIdentityError(ev);
-  }
-  return outAtom;
-}
-
-
-mork_aid
-morkAtomSpace::MakeNewAtomId(morkEnv* ev, morkBookAtom* ioAtom)
-{
-  mork_aid outAid = 0;
-  mork_tid id = mAtomSpace_HighUnderId;
-  mork_num count = 8; // try up to eight times
-  
-  while ( !outAid && count ) // still trying to find an unused table ID?
-  {
-    --count;
-    ioAtom->mBookAtom_Id = id;
-    if ( !mAtomSpace_AtomAids.GetAtom(ev, ioAtom) )
-      outAid = id;
-    else
-    {
-      MORK_ASSERT(morkBool_kFalse); // alert developer about ID problems
-      ++id;
-    }
-  }
-  
-  mAtomSpace_HighUnderId = id + 1;
-  return outAid;
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
-morkAtomSpaceMap::~morkAtomSpaceMap()
-{
-}
-
-morkAtomSpaceMap::morkAtomSpaceMap(morkEnv* ev, const morkUsage& inUsage,
-  nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-  : morkNodeMap(ev, inUsage, ioHeap, ioSlotHeap)
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kAtomSpaceMap;
-}
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
deleted file mode 100644
--- a/db/mork/src/morkAtomSpace.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKATOMSPACE_
-#define _MORKATOMSPACE_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKSPACE_
-#include "morkSpace.h"
-#endif
-
-#ifndef _MORKATOMMAP_
-#include "morkAtomMap.h"
-#endif
-
-#ifndef _MORKNODEMAP_
-#include "morkNodeMap.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-/*| kMinUnderId: the smallest ID we auto-assign to the 'under' namespace
-**| reserved for tokens expected to occur very frequently, such as the names
-**| of columns.  We reserve single byte ids in the ASCII range to correspond
-**| one-to-one to those tokens consisting single ASCII characters (so that
-**| this assignment is always known and constant).  So we start at 0x80, and
-**| then reserve the upper half of two hex digit ids and all the three hex
-**| digit IDs for the 'under' namespace for common tokens.
-|*/
-#define morkAtomSpace_kMinUnderId 0x80   /* low 7 bits mean byte tokens */
-
-#define morkAtomSpace_kMaxSevenBitAid 0x7F  /* low seven bit integer ID */
-
-/*| kMinOverId: the smallest ID we auto-assign to the 'over' namespace that
-**| might include very large numbers of tokens that are used infrequently,
-**| so that we care less whether the shortest hex representation is used.
-**| So we start all IDs for 'over' category tokens at a value range that
-**| needs at least four hex digits, so we can reserve three hex digits and
-**| shorter for more commonly occuring tokens in the 'under' category.
-|*/
-#define morkAtomSpace_kMinOverId 0x1000  /* using at least four hex bytes */
-
-#define morkDerived_kAtomSpace  /*i*/ 0x6153 /* ascii 'aS' */
-
-#define morkAtomSpace_kColumnScope ((mork_scope) 'c') /* column scope is forever */
-
-/*| morkAtomSpace:
-|*/
-class morkAtomSpace : public morkSpace { // 
-
-// public: // slots inherited from morkSpace (meant to inform only)
-  // nsIMdbHeap*    mNode_Heap;
-
-  // 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_able      mNode_Mutable;  // can this node be modified?
-  // mork_load      mNode_Load;     // is this node clean or dirty?
-  
-  // mork_uses      mNode_Uses;     // refcount for strong refs
-  // mork_refs      mNode_Refs;     // refcount for strong refs + weak refs
-  
-  // morkStore*  mSpace_Store; // weak ref to containing store
-  
-  // mork_bool   mSpace_DoAutoIDs;    // whether db should assign member IDs
-  // mork_bool   mSpace_HaveDoneAutoIDs; // whether actually auto assigned IDs
-  // mork_u1     mSpace_Pad[ 2 ];     // pad to u4 alignment
-
-public: // state is public because the entire Mork system is private
-
-  mork_aid         mAtomSpace_HighUnderId; // high ID in 'under' range
-  mork_aid         mAtomSpace_HighOverId;  // high ID in 'over' range
-  
-  morkAtomAidMap   mAtomSpace_AtomAids; // all atoms in space by ID
-  morkAtomBodyMap  mAtomSpace_AtomBodies; // all atoms in space by body
-
-public: // more specific dirty methods for atom space:
-  void SetAtomSpaceDirty() { this->SetNodeDirty(); }
-  void SetAtomSpaceClean() { this->SetNodeClean(); }
-  
-  mork_bool IsAtomSpaceClean() const { return this->IsNodeClean(); }
-  mork_bool IsAtomSpaceDirty() const { return this->IsNodeDirty(); }
-
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseAtomSpace() only if open
-  virtual ~morkAtomSpace(); // assert that CloseAtomSpace() executed earlier
-  
-public: // morkMap construction & destruction
-  morkAtomSpace(morkEnv* ev, const morkUsage& inUsage, mork_scope inScope, 
-    morkStore* ioStore, nsIMdbHeap* ioNodeHeap, nsIMdbHeap* ioSlotHeap);
-  void CloseAtomSpace(morkEnv* ev); // called by CloseMorkNode();
-
-public: // dynamic type identification
-  mork_bool IsAtomSpace() const
-  { return IsNode() && mNode_Derived == morkDerived_kAtomSpace; }
-// } ===== end morkNode methods =====
-
-public: // typing
-  void NonAtomSpaceTypeError(morkEnv* ev);
-
-public: // setup
-
-  mork_bool MarkAllAtomSpaceContentDirty(morkEnv* ev);
-  // MarkAllAtomSpaceContentDirty() visits every space object and marks 
-  // them dirty, including every table, row, cell, and atom.  The return
-  // equals ev->Good(), to show whether any error happened.  This method is
-  // intended for use in the beginning of a "compress commit" which writes
-  // all store content, whether dirty or not.  We dirty everything first so
-  // that later iterations over content can mark things clean as they are
-  // written, and organize the process of serialization so that objects are
-  // written only at need (because of being dirty).
-
-public: // other space methods
-
-  // void ReserveColumnAidCount(mork_count inCount)
-  // {
-  //   mAtomSpace_HighUnderId = morkAtomSpace_kMinUnderId + inCount;
-  //   mAtomSpace_HighOverId = morkAtomSpace_kMinOverId + inCount;
-  // }
-
-  mork_num CutAllAtoms(morkEnv* ev, morkPool* ioPool);
-  // CutAllAtoms() puts all the atoms back in the pool.
-  
-  morkBookAtom* MakeBookAtomCopyWithAid(morkEnv* ev,
-     const morkFarBookAtom& inAtom,  mork_aid inAid);
-  // Make copy of inAtom and put it in both maps, using specified ID.
-  
-  morkBookAtom* MakeBookAtomCopy(morkEnv* ev, const morkFarBookAtom& inAtom);
-  // Make copy of inAtom and put it in both maps, using a new ID as needed.
-
-  mork_aid MakeNewAtomId(morkEnv* ev, morkBookAtom* ioAtom);
-  // generate an unused atom id.
-
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakAtomSpace(morkAtomSpace* me,
-    morkEnv* ev, morkAtomSpace** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongAtomSpace(morkAtomSpace* me,
-    morkEnv* ev, morkAtomSpace** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kAtomSpaceMap  /*i*/ 0x615A /* ascii 'aZ' */
-
-/*| morkAtomSpaceMap: maps mork_scope -> morkAtomSpace
-|*/
-class morkAtomSpaceMap : public morkNodeMap { // for mapping tokens to tables
-
-public:
-
-  virtual ~morkAtomSpaceMap();
-  morkAtomSpaceMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap);
-
-public: // other map methods
-
-  mork_bool  AddAtomSpace(morkEnv* ev, morkAtomSpace* ioAtomSpace)
-  { return this->AddNode(ev, ioAtomSpace->SpaceScope(), ioAtomSpace); }
-  // the AddAtomSpace() boolean return equals ev->Good().
-
-  mork_bool  CutAtomSpace(morkEnv* ev, mork_scope inScope)
-  { return this->CutNode(ev, inScope); }
-  // The CutAtomSpace() boolean return indicates whether removal happened. 
-  
-  morkAtomSpace*  GetAtomSpace(morkEnv* ev, mork_scope inScope)
-  { return (morkAtomSpace*) this->GetNode(ev, inScope); }
-  // Note the returned space does NOT have an increase in refcount for this.
-
-  mork_num CutAllAtomSpaces(morkEnv* ev)
-  { return this->CutAllNodes(ev); }
-  // CutAllAtomSpaces() releases all the referenced table values.
-};
-
-class morkAtomSpaceMapIter: public morkMapIter{ // typesafe wrapper class
-
-public:
-  morkAtomSpaceMapIter(morkEnv* ev, morkAtomSpaceMap* ioMap)
-  : morkMapIter(ev, ioMap) { }
- 
-  morkAtomSpaceMapIter( ) : morkMapIter()  { }
-  void InitAtomSpaceMapIter(morkEnv* ev, morkAtomSpaceMap* ioMap)
-  { this->InitMapIter(ev, ioMap); }
-   
-  mork_change*
-  FirstAtomSpace(morkEnv* ev, mork_scope* outScope, morkAtomSpace** outAtomSpace)
-  { return this->First(ev, outScope, outAtomSpace); }
-  
-  mork_change*
-  NextAtomSpace(morkEnv* ev, mork_scope* outScope, morkAtomSpace** outAtomSpace)
-  { return this->Next(ev, outScope, outAtomSpace); }
-  
-  mork_change*
-  HereAtomSpace(morkEnv* ev, mork_scope* outScope, morkAtomSpace** outAtomSpace)
-  { return this->Here(ev, outScope, outAtomSpace); }
-  
-  mork_change*
-  CutHereAtomSpace(morkEnv* ev, mork_scope* outScope, morkAtomSpace** outAtomSpace)
-  { return this->CutHere(ev, outScope, outAtomSpace); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKATOMSPACE_ */
-
deleted file mode 100644
--- a/db/mork/src/morkBead.cpp
+++ /dev/null
@@ -1,472 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKBEAD_
-#include "morkBead.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkBead::CloseMorkNode(morkEnv* ev) // CloseBead() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseBead(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkBead::~morkBead() // assert CloseBead() executed earlier
-{
-  MORK_ASSERT(mBead_Color==0 || mNode_Usage == morkUsage_kStack );
-}
-
-/*public non-poly*/
-morkBead::morkBead(mork_color inBeadColor)
-: morkNode( morkUsage_kStack )
-, mBead_Color( inBeadColor )
-{
-}
-
-/*public non-poly*/
-morkBead::morkBead(const morkUsage& inUsage, nsIMdbHeap* ioHeap, 
-  mork_color inBeadColor)
-: morkNode( inUsage, ioHeap )
-, mBead_Color( inBeadColor )
-{
-}
-
-/*public non-poly*/
-morkBead::morkBead(morkEnv* ev,
-  const morkUsage& inUsage, nsIMdbHeap* ioHeap, mork_color inBeadColor)
-: morkNode(ev, inUsage, ioHeap)
-, mBead_Color( inBeadColor )
-{
-  if ( ev->Good() )
-  {
-    if ( ev->Good() )
-      mNode_Derived = morkDerived_kBead;
-  }
-}
-
-/*public non-poly*/ void
-morkBead::CloseBead(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      if ( !this->IsShutNode() )
-      {
-        mBead_Color = 0;
-        this->MarkShut();
-      }
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkBeadMap::CloseMorkNode(morkEnv* ev) // CloseBeadMap() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseBeadMap(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkBeadMap::~morkBeadMap() // assert CloseBeadMap() executed earlier
-{
-  MORK_ASSERT(this->IsShutNode());
-}
-
-/*public non-poly*/
-morkBeadMap::morkBeadMap(morkEnv* ev,
-  const morkUsage& inUsage, nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-: morkMap(ev, inUsage, ioHeap, sizeof(morkBead*), /*inValSize*/ 0,
-  /*slotCount*/ 11, ioSlotHeap, /*holdChanges*/ morkBool_kFalse)
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kBeadMap;
-}
-
-/*public non-poly*/ void
-morkBeadMap::CloseBeadMap(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      this->CutAllBeads(ev);
-      this->CloseMap(ev);
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-mork_bool
-morkBeadMap::AddBead(morkEnv* ev, morkBead* ioBead)
-  // the AddBead() boolean return equals ev->Good().
-{
-  if ( ioBead && ev->Good() )
-  {
-    morkBead* oldBead = 0; // old key in the map
-
-    mork_bool put = this->Put(ev, &ioBead, /*val*/ (void*) 0,
-      /*key*/ &oldBead, /*val*/ (void*) 0, (mork_change**) 0);
-      
-    if ( put ) // replaced an existing key?
-    {
-      if ( oldBead != ioBead ) // new bead was not already in table?
-        ioBead->AddStrongRef(ev); // now there's another ref
-        
-      if ( oldBead && oldBead != ioBead ) // need to release old node?
-        oldBead->CutStrongRef(ev);
-    }
-    else
-      ioBead->AddStrongRef(ev); // another ref if not already in table
-  }
-  else if ( !ioBead )
-    ev->NilPointerError();
-    
-  return ev->Good();
-}
-
-mork_bool
-morkBeadMap::CutBead(morkEnv* ev, mork_color inColor)
-{
-  morkBead* oldBead = 0; // old key in the map
-  morkBead bead(inColor);
-  morkBead* key = &bead;
-  
-  mork_bool outCutNode = this->Cut(ev, &key, 
-    /*key*/ &oldBead, /*val*/ (void*) 0, (mork_change**) 0);
-    
-  if ( oldBead )
-    oldBead->CutStrongRef(ev);
-  
-  bead.CloseBead(ev);
-  return outCutNode;
-}
-
-morkBead*
-morkBeadMap::GetBead(morkEnv* ev, mork_color inColor)
-  // Note the returned bead does NOT have an increase in refcount for this.
-{
-  morkBead* oldBead = 0; // old key in the map
-  morkBead bead(inColor);
-  morkBead* key = &bead;
-
-  this->Get(ev, &key, /*key*/ &oldBead, /*val*/ (void*) 0, (mork_change**) 0);
-  
-  bead.CloseBead(ev);
-  return oldBead;
-}
-
-mork_num
-morkBeadMap::CutAllBeads(morkEnv* ev)
-  // CutAllBeads() releases all the referenced beads.
-{
-  mork_num outSlots = mMap_Slots;
-  
-  morkBeadMapIter i(ev, this);
-  morkBead* b = i.FirstBead(ev);
-
-  while ( b )
-  {
-    b->CutStrongRef(ev);
-    i.CutHereBead(ev);
-    b = i.NextBead(ev);
-  }
-  
-  return outSlots;
-}
-
-
-// { ===== begin morkMap poly interface =====
-/*virtual*/ mork_bool
-morkBeadMap::Equal(morkEnv* ev, const void* inKeyA, const void* inKeyB) const
-{
-  MORK_USED_1(ev);
-  return (*(const morkBead**) inKeyA)->BeadEqual(
-    *(const morkBead**) inKeyB);
-}
-
-/*virtual*/ mork_u4
-morkBeadMap::Hash(morkEnv* ev, const void* inKey) const
-{
-  MORK_USED_1(ev);
-    return (*(const morkBead**) inKey)->BeadHash();
-}
-// } ===== end morkMap poly interface =====
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
- 
-morkBead* morkBeadMapIter::FirstBead(morkEnv* ev)
-{
-  morkBead* bead = 0;
-  this->First(ev, &bead, /*val*/ (void*) 0);
-  return bead;
-}
-
-morkBead* morkBeadMapIter::NextBead(morkEnv* ev)
-{
-  morkBead* bead = 0;
-  this->Next(ev, &bead, /*val*/ (void*) 0);
-  return bead;
-}
-
-morkBead* morkBeadMapIter::HereBead(morkEnv* ev)
-{
-  morkBead* bead = 0;
-  this->Here(ev, &bead, /*val*/ (void*) 0);
-  return bead;
-}
-
-void morkBeadMapIter::CutHereBead(morkEnv* ev)
-{
-  this->CutHere(ev, /*key*/ (void*) 0, /*val*/ (void*) 0);
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkBeadProbeMap::CloseMorkNode(morkEnv* ev) // CloseBeadProbeMap() if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseBeadProbeMap(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkBeadProbeMap::~morkBeadProbeMap() // assert CloseBeadProbeMap() earlier
-{
-  MORK_ASSERT(this->IsShutNode());
-}
-
-
-/*public non-poly*/
-morkBeadProbeMap::morkBeadProbeMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap)
-: morkProbeMap(ev, inUsage, ioHeap,
-  /*inKeySize*/ sizeof(morkBead*), /*inValSize*/ 0,
-  ioSlotHeap, /*startSlotCount*/ 11, 
-  /*inZeroIsClearKey*/ morkBool_kTrue)
-{
-  if ( ev->Good() )
-    mNode_Derived = morkDerived_kBeadProbeMap;
-}
-
-/*public non-poly*/ void
-morkBeadProbeMap::CloseBeadProbeMap(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      this->CutAllBeads(ev);
-      this->CloseProbeMap(ev);
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-/*virtual*/ mork_test // hit(a,b) implies hash(a) == hash(b)
-morkBeadProbeMap::MapTest(morkEnv* ev, const void* inMapKey,
-  const void* inAppKey) const
-{
-  MORK_USED_1(ev);
-  const morkBead* key = *(const morkBead**) inMapKey;
-  if ( key )
-  {
-    mork_bool hit = key->BeadEqual(*(const morkBead**) inAppKey);
-    return ( hit ) ? morkTest_kHit : morkTest_kMiss;
-  }
-  else
-    return morkTest_kVoid;
-}
-
-/*virtual*/ mork_u4 // hit(a,b) implies hash(a) == hash(b)
-morkBeadProbeMap::MapHash(morkEnv* ev, const void* inAppKey) const
-{
-  const morkBead* key = *(const morkBead**) inAppKey;
-  if ( key )
-    return key->BeadHash();
-  else
-  {
-    ev->NilPointerWarning();
-    return 0;
-  }
-}
-
-/*virtual*/ mork_u4 
-morkBeadProbeMap::ProbeMapHashMapKey(morkEnv* ev,
-  const void* inMapKey) const
-{
-  const morkBead* key = *(const morkBead**) inMapKey;
-  if ( key )
-    return key->BeadHash();
-  else
-  {
-    ev->NilPointerWarning();
-    return 0;
-  }
-}
-
-mork_bool
-morkBeadProbeMap::AddBead(morkEnv* ev, morkBead* ioBead)
-{
-  if ( ioBead && ev->Good() )
-  {
-    morkBead* bead = 0; // old key in the map
-    
-    mork_bool put = this->MapAtPut(ev, &ioBead, /*val*/ (void*) 0, 
-      /*key*/ &bead, /*val*/ (void*) 0);
-          
-    if ( put ) // replaced an existing key?
-    {
-      if ( bead != ioBead ) // new bead was not already in table?
-        ioBead->AddStrongRef(ev); // now there's another ref
-        
-      if ( bead && bead != ioBead ) // need to release old node?
-        bead->CutStrongRef(ev);
-    }
-    else
-      ioBead->AddStrongRef(ev); // now there's another ref
-  }
-  else if ( !ioBead )
-    ev->NilPointerError();
-    
-  return ev->Good();
-}
-
-morkBead*
-morkBeadProbeMap::GetBead(morkEnv* ev, mork_color inColor)
-{
-  morkBead* oldBead = 0; // old key in the map
-  morkBead bead(inColor);
-  morkBead* key = &bead;
-
-  this->MapAt(ev, &key, &oldBead, /*val*/ (void*) 0);
-  
-  bead.CloseBead(ev);
-  return oldBead;
-}
-
-mork_num
-morkBeadProbeMap::CutAllBeads(morkEnv* ev)
-  // CutAllBeads() releases all the referenced bead values.
-{
-  mork_num outSlots = sMap_Slots;
-  
-  morkBeadProbeMapIter i(ev, this);
-  morkBead* b = i.FirstBead(ev);
-
-  while ( b )
-  {
-    b->CutStrongRef(ev);
-    b = i.NextBead(ev);
-  }
-  this->MapCutAll(ev);
-  
-  return outSlots;
-}
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-
deleted file mode 100644
--- a/db/mork/src/morkBead.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKBEAD_
-#define _MORKBEAD_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKMAP_
-#include "morkMap.h"
-#endif
-
-#ifndef _MORKPROBEMAP_
-#include "morkProbeMap.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kBead   /*i*/ 0x426F /* ascii 'Bo' */
-
-/*| morkBead: subclass of morkNode that adds knowledge of db suite factory
-**| and containing port to those objects that are exposed as instances of
-**| nsIMdbBead in the public interface.
-|*/
-class morkBead : public morkNode { 
-
-// public: // slots inherited from morkNode (meant to inform only)
-  // nsIMdbHeap*    mNode_Heap;
-
-  // 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_able      mNode_Mutable;  // can this node be modified?
-  // mork_load      mNode_Load;     // is this node clean or dirty?
-  
-  // mork_uses      mNode_Uses;     // refcount for strong refs
-  // mork_refs      mNode_Refs;     // refcount for strong refs + weak refs
-  
-public: // state is public because the entire Mork system is private
-
-  mork_color      mBead_Color;   // ID for this bead
-
-public: // Hash() and Equal() for bead maps are same for all subclasses:
-
-  mork_u4 BeadHash() const { return (mork_u4) mBead_Color; }
-  mork_bool BeadEqual(const morkBead* inBead) const
-  { return ( mBead_Color == inBead->mBead_Color); }
-  
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseBead() only if open
-  virtual ~morkBead(); // assert that CloseBead() executed earlier
-  
-public: // special case for stack construction for map usage:
-  morkBead(mork_color inBeadColor); // stack-based bead instance
-  
-protected: // special case for morkObject:
-  morkBead(const morkUsage& inUsage, nsIMdbHeap* ioHeap,
-    mork_color inBeadColor);
-  
-public: // morkEnv construction & destruction
-  morkBead(morkEnv* ev, const morkUsage& inUsage, nsIMdbHeap* ioHeap, 
-     mork_color inBeadColor);
-  void CloseBead(morkEnv* ev); // called by CloseMorkNode();
-
-private: // copying is not allowed
-  morkBead(const morkBead& other);
-  morkBead& operator=(const morkBead& other);
-
-public: // dynamic type identification
-  mork_bool IsBead() const
-  { return IsNode() && mNode_Derived == morkDerived_kBead; }
-// } ===== end morkNode methods =====
-
-  // void NewNilHandleError(morkEnv* ev); // mBead_Handle is nil
-  
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakBead(morkBead* me,
-    morkEnv* ev, morkBead** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongBead(morkBead* me,
-    morkEnv* ev, morkBead** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kBeadMap  /*i*/ 0x744D /* ascii 'bM' */
-
-/*| morkBeadMap: maps bead -> bead (key only using mBead_Color)
-|*/
-class morkBeadMap : public morkMap {
-
-
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseBeadMap() only if open
-  virtual ~morkBeadMap(); // assert that CloseBeadMap() executed earlier
-  
-public: // morkMap construction & destruction
-  morkBeadMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap);
-  void CloseBeadMap(morkEnv* ev); // called by CloseMorkNode();
-
-public: // dynamic type identification
-  mork_bool IsBeadMap() const
-  { return IsNode() && mNode_Derived == morkDerived_kBeadMap; }
-// } ===== end morkNode methods =====
-
-// { ===== begin morkMap poly interface =====
-public:
-  virtual mork_bool // *((mork_u4*) inKeyA) == *((mork_u4*) inKeyB)
-  Equal(morkEnv* ev, const void* inKeyA, const void* inKeyB) const;
-
-  virtual mork_u4 // some integer function of *((mork_u4*) inKey)
-  Hash(morkEnv* ev, const void* inKey) const;
-// } ===== end morkMap poly interface =====
-
-public: // other map methods
-
-  mork_bool  AddBead(morkEnv* ev, morkBead* ioBead);
-  // the AddBead() boolean return equals ev->Good().
-
-  mork_bool  CutBead(morkEnv* ev, mork_color inColor);
-  // The CutBead() boolean return indicates whether removal happened. 
-  
-  morkBead*  GetBead(morkEnv* ev, mork_color inColor);
-  // Note the returned bead does NOT have an increase in refcount for this.
-
-  mork_num CutAllBeads(morkEnv* ev);
-  // CutAllBeads() releases all the referenced beads.
-};
-
-class morkBeadMapIter: public morkMapIter{ // typesafe wrapper class
-
-public:
-  morkBeadMapIter(morkEnv* ev, morkBeadMap* ioMap)
-  : morkMapIter(ev, ioMap) { }
- 
-  morkBeadMapIter( ) : morkMapIter()  { }
-  void InitBeadMapIter(morkEnv* ev, morkBeadMap* ioMap)
-  { this->InitMapIter(ev, ioMap); }
-   
-  morkBead* FirstBead(morkEnv* ev);
-  morkBead* NextBead(morkEnv* ev);
-  morkBead* HereBead(morkEnv* ev);
-  void      CutHereBead(morkEnv* ev);
-  
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#define morkDerived_kBeadProbeMap  /*i*/ 0x6D74 /* ascii 'mb' */
-
-/*| morkBeadProbeMap: maps bead -> bead (key only using mBead_Color)
-|*/
-class morkBeadProbeMap : public morkProbeMap {
-
-
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseBeadProbeMap() only if open
-  virtual ~morkBeadProbeMap(); // assert that CloseBeadProbeMap() executed earlier
-  
-public: // morkMap construction & destruction
-  morkBeadProbeMap(morkEnv* ev, const morkUsage& inUsage,
-    nsIMdbHeap* ioHeap, nsIMdbHeap* ioSlotHeap);
-  void CloseBeadProbeMap(morkEnv* ev); // called by CloseMorkNode();
-
-public: // dynamic type identification
-  mork_bool IsBeadProbeMap() const
-  { return IsNode() && mNode_Derived == morkDerived_kBeadProbeMap; }
-// } ===== end morkNode methods =====
-
-  // { ===== begin morkProbeMap methods =====
-public:
-  virtual mork_test // hit(a,b) implies hash(a) == hash(b)
-  MapTest(morkEnv* ev, const void* inMapKey, const void* inAppKey) const;
-
-  virtual mork_u4 // hit(a,b) implies hash(a) == hash(b)
-  MapHash(morkEnv* ev, const void* inAppKey) const;
-
-  virtual mork_u4 ProbeMapHashMapKey(morkEnv* ev, const void* inMapKey) const;
-
-  // virtual mork_bool ProbeMapIsKeyNil(morkEnv* ev, void* ioMapKey);
-
-  // virtual void ProbeMapClearKey(morkEnv* ev, // put 'nil' alls keys inside map
-  //   void* ioMapKey, mork_count inKeyCount); // array of keys inside map
-
-  // virtual void ProbeMapPushIn(morkEnv* ev, // move (key,val) into the map
-  //   const void* inAppKey, const void* inAppVal, // (key,val) outside map
-  //   void* outMapKey, void* outMapVal);      // (key,val) inside map
-
-  // virtual void ProbeMapPullOut(morkEnv* ev, // move (key,val) out from the map
-  //   const void* inMapKey, const void* inMapVal, // (key,val) inside map
-  //   void* outAppKey, void* outAppVal) const;    // (key,val) outside map
-  // } ===== end morkProbeMap methods =====
-
-public: // other map methods
-
-  mork_bool  AddBead(morkEnv* ev, morkBead* ioBead);
-  // the AddBead() boolean return equals ev->Good().
-  
-  morkBead*  GetBead(morkEnv* ev, mork_color inColor);
-  // Note the returned bead does NOT have an increase in refcount for this.
-
-  mork_num   CutAllBeads(morkEnv* ev);
-  // CutAllBeads() releases all the referenced bead values.
-};
-
-class morkBeadProbeMapIter: public morkProbeMapIter { // typesafe wrapper class
-
-public:
-  morkBeadProbeMapIter(morkEnv* ev, morkBeadProbeMap* ioMap)
-  : morkProbeMapIter(ev, ioMap) { }
- 
-  morkBeadProbeMapIter( ) : morkProbeMapIter()  { }
-  void InitBeadProbeMapIter(morkEnv* ev, morkBeadProbeMap* ioMap)
-  { this->InitProbeMapIter(ev, ioMap); }
-   
-  morkBead* FirstBead(morkEnv* ev)
-  { return (morkBead*) this->IterFirstKey(ev); }
-  
-  morkBead* NextBead(morkEnv* ev)
-  { return (morkBead*) this->IterNextKey(ev); }
-  
-  morkBead* HereBead(morkEnv* ev)
-  { return (morkBead*) this->IterHereKey(ev); }
-  
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKBEAD_ */
deleted file mode 100644
--- a/db/mork/src/morkBlob.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKBLOB_
-#include "morkBlob.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-/*static*/ void
-morkBuf::NilBufBodyError(morkEnv* ev)
-{
-  ev->NewError("nil mBuf_Body");
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-/*static*/ void
-morkBlob::BlobFillOverSizeError(morkEnv* ev)
-{
-  ev->NewError("mBuf_Fill > mBlob_Size");
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-mork_bool
-morkBlob::GrowBlob(morkEnv* ev, nsIMdbHeap* ioHeap, mork_size inNewSize)
-{
-  if ( ioHeap )
-  {
-    if ( !mBuf_Body ) // no body? implies zero sized?
-      mBlob_Size = 0;
-      
-    if ( mBuf_Fill > mBlob_Size ) // fill more than size?
-    {
-      ev->NewWarning("mBuf_Fill > mBlob_Size");
-      mBuf_Fill = mBlob_Size;
-    }
-      
-    if ( inNewSize > mBlob_Size ) // need to allocate larger blob?
-    {
-      mork_u1* body = 0;
-      ioHeap->Alloc(ev->AsMdbEnv(), inNewSize, (void**) &body);
-      if ( body && ev->Good() )
-      {
-        void* oldBody = mBuf_Body;
-        if ( mBlob_Size ) // any old content to transfer?
-          MORK_MEMCPY(body, oldBody, mBlob_Size);
-        
-        mBlob_Size = inNewSize; // install new size
-        mBuf_Body = body; // install new body
-        
-        if ( oldBody ) // need to free old buffer body?
-          ioHeap->Free(ev->AsMdbEnv(), oldBody);
-      }
-    }
-  }
-  else
-    ev->NilPointerError();
-    
-  if ( ev->Good() && mBlob_Size < inNewSize )
-    ev->NewError("mBlob_Size < inNewSize");
-    
-  return ev->Good();
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-morkCoil::morkCoil(morkEnv* ev, nsIMdbHeap* ioHeap)
-{
-  mBuf_Body = 0;
-  mBuf_Fill = 0;
-  mBlob_Size = 0;
-  mText_Form = 0;
-  mCoil_Heap = ioHeap;
-  if ( !ioHeap )
-    ev->NilPointerError();
-}
-
-void
-morkCoil::CloseCoil(morkEnv* ev)
-{
-  void* body = mBuf_Body;
-  nsIMdbHeap* heap = mCoil_Heap;
-
-  mBuf_Body = 0;
-  mCoil_Heap = 0;
-  
-  if ( body && heap )
-  {
-    heap->Free(ev->AsMdbEnv(), body);
-  }
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
deleted file mode 100644
--- a/db/mork/src/morkBlob.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKBLOB_
-#define _MORKBLOB_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-/*| Buf: the minimum needed to describe location and content length.
-**| This is typically only enough to read from this buffer, since
-**| one cannot write effectively without knowing the size of a buf.
-|*/
-class morkBuf { // subset of nsIMdbYarn slots
-public:
-  void*         mBuf_Body;  // space for holding any binary content
-  mork_fill     mBuf_Fill;  // logical content in Buf in bytes
-
-public:
-  morkBuf() { }
-  morkBuf(const void* ioBuf, mork_fill inFill)
-  : mBuf_Body((void*) ioBuf), mBuf_Fill(inFill) { }
-
-  void ClearBufFill() { mBuf_Fill = 0; }
-
-  static void NilBufBodyError(morkEnv* ev);
-
-private: // copying is not allowed
-  morkBuf(const morkBuf& other);
-  morkBuf& operator=(const morkBuf& other);
-};
-
-/*| Blob: a buffer with an associated size, to increase known buf info
-**| to include max capacity in addition to buf location and content.
-**| This form factor allows us to allocate a vector of such blobs,
-**| which can share the same managing heap stored elsewhere, and that
-**| is why we don't include a pointer to a heap in this blob class.
-|*/
-class morkBlob : public morkBuf { // greater subset of nsIMdbYarn slots
-
-  // void*         mBuf_Body;  // space for holding any binary content
-  // mdb_fill      mBuf_Fill;  // logical content in Buf in bytes
-public:
-  mork_size      mBlob_Size;  // physical size of Buf in bytes
-
-public:
-  morkBlob() { }
-  morkBlob(const void* ioBuf, mork_fill inFill, mork_size inSize)
-  : morkBuf(ioBuf, inFill), mBlob_Size(inSize) { }
- 
-  static void BlobFillOverSizeError(morkEnv* ev);
- 
-public:
-  mork_bool GrowBlob(morkEnv* ev, nsIMdbHeap* ioHeap,
-    mork_size inNewSize);
-
-private: // copying is not allowed
-  morkBlob(const morkBlob& other);
-  morkBlob& operator=(const morkBlob& other);
-  
-};
-
-/*| Text: a blob with an associated charset annotation, where the
-**| charset actually includes the general notion of typing, and not
-**| just a specification of character set alone; we want to permit
-**| arbitrary charset annotations for ad hoc binary types as well.
-**| (We avoid including a nsIMdbHeap pointer in morkText for the same
-**| reason morkBlob does: we want minimal size vectors of morkText.)
-|*/
-class morkText : public morkBlob { // greater subset of nsIMdbYarn slots
-
-  // void*         mBuf_Body;  // space for holding any binary content
-  // mdb_fill      mBuf_Fill;  // logical content in Buf in bytes
-  // mdb_size      mBlob_Size;  // physical size of Buf in bytes
-
-public:
-  mork_cscode    mText_Form;  // charset format encoding
-
-  morkText() { }
-
-private: // copying is not allowed
-  morkText(const morkText& other);
-  morkText& operator=(const morkText& other);
-};
-
-/*| Coil: a text with an associated nsIMdbHeap instance that provides
-**| all memory management for the space pointed to by mBuf_Body. (This
-**| was the hardest type to give a name in this small class hierarchy,
-**| because it's hard to characterize self-management of one's space.)
-**| A coil is a self-contained blob that knows how to grow itself as
-**| necessary to hold more content when necessary.  Coil descends from
-**| morkText to include the mText_Form slot, even though this won't be
-**| needed always, because we are not as concerned about the overall
-**| size of this particular Coil object (if we were concerned about
-**| the size of an array of Coil instances, we would not bother with
-**| a separate heap pointer for each of them).
-**|
-**|| A coil makes a good medium in which to stream content as a sink,
-**| so we will have a subclass of morkSink called morkCoil that
-**| will stream bytes into this self-contained coil object. The name
-**| of this morkCoil class derives more from this intended usage than
-**| from anything else.  The Mork code to parse db content will use
-**| coils with associated sinks to accumulate parsed strings.
-**|
-**|| Heap: this is the heap used for memory allocation.  This instance
-**| is NOT refcounted, since this coil always assumes the heap is held
-**| through a reference elsewhere (for example, through the same object
-**| that contains or holds the coil itself.  This lack of refcounting
-**| is consistent with the fact that morkCoil itself is not refcounted,
-**| and is not intended for use as a standalone object.
-|*/
-class morkCoil : public morkText { // self-managing text blob object
-
-  // void*         mBuf_Body;  // space for holding any binary content
-  // mdb_fill      mBuf_Fill;  // logical content in Buf in bytes
-  // mdb_size      mBlob_Size;  // physical size of Buf in bytes
-  // mdb_cscode    mText_Form;  // charset format encoding
-public:
-  nsIMdbHeap*      mCoil_Heap;  // storage manager for mBuf_Body pointer
-
-public:
-  morkCoil(morkEnv* ev, nsIMdbHeap* ioHeap);
-  
-  void CloseCoil(morkEnv* ev);
-
-  mork_bool GrowCoil(morkEnv* ev, mork_size inNewSize)
-  { return this->GrowBlob(ev, mCoil_Heap, inNewSize); }
-
-private: // copying is not allowed
-  morkCoil(const morkCoil& other);
-  morkCoil& operator=(const morkCoil& other);
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKBLOB_ */
deleted file mode 100644
--- a/db/mork/src/morkBuilder.cpp
+++ /dev/null
@@ -1,1068 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKMAP_
-#include "morkMap.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKPARSER_
-#include "morkParser.h"
-#endif
-
-#ifndef _MORKBUILDER_
-#include "morkBuilder.h"
-#endif
-
-#ifndef _MORKCELL_
-#include "morkCell.h"
-#endif
-
-#ifndef _MORKSTORE_
-#include "morkStore.h"
-#endif
-
-#ifndef _MORKTABLE_
-#include "morkTable.h"
-#endif
-
-#ifndef _MORKROW_
-#include "morkRow.h"
-#endif
-
-#ifndef _MORKCELL_
-#include "morkCell.h"
-#endif
-
-#ifndef _MORKATOM_
-#include "morkAtom.h"
-#endif
-
-#ifndef _MORKATOMSPACE_
-#include "morkAtomSpace.h"
-#endif
-
-#ifndef _MORKROWSPACE_
-#include "morkRowSpace.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-// ````` ````` ````` ````` ````` 
-// { ===== begin morkNode interface =====
-
-/*public virtual*/ void
-morkBuilder::CloseMorkNode(morkEnv* ev) // CloseBuilder() only if open
-{
-  if ( this->IsOpenNode() )
-  {
-    this->MarkClosing();
-    this->CloseBuilder(ev);
-    this->MarkShut();
-  }
-}
-
-/*public virtual*/
-morkBuilder::~morkBuilder() // assert CloseBuilder() executed earlier
-{
-  MORK_ASSERT(mBuilder_Store==0);
-  MORK_ASSERT(mBuilder_Row==0);
-  MORK_ASSERT(mBuilder_Table==0);
-  MORK_ASSERT(mBuilder_Cell==0);
-  MORK_ASSERT(mBuilder_RowSpace==0);
-  MORK_ASSERT(mBuilder_AtomSpace==0);
-}
-
-/*public non-poly*/
-morkBuilder::morkBuilder(morkEnv* ev,
-  const morkUsage& inUsage, nsIMdbHeap* ioHeap, 
-  morkStream* ioStream, mdb_count inBytesPerParseSegment,
-  nsIMdbHeap* ioSlotHeap, morkStore* ioStore)
-
-: morkParser(ev, inUsage, ioHeap, ioStream,
-  inBytesPerParseSegment, ioSlotHeap)
-  
-, mBuilder_Store( 0 )
-  
-, mBuilder_Table( 0 )
-, mBuilder_Row( 0 )
-, mBuilder_Cell( 0 )
-  
-, mBuilder_RowSpace( 0 )
-, mBuilder_AtomSpace( 0 )
-  
-, mBuilder_OidAtomSpace( 0 )
-, mBuilder_ScopeAtomSpace( 0 )
-  
-, mBuilder_PortForm( 0 )
-, mBuilder_PortRowScope( (mork_scope) 'r' )
-, mBuilder_PortAtomScope( (mork_scope) 'v' )
-
-, mBuilder_TableForm( 0 )
-, mBuilder_TableRowScope( (mork_scope) 'r' )
-, mBuilder_TableAtomScope( (mork_scope) 'v' )
-, mBuilder_TableKind( 0 )
-
-, mBuilder_TablePriority( morkPriority_kLo )
-, mBuilder_TableIsUnique( morkBool_kFalse )
-, mBuilder_TableIsVerbose( morkBool_kFalse )
-, mBuilder_TablePadByte( 0 )
-  
-, mBuilder_RowForm( 0 )
-, mBuilder_RowRowScope( (mork_scope) 'r' )
-, mBuilder_RowAtomScope( (mork_scope) 'v' )
-
-, mBuilder_CellForm( 0 )
-, mBuilder_CellAtomScope( (mork_scope) 'v' )
-
-, mBuilder_DictForm( 0 )
-, mBuilder_DictAtomScope( (mork_scope) 'v' )
-
-, mBuilder_MetaTokenSlot( 0 )
-  
-, mBuilder_DoCutRow( morkBool_kFalse )
-, mBuilder_DoCutCell( morkBool_kFalse )
-, mBuilder_CellsVecFill( 0 )
-{
-  if ( ev->Good() )
-  {
-    if ( ioStore )
-    {
-      morkStore::SlotWeakStore(ioStore, ev, &mBuilder_Store);
-      if ( ev->Good() )
-        mNode_Derived = morkDerived_kBuilder;
-    }
-    else
-      ev->NilPointerError();
-  }
-   
-}
-
-/*public non-poly*/ void
-morkBuilder::CloseBuilder(morkEnv* ev) // called by CloseMorkNode();
-{
-  if ( this )
-  {
-    if ( this->IsNode() )
-    {
-      mBuilder_Row = 0;
-      mBuilder_Cell = 0;
-      mBuilder_MetaTokenSlot = 0;
-      
-      morkTable::SlotStrongTable((morkTable*) 0, ev, &mBuilder_Table);
-      morkStore::SlotWeakStore((morkStore*) 0, ev, &mBuilder_Store);
-
-      morkRowSpace::SlotStrongRowSpace((morkRowSpace*) 0, ev,
-        &mBuilder_RowSpace);
-
-      morkAtomSpace::SlotStrongAtomSpace((morkAtomSpace*) 0, ev,
-        &mBuilder_AtomSpace);
-
-      morkAtomSpace::SlotStrongAtomSpace((morkAtomSpace*) 0, ev,
-        &mBuilder_OidAtomSpace);
-
-      morkAtomSpace::SlotStrongAtomSpace((morkAtomSpace*) 0, ev,
-        &mBuilder_ScopeAtomSpace);
-      this->CloseParser(ev);
-      this->MarkShut();
-    }
-    else
-      this->NonNodeError(ev);
-  }
-  else
-    ev->NilPointerError();
-}
-
-// } ===== end morkNode methods =====
-// ````` ````` ````` ````` ````` 
-
-/*static*/ void
-morkBuilder::NonBuilderTypeError(morkEnv* ev)
-{
-  ev->NewError("non morkBuilder");
-}
-
-/*static*/ void
-morkBuilder::NilBuilderCellError(morkEnv* ev)
-{
-  ev->NewError("nil mBuilder_Cell");
-}
-
-/*static*/ void
-morkBuilder::NilBuilderRowError(morkEnv* ev)
-{
-  ev->NewError("nil mBuilder_Row");
-}
-
-/*static*/ void
-morkBuilder::NilBuilderTableError(morkEnv* ev)
-{
-  ev->NewError("nil mBuilder_Table");
-}
-
-/*static*/ void
-morkBuilder::NonColumnSpaceScopeError(morkEnv* ev)
-{
-  ev->NewError("column space != 'c'");
-}
-
-void
-morkBuilder::LogGlitch(morkEnv* ev, const morkGlitch& inGlitch, 
-  const char* inKind)
-{
-  MORK_USED_2(inGlitch,inKind);
-  ev->NewWarning("parsing glitch");
-}
-
-/*virtual*/ void
-morkBuilder::MidToYarn(morkEnv* ev,
-  const morkMid& inMid,  // typically an alias to concat with strings
-  mdbYarn* outYarn)
-// The parser might ask that some aliases be turned into yarns, so they
-// can be concatenated into longer blobs under some circumstances.  This
-// is an alternative to using a long and complex callback for many parts
-// for a single cell value.
-{
-  mBuilder_Store->MidToYarn(ev, inMid, outYarn);
-}
-
-/*virtual*/ void
-morkBuilder::OnNewPort(morkEnv* ev, const morkPlace& inPlace)
-// mp:Start     ::= OnNewPort mp:PortItem* OnPortEnd
-// mp:PortItem  ::= mp:Content | mp:Group | OnPortGlitch
-// mp:Content   ::= mp:PortRow | mp:Dict | mp:Table | mp:Row
-{
-  MORK_USED_2(ev,inPlace);
-  // mParser_InPort = morkBool_kTrue;
-  mBuilder_PortForm = 0;
-  mBuilder_PortRowScope = (mork_scope) 'r';
-  mBuilder_PortAtomScope = (mork_scope) 'v';
-}
-
-/*virtual*/ void
-morkBuilder::OnPortGlitch(morkEnv* ev, const morkGlitch& inGlitch)  
-{
-  this->LogGlitch(ev, inGlitch, "port");
-}
-
-/*virtual*/ void
-morkBuilder::OnPortEnd(morkEnv* ev, const morkSpan& inSpan)
-// mp:Start     ::= OnNewPort mp:PortItem* OnPortEnd
-{
-  MORK_USED_2(ev,inSpan);
-  // ev->StubMethodOnlyError();
-  // nothing to do?
-  // mParser_InPort = morkBool_kFalse;
-}
-
-/*virtual*/ void
-morkBuilder::OnNewGroup(morkEnv* ev, const morkPlace& inPlace, mork_gid inGid)
-{
-  MORK_USED_1(inPlace);
-  mParser_InGroup = morkBool_kTrue;
-  mork_pos startPos = inPlace.mPlace_Pos;
-
-  morkStore* store = mBuilder_Store;
-  if ( store )
-  {
-    if ( inGid >= store->mStore_CommitGroupIdentity )
-      store->mStore_CommitGroupIdentity = inGid + 1;
-  
-    if ( !store->mStore_FirstCommitGroupPos )
-      store->mStore_FirstCommitGroupPos = startPos;
-    else if ( !store->mStore_SecondCommitGroupPos )
-      store->mStore_SecondCommitGroupPos = startPos;
-  }
-}
-
-/*virtual*/ void
-morkBuilder::OnGroupGlitch(morkEnv* ev, const morkGlitch& inGlitch) 
-{
-  this->LogGlitch(ev, inGlitch, "group");
-}
-
-/*virtual*/ void
-morkBuilder::OnGroupCommitEnd(morkEnv* ev, const morkSpan& inSpan)  
-{
-  MORK_USED_2(ev,inSpan);
-  // mParser_InGroup = morkBool_kFalse;
-  // ev->StubMethodOnlyError();
-}
-
-/*virtual*/ void
-morkBuilder::OnGroupAbortEnd(morkEnv* ev, const morkSpan& inSpan) 
-{
-  MORK_USED_1(inSpan);
-  // mParser_InGroup = morkBool_kFalse;
-  ev->StubMethodOnlyError();
-}
-
-/*virtual*/ void
-morkBuilder::OnNewPortRow(morkEnv* ev, const morkPlace& inPlace, 
-  const morkMid& inMid, mork_change inChange)
-{
-  MORK_USED_3(inMid,inPlace,inChange);
-  // mParser_InPortRow = morkBool_kTrue;
-  ev->StubMethodOnlyError();
-}
-
-/*virtual*/ void
-morkBuilder::OnPortRowGlitch(morkEnv* ev, const morkGlitch& inGlitch)
-{
-  this->LogGlitch(ev, inGlitch, "port row");
-}
-
-/*virtual*/ void
-morkBuilder::OnPortRowEnd(morkEnv* ev, const morkSpan& inSpan)
-{
-  MORK_USED_1(inSpan);
-  // mParser_InPortRow = morkBool_kFalse;
-  ev->StubMethodOnlyError();
-}
-
-/*virtual*/ void
-morkBuilder::OnNewTable(morkEnv* ev, const morkPlace& inPlace,
-  const morkMid& inMid, mork_bool inCutAllRows)
-// mp:Table     ::= OnNewTable mp:TableItem* OnTableEnd
-// mp:TableItem ::= mp:Row | mp:MetaTable | OnTableGlitch
-// mp:MetaTable ::= OnNewMeta mp:MetaItem* mp:Row OnMetaEnd
-// mp:Meta      ::= OnNewMeta mp:MetaItem* OnMetaEnd
-// mp:MetaItem  ::= mp:Cell | OnMetaGlitch
-{
-  MORK_USED_1(inPlace);
-  // mParser_InTable = morkBool_kTrue;
-  mBuilder_TableForm = mBuilder_PortForm;
-  mBuilder_TableRowScope = mBuilder_PortRowScope;
-  mBuilder_TableAtomScope = mBuilder_PortAtomScope;
-  mBuilder_TableKind = morkStore_kNoneToken;
-  
-  mBuilder_TablePriority = morkPriority_kLo;
-  mBuilder_TableIsUnique = morkBool_kFalse;
-  mBuilder_TableIsVerbose = morkBool_kFalse;
-
-  morkTable* table = mBuilder_Store->MidToTable(ev, inMid);
-  morkTable::SlotStrongTable(table, ev, &mBuilder_Table);
-  if ( table )
-  {
-    if ( table->mTable_RowSpace )
-      mBuilder_TableRowScope = table->mTable_RowSpace->SpaceScope();
-      
-    if ( inCutAllRows )
-      table->CutAllRows(ev);
-  }
-}
-
-/*virtual*/ void
-morkBuilder::OnTableGlitch(morkEnv* ev, const morkGlitch& inGlitch)
-{
-  this->LogGlitch(ev, inGlitch, "table");
-}
-
-/*virtual*/ void
-morkBuilder::OnTableEnd(morkEnv* ev, const morkSpan& inSpan)
-// mp:Table     ::= OnNewTable mp:TableItem* OnTableEnd
-{
-  MORK_USED_1(inSpan);
-  // mParser_InTable = morkBool_kFalse;
-  if ( mBuilder_Table )
-  {
-    mBuilder_Table->mTable_Priority = mBuilder_TablePriority;
-    
-    if ( mBuilder_TableIsUnique )
-      mBuilder_Table->SetTableUnique();
-
-    if ( mBuilder_TableIsVerbose )
-      mBuilder_Table->SetTableVerbose();
-  
-    morkTable::SlotStrongTable((morkTable*) 0, ev, &mBuilder_Table);
-  }
-  else
-    this->NilBuilderTableError(ev);
-    
-  mBuilder_Row = 0;
-  mBuilder_Cell = 0;
-  
-  
-  mBuilder_TablePriority = morkPriority_kLo;
-  mBuilder_TableIsUnique = morkBool_kFalse;
-  mBuilder_TableIsVerbose = morkBool_kFalse;
-
-  if ( mBuilder_TableKind == morkStore_kNoneToken )
-    ev->NewError("missing table kind");
-
-  mBuilder_CellAtomScope = mBuilder_RowAtomScope =
-    mBuilder_TableAtomScope = mBuilder_PortAtomScope;
-
-  mBuilder_DoCutCell = morkBool_kFalse;
-  mBuilder_DoCutRow = morkBool_kFalse;
-}
-
-/*virtual*/ void
-morkBuilder::OnNewMeta(morkEnv* ev, const morkPlace& inPlace)
-// mp:Meta      ::= OnNewMeta mp:MetaItem* OnMetaEnd
-// mp:MetaItem  ::= mp:Cell | OnMetaGlitch
-// mp:Cell      ::= OnMinusCell? OnNewCell mp:CellItem? OnCellEnd
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_2(ev,inPlace);
-  // mParser_InMeta = morkBool_kTrue;
-  
-}
-
-/*virtual*/ void
-morkBuilder::OnMetaGlitch(morkEnv* ev, const morkGlitch& inGlitch)
-{
-  this->LogGlitch(ev, inGlitch, "meta");
-}
-
-/*virtual*/ void
-morkBuilder::OnMetaEnd(morkEnv* ev, const morkSpan& inSpan)
-// mp:Meta      ::= OnNewMeta mp:MetaItem* OnMetaEnd
-{
-  MORK_USED_2(ev,inSpan);
-  // mParser_InMeta = morkBool_kFalse;
-}
-
-/*virtual*/ void
-morkBuilder::OnMinusRow(morkEnv* ev)
-{
-  MORK_USED_1(ev);
-  mBuilder_DoCutRow = morkBool_kTrue;
-}
-
-/*virtual*/ void
-morkBuilder::OnNewRow(morkEnv* ev, const morkPlace& inPlace, 
-  const morkMid& inMid, mork_bool inCutAllCols)
-// mp:Table     ::= OnNewTable mp:TableItem* OnTableEnd
-// mp:TableItem ::= mp:Row | mp:MetaTable | OnTableGlitch
-// mp:MetaTable ::= OnNewMeta mp:MetaItem* mp:Row OnMetaEnd
-// mp:Row       ::= OnMinusRow? OnNewRow mp:RowItem* OnRowEnd
-// mp:RowItem   ::= mp:Cell | mp:Meta | OnRowGlitch
-// mp:Cell      ::= OnMinusCell? OnNewCell mp:CellItem? OnCellEnd
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inPlace);
-  // mParser_InRow = morkBool_kTrue;
-  
-  mBuilder_CellForm = mBuilder_RowForm = mBuilder_TableForm;
-  mBuilder_CellAtomScope = mBuilder_RowAtomScope = mBuilder_TableAtomScope;
-  mBuilder_RowRowScope = mBuilder_TableRowScope;
-  morkStore* store = mBuilder_Store;
-  
-  if ( !inMid.mMid_Buf && !inMid.mMid_Oid.mOid_Scope )
-  {
-    morkMid mid(inMid);
-    mid.mMid_Oid.mOid_Scope = mBuilder_RowRowScope;
-    mBuilder_Row = store->MidToRow(ev, mid);
-  }
-  else
-  {
-    mBuilder_Row = store->MidToRow(ev, inMid);
-  }
-  morkRow* row = mBuilder_Row;
-  if ( row && inCutAllCols )
-  {
-    row->CutAllColumns(ev);
-  }
-
-  morkTable* table = mBuilder_Table;
-  if ( table )
-  {
-    if ( row )
-    {
-      if ( mParser_InMeta )
-      {
-        morkRow* metaRow = table->mTable_MetaRow;
-        if ( !metaRow )
-        {
-          table->mTable_MetaRow = row;
-          table->mTable_MetaRowOid = row->mRow_Oid;
-          row->AddRowGcUse(ev);
-        }
-        else if ( metaRow != row ) // not identical?
-          ev->NewError("duplicate table meta row");
-      }
-      else
-      {
-        if ( mBuilder_DoCutRow )
-          table->CutRow(ev, row);
-        else
-          table->AddRow(ev, row);
-      }
-    }
-  }
-  // else // it is now okay to have rows outside a table:
-  //  this->NilBuilderTableError(ev);
-    
-  mBuilder_DoCutRow = morkBool_kFalse;
-}
-
-/*virtual*/ void
-morkBuilder::OnRowPos(morkEnv* ev, mork_pos inRowPos) 
-{
-  if ( mBuilder_Row && mBuilder_Table && !mParser_InMeta )
-  {
-    mork_pos hintFromPos = 0; // best hint when we don't know position
-    mBuilder_Table->MoveRow(ev, mBuilder_Row, hintFromPos, inRowPos);
-  }
-}
-
-/*virtual*/ void
-morkBuilder::OnRowGlitch(morkEnv* ev, const morkGlitch& inGlitch) 
-{
-  this->LogGlitch(ev, inGlitch, "row");
-}
-
-void
-morkBuilder::FlushBuilderCells(morkEnv* ev)
-{
-  if ( mBuilder_Row )
-  {
-    morkPool* pool = mBuilder_Store->StorePool();
-    morkCell* cells = mBuilder_CellsVec;
-    mork_fill fill = mBuilder_CellsVecFill;
-    mBuilder_Row->TakeCells(ev, cells, fill, mBuilder_Store);
-
-    morkCell* end = cells + fill;
-    --cells; // prepare for preincrement
-    while ( ++cells < end )
-    {
-      if ( cells->mCell_Atom )
-        cells->SetAtom(ev, (morkAtom*) 0, pool);
-    }
-    mBuilder_CellsVecFill = 0;
-  }
-  else
-    this->NilBuilderRowError(ev);
-}
-
-/*virtual*/ void
-morkBuilder::OnRowEnd(morkEnv* ev, const morkSpan& inSpan) 
-// mp:Row       ::= OnMinusRow? OnNewRow mp:RowItem* OnRowEnd
-{
-  MORK_USED_1(inSpan);
-  // mParser_InRow = morkBool_kFalse;
-  if ( mBuilder_Row )
-  {
-    this->FlushBuilderCells(ev);
-  }
-  else
-    this->NilBuilderRowError(ev);
-    
-  mBuilder_Row = 0;
-  mBuilder_Cell = 0;
-
-  mBuilder_DoCutCell = morkBool_kFalse;
-  mBuilder_DoCutRow = morkBool_kFalse;
-}
-
-/*virtual*/ void
-morkBuilder::OnNewDict(morkEnv* ev, const morkPlace& inPlace)
-// mp:Dict      ::= OnNewDict mp:DictItem* OnDictEnd
-// mp:DictItem  ::= OnAlias | OnAliasGlitch | mp:Meta | OnDictGlitch
-{
-  MORK_USED_2(ev,inPlace);
-  // mParser_InDict = morkBool_kTrue;
-  
-  mBuilder_CellForm = mBuilder_DictForm = mBuilder_PortForm;
-  mBuilder_CellAtomScope = mBuilder_DictAtomScope = mBuilder_PortAtomScope;
-}
-
-/*virtual*/ void
-morkBuilder::OnDictGlitch(morkEnv* ev, const morkGlitch& inGlitch) 
-{
-  this->LogGlitch(ev, inGlitch, "dict");
-}
-
-/*virtual*/ void
-morkBuilder::OnDictEnd(morkEnv* ev, const morkSpan& inSpan)  
-// mp:Dict      ::= OnNewDict mp:DictItem* OnDictEnd
-{
-  MORK_USED_2(ev,inSpan);
-  // mParser_InDict = morkBool_kFalse;
-
-  mBuilder_DictForm = 0;
-  mBuilder_DictAtomScope = 0;
-}
-
-/*virtual*/ void
-morkBuilder::OnAlias(morkEnv* ev, const morkSpan& inSpan,
-  const morkMid& inMid)
-{
-  MORK_USED_1(inSpan);
-  if ( mParser_InDict )
-  {
-    morkMid mid = inMid; // local copy for modification
-    mid.mMid_Oid.mOid_Scope = mBuilder_DictAtomScope;
-    mBuilder_Store->AddAlias(ev, mid, mBuilder_DictForm);
-  }
-  else
-    ev->NewError("alias not in dict");
-}
-
-/*virtual*/ void
-morkBuilder::OnAliasGlitch(morkEnv* ev, const morkGlitch& inGlitch)
-{
-  this->LogGlitch(ev, inGlitch, "alias");
-}
-
-
-morkCell* 
-morkBuilder::AddBuilderCell(morkEnv* ev,
-  const morkMid& inMid, mork_change inChange)
-{
-  morkCell* outCell = 0;
-  mork_column column = inMid.mMid_Oid.mOid_Id;
-  
-  if ( ev->Good() )
-  {
-    if ( mBuilder_CellsVecFill >= morkBuilder_kCellsVecSize )
-      this->FlushBuilderCells(ev);
-    if ( ev->Good() )
-    {
-      if ( mBuilder_CellsVecFill < morkBuilder_kCellsVecSize )
-      {
-        mork_fill indx = mBuilder_CellsVecFill++;
-        outCell = mBuilder_CellsVec + indx;
-        outCell->SetColumnAndChange(column, inChange);
-        outCell->mCell_Atom = 0;
-      }
-      else
-        ev->NewError("out of builder cells");
-    }
-  }
-  return outCell;
-}
-
-/*virtual*/ void
-morkBuilder::OnMinusCell(morkEnv* ev)
-{
-  MORK_USED_1(ev);
-  mBuilder_DoCutCell = morkBool_kTrue;
-}
-
-/*virtual*/ void
-morkBuilder::OnNewCell(morkEnv* ev, const morkPlace& inPlace,
-    const morkMid* inMid, const morkBuf* inBuf)
-// Exactly one of inMid and inBuf is nil, and the other is non-nil.
-// When hex ID syntax is used for a column, then inMid is not nil, and
-// when a naked string names a column, then inBuf is not nil.
-  
-  // mp:Cell      ::= OnMinusCell? OnNewCell mp:CellItem? OnCellEnd
-  // mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-  // mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inPlace);
-  // mParser_InCell = morkBool_kTrue;
-  
-  mork_change cellChange = ( mBuilder_DoCutCell )?
-    morkChange_kCut : morkChange_kAdd;
-    
-  mBuilder_DoCutCell = morkBool_kFalse;
-  
-  mBuilder_CellAtomScope = mBuilder_RowAtomScope;
-  
-  mBuilder_Cell = 0; // nil until determined for a row
-  morkStore* store = mBuilder_Store;
-  mork_scope scope = morkStore_kColumnSpaceScope;
-  morkMid tempMid; // space for local and modifiable cell mid
-  morkMid* cellMid = &tempMid; // default to local if inMid==0
-  
-  if ( inMid ) // mid parameter is actually provided?
-  {
-    *cellMid = *inMid; // bitwise copy for modifiable local mid
-
-    if ( !cellMid->mMid_Oid.mOid_Scope ) 
-    {
-      if ( cellMid->mMid_Buf )
-      {
-        scope = store->BufToToken(ev, cellMid->mMid_Buf);
-        cellMid->mMid_Buf = 0; // don't do scope lookup again
-        ev->NewWarning("column mids need column scope");
-      }
-      cellMid->mMid_Oid.mOid_Scope = scope;
-    }
-  }
-  else if ( inBuf ) // buf points to naked column string name?
-  {
-    cellMid->ClearMid();
-    cellMid->mMid_Oid.mOid_Id = store->BufToToken(ev, inBuf);
-    cellMid->mMid_Oid.mOid_Scope = scope; // kColumnSpaceScope
-  }
-  else
-    ev->NilPointerError(); // either inMid or inBuf must be non-nil
-
-  mork_column column = cellMid->mMid_Oid.mOid_Id;
-  
-  if ( mBuilder_Row && ev->Good() ) // this cell must be inside a row
-  {
-      // mBuilder_Cell = this->AddBuilderCell(ev, *cellMid, cellChange);
-
-      if ( mBuilder_CellsVecFill >= morkBuilder_kCellsVecSize )
-        this->FlushBuilderCells(ev);
-      if ( ev->Good() )
-      {
-        if ( mBuilder_CellsVecFill < morkBuilder_kCellsVecSize )
-        {
-          mork_fill ix = mBuilder_CellsVecFill++;
-          morkCell* cell =  mBuilder_CellsVec + ix;
-          cell->SetColumnAndChange(column, cellChange);
-          
-          cell->mCell_Atom = 0;
-          mBuilder_Cell = cell;
-        }
-        else
-          ev->NewError("out of builder cells");
-      }
-  }
-
-  else if ( mParser_InMeta &&  ev->Good() ) // cell is in metainfo structure?
-  {
-    if ( scope == morkStore_kColumnSpaceScope )
-    {
-      if ( mParser_InTable ) // metainfo for table?
-      {
-        if ( column == morkStore_kKindColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_TableKind;
-        else if ( column == morkStore_kStatusColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_TableStatus;
-        else if ( column == morkStore_kRowScopeColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_TableRowScope;
-        else if ( column == morkStore_kAtomScopeColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_TableAtomScope;
-        else if ( column == morkStore_kFormColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_TableForm;
-      }
-      else if ( mParser_InDict ) // metainfo for dict?
-      {
-        if ( column == morkStore_kAtomScopeColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_DictAtomScope;
-        else if ( column == morkStore_kFormColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_DictForm;
-      }
-      else if ( mParser_InRow ) // metainfo for row?
-      {
-        if ( column == morkStore_kAtomScopeColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_RowAtomScope;
-        else if ( column == morkStore_kRowScopeColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_RowRowScope;
-        else if ( column == morkStore_kFormColumn )
-          mBuilder_MetaTokenSlot = &mBuilder_RowForm;
-      }
-    }
-    else
-      ev->NewWarning("expected column scope");
-  }
-}
-
-/*virtual*/ void
-morkBuilder::OnCellGlitch(morkEnv* ev, const morkGlitch& inGlitch)
-{
-  this->LogGlitch(ev, inGlitch, "cell");
-}
-
-/*virtual*/ void
-morkBuilder::OnCellForm(morkEnv* ev, mork_cscode inCharsetFormat)
-{
-  morkCell* cell = mBuilder_Cell;
-  if ( cell )
-  {
-    mBuilder_CellForm = inCharsetFormat;
-  }
-  else
-    this->NilBuilderCellError(ev);
-}
-
-/*virtual*/ void
-morkBuilder::OnCellEnd(morkEnv* ev, const morkSpan& inSpan)
-// mp:Cell      ::= OnMinusCell? OnNewCell mp:CellItem? OnCellEnd
-{
-  MORK_USED_2(ev,inSpan);
-  // mParser_InCell = morkBool_kFalse;
-  
-  mBuilder_MetaTokenSlot = 0;
-  mBuilder_CellAtomScope = mBuilder_RowAtomScope;
-}
-
-/*virtual*/ void
-morkBuilder::OnValue(morkEnv* ev, const morkSpan& inSpan,
-  const morkBuf& inBuf)
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inSpan);
-  morkStore* store = mBuilder_Store;
-  morkCell* cell = mBuilder_Cell;
-  if ( cell )
-  {
-    mdbYarn yarn;
-    yarn.mYarn_Buf = inBuf.mBuf_Body;
-    yarn.mYarn_Fill = yarn.mYarn_Size = inBuf.mBuf_Fill;
-    yarn.mYarn_More = 0;
-    yarn.mYarn_Form = mBuilder_CellForm;
-    yarn.mYarn_Grow = 0;
-    morkAtom* atom = store->YarnToAtom(ev, &yarn, PR_TRUE /* create */);
-    cell->SetAtom(ev, atom, store->StorePool());
-  }
-  else if ( mParser_InMeta )
-  {
-    mork_token* metaSlot = mBuilder_MetaTokenSlot;
-    if ( metaSlot )
-    {
-      if ( metaSlot == &mBuilder_TableStatus ) // table status?
-      {
-        if ( mParser_InTable && mBuilder_Table )
-        {
-          const char* body = (const char*) inBuf.mBuf_Body;
-          mork_fill bufFill = inBuf.mBuf_Fill;
-          if ( body && bufFill )
-          {
-            const char* bodyEnd = body + bufFill;
-            while ( body < bodyEnd )
-            {
-              int c = *body++;
-              switch ( c )
-              {
-                case '0':
-                case '1':
-                case '2':
-                case '3':
-                case '4':
-                case '5':
-                case '6':
-                case '7':
-                case '8':
-                case '9':
-                  mBuilder_TablePriority = (mork_priority) ( c - '0' );
-                  break;
-                
-                case 'u':
-                case 'U':
-                  mBuilder_TableIsUnique = morkBool_kTrue;
-                  break;
-                  
-                case 'v':
-                case 'V':
-                  mBuilder_TableIsVerbose = morkBool_kTrue;
-                  break;
-              }
-            }
-          }
-        }
-      }
-      else
-      {
-        mork_token token = store->BufToToken(ev, &inBuf);
-        if ( token )
-        {
-          *metaSlot = token;
-          if ( metaSlot == &mBuilder_TableKind ) // table kind?
-          {
-            if ( mParser_InTable && mBuilder_Table )
-              mBuilder_Table->mTable_Kind = token;
-          }
-        }
-      }
-    }
-  }
-  else
-    this->NilBuilderCellError(ev);
-}
-
-/*virtual*/ void
-morkBuilder::OnValueMid(morkEnv* ev, const morkSpan& inSpan,
-  const morkMid& inMid)
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inSpan);
-  morkStore* store = mBuilder_Store;
-  morkCell* cell = mBuilder_Cell;
-
-  morkMid valMid; // local mid for modifications
-  mdbOid* valOid = &valMid.mMid_Oid; // ref to oid inside mid
-  *valOid = inMid.mMid_Oid; // bitwise copy inMid's oid
-  
-  if ( inMid.mMid_Buf )
-  {
-    if ( !valOid->mOid_Scope )
-      store->MidToOid(ev, inMid, valOid);
-  }
-  else if ( !valOid->mOid_Scope )
-    valOid->mOid_Scope = mBuilder_CellAtomScope;
-  
-  if ( cell )
-  {
-    morkBookAtom* atom = store->MidToAtom(ev, valMid);
-    if ( atom )
-      cell->SetAtom(ev, atom, store->StorePool());
-    else
-      ev->NewError("undefined cell value alias");
-  }
-  else if ( mParser_InMeta )
-  {
-    mork_token* metaSlot = mBuilder_MetaTokenSlot;
-    if ( metaSlot )
-    {
-      mork_scope valScope = valOid->mOid_Scope;
-      if ( !valScope || valScope == morkStore_kColumnSpaceScope )
-      {
-        if ( ev->Good() && valMid.HasSomeId() )
-        {
-          *metaSlot = valOid->mOid_Id;
-          if ( metaSlot == &mBuilder_TableKind ) // table kind?
-          {
-            if ( mParser_InTable && mBuilder_Table )
-            {
-              mBuilder_Table->mTable_Kind = valOid->mOid_Id;
-            }
-            else
-              ev->NewWarning("mBuilder_TableKind not in table");
-          }
-          else if ( metaSlot == &mBuilder_TableStatus ) // table status?
-          {
-            if ( mParser_InTable && mBuilder_Table )
-            {
-              // $$ what here??
-            }
-            else
-              ev->NewWarning("mBuilder_TableStatus not in table");
-          }
-        }
-      }
-      else
-        this->NonColumnSpaceScopeError(ev);
-    }
-  }
-  else
-    this->NilBuilderCellError(ev);
-}
-
-/*virtual*/ void
-morkBuilder::OnRowMid(morkEnv* ev, const morkSpan& inSpan,
-  const morkMid& inMid)
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inSpan);
-  morkStore* store = mBuilder_Store;
-  morkCell* cell = mBuilder_Cell;
-  if ( cell )
-  {
-    mdbOid rowOid = inMid.mMid_Oid;
-    if ( inMid.mMid_Buf )
-    {
-      if ( !rowOid.mOid_Scope )
-        store->MidToOid(ev, inMid, &rowOid);
-    }
-    else if ( !rowOid.mOid_Scope )
-      rowOid.mOid_Scope = mBuilder_RowRowScope;
-    
-    if ( ev->Good() )
-     {
-       morkPool* pool = store->StorePool();
-       morkAtom* atom = pool->NewRowOidAtom(ev, rowOid, &store->mStore_Zone);
-       if ( atom )
-       {
-         cell->SetAtom(ev, atom, pool);
-         morkRow* row = store->OidToRow(ev, &rowOid);
-         if ( row ) // found or created such a row?
-           row->AddRowGcUse(ev);
-       }
-     }
-  }
-  else
-    this->NilBuilderCellError(ev);
-}
-
-/*virtual*/ void
-morkBuilder::OnTableMid(morkEnv* ev, const morkSpan& inSpan,
-  const morkMid& inMid)
-// mp:CellItem  ::= mp:Slot | OnCellForm | OnCellGlitch
-// mp:Slot      ::= OnValue | OnValueMid | OnRowMid | OnTableMid
-{
-  MORK_USED_1(inSpan);
-  morkStore* store = mBuilder_Store;
-  morkCell* cell = mBuilder_Cell;
-  if ( cell )
-  {
-    mdbOid tableOid = inMid.mMid_Oid;
-    if ( inMid.mMid_Buf )
-    {
-      if ( !tableOid.mOid_Scope )
-        store->MidToOid(ev, inMid, &tableOid);
-    }
-    else if ( !tableOid.mOid_Scope )
-      tableOid.mOid_Scope = mBuilder_RowRowScope;
-    
-    if ( ev->Good() )
-     {
-       morkPool* pool = store->StorePool();
-       morkAtom* atom = pool->NewTableOidAtom(ev, tableOid, &store->mStore_Zone);
-       if ( atom )
-       {
-         cell->SetAtom(ev, atom, pool);
-         morkTable* table = store->OidToTable(ev, &tableOid,
-           /*optionalMetaRowOid*/ (mdbOid*) 0);
-         if ( table ) // found or created such a table?
-           table->AddTableGcUse(ev);
-       }
-     }
-  }
-  else
-    this->NilBuilderCellError(ev);
-}
-
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
deleted file mode 100644
--- a/db/mork/src/morkBuilder.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MORKBUILDER_
-#define _MORKBUILDER_ 1
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKPARSER_
-#include "morkParser.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
- 
-/*| kCellsVecSize: length of cell vector buffer inside morkBuilder
-|*/
-#define morkBuilder_kCellsVecSize 64
-
-#define morkBuilder_kDefaultBytesPerParseSegment 512 /* plausible to big */
-
-#define morkDerived_kBuilder     /*i*/ 0x4275 /* ascii 'Bu' */
-
-class morkBuilder /*d*/ : public morkParser {
-
-// public: // slots inherited from morkParser (meant to inform only)
-  // nsIMdbHeap*       mNode_Heap;
-
-  // 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_able      mNode_Mutable;  // can this node be modified?
-  // mork_load      mNode_Load;     // is this node clean or dirty?
-  
-  // mork_uses      mNode_Uses;     // refcount for strong refs
-  // mork_refs      mNode_Refs;     // refcount for strong refs + weak refs
-
-
-  // nsIMdbHeap*      mParser_Heap;   // refcounted heap used for allocation
-  // morkStream*   mParser_Stream; // refcounted input stream
-    
-  // mork_u4       mParser_Tag; // must equal morkParser_kTag
-  // mork_count    mParser_MoreGranularity; // constructor inBytesPerParseSegment
-
-  // mork_u4       mParser_State; // state where parser should resume
- 
-  // after finding ends of group transactions, we can re-seek the start:
-  // mork_pos      mParser_GroupContentStartPos; // start of this group
-    
-  // mdbOid        mParser_TableOid; // table oid if inside a table
-  // mdbOid        mParser_RowOid;   // row oid if inside a row
-  // mork_gid      mParser_GroupId; // group ID if inside a group
-    
-  // mork_bool     mParser_InPort;  // called OnNewPort but not OnPortEnd?
-  // mork_bool     mParser_InDict;  // called OnNewDict but not OnDictEnd?
-  // mork_bool     mParser_InCell;  // called OnNewCell but not OnCellEnd?
-  // mork_bool     mParser_InMeta;  // called OnNewMeta but not OnMetaEnd?
-    
-  // morkMid     mParser_Mid;   // current alias being parsed
-  // note that mParser_Mid.mMid_Buf points at mParser_ScopeCoil below:
-    
-  // blob coils allocated in mParser_Heap
-  // morkCoil     mParser_ScopeCoil;   // place to accumulate ID scope blobs
-  // morkCoil     mParser_ValueCoil;   // place to accumulate value blobs
-  // morkCoil     mParser_ColumnCoil;  // place to accumulate column blobs
-  // morkCoil     mParser_StringCoil;  // place to accumulate string blobs
-    
-  // morkSpool    mParser_ScopeSpool;  // writes to mParser_ScopeCoil
-  // morkSpool    mParser_ValueSpool;  // writes to mParser_ValueCoil
-  // morkSpool    mParser_ColumnSpool; // writes to mParser_ColumnCoil
-  // morkSpool    mParser_StringSpool; // writes to mParser_StringCoil
-
-  // yarns allocated in mParser_Heap
-  // morkYarn      mParser_MidYarn;   // place to receive from MidToYarn()
-  
-  // span showing current ongoing file position status:
-  // morkSpan      mParser_PortSpan; // span of current db port file
-    
-  // various spans denoting nested subspaces inside the file's port span:
-  // morkSpan      mParser_GroupSpan; // span of current transaction group
-  // morkSpan      mParser_DictSpan;
-  // morkSpan      mParser_AliasSpan;
-  // morkSpan      mParser_MetaDictSpan;
-  // morkSpan      mParser_TableSpan;
-  // morkSpan      mParser_MetaTableSpan;
-  // morkSpan      mParser_RowSpan;
-  // morkSpan      mParser_MetaRowSpan;
-  // morkSpan      mParser_CellSpan;
-  // morkSpan      mParser_ColumnSpan;
-  // morkSpan      mParser_SlotSpan;
-
-// ````` ````` ````` `````   ````` ````` ````` `````  
-protected: // protected morkBuilder members
-  
-  // weak refs that do not prevent closure of referenced nodes:
-  morkStore*       mBuilder_Store; // weak ref to builder's store
-  
-  // strong refs that do indeed prevent closure of referenced nodes:
-  morkTable*       mBuilder_Table;    // current table being built (or nil)
-  morkRow*         mBuilder_Row;      // current row being built (or nil)
-  morkCell*        mBuilder_Cell;     // current cell within CellsVec (or nil)
-  
-  morkRowSpace*    mBuilder_RowSpace;  // space for mBuilder_CellRowScope
-  morkAtomSpace*   mBuilder_AtomSpace; // space for mBuilder_CellAtomScope
-  
-  morkAtomSpace*   mBuilder_OidAtomSpace;   // ground atom space for oids
-  morkAtomSpace*   mBuilder_ScopeAtomSpace; // ground atom space for scopes
-  
-  // scoped object ids for current objects under construction:
-  mdbOid           mBuilder_TableOid; // full oid for current table
-  mdbOid           mBuilder_RowOid;   // full oid for current row
-      
-  // tokens that become set as the result of meta cells in port rows:
-  mork_cscode      mBuilder_PortForm;       // default port charset format
-  mork_scope       mBuilder_PortRowScope;   // port row scope
-  mork_scope       mBuilder_PortAtomScope;  // port atom scope
-
-  // tokens that become set as the result of meta cells in meta tables:
-  mork_cscode      mBuilder_TableForm;       // default table charset format
-  mork_scope       mBuilder_TableRowScope;   // table row scope
-  mork_scope       mBuilder_TableAtomScope;  // table atom scope
-  mork_kind        mBuilder_TableKind;       // table kind
-  
-  mork_token       mBuilder_TableStatus;  // dummy: priority/unique/verbose
-  
-  mork_priority    mBuilder_TablePriority;   // table priority
-  mork_bool        mBuilder_TableIsUnique;   // table uniqueness
-  mork_bool        mBuilder_TableIsVerbose;  // table verboseness
-  mork_u1          mBuilder_TablePadByte;    // for u4 alignment
-  
-  // tokens that become set as the result of meta cells in meta rows:
-  mork_cscode      mBuilder_RowForm;       // default row charset format
-  mork_scope       mBuilder_RowRowScope;   // row scope per row metainfo
-  mork_scope       mBuilder_RowAtomScope;  // row atom scope
-
-  // meta tokens currently in force, driven by meta info slots above:
-  mork_cscode      mBuilder_CellForm;       // cell charset format
-  mork_scope       mBuilder_CellAtomScope;  // cell atom scope
-
-  mork_cscode      mBuilder_DictForm;       // dict charset format
-  mork_scope       mBuilder_DictAtomScope;  // dict atom scope
-
-  mork_token*      mBuilder_MetaTokenSlot; // pointer to some slot above
-  
-  // If any of these 'cut' bools are true, it means a minus was seen in the
-  // Mork source text to indicate removal of content from some container.
-  // (Note there is no corresponding 'add' bool, since add is the default.)
-  // CutRow implies the current row should be cut from the table.
-  // CutCell implies the current column should be cut from the row.
-  mork_bool        mBuilder_DoCutRow;    // row with kCut change
-  mork_bool        mBuilder_DoCutCell;   // cell with kCut change
-  mork_u1          mBuilder_row_pad;    // pad to u4 alignment
-  mork_u1          mBuilder_cell_pad;   // pad to u4 alignment
-  
-  morkCell         mBuilder_CellsVec[ morkBuilder_kCellsVecSize + 1 ];
-  mork_fill        mBuilder_CellsVecFill; // count used in CellsVec
-  // Note when mBuilder_CellsVecFill equals morkBuilder_kCellsVecSize, and 
-  // another cell is added, this means all the cells in the vector above
-  // must be flushed to the current row being built to create more room.
-  
-protected: // protected inlines
-
-  mork_bool  CellVectorIsFull() const
-  { return ( mBuilder_CellsVecFill == morkBuilder_kCellsVecSize ); }
-  
-// { ===== begin morkNode interface =====
-public: // morkNode virtual methods
-  virtual void CloseMorkNode(morkEnv* ev); // CloseBuilder() only if open
-  virtual ~morkBuilder(); // assert that CloseBuilder() executed earlier
-  
-public: // morkYarn construction & destruction
-  morkBuilder(morkEnv* ev, const morkUsage& inUsage, nsIMdbHeap* ioHeap,
-    morkStream* ioStream,  // the readonly stream for input bytes
-    mdb_count inBytesPerParseSegment, // target for ParseMore()
-    nsIMdbHeap* ioSlotHeap, morkStore* ioStore
-    );
-      
-  void CloseBuilder(morkEnv* ev); // called by CloseMorkNode();
-
-private: // copying is not allowed
-  morkBuilder(const morkBuilder& other);
-  morkBuilder& operator=(const morkBuilder& other);
-
-public: // dynamic type identification
-  mork_bool IsBuilder() const
-  { return IsNode() && mNode_Derived == morkDerived_kBuilder; }
-// } ===== end morkNode methods =====
-
-public: // errors
-  static void NonBuilderTypeError(morkEnv* ev);
-  static void NilBuilderCellError(morkEnv* ev);
-  static void NilBuilderRowError(morkEnv* ev);
-  static void NilBuilderTableError(morkEnv* ev);
-  static void NonColumnSpaceScopeError(morkEnv* ev);
-  
-  void LogGlitch(morkEnv* ev, const morkGlitch& inGlitch, 
-    const char* inKind);
-
-public: // other builder methods
-
-  morkCell* AddBuilderCell(morkEnv* ev,
-    const morkMid& inMid, mork_change inChange);
-
-  void FlushBuilderCells(morkEnv* ev);
-  
-// ````` ````` ````` `````   ````` ````` ````` `````  
-public: // in virtual morkParser methods, data flow subclass to parser
-
-    virtual void MidToYarn(morkEnv* ev,
-      const morkMid& inMid,  // typically an alias to concat with strings
-      mdbYarn* outYarn);
-    // The parser might ask that some aliases be turned into yarns, so they
-    // can be concatenated into longer blobs under some circumstances.  This
-    // is an alternative to using a long and complex callback for many parts
-    // for a single cell value.
-  
-// ````` ````` ````` `````   ````` ````` ````` `````  
-public: // out virtual morkParser methods, data flow parser to subclass
-
-  virtual void OnNewPort(morkEnv* ev, const morkPlace& inPlace);
-  virtual void OnPortGlitch(morkEnv* ev, const morkGlitch& inGlitch);  
-  virtual void OnPortEnd(morkEnv* ev, const morkSpan& inSpan);  
-
-  virtual void OnNewGroup(morkEnv* ev, const morkPlace& inPlace, mork_gid inGid);
-  virtual void OnGroupGlitch(morkEnv* ev, const morkGlitch& inGlitch);  
-  virtual void OnGroupCommitEnd(morkEnv* ev, const morkSpan& inSpan);  
-  virtual void OnGroupAbortEnd(morkEnv* ev, const morkSpan& inSpan);  
-
-  virtual void OnNewPortRow(morkEnv* ev, const morkPlace& inPlace, 
-    const morkMid& inMid, mork_change inChange);
-  virtual void OnPortRowGlitch(morkEnv* ev, const morkGlitch& inGlitch);  
-  virtual void OnPortRowEnd(morkEnv* ev, const morkSpan& inSpan);  
-
-  virtual void OnNewTable(morkEnv* ev, const morkPlace& inPlace,
-    const morkMid& inMid, mork_bool inCutAllRows);
-  virtual void OnTableGlitch(morkEnv* ev, const morkGlitch& inGlitch);
-  virtual void OnTableEnd(morkEnv* ev, const morkSpan& inSpan);
-    
-  virtual void OnNewMeta(morkEnv* ev, const morkPlace& inPlace);
-  virtual void OnMetaGlitch(morkEnv* ev, const morkGlitch& inGlitch);
-  virtual void OnMetaEnd(morkEnv* ev, const morkSpan& inSpan);
-
-  virtual void OnMinusRow(morkEnv* ev);
-  virtual void OnNewRow(morkEnv* ev, const morkPlace& inPlace, 
-    const morkMid& inMid, mork_bool inCutAllCols);
-  virtual void OnRowPos(morkEnv* ev, mork_pos inRowPos);  
-  virtual void OnRowGlitch(morkEnv* ev, const morkGlitch& inGlitch);  
-  virtual void OnRowEnd(morkEnv* ev, const morkSpan& inSpan);  
-
-  virtual void OnNewDict(morkEnv* ev, const morkPlace& inPlace);
-  virtual void OnDictGlitch(morkEnv* ev, const morkGlitch& inGlitch);  
-  virtual void OnDictEnd(morkEnv* ev, const morkSpan& inSpan);  
-
-  virtual void OnAlias(morkEnv* ev, const morkSpan& inSpan,
-    const morkMid& inMid);
-
-  virtual void OnAliasGlitch(morkEnv* ev, const morkGlitch& inGlitch);
-
-  virtual void OnMinusCell(morkEnv* ev);
-  virtual void OnNewCell(morkEnv* ev, const morkPlace& inPlace,
-    const morkMid* inMid, const morkBuf* inBuf);
-  // Exactly one of inMid and inBuf is nil, and the other is non-nil.
-  // When hex ID syntax is used for a column, then inMid is not nil, and
-  // when a naked string names a column, then inBuf is not nil.
-
-  virtual void OnCellGlitch(morkEnv* ev, const morkGlitch& inGlitch);
-  virtual void OnCellForm(morkEnv* ev, mork_cscode inCharsetFormat);
-  virtual void OnCellEnd(morkEnv* ev, const morkSpan& inSpan);
-    
-  virtual void OnValue(morkEnv* ev, const morkSpan& inSpan,
-    const morkBuf& inBuf);
-
-  virtual void OnValueMid(morkEnv* ev, const morkSpan& inSpan,
-    const morkMid& inMid);
-
-  virtual void OnRowMid(morkEnv* ev, const morkSpan& inSpan,
-    const morkMid& inMid);
-
-  virtual void OnTableMid(morkEnv* ev, const morkSpan& inSpan,
-    const morkMid& inMid);
-  
-// ````` ````` ````` `````   ````` ````` ````` `````  
-public: // public non-poly morkBuilder methods
-  
-  
-public: // typesafe refcounting inlines calling inherited morkNode methods
-  static void SlotWeakBuilder(morkBuilder* me,
-    morkEnv* ev, morkBuilder** ioSlot)
-  { morkNode::SlotWeakNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-  
-  static void SlotStrongBuilder(morkBuilder* me,
-    morkEnv* ev, morkBuilder** ioSlot)
-  { morkNode::SlotStrongNode((morkNode*) me, ev, (morkNode**) ioSlot); }
-};
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-#endif /* _MORKBUILDER_ */
deleted file mode 100644
--- a/db/mork/src/morkCell.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef _MDB_
-#include "mdb.h"
-#endif
-
-#ifndef _MORK_
-#include "mork.h"
-#endif
-
-#ifndef _MORKNODE_
-#include "morkNode.h"
-#endif
-
-#ifndef _MORKSTORE_
-#include "morkStore.h"
-#endif
-
-#ifndef _MORKPOOL_
-#include "morkPool.h"
-#endif
-
-#ifndef _MORKENV_
-#include "morkEnv.h"
-#endif
-
-#ifndef _MORKCELL_
-#include "morkCell.h"
-#endif
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-
-void
-morkCell::SetYarn(morkEnv* ev, const mdbYarn* inYarn, morkStore* ioStore)
-{
-  morkAtom* atom = ioStore->YarnToAtom(ev, inYarn, PR_TRUE /* create */);
-  if ( atom )
-    this->SetAtom(ev, atom, ioStore->StorePool()); // refcounts atom
-}
-
-void
-morkCell::GetYarn(morkEnv* ev, mdbYarn* outYarn) const
-{
-  MORK_USED_1(ev);
-  mCell_Atom->GetYarn(outYarn);
-}
-
-void
-morkCell::AliasYarn(morkEnv* ev, mdbYarn* outYarn) const
-{
-  MORK_USED_1(ev);
-  mCell_Atom->AliasYarn(outYarn);
-}
-  
-  
-void
-morkCell::SetCellClean()
-{
-  mork_column col = this->GetColumn();
-  this->SetColumnAndChange(col, morkChange_kNil);
-}
-  
-void
-morkCell::SetCellDirty()
-{
-  mork_column col = this->GetColumn();
-  this->SetColumnAndChange(col, morkChange_kAdd);
-}
-
-void
-morkCell::SetAtom(morkEnv* ev, morkAtom* ioAtom, morkPool* ioPool)
-  // SetAtom() "acquires" the new ioAtom if non-nil, by calling AddCellUse()
-  // to increase the refcount, and puts ioAtom into mCell_Atom.  If the old
-  // atom in mCell_Atom is non-nil, then it is "released" first by a call to
-  // CutCellUse(), and if the use count then becomes zero, then the old atom
-  // is deallocated by returning it to the pool ioPool.  (And this is
-  // why ioPool is a parameter to this method.)  Note that ioAtom can be nil
-  // to cause the cell to refer to nothing, and the old atom in mCell_Atom
-  // can also be nil, and all the atom refcounting is handled correctly.
-  //
-  // Note that if ioAtom was just created, it typically has a zero use count
-  // before calling SetAtom().  But use count is one higher after SetAtom().
-{
-  morkAtom* oldAtom = mCell_Atom;
-  if ( oldAtom != ioAtom ) // ioAtom is not already installed in this cell?
-  {
-    if ( oldAtom )
-    {
-      mCell_Atom = 0;
-      if ( oldAtom->CutCellUse(ev) == 0 )
-      {
-      // this was zapping atoms still in use - comment out until davidmc
-      // can figure out a better fix.
-//        if ( ioPool )
-//        {
-//          if ( oldAtom->IsBook() )
-//            ((morkBookAtom*) oldAtom)->CutBookAtomFromSpace(ev);
-            
-//          ioPool->ZapAtom(ev, oldAtom);
-//        }
-//        else
-//          ev->NilPointerError();
-      }
-    }
-    if ( ioAtom )
-      ioAtom->AddCellUse(ev);
-      
-    mCell_Atom = ioAtom;
-  }
-}
-
-//3456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789
deleted file mode 100644
--- a/db/mork/src/morkCell.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-  */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the