2020/02/19

サマリーフィールドの制限を緩和するには

【2023/12/17 追記】
本エントリで指摘している問題が V14.0 で解消されていることを確認し、その内容を次のエントリにまとめました。

サマリーフィールドの制限をご存知でしょうか。

ややこしいのですが、サマリーフィールドの制限は2種類あります。

文書にあるサマリーフィールドのサイズの合計

バージョン 9.0.1 FP8 で、文書内にあるサマリーフィールドのサイズの合計が、これまでの 64K から 16M に拡張されました。
こちらは御代様のブログに詳細に書かれていますので、ここでは省略します。


サマリーフィールドひとつあたりのサイズ

バージョン 10 で、ひとつのサマリーフィールドのサイズの制限が、これまでの 32K から 64K へ拡張されました。※この資料の34ページで紹介されています



以下、後者の制限が拡張されたことについて書きます。
なお、今回私が試した環境は バージョン11のベータ2です。製品版ではありません。


ひとつのサマリーフィールドのサイズを 64K へ拡張する場合、対象のデータベースに対して -LargeSummary on オプションを付けて圧縮タスクを実行します。
この -LargeSummary on オプションは、9.0.1 FP8 以降でサマリーフィールドの合計サイズを拡張したい場合に指定するものでしたが、単一のサマリーフィールドのサイズを拡張したい場合にも使用します。

もし、データベースの ODS バージョンが 53 でない場合、 notes.ini に CREATE_R10_DATABASES=1 を追加してコピー圧縮も実行します。
※実は ODS 52 でも -LargeSummary オプションを有効にすると 64K まで使えるっぽいのですが...サポートしてくれるのかしら...

そして圧縮タスクを実行したデータベースで、フォームにあるテキストフィールドで半角英数字をタイプしていくと 32762 文字目をタイプしたところで次のメッセージが表示されました。
Field is too large (32K) or View's column & selection formulas are too large

上のメッセージを閉じた後、Ctrl + S で文書を保存しようとすると、次のメッセージが表示されました。
Field 'xxx' contains too many characters (nn over 32767 maximum). Field will be saved but will not be displayed in views.

また、タイプした文字列が制限を超えている状態で保存した文書を、再びフォームで開くと、制限を超えた部分?の内容が崩れたような表示になりました。試してみると、正しく表示されるのは 32000 文字までで、32001文字目をタイプして保存した文書を開きなおすと崩れていました。
表示が崩れた部分で文字数が増加。それらもカウントされて32001文字ではなくなった...

他にも、テキストエディタで編集した、32K 以上 64K 未満の文字列をクリップボード経由で貼り付けようとすると、こんなメッセージが表示されました。
Text on clipboard must be less than 64K bytes in order to be pasted

どうやらフォームを使って編集する場合、まだ 32K の制限が有効のままのようです。※しつこいようですがこの環境は製品版ではありません

それでは LotusScript のエージェントでバックグラウンド系のクラスを使えば、文書が作成できるのか見ていきます。

NotesDocument.AppendItemValue メソッドで 32K を超える 62000 文字をセットしたところ、文字が崩れることもなく保存できていました。保存した文書のプロパティから、アイテムに SUMMARY フラグがあることと、 Data Length が 62000 であることが確認できます。
フィールドフラグに SUMMARY、Data Length に 32K を超える値がある

これだけ見れば、確かに 32K の制限は緩和され 64K まで拡張されているようです。


最後に、先のエージェントを修正して AppendItemValue で 64K 以上の文字列をセットしてみます。

エージェントを実行したところ AppendItemValue の行で次のようなメッセージが表示されました。

Memory allocation request exceeded 65,000 bytes
64K の制限が機能していることを確認できました。


今回 LargeSummary オプションについて分かったことは、御代さんもブログの中でご指摘されてるとおり LargeSummary オプションが有効かどうかを簡単に確認する方法は現状ありませんが、この問題は SPR SWASBLWJ39 として報告されているとのこと。

実は LargeSummary オプションを有効にしたデータベースの icon note には、$LargeSummary アイテムの値に "1" がセットされるようですので、LotusScript 等を使えば確認できないわけではなさそうです。
※icon note の取得方法はこちらが参考になるかと。

なお、LargeSummary を有効にしたデータベースに対して、再度 -LargeSummary on を指定して Compact を実行すると「LargeSummary is already enabled in database xxx.nsf.」と表示されます。

それならば、いったん有効にするコマンドを投入してみて、already enabled と表示されなかったら有効ってことで、そうでなければ無効に戻せばいいよね?と安易に考えて、有効にしたデータベースに対して Compact のオプションに -LargeSummary off と指定してみたところ「Invalid command line argument」と叱られてしまいました。off というオプションは存在しないようです。仮に無効にできたとしても 64K 超えの値を含む文書が失われたりして...やらないけど。

あ、-i とともに -R または -r を付けて Compact タスクを実行して ODS バージョンを戻せば無効にできるかも...やらないけど。

0 件のコメント:

コメントを投稿