![見出し画像](https://assets.st-note.com/production/uploads/images/57380125/rectangle_large_type_2_484645330d962ddca8a4f70b3f46cdd1.png?width=1200)
Notes C API探訪: NSFDbInfoGet/NSFDbInfoSet(関数)
データベースにアクセスできる・・・となれば、まずやってみたくなるのがタイトルの取得ではないでしょうか。Notesクライアントでワークスペースを広げると、四角い枠にアイコンとデータベースタイトル、未読文書数やどのサーバにあるかなどが目に飛び込んできます。このデータベースタイトルを、まずは取得してみよう。
実は、データベースタイトルは単独で保管されているわけではありません。カテゴリー、データベースクラス、設計クラスと4つの情報と一緒に保管されています。1つのバッファを共有しているので、どれか1つでも極端に大きいと、後ろにある情報から途切れてしまいます。コンピュータのリソースが極端に少ない時代の設計が色濃く残る仕様ですね。
データベースタイトル、カテゴリー、データベースクラス(データベースが参照しているテンプレートの設計クラス)、設計クラス(データベース自身がテンプレートとして名乗る名前)の4つが格納されているバッファのことを「データベース情報バッファ」と呼びます。タイトルを取得、変更するにはまずこのデータベース情報バッファを取得します。
NSFDbInfoGet
NSFDbInfoGet関数は、データベースからデータベース情報バッファを取得します。
#include <nsfdb.h>
STATUS LNPUBLIC NSFDbInfoGet (DBHANDLE hDB, char far *retBuffer);
#define NSF_INFO_SIZE 128
hDBは、データベースハンドルを指定します。
retBufferは、データベース情報バッファを格納する領域を指定します。領域の最大サイズはNSF_INFO_SIZE(4つ合わせて128バイト?!)です。
データベース情報バッファを取得しただけではタイトルを取得できません。4つの情報が合成されているので、バラしてタイトルだけ抜き取る必要があります。
NSFDbInfoParse
NSFDbInfoParse関数は、NSFDbInfoGetで取得したデータベース情報バッファから、タイトル/カテゴリー/クラス/設計クラスのいずれか抽出します。
#include <nsfdb.h>
void LNPUBLIC NSFDbInfoParse(
char far *Info,
WORD What,
char far *Buffer,
WORD Length);
#define INFOPARSE_TITLE 0
#define INFOPARSE_CATEGORIES 1
#define INFOPARSE_CLASS 2
#define INFOPARSE_DESIGN_CLASS 3
Infoは、NSFDbInfoGetで取得したデータベース情報バッファを指定します。
Whatは、抽出対象となる情報の種類(INFOPARSE_***)を指定します。
BufferとLengthは、抽出した文字列を格納する領域を指定します。通常、NSF_INFO_SIZEで十分です。
INFOPARSE_TITLEでタイトルを取得できました。では、次にこのタイトルを別のテキストに置き換えるにはNSFDbInfoModify関数を使います。
NSFDbInfoModify
NSFDbInfoModify関数は、データベース情報バッファに、タイトル/カテゴリー/クラス/設計クラスのいずれかを指定したテキストで書き換えます。
#include <nsfdb.h>
void LNPUBLIC NSFDbInfoModify(
char far *Info,
WORD What,
const char far *Buffer);
Infoは、NSFDbInfoGetで取得しデータベース情報バッファを指定します。
Whatは、書き換え対象となる情報の種類(INFOPARSE_***)を指定します。
Bufferは、書き換える内容のテキストを指定します。
NSFDbInfoModifyでタイトルを書き換えても、メモリ上のデータベース情報バッファが更新されたに過ぎません。更新されたデータベース情報バッファをデータベースに反映します。
NSFDbInfoSet
NSFDbInfoSet関数は、メモリ上のデータベース情報バッファをデータベースに反映します。
#include <nsfdb.h>
STATUS LNPUBLIC NSFDbInfoSet (DBHANDLE hDB, char far *Buffer);
hDBは、データベースハンドルを指定します。
retBufferは、上書きするデータベース情報バッファを指定します。
以上で、データベースからタイトル(他3つ)を取得し、更新、反映することができます。
まとめ
データベースのタイトルにある程度長い名前は付けられますが、その分、カテゴリー/クラス/設計クラスが割を食います。たった128バイトですよ。なかなか衝撃的なサイズです。カテゴリー/クラス/設計クラスを指定しなかったとしても全角で42文字しか入りません(日本語の全角文字は1文字当たり3バイトを要するため)。早々長い名前は付けないにしても、心許ないサイズ感ですよね。データベースに長いタイトルを付けたら後半切れてしまったという経験のある方、これが原因でした。
Notes C APIに触れていると、普段は見えてこないNotes/Dominoの内部事情を垣間見ることができます。このような負の側面もありますが、「あんなこともできる」「こんなこともできる」と思わせてくれるのもNotes C APIです。