見出し画像

Notes C API探訪: NSFNoteGetInfo/NSFNoteSetInfo(関数)

NSFSearch関数で文書がマッチするたびにコールバック関数が呼び出されますが、その第2引数で送られてくるのがSEARCH_MATCH構造体でした。

typedef struct {
	GLOBALINSTANCEID ID;		/* identity of the note within the file */
	ORIGINATORID OriginatorID;	/* identity of the note in the universe */
	WORD NoteClass;				/* class of the note */
	BYTE SERetFlags;			/* MUST check for SE_FMATCH! */
	BYTE Privileges;			/* note privileges */
	WORD SummaryLength;			/* length of the summary information */
	/*WORD TUALength;			length of the $TUA item value; must be requested with SEARCH1_RETURN_THREAD_UNID_ARRAY */
								/* 56 bytes to here */
								/* now comes an ITEM_TABLE with Summary Info */
								/* now comes the optional $TUA item value.  It is in host format. */
} SEARCH_MATCH;

このうち、ID.Note(TIMEDATE)、ID.NoteID(NOTEID)、OriginatorID(ORIGINATORID)、NoteClass(WORD)などは、文書情報として文書ハンドルを取得することができます。

NSFNoteGetInfo

NSFNoteGetInfo関数は、文書ハンドルから文書情報を取得します。

#include <nsfnote.h>
void LNPUBLIC NSFNoteGetInfo (NOTEHANDLE hNote, WORD Type, void far *Value);

hNoteは、文書ハンドルを指定します。
Typeは、取得したい文書情報の種類(後述)を指定します。
Valueは、取得したい情報の変数への型を指定します。

文書情報の種類は、以下の通りです。

#include <nsfnote.h>

/* 	Note structure member IDs for NSFNoteGet&SetInfo. */

#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 */

文書情報のデータ型は種類によってまちまちです。_ADDED_TO_FILEのみ情報がありませんが、それ以外は以下の通りです。

_NOTE_DB             /* DBHANDLE */
_NOTE_ID             /* NOTEID */ 
_NOTE_OID            /* ORIGINATORID(OID) */
_NOTE_CLASS          /* WORD */
_NOTE_MODIFIED       /* TIMEDATE */
_NOTE_PRIVILEGES     /* (v3以降使用されなくなったACL的なもの) */
_NOTE_FLAGS          /* WORD */
_NOTE_ACCESSED       /* TIMEDATE */
_NOTE_PARENT_NOTEID  /* NOTEID */
_NOTE_RESPONSE_COUNT /* DWORD */
_NOTE_RESPONSES      /* DHANDLE (返答文書が集合したIDテーブルという構造のハンドル) */
_NOTE_ADDED_TO_FILE  /* ??? */
_NOTE_OBJSTORE_DB    /* DBHANDLE */

_NOTE_DBは、属するデータベースのハンドルです。
_NOTE_IDは、文書IDです。
_NOTE_OIDは、UNIDを含むORIGINATORID構造体データです。
_NOTE_CLASSは、文書クラスです。
_NOTE_MODIFIED、文書の最終更新日時です。
_NOTE_FLAGSは、文書フラグです。_NOTE_FLAG_XXXとして定義されています。
_NOTE_ACCESSED、文書の最終アクセス日時です。
_NOTE_PARENT_NOTEID、親文書の文書IDです。
_NOTE_RESPONSE_COUNT、孫以下を含まない、子の返答文書の数です。
_NOTE_RESPONSES、孫以下を含まない、子の返答文書のIDテーブル(後述)ハンドルです。
_NOTE_ADDED_TO_FILEは・・・なんでしょう?作成日時のことでしょうか?情報不足です。
_NOTE_OBJSTOREDBは、オブジェクトストアとしてリンクされるデータベースのハンドルです。

IDテーブルとは、文書IDを昇順で持っているコンテナです。私の愛読書「Notes/Domino APIプログラミング」では「std::set<NOTEID>とほぼ同じ機能」と紹介されています。

2000年の著書で、Notes C APIの日本語著作では唯一のものです。今でも非常に役立つ情報が満載です。Amazonでも新品は手に入れにくくなった本ですが、チャンスがあれば是非手に入れてみて下さい。

ちなみに、Notes C APIでは、LIST構造体やRANGE構造体のように、C++であればライブラリで実現できそうなコンテナ構造を、あえて自前で構築している背景には、本来このライブラリがC言語で書かれている点が上げられると思います(先の書籍にもそう指摘されています)。

NSFNoteSetInfo

NSFNoteSetInfo関数は、文書情報を設定します。

#include <nsfnote.h>
void LNPUBLIC NSFNoteSetInfo (NOTEHANDLE hNote, WORD Type, void far *Value);

引数についてはNSFNoteGetInfo関数とかぶるので説明を省略します。

NSFNoteSetInfo関数は、その存在意義に多少の疑問が生じます。DBHANDLEやNOTEID、更新日時やアクセス日時など、利用者が情報を取りに行くことはあっても、こちらから設定できるとは一体どういうことでしょうか?

実は、文書情報を能動的に設定するケースとして、メモリ上にしか存在していない文書、インメモリノートというものがあります。
例えば、DBHANDLEがNULLHANDLEのインメモリノートは、どのデータベースとも関連付いていない状態です。そのため、どこかのデータベースに保存するためには、ここでそのデータベースのハンドルをNSFNoteSetInfo関数で設定する必要があります。
また、NOTEIDを0に設定して保存すると、その文書は新規文書として扱われ、更新時に新たなNOTEIDが付与されます。
OIDは他の文書とかぶってはいけない情報ですが、これにはNSFDbGenerateOIDという関数で生成したものを使います。
更新日時は、例えNSFNoteSetInfo関数であり得ない日時を設定しても、更新時にその日時で上書きされます。

このように、文書情報をこちらで設定する場面があるために、NSFNoteSetInfoが存在します。


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