[Notes/Domino] 設計解析講座: データベースプロパティとアイコン(1)
前回からだいぶ間があいてしまいました(_ _;; スミマセン。
今回はちょっと基礎事項から外れて、データベースプロパティの部分を解析してみたいと思います。かなり長くなってしまいましたので、3回ほどに分載する予定です。
データベースプロパティ情報の取得
データベースプロパティの情報は、基本的にはアイコンノートに保存されています。ただし、100% あるわけではなく、全部取得するためには、NSFDbReplicaInfoGet と NSFDbGetOptionsExt も必要です。
今回は、アイコンと NSFDbGetOptionsExt を説明します。NSFDbReplicaInfoGet のサンプルは、以前のエントリを参照してください。NSFDbReplicaInfoGet で取得できるプロパティは、以下のものです。
- バックグラウンドエージェント不可(REPLFLG_NO_CHRONOS)
- データベースカタログに表示(REPLFLG_DO_NOT_CATALOG)
- [データベースを開く] ダイアログ(REPLFLG_DO_NOT_BROWSE)
- サイト検索に含む(REPLFLG_MULTIDB_INDEX)
- 設計非表示かどうか(REPLFLG_HIDDEN_DESIGN) (参考)
アイコンノート
以前に取り上げたことがありますが、アイコンノートにはアイコンだけでなく、データベースに関する様々な情報が保管されています。以下、各アイテムの説明を列挙してみます。
アイテム名 | 説明 |
---|---|
$AllowPost8HTML | 「拡張 HTML 生成を有効にする」がONの場合"1" |
$CollationType | マルチリンガルオプションの「Unicodeスタンダードソート」がオンの場合、"@UCA" |
$CSSExpires | 「カスタムブラウザのキャッシュ有効期限(日数)」の「スタイルシートファイル」の値 |
$Daos | DAOSが有効な場合"1" |
$DBTheme | 「クラシック Web テーマ」の値 |
$DefaultClientXPage | ノーツクライアントでのDB起動時のXPage名 ($Flags に "?" が含まれる場合に有効) |
$DefaultCollation | マルチリンガルオプションの「デフォルトのソート方法」 例: 日本語 → "ja" |
$DefaultCompApp | 「コンポジットアプリケーションとして起動する」の名前 ($Flags に "K" が含まれる場合に有効) |
$DefaultCompAppPage | 「コンポジットアプリケーションとして起動する」のページの識別名 ($Flags に "K" が含まれる場合に有効) |
$DefaultFrameset | ノーツクライアントでのDB起動時のフレームセット名 ($Flags に "F" が含まれる場合に有効) |
$DefaultLanguage | マルチリンガルオプションの「デフォルトの言語」と「デフォルトの地域」 例1: 日本 → "ja" 例2: 英語&USA → "en-US" |
$DefaultNavigator | ノーツクライアントでのDB起動時のナビゲータ名 ただし "Folders" の場合は「フォルダ」 ($Flags に "l" が含まれ、"W" が含まれない場合に有効) |
$DefaultOutline | ? |
$DefaultWebFrameset | WebでのDB起動時のフレームセット名 ($Flags に "S" が含まれる場合に有効) |
$DefaultWebLaunchPage | WebでのDB起動時のページ名 ($Flags に "E" が含まれる場合に有効) |
$DefaultWebNavigator | ノーツクライアントでのDB起動時のナビゲータ名 ($Flags に "L" が含まれる場合に有効) |
$DefaultWebPage | ノーツクライアントでのDB起動時のページ名 ($Flags に"l" と "W" が含まれる場合に有効) |
$DefaultXPage | WebでのDB起動時のXPage名 ($Flags に "!" が含まれる場合に有効) |
$DisableExport | 「ビューのデータ書き出しを無効にする」がONの場合"1" |
$Flags | (後述) |
$FlagsNoRefresh | (後述) |
$ImageExpires | 「カスタムブラウザのキャッシュ有効期限(日数)」の「イメージファイル」の値 |
$JSExpires | 「カスタムブラウザのキャッシュ有効期限(日数)」の「JavaScript ファイル」の値 |
$JSLibName | ? |
$LaunchDoclink | ? |
$LaunchViewName | ? |
$LaunchWebDoclink | WebでのDB起動時が「指定された文書リンクを起動する」の場合の文書リンク ($Flags に "T" が含まれる場合に有効) |
$LaunchWebDoclinkAnchor | WebでのDB起動時が「指定された文書リンクを起動する」の場合で、アンカーリンクを貼りつけた場合のアンカー名 ($Flags に "T" が含まれる場合に有効) |
$LaunchWebViewName | WebでのDB起動時が「ビューの最初の文書を起動する」の場合の文書リンク ($Flags に "V" が含まれる場合に有効) |
$LSECFlags | 複製の設定の「ローカルでのアクセス制御設定の変更を他レプリカへ反映する」がONの場合"s"("c"、"p"の場合もあるようだが、よくわからん……) |
$RevisionsLimit | $Revisions フィールドのエントリ制限値 デフォルト値から値を変えた場合のみアイテムが作成される) |
$SoftDeleteExpireHours | 一時削除の有効期間の時間数 デフォルト値から値を変えた場合のみアイテムが作成される) |
$TemplateFileName | 再設計/設計の置換したときの情報。詳しくはこちらを参照してください。 |
$TemplateModTime | |
$TemplateServerName | |
$UpdatedByLimit | $UpdatedBy フィールドのエントリ制限値 (デフォルト値から値を変えた場合のみアイテムが作成される) |
$TITLE | (後述) |
IconBitmap | (後述) |
上記は stdnames.h にあった定義をもとに列挙していますが、$DefaultOutline など、一部のものはよくわかりませんでした……(x_x) 使われてないのかな???
また、メールDBなどには stdnames.h に定義されていないアイテムもあるみたいです。それらについてはキリがないので、ここでは省略しています。
アイコンからデータを取得するには、以下のようにすれば簡単です。以下はノーツクライアントから起動した場合のフレームセット名を取得します。(2011/03/19追記)
Dim ss As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Set db = ss.Currentdatabase Set doc = db.Getdocumentbyid("FFFF0010") If InStr(1, doc.~$Flags(0), "F", 0) > 0 Then MsgBox doc.~$DefaultFrameset(0) End If
$TITLE、$Flags、$FlagsNoRefresh、IconBitmap については後述します。
$TITLE
$TITLE は、データベース名、カタログDBに表示される場合のカテゴリ名、引き継ぐテンプレート名、マスターテンプレート名がセットされます。以下のような感じでセットされています。
データベース名[LF]カテゴリ名[LF]#1マスターテンプレート名[LF]#2引き継ぐテンプレート名
※ [LF] はラインフィード(アスキーコード=10)のことです。
この文字列をそれぞれのパーツに分割するのは、API 的には NSFDbInfoParse という関数を使います。以下はそのサンプルです。(まあ、LF でバラしてやれば結構簡単に取得できますし、そもそも LotusScript の NotesDatabase クラスで全部取れますから、あまり意味は無いですが。)
Public Const MAXPATH = 256 Public Const WORDLEN = 65534 Public Const OS_TRANSLATE_NATIVE_TO_LMBCS = 0 Public Const OS_TRANSLATE_LMBCS_TO_NATIVE = 1 Public Const NSF_INFO_SIZE = 128 Public Const INFOPARSE_TITLE = 0 Public Const INFOPARSE_CATEGORIES = 1 Public Const INFOPARSE_CLASS = 2 Public Const INFOPARSE_DESIGN_CLASS = 3 Public Const NOTESDLL = "nnotes.dll" Declare Function NSFDbOpen Lib NOTESDLL (Byval PathName As String, rethDB As Long) As Integer Declare Function NSFDbInfoGet Lib NOTESDLL (Byval hDB As Long, Byval retBuffer As String) As Integer Declare Sub NSFDbInfoParse Lib NOTESDLL (Byval Info As String, Byval What As Integer, _ Byval Buffer As String, Byval Length As Integer) Declare Function NSFDbClose Lib NOTESDLL (Byval hDB As Long) As Integer Declare Function OSLoadString Lib NOTESDLL (Byval hModule As Long, Byval StringCode As Long, _ Byval retBuffer As String, Byval BufferLength As Integer) As Integer Declare Function OSPathNetConstruct Lib NOTESDLL (Byval PortName As Long, Byval ServerName As String, _ Byval FileName As String, Byval retPathName As String) As Integer Declare Function OSTranslate Lib NOTESDLL (Byval TranslateMode As Integer, Byval InData As String, _ Byval InLength As Long, Byval OutData As String, Byval OutLength As Long) As Integer Sub Initialize Const DB_SVR = "" Const DB_PATH = "names.nsf" Dim strPath As String Dim strInfo As String * NSF_INFO_SIZE Dim strBuf As String * NSF_INFO_SIZE Dim hDb As Long Dim intRet As Integer strPath = Space$(MAXPATH) Call OSPathNetConstruct(Byval &h0, DB_SVR, DB_PATH, strPath) intRet = NSFDbOpen(APITranslate(OS_TRANSLATE_NATIVE_TO_LMBCS, strPath), hDb) If intRet <> 0 Then Msgbox APIGetError(intRet), 0, "エラー" Exit Sub End If intRet = NSFDbInfoGet(hDb, strInfo) If intRet <> 0 Then Msgbox APIGetError(intRet), 0, "エラー" Call NSFDbClose(hDb) Exit Sub End If 'DBタイトル Call NSFDbInfoParse(strInfo, INFOPARSE_TITLE, strBuf, NSF_INFO_SIZE - 1) Msgbox APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strBuf) 'データベースカタログに表示する名前 Call NSFDbInfoParse(strInfo, INFOPARSE_CATEGORIES, strBuf, NSF_INFO_SIZE - 1) Msgbox APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strBuf) 'テンプレート名 Call NSFDbInfoParse(strInfo, INFOPARSE_CLASS, strBuf, NSF_INFO_SIZE - 1) Msgbox APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strBuf) '引き継ぐテンプレート名 Call NSFDbInfoParse(strInfo, INFOPARSE_DESIGN_CLASS, strBuf, NSF_INFO_SIZE - 1) Msgbox APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strBuf) Call NSFDbClose(hDb) End Sub Public Function APITranslate(Byval intMode As Integer, Byval strBuf As String) As String Dim strOut As String strOut = Space$(WORDLEN) Call OSTranslate(intMode , strBuf, LenBP(strBuf) - 1, strOut, WORDLEN - 1) APITranslate = Strleft(strOut & Chr(0), Chr(0)) End Function Public Function APIGetError(Byval intErrCode As Integer) As String Dim strIn As String Dim strOut As String Dim intCode As Integer strIn = Space$(255) strOut = Space$(255) intCode = intErrCode And &h3FFF Call OSLoadString(0, intCode, strIn, LenBP(strIn) - 1) strOut = APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strIn) APIGetError = Trim(strOut) End Function
(次回に続く)
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。