TPC-B仕様書の巻末のサンプル実装のコメントの日本語訳

TPC-B(TPC Benchmark B)の仕様書の巻末に掲載されているTPC-Bのサンプル実装のコメントを日本語に翻訳しました。たぶん、英文のTPC-Bの仕様書を読むよりも、このベンチマークプログラムのサンプル実装を読むほうが簡単だと思います。

/*
*  このコードは、TPC-BのANSI CとANSI SQL2によるサンプル実装です。
*  このコードと同等な実装であればTPC-Bとして認められます
* 
*  特例:
* 
*  1.  ANSI/ISO SQLには、明確な"BEGIN WORK"(トランザクションの開始)がありません。
*      ドライバーがトランザクションの外にあることを示すために、
*      明確な"BEGIN WORK"文が含まれています。
*  2.  C言語には、整数と浮動小数点数しかなく、精度と桁数を持っていません。
*      したがって、この実装では、お金は、整数の貨幣単位で表現されます。
*  3.  データベース構造を明確にするために、以下のSQL2の機能が使用されています。
*          主キー
*          外部キー
*          日付時刻型
*          デフォルト値(文字列を埋めるための単純な操作のため)
*  4. プログラムを単純にするために、エラーチェックやエラー処理は行っていません。
*/
/* グローバル変数の宣言                 */
exec sql BEGIN DECLARE SECTION;
/* TPC-B スケーリング規則                 */
long tps        =        1;     /* TPS(1秒あたりのトランザクション)のスケーリング数: ここでは1 */
long nbranches  =        1;     /* 支店数           */
long ntellers   =       10;     /* 金銭出納係の人数 */
long naccounts  =   100000;     /* 口座数           */
long nhistory   =   864000;     /* 履歴レコード数   */
/* 作業記憶域                           */
long i,sqlcode, Bid, Tid, Aid, delta, Abalance;
exec sql END DECLARE SECTION;
void CreateDatabase();
long DoOne(long Bid, long Tid, long Aid, long delta);
#include
/*  メインプログラム    1-tpsデータベースを生成します。すなわち、1支店、10金銭出納係、・・・
*                      TPC-Bの1トランザクションを実行します。
*/
main()
{
    CreateDatabase();
    Abalance = DoOne(1,1,1,100);    /*  支店1の金銭出納係1の口座1に100を追加し、
                                        新しい預金残高を返します。  */
}
/*
* CreateDatabase - スケールされたデータベースを作成及び初期化する。 */
void CreateDatabase()
{
exec sql BEGIN WORK;        /* DDLのオプションをカバーするトランザクションの開始    */
/* start trans to cover DDL ops */
exec sql CREATE TABLE branches (
    Bid         NUMERIC(9), PRIMARY KEY(Bid),
    Bbalance    NUMERIC(10),
    filler      CHAR(88) DEFAULT SYSTEM
);      /* 100バイトまで詰める。 */
exec sql CREATE TABLE tellers (
    Tid         NUMERIC(9), PRIMARY KEY(Tid),
    Bid         NUMERIC(9) FOREIGN KEY REFERENCES branches,
    Tbalance    NUMERIC(10),
    filler      CHAR(84) DEFAULT SYSTEM
);      /* 100バイトまで詰める。 */
exec sql CREATE TABLE accounts (
    Aid         NUMERIC(9), PRIMARY KEY(Aid),
    Bid         NUMERIC(9) FOREIGN KEY REFERENCES branches,
    Abalance    NUMERIC(10),
    filler      CHAR(84) DEFAULT SYSTEM
);      /* 100バイトまで詰める。 */
exec sql CREATE TABLE history (
    Tid         NUMERIC(9) FOREIGN KEY REFERENCES tellers,
    Bid         NUMERIC(9) FOREIGN KEY REFERENCES branches,
    Aid         NUMERIC(9) FOREIGN KEY REFERENCES accounts,
    delta       NUMERIC(10),
    time        TIMESTAMP,
    filler      CHAR(22) DEFAULT SYSTEM
);      /* 50バイトまで詰める。 */
/*  主要なデータベースはTPC-Bスケーリング規則を使用します。
*  それぞれの支店と金銭出納係に注意してください。
*  branch_id = teller_id / ntellers
*  branch_id = account_id / naccounts
*/
for (i = 0; i < nbranches*tps; i++)
    exec sql INSERT INTO branches(Bid,Bbalance) VALUES (:i,0);
for (i = 0; i < ntellers*tps; i++)
    exec sql INSERT INTO tellers(Tid,Bid,Tbalance) VALUES (:i,:i/:ntellers,0);
for (i = 0; i < naccounts*tps; i++)
    exec sql INSERT INTO accounts(Aid,Bid,Abalance) VALUES (:i,:i/:naccounts,0);
exec sql COMMIT WORK;
}       /* CreateDatabase の終了 */
/*
*  DoOne - TPC-Bの1トランザクションを実行する。
*/
long DoOne(long Bid, long Tid, long Aid, long delta)
{
exec sql BEGIN WORK;
    exec sql UPDATE accounts
    SET Abalance = Abalance + :delta
    WHERE Aid = :Aid;
exec sql SELECT Abalance INTO :Abalance
    FROM accounts
    WHERE Aid = :Aid;
exec sql UPDATE tellers
    SET Tbalance = Tbalance + :delta
    WHERE Tid = :Tid;
exec sql UPDATE branches
    SET Bbalance = Bbalance + :delta
    WHERE Bid = :Bid;
exec sql INSERT INTO history(Tid, Bid, Aid, delta, time)
    VALUES (:Tid, :Bid, :Aid, :delta, CURRENT);
exec sql COMMIT WORK;
    return ( Abalance);
}   /* DoOne の終了 */