Takenoff Labs

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

[Notes/Domino] 設計解析講座: データベースプロパティとアイコン(3)

気づいたら前回から1ヶ月以上経ってた……orz
もはや誰も見てないかもしれませんが、自分のメモのために更新。

詳細オプションの取得

DBの詳細オプションは、NotesDatabase.GetOption で取れますが、以下の問題があります。

  • バージョンによっては一部取れないオプションがある(最新のオプションへの対応が遅い)
  • 複数のDBに対して連続して実行すると、メモリリークを起こす場合がある(R6 で発生することを確認。最新バージョンでは直っているのかな??)

API で詳細オプションを取得するには、NSFDbGetOptionsExt を使用します。以下にサンプルを掲載します。

(※ NSFDbGetOptionsExt はドキュメントに無い関数です。その点ご留意ください。
また、下記では個人アドレス帳からデータを取得する処理になっているので、DB_SVR、DB_PATH 定数の値を適当に変更して試してください。)

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 Type DBOPTIONSEXT
    Options As Long
    Options1 As Long
    Options2 As Long
    Options3 As Long
End Type

Public Const NOTESDLL = "nnotes.dll"

Declare Function NSFDbOpen Lib NOTESDLL (ByVal PathName As String, rethDB As Long) As Integer

Declare Function NSFDbGetOptionsExt Lib NOTESDLL (ByVal hDB As Integer, _
retDbOptions As DBOPTIONSEXT) 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 hDb     As Long
    Dim intRet  As Integer
    
    Dim options As DBOPTIONSEXT
    
    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 = NSFDbGetOptionsExt(hDb, options)
    If intRet <> 0 Then
        MsgBox APIGetError(intRet), 0, "エラー"
        Call NSFDbClose(hDb)
        Exit Sub
    End If
    
    If (options.Options1 And &H00000020&) = &H00000020& Then
        MsgBox "未読マークを使用しない"
    Else
        If (options.Options2 And &H00000040&) = &H00000040& Then
            If (options.Options2 And &H00000080&) = &H00000080& Then
                MsgBox "未読マークを複製する(すべてのサーバー)"
            Else
                MsgBox "未読マークを複製する(クラスタサーバーのみ)"
            End If
        End If
    End If
    If (options.Options1 And &H00000800&) = &H00000800& Then
        MsgBox "文書テーブルマップの最適化"
    End If
    If (options.Options1 And &H00000010&) = &H00000010& Then
        MsgBox "空きスペースに上書きしない"
    End If
    If (options.Options1 And &H00001000&) = &H00001000& Then
        MsgBox "LastAccessed プロパティを保持"
    End If
    If (options.Options1 And &H00002000&) = &H00002000& Then
        MsgBox "トランザクションログを無効"
    End If
    If (options.Options1 And &H00000080&) = &H00000080& Then
        MsgBox "文書の階層情報を使用しない"
    End If
    If (options.Options2 And &H00000002&) = &H00000002& Then
        MsgBox "添付ファイルの圧縮形式として LZ1 を使用"
    End If
    If (options.Options1 And &H00004000&) = &H00004000& Then
        MsgBox "ヘッドラインモニターを許可しない"
    End If
    If (options.Options1 And &H00400000&) = &H00400000& Then
        MsgBox "データベースで多くのフィールドを許可"
    End If
    If (options.Options2 And &H00000800&) = &H00000800& Then
        MsgBox "返答スレッド履歴をサポート"
    End If
    If (options.Options2 And &H00001000&) = &H00001000& Then
        MsgBox "簡易検索を許可しない"
    End If
    If (options.Options2 And &H00010000&) = &H00010000& Then
        MsgBox "データベース設計の圧縮"
    End If
    If (options.Options2 And &H00040000&) = &H00040000& Then
        MsgBox "文書データの圧縮"
    End If
    If (options.Options2 And &H00080000&) = &H00080000& Then
        MsgBox "ビューの自動更新を無効にする"
    End If
    If (options.Options1 And &H00020000&) = &H00020000& Then
        MsgBox "一時削除を許可"
    End If
    
    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

※ 「ビューのデータの書き出しを無効にする」オプションは、どうやら NSFDbGetOptionsExt でも取得できないみたいです。アイコンのほうの $DisableExport が "1" かどうかで判断してください。同様に数値関係の値もアイコンから取ってください。アイコンについては、前々回のエントリを参照してください。

詳細オプションの設定

詳細オプションの設定には、同様に NSFDbSetOptionsExt を使用します。以下、「簡易検索を許可しない」オプションを有効にするサンプルを掲載します。

(※ NSFDbSetOptionsExt はドキュメントに無い関数です。その点ご留意ください。

また、下記では個人アドレス帳にデータを設定する処理になっているので、DB_SVR、DB_PATH 定数の値を適当に変更して試してください。

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 Type DBOPTIONSEXT
    Options As Long
    Options1 As Long
    Options2 As Long
    Options3 As Long
End Type

Public Const NOTESDLL = "nnotes.dll"

Declare Function NSFDbOpen Lib NOTESDLL (ByVal PathName As String, rethDB As Long) As Integer

Declare Function NSFDbSetOptionsExt Lib NOTESDLL (ByVal hDB As Integer, _
DbOptions As DBOPTIONSEXT, Mask As DBOPTIONSEXT) 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 hDb     As Long
    Dim intRet  As Integer
    
    Dim options As DBOPTIONSEXT
    
    strPath = Space$(MAXPATH)
    Call OSPathNetConstruct(ByVal &h0, DB_SVR, DB_PATH, strPath)
    intRet = NSFDbOpen(APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strPath), hDb)
    If intRet <> 0 Then
        MsgBox APIGetError(intRet), 0, "エラー"
        Exit Sub
    End If
    
    options.Options2 = &H00001000& '簡易検索を許可しない
    
    intRet = NSFDbSetOptionsExt(hDb, options, options)
    If intRet <> 0 Then
        MsgBox APIGetError(intRet), 0, "エラー"
        Call NSFDbClose(hDb)
        Exit Sub
    End If
    
    Call NSFDbClose(hDb)
End Sub

'APITranslate、APIGetError は省略

NSFDbSetOptionsExt の3番目の引数(Mask)は、設定するビットを限定するためのものです。これによって特定ビットのみを書き換えることができます。まあ通常は第2引数と同じ値を設定しておく、と思ってください。


「データベースプロパティとアイコン」の解説は、とりあえずここまで。足りないところはあるかと思いますが、ご容赦くださいませ(_ _;;

ニーズが高いと思われる「データベースの使用状況」については、別エントリで解説するかもしれません。しないかもしれないけど(汗

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
読み込み中...

トラックバック

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

コメント

コメントはありません

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





(以下のタグが使えます)
<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 3658 to the field below:

^
×