見出し画像

Notes C API探訪: 設計フラグ

Notes/Dominoデータベースは、文書をレコードとしたデータベースで、データとしての文書の他に、「設計要素」と呼ばれる設計向けの文書が存在します。前回の記事では、「文書クラス」という、文書に含まれるパラメータが、設計文書をある程度は分別をしてくれている・・・、けど機能が増えて今ではざっくりしていることをご紹介しました。

今回は、その「ざっくりしている」設計要素分類の、細分化を補助している「設計フラグ」というものを紹介します。

設計フラグの文字

設計フラグ自体は、「$Flags」という名前の単なる文字列フィールドです。この中に、さまざまな意味のある文字、「文字フラグ」を並べることで、その設計要素が何を表しているかがわかります。

// stdnames.hより一部抜粋

/*	Design flags */

#define	DESIGN_FLAGS "$Flags"

/*	Please keep these flags in alphabetic order (based on the flag itself) so that
	we can easily tell which flags to use next. Note that some of these flags apply
	to a particular NOTE_CLASS; others apply to all design elements. The comments
	indicate which is which. In theory, flags that apply to two different NOTE_CLASSes
	could overlap, but for now, try to make each flag unique. */

#define DESIGN_FLAG_V4AGENT 			'f'	/*	FILTER: This is a V4 agent */
#define DESIGN_FLAG_XSPPAGE				'K'	/*	FORM: with "g", design element is an xpage, much like a file resource, but special! */
#define DESIGN_FLAG_LOTUSSCRIPT_AGENT   'L' /*  FILTER: If its LOTUSSCRIPT */
#define	DESIGN_FLAG_QUERY_FILTER 		'Q'	/*	FILTER: Indicates full text query 
#define DESIGN_FLAG_V4BACKGROUND_MACRO 	'S'	/*	FILTER: This is a V4 background agent */
#define DESIGN_FLAG_SCRIPTLIB			's'	/*	FILTER: A database global script library note */
#define DESIGN_FLAG_SUBFORM 			'U'	/*	FORM: Indicates that a form is a subform.*/
#define DESIGN_FLAG_HIDE_FROM_V3		'3'	/*	ALL: notes stamped with this flag 
#define DESIGN_FLAG_HIDE_FROM_V4		'4'	/*	ALL: notes stamped with this flag 
#define DESIGN_FLAG_XSP_CC				';' /* note class form, a custom control */

例えば、LotusScriptのエージェントは「SfL3」となっていて、DESIGN_FLAG_V4BACKGROUND_MACRO、DESIGN_FLAG_V4AGENT、DESIGN_FLAG_LOTUSSCRIPT_AGENT、DESIGN_FLAG_HIDE_FROM_V3の複合体として表されています。
また、LotusScriptライブラリは「s34Q」となっていて、DESIGN_FLAG_SCRIPTLIB、DESIGN_FLAG_HIDE_FROM_V3、DESIGN_FLAG_HIDE_FROM_V4、DESIGN_FLAG_QUERY_FILTERの複合体として表されています。
これらの文字フラグは、ヘッダーファイルの定義を見る限り80種類以上を数えます。

設計フラグパターン

設計フラグを1文字1文字確認することで、この設計要素が何かを絞り込むことも可能ですが、「この設計要素はこの設計フラグ文字列を使う」みたいなことができると便利です。

ヘッダーファイルstdnames.hには、設計フラグを検索できる正規表現のような検索パターンが用意されています。同ヘッダーファイルの検索パターン定義の直前に、以下のような記述があります。

/* '+' = ANY of the flags, '-' = NONE of the flags, '*' = ALL of the flags 	*/
/* '(+-*' = a combination of the above.										*/
/*	 Example:  "(+AB-C*DE" = (A OR B) AND (NOT C) AND (D AND E)				*/
/* 		Note: be sure to have +-* placeholders even if no flags for some.	*/
/* 			  ie: "(+-C*DE"   = (NOT C) AND (D AND E).						*/
/*	 Note: "(+-Q*" is equivalent to "-Q" 									*/

これを要約すると以下のようになります。

'+'の直後からの文字フラグのいずれかを含む(OR式)。
'-'の直後からの文字フラグを含まない(NOT式)。
'*'の直後からの文字フラグをすべて含む(AND式)。
'('ではじまる場合、'+'、'-'、'*'の条件をANDでつなげる。

例えば、stdnamesヘッダーファイルには次のようなパターンが定義されています。

#define DFLAGPAT_SCRIPTLIB		 "+sh."		/* display only database global script libraries */
#define DFLAGPAT_SCRIPTLIB_LS	 "(+s-jh.*"	/* display only database global LotusScript script libraries */
#define DFLAGPAT_SCRIPTLIB_JAVA	 "*sj"		/* display only database global Java script libraries */
#define DFLAGPAT_SCRIPTLIB_JS	 "+h"		/* display only database global Javascript script libraries */
#define DFLAGPAT_SCRIPTLIB_SERVER_JS "+."	/* display only database global JS server side script libraries */

スクリプトライブラリ全般を検索したい場合、"+sh."となり、's'か'h'か'.'のいずれかを含んでいることを示しています。
LotusScriptライブラリの場合は"(+s-jh.*"となり、's'を含み、'j'と'h'と'.'のいずれも含まないことを示しています。
Javaライブラリの場合は"*sj"となり、's'と'j'の両方を含むことを示しています。
JavaScriptライブラリの場合は"+h"となり、'h'を含むことを示しています。
Javaサーバーの場合は"+."となり、'.'を含むことを示しています。
なお、各文字フラグは以下のようになります。

#define DESIGN_FLAG_SCRIPTLIB			's'	/*	FILTER: A database global script library note */
#define DESIGN_FLAG_JAVASCRIPT_LIBRARY  'h' /*  Javascript library. */
#define DESIGN_FLAG_JAVA_AGENT_WITH_SOURCE 'j' /* FILTER: If it is a java agent with java source code. */
#define DESIGN_FLAG_JS_SERVER			'.' /* note class filter, with 's', server side JS script library */

このような「DFLAGPAT_〜」で始まる検索パターンは関数NIFFindDesignNoteExtの第4引数で使用できます。

// nif.hより抜粋

STATUS LNPUBLIC		NIFFindDesignNote (DBHANDLE hFile, const char far *Name, WORD Class, NOTEID far *retNoteID);
STATUS LNPUBLIC		NIFFindDesignNoteExt (DBHANDLE hFile, const char far *Name, WORD Class, const char *pszFlagsPattern, NOTEID far *retNoteID, DWORD Options);

ここでは簡単な紹介になりますが、NIFFindDesignNoteやNIFFindDesignNoteExtは、設計要素を検索するための関数です。

まとめ

設計フラグは、特にバージョン4以降に増えた設計要素を区別するための重要な文字列です。使いこなせるようにしておきたいポイントです。

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