見出し画像

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, &noteid);
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を学ぶと、知識に深みが増していくので、より楽しくなっていきます。

注意: コードの利用においてチブル・システムズは一切の責任を負いません。自己責任でご利用をお願いいたします。

この記事が気に入ったらサポートをしてみませんか?