3.2.1 Abstract Data Model

This section describes a conceptual model of possible data organization that an implementation maintains to participate in this protocol. The described organization is provided to facilitate the explanation of how the protocol behaves. This document does not mandate that implementations adhere to this model as long as their external behavior is consistent with that described in this document.

The server maintains several tables of data in order to satisfy the various ROPs that a client can invoke. These tables include: a REPLID and REPLGUID to-and-from mapping table, named property-to-property ID mapping table, a mailbox table, a per-user data table, and a Receive folder table.

REPLID/REPLGUID mapping table: The REPLID and REPLGUID to-and-from mapping table contains rows of 16-bit REPLID values coupled with 128-bit REPLGUID values. This table is used to map a REPLID to a REPLGUID and vice versa. When a client invokes RopIdFromLongTermId (section 2.2.1.9), this table is searched for the REPLGUID portion of the LongTermID, as specified in [MS-OXCDATA] section 2.2.1.3.1, passed by the client. When a client invokes RopLongTermIdFromId (section 2.2.1.8), this table is searched for the REPLID portion of the Folder ID or Message ID, as specified in [MS-OXCDATA] sections 2.2.1.1 or 2.2.1.2, passed by the client.

named property/property ID mapping table: The named property-to-property ID mapping table contains the mapping between registered named properties and their server-assigned property identifiers. The server uses this table to look up the named property for a given property ID and vice versa when processing RopGetNamesFromPropertyIds and RopGetPropertyIdsFromNames, as specified in [MS-OXCPRPT] section 3.2.5.9 and [MS-OXCPRPT] section 3.2.5.10

mailbox table: The mailbox table is used for logging on to a private mailbox. The table contains one row for each mailbox in the database. It contains columns to specify the root folder and other special folders of the mailbox, the access permissions to the mailbox, and an identifying GUID that matches the owner of the mailbox, along with other metadata, such as last logon time, various item counts and aggregate sizes within the mailbox, and so on. When a client invokes RopLogon (section 2.2.1.1), the client passes an identifying moniker for the mailbox. The server then looks up the moniker in a global directory. The entry in the global directory indicates the proper server to log on to for this user's mailbox, and contains other relevant data used to find the mailbox on that server in the mailbox table. The proper row in the mailbox table is then found, and the user's access is checked. If the logon is allowed, then the Folder IDs of various special folders are obtained from the table and returned to the client. For more details about special folders, see [MS-OXOSFLD]. A list of the folders that are special folders is provided in [MS-OXOSFLD] section 1.3.

per-user data table: The per-user data table contains the read/unread information for various public folders on a specific public folder replica server. The table maintains the mailbox GUID, the REPLGUID, the folder, and the change number set of read items. The RopGetPerUserLongTermIds ([MS-OXCROPS] section 2.2.3.10), RopGetPerUserGuid ([MS-OXCROPS] section 2.2.3.11), RopReadPerUserInformation ([MS-OXCROPS] section 2.2.3.12), RopWritePerUserInformation ([MS-OXCROPS] section 2.2.3.13) ROPs each make use of the data in this table.

Receive folder table: The Receive folder table contains rows of message class strings and associated FIDs. Each FID specifies a Receive folder. The server maintains a single Receive folder table per database. The data within the table are scoped to each mailbox. Conceptually, there is a single Receive folder table per mailbox. The delivery process uses the message class string on the incoming e-mail to look up the appropriate folder to which to deliver that message. The RopGetReceiveFolder ([MS-OXCROPS] section 2.2.3.2) and RopSetReceiveFolder ([MS-OXCROPS] section 2.2.3.3) ROPs are used to retrieve and set the data in this table.