[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
(次回に続く)

コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。