TpcbExample.java
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:23k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: TpcbExample.java,v 11.9 2000/04/01 15:52:15 dda Exp $
  8.  */
  9. package com.sleepycat.examples;
  10. import com.sleepycat.db.*;
  11. import java.io.FileNotFoundException;
  12. import java.util.Calendar;
  13. import java.util.Date;
  14. import java.util.Random;
  15. import java.util.GregorianCalendar;
  16. import java.math.BigDecimal;
  17. //
  18. // This program implements a basic TPC/B driver program.  To create the
  19. // TPC/B database, run with the -i (init) flag.  The number of records
  20. // with which to populate the account, history, branch, and teller tables
  21. // is specified by the a, s, b, and t flags respectively.  To run a TPC/B
  22. // test, use the n flag to indicate a number of transactions to run (note
  23. // that you can run many of these processes in parallel to simulate a
  24. // multiuser test run).
  25. //
  26. class TpcbExample extends DbEnv
  27. {
  28.     public static final int TELLERS_PER_BRANCH = 10;
  29.     public static final int ACCOUNTS_PER_TELLER = 10000;
  30.     public static final int HISTORY_PER_BRANCH = 2592000;
  31.     //
  32.     // The default configuration that adheres to TPCB scaling rules requires
  33.     // nearly 3 GB of space.  To avoid requiring that much space for testing,
  34.     // we set the parameters much lower.  If you want to run a valid 10 TPS
  35.     // configuration, uncomment the VALID_SCALING configuration
  36.     //
  37.     // VALID_SCALING configuration
  38.     /*
  39.     public static final int ACCOUNTS = 1000000;
  40.     public static final int BRANCHES = 10;
  41.     public static final int TELLERS = 100;
  42.     public static final int HISTORY = 25920000;
  43.     */
  44.     // TINY configuration
  45.     /*
  46.     public static final int ACCOUNTS = 1000;
  47.     public static final int BRANCHES = 10;
  48.     public static final int TELLERS = 100;
  49.     public static final int HISTORY = 10000;
  50.     */
  51.     // Default configuration
  52.     public static final int ACCOUNTS = 100000;
  53.     public static final int BRANCHES = 10;
  54.     public static final int TELLERS = 100;
  55.     public static final int HISTORY = 259200;
  56.     public static final int HISTORY_LEN = 100;
  57.     public static final int RECLEN = 100;
  58.     public static final int BEGID = 1000000;
  59.     // used by random_id()
  60.     public static final int ACCOUNT = 0;
  61.     public static final int BRANCH = 1;
  62.     public static final int TELLER = 2;
  63.     private static boolean verbose = false;
  64.     private static final String progname = "TpcbExample";    // Program name.
  65.     public TpcbExample(String home, int cachesize,
  66.                        boolean initializing, int flags)
  67.         throws DbException, FileNotFoundException
  68.     {
  69.         super(0);
  70.         set_error_stream(System.err);
  71.         set_errpfx(progname);
  72.         set_cachesize(0, cachesize == 0 ? 4 * 1024 * 1024 : cachesize, 0);
  73. int local_flags = flags | Db.DB_CREATE;
  74.         if (initializing)
  75.             local_flags |= Db.DB_INIT_MPOOL;
  76.         else
  77.             local_flags |= Db.DB_INIT_TXN | Db.DB_INIT_LOCK |
  78.                            Db.DB_INIT_LOG | Db.DB_INIT_MPOOL;
  79.         open(home, local_flags, 0);        // may throw DbException
  80.     }
  81.     //
  82.     // Initialize the database to the specified number of accounts, branches,
  83.     // history records, and tellers.
  84.     //
  85.     // Note: num_h was unused in the original ex_tpcb.c example.
  86.     //
  87.     public void
  88.     populate(int num_a, int num_b, int num_h, int num_t)
  89.     {
  90.         Db dbp = null;
  91.         int err;
  92.         int balance, idnum;
  93.         int end_anum, end_bnum, end_tnum;
  94.         int start_anum, start_bnum, start_tnum;
  95.         int h_nelem;
  96.         idnum = BEGID;
  97.         balance = 500000;
  98.         h_nelem = num_a;
  99.         try {
  100.             dbp = new Db(this, 0);
  101.             dbp.set_h_nelem(h_nelem);
  102.             dbp.open("account", null,
  103.                      Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644);
  104.         }
  105.         // can be DbException or FileNotFoundException
  106.         catch (Exception e1) {
  107.             errExit(e1, "Open of account file failed");
  108.         }
  109.         start_anum = idnum;
  110.         populateTable(dbp, idnum, balance, h_nelem, "account");
  111.         idnum += h_nelem;
  112.         end_anum = idnum - 1;
  113.         try {
  114.             dbp.close(0);
  115.         }
  116.         catch (DbException e2) {
  117.             errExit(e2, "Account file close failed");
  118.         }
  119.         if (verbose)
  120.             System.out.println("Populated accounts: "
  121.                  + String.valueOf(start_anum) + " - " + String.valueOf(end_anum));
  122.         //
  123.         // Since the number of branches is very small, we want to use very
  124.         // small pages and only 1 key per page.  This is the poor-man's way
  125.         // of getting key locking instead of page locking.
  126.         //
  127.         h_nelem = (int)num_b;
  128.         try {
  129.             dbp = new Db(this, 0);
  130.             dbp.set_h_nelem(h_nelem);
  131.             dbp.set_h_ffactor(1);
  132.             dbp.set_pagesize(512);
  133.             dbp.open("branch", null,
  134.                      Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644);
  135.         }
  136.         // can be DbException or FileNotFoundException
  137.         catch (Exception e3) {
  138.             errExit(e3, "Branch file create failed");
  139.         }
  140.         start_bnum = idnum;
  141.         populateTable(dbp, idnum, balance, h_nelem, "branch");
  142.         idnum += h_nelem;
  143.         end_bnum = idnum - 1;
  144.         try {
  145.             dbp.close(0);
  146.         }
  147.         catch (DbException dbe4) {
  148.             errExit(dbe4, "Close of branch file failed");
  149.         }
  150.         if (verbose)
  151.             System.out.println("Populated branches: "
  152.                  + String.valueOf(start_bnum) + " - " + String.valueOf(end_bnum));
  153.         //
  154.         // In the case of tellers, we also want small pages, but we'll let
  155.         // the fill factor dynamically adjust itself.
  156.         //
  157.         h_nelem = (int)num_t;
  158.         try {
  159.             dbp = new Db(this, 0);
  160.             dbp.set_h_nelem(h_nelem);
  161.             dbp.set_h_ffactor(0);
  162.             dbp.set_pagesize(512);
  163.             dbp.open("teller", null,
  164.                      Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644);
  165.         }
  166.         // can be DbException or FileNotFoundException
  167.         catch (Exception e5) {
  168.             errExit(e5, "Teller file create failed");
  169.         }
  170.         start_tnum = idnum;
  171.         populateTable(dbp, idnum, balance, h_nelem, "teller");
  172.         idnum += h_nelem;
  173.         end_tnum = idnum - 1;
  174.         try {
  175.             dbp.close(0);
  176.         }
  177.         catch (DbException e6) {
  178.             errExit(e6, "Close of teller file failed");
  179.         }
  180.         if (verbose)
  181.             System.out.println("Populated tellers: "
  182.                  + String.valueOf(start_tnum) + " - " + String.valueOf(end_tnum));
  183.         try {
  184.             dbp = new Db(this, 0);
  185.             dbp.set_re_len(HISTORY_LEN);
  186.             dbp.open("history", null,
  187.                      Db.DB_RECNO, Db.DB_CREATE | Db.DB_TRUNCATE, 0644);
  188.         }
  189.         // can be DbException or FileNotFoundException
  190.         catch (Exception e7) {
  191.             errExit(e7, "Create of history file failed");
  192.         }
  193.         populateHistory(dbp, num_h, num_a, num_b, num_t);
  194.         try {
  195.             dbp.close(0);
  196.         }
  197.         catch (DbException e8) {
  198.             errExit(e8, "Close of history file failed");
  199.         }
  200.     }
  201.     public void
  202.     populateTable(Db dbp,
  203.                   int start_id, int balance,
  204.                   int nrecs, String msg)
  205.     {
  206.         Defrec drec = new Defrec();
  207.         Dbt kdbt = new Dbt(drec.data);
  208.         kdbt.set_size(4);                  // sizeof(int)
  209.         Dbt ddbt = new Dbt(drec.data);
  210.         ddbt.set_size(drec.data.length);   // uses whole array
  211.         try {
  212.             for (int i = 0; i < nrecs; i++) {
  213.                 kdbt.set_recno_key_data(start_id + (int)i);
  214.                 drec.set_balance(balance);
  215.                 dbp.put(null, kdbt, ddbt, Db.DB_NOOVERWRITE);
  216.             }
  217.         }
  218.         catch (DbException dbe) {
  219.             System.err.println("Failure initializing " + msg + " file: " +
  220.                                dbe.toString());
  221.             System.exit(1);
  222.         }
  223.     }
  224.     public void
  225.     populateHistory(Db dbp, int nrecs,
  226.                                  int anum, int bnum, int tnum)
  227.     {
  228.         Histrec hrec = new Histrec();
  229.         hrec.set_amount(10);
  230.         byte arr[] = new byte[4];                  // sizeof(int)
  231.         int i;
  232.         Dbt kdbt = new Dbt(arr);
  233.         kdbt.set_size(arr.length);
  234.         Dbt ddbt = new Dbt(hrec.data);
  235.         ddbt.set_size(hrec.data.length);
  236.         try {
  237.             for (i = 1; i <= nrecs; i++) {
  238.                 kdbt.set_recno_key_data(i);
  239.                 hrec.set_aid(random_id(ACCOUNT, anum, bnum, tnum));
  240.                 hrec.set_bid(random_id(BRANCH, anum, bnum, tnum));
  241.                 hrec.set_tid(random_id(TELLER, anum, bnum, tnum));
  242.                 dbp.put(null, kdbt, ddbt, Db.DB_APPEND);
  243.             }
  244.         }
  245.         catch (DbException dbe) {
  246.             errExit(dbe, "Failure initializing history file");
  247.         }
  248.     }
  249.     static Random rand = new Random();
  250.     public static int
  251.     random_int(int lo, int hi)
  252.     {
  253.         int ret;
  254.         int t;
  255.         t = rand.nextInt();
  256.         if (t < 0)
  257.             t = -t;
  258.         ret = (int)(((double)t / ((double)(Integer.MAX_VALUE) + 1)) *
  259.                           (hi - lo + 1));
  260.         ret += lo;
  261.         return (ret);
  262.     }
  263.     public static int
  264.     random_id(int type, int accounts, int branches, int tellers)
  265.     {
  266.         int min, max, num;
  267.         max = min = BEGID;
  268.         num = accounts;
  269.         switch(type) {
  270.         case TELLER:
  271.             min += branches;
  272.             num = tellers;
  273.             // Fallthrough
  274.         case BRANCH:
  275.             if (type == BRANCH)
  276.                 num = branches;
  277.             min += accounts;
  278.             // Fallthrough
  279.         case ACCOUNT:
  280.             max = min + num - 1;
  281.         }
  282.         return (random_int(min, max));
  283.     }
  284.     public void
  285.     run(int n, int accounts, int branches, int tellers)
  286.     {
  287.         Db adb = null;
  288.         Db bdb = null;
  289.         Db hdb = null;
  290.         Db tdb = null;
  291.         double gtps, itps;
  292.         int failed, ifailed, ret, txns;
  293.         long starttime, curtime, lasttime;
  294.         //
  295.         // Open the database files.
  296.         //
  297.         int err;
  298.         try {
  299.             adb = new Db(this, 0);
  300.             adb.open("account", null, Db.DB_UNKNOWN, 0, 0);
  301.             bdb = new Db(this, 0);
  302.             bdb.open("branch", null, Db.DB_UNKNOWN, 0, 0);
  303.             tdb = new Db(this, 0);
  304.             tdb.open("teller", null, Db.DB_UNKNOWN, 0, 0);
  305.             hdb = new Db(this, 0);
  306.             hdb.open("history", null, Db.DB_UNKNOWN, 0, 0);
  307.         }
  308.         catch (DbException dbe) {
  309.             errExit(dbe, "Open of db files failed");
  310.         }
  311.         catch (FileNotFoundException fnfe) {
  312.             errExit(fnfe, "Open of db files failed, missing file");
  313.         }
  314.         txns = failed = ifailed = 0;
  315.         starttime = (new Date()).getTime();
  316.         lasttime = starttime;
  317.         while (n-- > 0) {
  318.             txns++;
  319.             ret = txn(adb, bdb, tdb, hdb, accounts, branches, tellers);
  320.             if (ret != 0) {
  321.                 failed++;
  322.                 ifailed++;
  323.             }
  324.             if (n % 5000 == 0) {
  325.                 curtime = (new Date()).getTime();
  326.                 gtps = (double)(txns - failed) /
  327.     ((curtime - starttime) / 1000.0);
  328.                 itps = (double)(5000 - ifailed) /
  329.     ((curtime - lasttime) / 1000.0);
  330.                 System.out.print(String.valueOf(txns) + " txns " +
  331.                                  String.valueOf(failed) + " failed ");
  332.                 System.out.println(showRounded(gtps, 2) + " TPS (gross) " +
  333.                                    showRounded(itps, 2) + " TPS (interval)");
  334.                 lasttime = curtime;
  335.                 ifailed = 0;
  336.             }
  337.         }
  338.         try {
  339.             adb.close(0);
  340.             bdb.close(0);
  341.             tdb.close(0);
  342.             hdb.close(0);
  343.         }
  344.         catch (DbException dbe2) {
  345.             errExit(dbe2, "Close of db files failed");
  346.         }
  347.         System.out.println((long)txns + " transactions begun "
  348.              + String.valueOf(failed) + " failed");
  349.     }
  350.     //
  351.     // XXX Figure out the appropriate way to pick out IDs.
  352.     //
  353.     public int
  354.     txn(Db adb, Db bdb, Db tdb, Db hdb,
  355.         int anum, int bnum, int tnum)
  356.     {
  357.         Dbc acurs = null;
  358.         Dbc bcurs = null;
  359.         Dbc hcurs = null;
  360.         Dbc tcurs = null;
  361.         DbTxn t = null;
  362.         Defrec rec = new Defrec();
  363.         Histrec hrec = new Histrec();
  364.         int account, branch, teller;
  365.         Dbt d_dbt = new Dbt();
  366.         Dbt d_histdbt = new Dbt();
  367.         Dbt k_dbt = new Dbt();
  368.         Dbt k_histdbt = new Dbt();
  369.         account = random_id(ACCOUNT, anum, bnum, tnum);
  370.         branch = random_id(BRANCH, anum, bnum, tnum);
  371.         teller = random_id(TELLER, anum, bnum, tnum);
  372.         // The history key will not actually be retrieved,
  373.         // but it does need to be set to something.
  374.         byte hist_key[] = new byte[4];
  375. k_histdbt.set_data(hist_key);
  376. k_histdbt.set_size(4 /* == sizeof(int)*/);
  377.         byte key_bytes[] = new byte[4];
  378.         k_dbt.set_data(key_bytes);
  379.         k_dbt.set_size(4 /* == sizeof(int)*/);
  380.         d_dbt.set_flags(Db.DB_DBT_USERMEM);
  381.         d_dbt.set_data(rec.data);
  382.         d_dbt.set_ulen(rec.length());
  383.         hrec.set_aid(account);
  384.         hrec.set_bid(branch);
  385.         hrec.set_tid(teller);
  386.         hrec.set_amount(10);
  387.         // Request 0 bytes since we're just positioning.
  388.         d_histdbt.set_flags(Db.DB_DBT_PARTIAL);
  389.         // START TIMING
  390.         try {
  391.             t = txn_begin(null, 0);
  392.             acurs = adb.cursor(t, 0);
  393.             bcurs = bdb.cursor(t, 0);
  394.             tcurs = tdb.cursor(t, 0);
  395.             hcurs = hdb.cursor(t, 0);
  396.             // Account record
  397.             k_dbt.set_recno_key_data(account);
  398.             if (acurs.get(k_dbt, d_dbt, Db.DB_SET) != 0)
  399.                 throw new TpcbException("acurs get failed");
  400.             rec.set_balance(rec.get_balance() + 10);
  401.             acurs.put(k_dbt, d_dbt, Db.DB_CURRENT);
  402.             // Branch record
  403.             k_dbt.set_recno_key_data(branch);
  404.             if (bcurs.get(k_dbt, d_dbt, Db.DB_SET) != 0)
  405.                 throw new TpcbException("bcurs get failed");
  406.             rec.set_balance(rec.get_balance() + 10);
  407.             bcurs.put(k_dbt, d_dbt, Db.DB_CURRENT);
  408.             // Teller record
  409.             k_dbt.set_recno_key_data(teller);
  410.             if (tcurs.get(k_dbt, d_dbt, Db.DB_SET) != 0)
  411.                 throw new TpcbException("ccurs get failed");
  412.             rec.set_balance(rec.get_balance() + 10);
  413.             tcurs.put(k_dbt, d_dbt, Db.DB_CURRENT);
  414.             // History record
  415.             d_histdbt.set_flags(0);
  416.             d_histdbt.set_data(hrec.data);
  417.             d_histdbt.set_ulen(hrec.length());
  418.             if (hdb.put(t, k_histdbt, d_histdbt, Db.DB_APPEND) != 0)
  419. throw(new DbException("put failed"));
  420.             acurs.close();
  421.             bcurs.close();
  422.             tcurs.close();
  423.             hcurs.close();
  424.             t.commit(0);
  425.             // END TIMING
  426.             return (0);
  427.         }
  428.         catch (Exception e) {
  429.             try {
  430.                 if (acurs != null)
  431.                     acurs.close();
  432.                 if (bcurs != null)
  433.                     bcurs.close();
  434.                 if (tcurs != null)
  435.                     tcurs.close();
  436.                 if (hcurs != null)
  437.                     hcurs.close();
  438.                 if (t != null)
  439.                     t.abort();
  440.             }
  441.             catch (DbException dbe) {
  442.                 // not much we can do here.
  443.             }
  444.             if (verbose) {
  445.                 System.out.println("Transaction A=" + String.valueOf(account)
  446.                                    + " B=" + String.valueOf(branch)
  447.                                    + " T=" + String.valueOf(teller) + " failed");
  448.                 System.out.println("Reason: " + e.toString());
  449.             }
  450.             return (-1);
  451.         }
  452.     }
  453.     static void errExit(Exception err, String s)
  454.     {
  455.         System.err.print(progname + ": ");
  456.         if (s != null) {
  457.             System.err.print(s + ": ");
  458.         }
  459.         System.err.println(err.toString());
  460.         System.exit(1);
  461.     }
  462.     public static void main(String argv[])
  463.     {
  464.         long seed;
  465.         int accounts, branches, tellers, history;
  466.         boolean iflag, txn_no_sync;
  467.         int mpool, ntxns;
  468.         String home, endarg;
  469.         home = "TESTDIR";
  470.         accounts = branches = history = tellers = 0;
  471.         txn_no_sync = false;
  472.         mpool = ntxns = 0;
  473.         verbose = false;
  474.         iflag = false;
  475.         seed = (new GregorianCalendar()).get(Calendar.SECOND);
  476.         for (int i = 0; i < argv.length; ++i)
  477.         {
  478.             if (argv[i].equals("-a")) {
  479.                 // Number of account records
  480.                 if ((accounts = Integer.parseInt(argv[++i])) <= 0)
  481.                     invarg(argv[i]);
  482.             }
  483.             else if (argv[i].equals("-b")) {
  484.                 // Number of branch records
  485.                 if ((branches = Integer.parseInt(argv[++i])) <= 0)
  486.                     invarg(argv[i]);
  487.             }
  488.             else if (argv[i].equals("-c")) {
  489.                 // Cachesize in bytes
  490.                 if ((mpool = Integer.parseInt(argv[++i])) <= 0)
  491.                     invarg(argv[i]);
  492.             }
  493.             else if (argv[i].equals("-f")) {
  494.                 // Fast mode: no txn sync.
  495.                 txn_no_sync = true;
  496.             }
  497.             else if (argv[i].equals("-h")) {
  498.                 // DB  home.
  499.                 home = argv[++i];
  500.             }
  501.             else if (argv[i].equals("-i")) {
  502.                 // Initialize the test.
  503.                 iflag = true;
  504.             }
  505.             else if (argv[i].equals("-n")) {
  506.                 // Number of transactions
  507.                 if ((ntxns = Integer.parseInt(argv[++i])) <= 0)
  508.                     invarg(argv[i]);
  509.             }
  510.             else if (argv[i].equals("-S")) {
  511.                 // Random number seed.
  512.                 seed = Long.parseLong(argv[++i]);
  513.                 if (seed <= 0)
  514.                     invarg(argv[i]);
  515.             }
  516.             else if (argv[i].equals("-s")) {
  517.                 // Number of history records
  518.                 if ((history = Integer.parseInt(argv[++i])) <= 0)
  519.                     invarg(argv[i]);
  520.             }
  521.             else if (argv[i].equals("-t")) {
  522.                 // Number of teller records
  523.                 if ((tellers = Integer.parseInt(argv[++i])) <= 0)
  524.                     invarg(argv[i]);
  525.             }
  526.             else if (argv[i].equals("-v")) {
  527.                 // Verbose option.
  528.                 verbose = true;
  529.             }
  530.             else
  531.             {
  532.                 usage();
  533.             }
  534.         }
  535.         rand.setSeed((int)seed);
  536.         TpcbExample app = null;
  537.         // Initialize the database environment.
  538.         // Must be done in within a try block.
  539.         //
  540.         try {
  541.             app = new TpcbExample(home, mpool, iflag,
  542.                                   txn_no_sync ? Db.DB_TXN_NOSYNC : 0);
  543.         }
  544.         catch (Exception e1) {
  545.             errExit(e1, "initializing environment failed");
  546.         }
  547.         accounts = accounts == 0 ? ACCOUNTS : accounts;
  548.         branches = branches == 0 ? BRANCHES : branches;
  549.         tellers = tellers == 0 ? TELLERS : tellers;
  550.         history = history == 0 ? HISTORY : history;
  551.         if (verbose)
  552.             System.out.println((long)accounts + " Accounts "
  553.                  + String.valueOf(branches) + " Branches "
  554.                  + String.valueOf(tellers) + " Tellers "
  555.                  + String.valueOf(history) + " History");
  556.         if (iflag) {
  557.             if (ntxns != 0)
  558.                 usage();
  559.             app.populate(accounts, branches, history, tellers);
  560.         }
  561.         else {
  562.             if (ntxns == 0)
  563.                 usage();
  564.             app.run(ntxns, accounts, branches, tellers);
  565.         }
  566.         // Shut down the application.
  567.         try {
  568.             app.close(0);
  569.         }
  570.         catch (DbException dbe2) {
  571.             errExit(dbe2, "appexit failed");
  572.         }
  573.         System.exit(0);
  574.     }
  575.     private static void invarg(String str)
  576.     {
  577.         System.err.println("TpcbExample: invalid argument: " + str);
  578.         System.exit(1);
  579.     }
  580.     private static void usage()
  581.     {
  582.         System.err.println(
  583.            "usage: TpcbExample [-fiv] [-a accounts] [-b branches]n" +
  584.            "                   [-c cachesize] [-h home] [-n transactions ]n" +
  585.            "                   [-S seed] [-s history] [-t tellers]");
  586.         System.exit(1);
  587.     }
  588.     // round 'd' to 'scale' digits, and return result as string
  589.     private String showRounded(double d, int scale)
  590.     {
  591.         return new BigDecimal(d).
  592.             setScale(scale, BigDecimal.ROUND_HALF_DOWN).toString();
  593.     }
  594.     // The byte order is our choice.
  595.     //
  596.     static long get_int_in_array(byte[] array, int offset)
  597.     {
  598.         return
  599.             ((0xff & array[offset+0]) << 0)  |
  600.             ((0xff & array[offset+1]) << 8)  |
  601.             ((0xff & array[offset+2]) << 16) |
  602.             ((0xff & array[offset+3]) << 24);
  603.     }
  604.     // Note: Value needs to be long to avoid sign extension
  605.     static void set_int_in_array(byte[] array, int offset, long value)
  606.     {
  607.         array[offset+0] = (byte)((value >> 0) & 0x0ff);
  608.         array[offset+1] = (byte)((value >> 8) & 0x0ff);
  609.         array[offset+2] = (byte)((value >> 16) & 0x0ff);
  610.         array[offset+3] = (byte)((value >> 24) & 0x0ff);
  611.     }
  612. };
  613. // Simulate the following C struct:
  614. // struct Defrec {
  615. //     u_int32_t   id;
  616. //     u_int32_t   balance;
  617. //     u_int8_t    pad[RECLEN - sizeof(int) - sizeof(int)];
  618. // };
  619. class Defrec
  620. {
  621.     public Defrec()
  622.     {
  623.         data = new byte[TpcbExample.RECLEN];
  624.     }
  625.     public int length()
  626.     {
  627.         return TpcbExample.RECLEN;
  628.     }
  629.     public long get_id()
  630.     {
  631.         return TpcbExample.get_int_in_array(data, 0);
  632.     }
  633.     public void set_id(long value)
  634.     {
  635.         TpcbExample.set_int_in_array(data, 0, value);
  636.     }
  637.     public long get_balance()
  638.     {
  639.         return TpcbExample.get_int_in_array(data, 4);
  640.     }
  641.     public void set_balance(long value)
  642.     {
  643.         TpcbExample.set_int_in_array(data, 4, value);
  644.     }
  645.     static {
  646.         Defrec d = new Defrec();
  647.         d.set_balance(500000);
  648.     }
  649.     public byte[] data;
  650. }
  651. // Simulate the following C struct:
  652. // struct Histrec {
  653. //     u_int32_t   aid;
  654. //     u_int32_t   bid;
  655. //     u_int32_t   tid;
  656. //     u_int32_t   amount;
  657. //     u_int8_t    pad[RECLEN - 4 * sizeof(u_int32_t)];
  658. // };
  659. class Histrec
  660. {
  661.     public Histrec()
  662.     {
  663.         data = new byte[TpcbExample.RECLEN];
  664.     }
  665.     public int length()
  666.     {
  667.         return TpcbExample.RECLEN;
  668.     }
  669.     public long get_aid()
  670.     {
  671.         return TpcbExample.get_int_in_array(data, 0);
  672.     }
  673.     public void set_aid(long value)
  674.     {
  675.         TpcbExample.set_int_in_array(data, 0, value);
  676.     }
  677.     public long get_bid()
  678.     {
  679.         return TpcbExample.get_int_in_array(data, 4);
  680.     }
  681.     public void set_bid(long value)
  682.     {
  683.         TpcbExample.set_int_in_array(data, 4, value);
  684.     }
  685.     public long get_tid()
  686.     {
  687.         return TpcbExample.get_int_in_array(data, 8);
  688.     }
  689.     public void set_tid(long value)
  690.     {
  691.         TpcbExample.set_int_in_array(data, 8, value);
  692.     }
  693.     public long get_amount()
  694.     {
  695.         return TpcbExample.get_int_in_array(data, 12);
  696.     }
  697.     public void set_amount(long value)
  698.     {
  699.         TpcbExample.set_int_in_array(data, 12, value);
  700.     }
  701.     public byte[] data;
  702. }
  703. class TpcbException extends Exception
  704. {
  705.     TpcbException()
  706.     {
  707.         super();
  708.     }
  709.     TpcbException(String s)
  710.     {
  711.         super(s);
  712.     }
  713. }