Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[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

(次回に続く)

1 Star2 Stars3 Stars4 Stars5 Stars (5 votes, average: 5.00 out of 5)
読み込み中...

Navigation

トラックバック

トラックバックはありません

コメント

コメントはありません

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





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 7426 to the field below:

^
×