Notes C API探訪: DBID/UNID(データ型)
Notes/DominoではデータベースのIDといえばレプリカID、文書のIDといえばUNIDを真っ先に浮かべるかと思います。いずれもNotes/Dominoの特徴の一つであるレプリケーション(複製)とゆかりがあるIDになっています。
レプリカID(DBID)
データベースはファイルなので、元々「パス」という固有の情報を持っていますが、複製先と同一であることを保証するために、複製されたデータベース間では同じID「レプリカID」を持っています。
「レプリカID」と表記されていますが、Notes C APIシンボル的には「DBID型」となります。
#include <nsfdata.h>
#define DBID TIMEDATE
ご覧のとおり、DBID型はTIMDATE型と同義です。
DBIDはNSFDbIDGet関数で取得できます。
#include <nsfdb.h>
STATUS LNPUBLIC NSFDbIDGet (DBHANDLE hDB, DBID far *retDbID);
UNID(UniversalNoteID)
文書は、データベース内において一意であることを示すIDとしてNoteID(文書ID)というものを持っています。しかし、レプリカ先のデータベースでは改めて個別の文書IDが振られるため、レプリカ間で同一性を保てなくなります。そのため、レプリカ間で同一文書であることを保障するためにUNIDがあります。
NoteIDは簡易なIDで、DWORD(4バイト符号なし整数)の領域を持ちます(実質下位の2バイトがIDとして使われます)。
#include <nsfdata.h>
typedef DWORD NOTEID;
一方、UNIDは以下のような構造体となっています。
#include <nsfdata.h>
typedef struct UNIVERSALNOTEID_tag {
DBID File;
TIMEDATE Note;
} UNIVERSALNOTEID;
#define UNID UNIVERSALNOTEID
DBID型はTIMEDATE型なので、実質TIMEDATE型2つがUNIDを表しています。
#include <global.h>
typedef struct tagTIMEDATE {
DWORD Innards[2];
} TIMEDATE;
TIMEDATE型はDWORD2個の構造体なので、UNIDは4バイト×4つで16バイトのデータであることがわかります。
NOTEID、UNIDはともにNSFNoteGetInfo関数で取得できます。
#include <nsfnote.h>
void LNPUBLIC NSFNoteGetInfo (NOTEHANDLE hNote, WORD Type, void far *Value);
#define _NOTE_DB 0 /* IDs for NSFNoteGet&SetInfo */
#define _NOTE_ID 1 /* (When adding new values, see the */
#define _NOTE_OID 2 /* table in NTINFO.C */
#define _NOTE_CLASS 3
#define _NOTE_MODIFIED 4
#define _NOTE_PRIVILEGES 5 /* For pre-V3 compatibility. Should use $Readers item */
#define _NOTE_FLAGS 7
#define _NOTE_ACCESSED 8
#define _NOTE_PARENT_NOTEID 10 /* For response hierarchy */
#define _NOTE_RESPONSE_COUNT 11 /* For response hierarchy */
#define _NOTE_RESPONSES 12 /* For response hierarchy */
#define _NOTE_ADDED_TO_FILE 13 /* For AddedToFile time */
#define _NOTE_OBJSTORE_DB 14 /* DBHANDLE of object store used by linked items */
第2引数のTypeには_NOTE_xxx定数が入ります。NOTEIDを取得する時_NOTE_IDを指定すると第3引数はNOTEIDへのポインタとして、UNIDを取得する時_NOTE_OIDを指定すると第3引数はOIDへのポインタとして機能します。
NOTEID noteid;
NSFNoteGetInfo(notehandle, _NOTE_ID, ¬eid);
OID oid;
NSFNoteGetInfo(notehandle, _NOTE_OID, &oid);
OIDはORIGINATORID構造体と同義です。
#include <nsfdata.h>
typedef struct ORIGINATORID_tag {
DBID File; // -> UNID.File
TIMEDATE Note; // -> UNID.Note
DWORD Sequence;
TIMEDATE SequenceTime;
} ORIGINATORID;
#define OID ORIGINATORID
取得したOIDのメンバ変数FileをUNID.Fileとして、メンバ変数NoteをUNID.Noteとしてコピーすれば、UNIDのできあがりです。
OID oid;
NSFNoteGetInfo(notehandle, _NOTE_OID, &oid);
UNID unid { oid.File, oid.Note };
まとめ
式言語やLotusScriptなど、Notes/Dominoのプログラミングでは、レプリカIDやUNIDはテキストとして扱われるので、16文字、32文字の文字列くらいの認識で十分ですが、これらは、内部ではきっちりバイナリーデータとして扱われます。Notes C APIを学ぶと、知識に深みが増していくので、より楽しくなっていきます。
注意: コードの利用においてチブル・システムズは一切の責任を負いません。自己責任でご利用をお願いいたします。