HUMCOM DataBase Serice

概要

XPagesのアプリケーションDBを使ったサービス。設定値を取得するメソッドと文書ロックを行うメソッドを提供する。

前準備

このライブラリを使うためにXPagesを実装するDBにちょっと仕掛けが必要になる。

フォームの追加

DB内に以下のフォームを追加しておく。

lock フォーム

文書ロックの情報を保持するフォーム。

以下のフィールドを配置しておく。

[name]

ユーザー名を格納する。種類は文字列フィールドにしておく。

[docID]

ロック対象の文書を特定するためのUNIDを格納。

[lockTo]

ロックの有効期限。時刻情報を入れるけど文字列フィールドにしておく。 このフォームの文書はだれでもアクセスして、変更できないといけないので、アクセス権を制限するフィールドは設置しない。

setting フォーム

設定を保持するフォーム。

以下のフィールドを配置しておく。

[keyword]

設定値を特定するためのフィールド。文字列。

[values]

設定値そのものを保持するフィールド。複数値を管理しないといけないので、種類は文字列、複数値を許可する。

[Editors]

編集権限を保持させるので、作成者フィールドにして、自動的にメンテナンス用のロール名を設定しておくといい。

  設定を勝手に変えられると、セキュリティホールになるので。設定値はNotes Clientで作成する。
  

ビューの追加

DB内に以下のビューを追加しておく。

lockView ビュー

ロック文書を検索するビュー。選択式にはlockフォームの文書だけ表示するようにしておき、1列目に[docID]フィールドをソートして表示する。

settings ビュー

設定文書を検索するビュー。選択式にはsettingフォームの文書だけ表示するようにしておき、1列目に[keyword]フィールドをソートして表示する。

文書タイプのデータソースの設定

競合文書が作成されそうになったら例外を起こすようにconcurrencyMode="exception"をデータソースの定義位置に設定しておく。

  <xp:this.data>
      <xp:dominoDocument var="document1" formName="main" concurrencyMode="exception">
          <xp:this.postOpenDocument><![CDATA[#{javascript:$pcBook.postOpenDoc(document1);}]]></xp:this.postOpenDocument>
          <xp:this.postNewDocument><![CDATA[#{javascript:$pcBook.postNewDoc(document1);}]]></xp:this.postNewDocument>
      </xp:dominoDocument>
  </xp:this.data>
  

一応、ロック機能をとりいれることで、単純な競合はおきなくなるのだが、タイミングによってはどうしても競合が発生しうるので、保険として この設定は必要。もちろん、文書保存時に例外補足をしておくのが前提。

ライブラリで提供しているパブリックメソッド

$hcdb.getSettings(keyword)

keywordで特定可能な設定値を読み出す。

複数値の設定を読み出すときに使うので、設定値が単数でも複数でも、結果は配列になる。

設定値が登録されてないときはnullを返す。

$hcdb.getSetting(keyword)

keywordで特定可能な設定値を読み出す。

こちらは単独の設定値のみ。複数の設定が書き込まれている場合でも、先頭の設定を返すだけ。数字の設定も文字列として返す。

こちらも設定値が登録されてないときはnullを返す。

$hcdb.getSettingValue(keyword)

keywordで特定可能な設定値を数値として読み出す。

$hcdb.docLock(docID)

文書を編集ロックするためのメソッド。docIDにはロック対象の文書を特定可能なIDを返す。UNIDでもNoteIDでもいい。

戻り値は[result, username]の配列。1つめの要素がtrueのときはロックできたということ。編集に進んでいい。 1つめの要素がfalseだった場合は、他の人に既に編集ロックされているということ。編集ロック中のユーザー名が2つめの要素に設定されている。 $hcacc.un2kanji()などで漢字名に変換すればいい。

$hcdb.isLocked(docID)

文書がロック中かどうか調べる。戻り値がtrueならロック中、falseならロックされてない。

このメソッドではロックはかけない。

$hcdb.docUnlock(docID)

文書のロックを解除するメソッド。自分がかけたロックを解除する。タイミングによっては、ロック解除時に既に他の人にロックを横取りされている こともありえる。その場合は、このメソッドの戻りはfalseになり、ロックは解除されない(他の人のロックだからねぇ)。

このメソッドの戻りがfalseの時には、保存をかけないようにする。そうしないと、この後でロックを取得した人が保存をかけようとしたときに例外が 発生する。 競合文書ができそうになったら、例外がおきるように設定しているため。