gecko-dev/grendel/storage/mdb/nsIMdbPort.java
1999-11-02 01:51:54 +00:00

258 lines
12 KiB
Java

/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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 the Grendel mail/news client.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1997 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*
* Created: Mauro Botelho <mabotelh@email.com>, 20 Mar 1999.
*/
package grendel.storage.mdb;
/*| 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.)
|*/
public interface nsIMdbPort extends nsIMdbObject {
// { ===== begin nsIMdbPort methods =====
// { ----- begin attribute methods -----
public boolean GetIsPortReadonly(nsIMdbEnv ev);
public boolean GetIsStore(nsIMdbEnv ev);
public boolean GetIsStoreAndDirty(nsIMdbEnv ev);
public mdbUsagePolicy GetUsagePolicy(nsIMdbEnv ev);
public void SetUsagePolicy(nsIMdbEnv ev, final mdbUsagePolicy inUsagePolicy);
// } ----- end attribute methods -----
// { ----- begin memory policy methods -----
public int IdleMemoryPurge( // do memory management already scheduled
nsIMdbEnv ev); // context
// approximate bytes actually freed
public int SessionMemoryPurge( // request specific footprint decrease
nsIMdbEnv ev, // context
int inDesiredBytesFreed); // approximate number of bytes wanted
// approximate bytes actually freed
public int PanicMemoryPurge( // desperately free all possible memory
nsIMdbEnv ev); // context
// approximate bytes actually freed
// } ----- end memory policy methods -----
// { ----- begin filepath methods -----
public String GetPortFilePath(
nsIMdbEnv ev); // context
// name of file holding port content
// file format description
public String GetFormatVersion(nsIMdbEnv ev);
// } ----- end filepath methods -----
// { ----- begin export methods -----
public String BestExportFormat( // determine preferred export format
nsIMdbEnv ev); // context
// 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"
public boolean
CanExportToFormat( // can export content in given specific format?
nsIMdbEnv ev, // context
final String inFormatVersion); // file format description
// whether ExportSource() might succeed
public nsIMdbThumb ExportToFormat( // export content in given specific format
nsIMdbEnv ev, // context
final String inFilePath, // the file to receive exported content
final String inFormatVersion); // file format description
// 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 -----
public String TokenToString( // return a string name for an integer token
nsIMdbEnv ev, // context
int inToken); // token for inTokenName inside this port
// the type of table to access
public int StringToToken( // return an integer token for scope name
nsIMdbEnv ev, // context
final String inTokenName); // Latin1 string to tokenize if possible
// 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.
public int QueryToken( // like StringToToken(), but without adding
nsIMdbEnv ev, // context
final String inTokenName); // Latin1 string to tokenize if possible
// 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 -----
public boolean HasRow( // contains a row with the specified oid?
nsIMdbEnv ev, // context
final mdbOid inOid); // hypothetical row oid
// whether GetRow() might succeed
public nsIMdbRow GetRow( // access one row with specific oid
nsIMdbEnv ev, // context
final mdbOid inOid); // hypothetical row oid
// acquire specific row (or null)
public int GetRowRefCount( // get number of tables that contain a row
nsIMdbEnv ev, // context
final mdbOid inOid); // hypothetical row oid
// number of tables containing inRowKey
// } ----- end row methods -----
// { ----- begin table methods -----
public boolean HasTable( // supports a table with the specified oid?
nsIMdbEnv ev, // context
final mdbOid inOid); // hypothetical table oid
// whether GetTable() might succeed
public nsIMdbTable GetTable( // access one table with specific oid
nsIMdbEnv ev, // context
final mdbOid inOid); // hypothetical table oid
// acquire specific table (or null)
public boolean HasTableKind( // supports a table of the specified type?
nsIMdbEnv ev, // context
int inRowScope, // rid scope for row ids
int inTableKind); // the type of table to access
// whether GetTableKind() might succeed
public int GetTableKindCount( // supports a table of the specified type?
nsIMdbEnv ev, // context
int inRowScope, // rid scope for row ids
int inTableKind); // the type of table to access
// 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"
public nsIMdbTable GetTableKind( // access one (random) table of specific type
nsIMdbEnv ev, // context
int inRowScope, // row scope for row ids
int inTableKind); // the type of table to access
// current number of such tables
//mdb_bool* outMustBeUnique); // whether port can hold only one of these
// acquire scoped collection of rows
public nsIMdbPortTableCursor
GetPortTableCursor( // get cursor for all tables of specific type
nsIMdbEnv ev, // context
int inRowScope, // row scope for row ids
int inTableKind); // the type of table to access
// all such tables in the port
// } ----- end table methods -----
// } ===== end nsIMdbPort methods =====
};