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

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: BtRecExample.java,v 11.6 2000/02/19 20:58:02 bostic Exp $
  8.  */
  9. package com.sleepycat.examples;
  10. import com.sleepycat.db.*;
  11. import java.io.BufferedReader;
  12. import java.io.File;
  13. import java.io.FileNotFoundException;
  14. import java.io.FileReader;
  15. import java.io.FileWriter;
  16. import java.io.InputStreamReader;
  17. import java.io.IOException;
  18. import java.io.PrintStream;
  19. public class BtRecExample
  20. {
  21.     static final String progname =  "BtRecExample"; // Program name.
  22.     static final String database =  "access.db";
  23.     static final String wordlist =  "../test/wordlist";
  24.     BtRecExample(BufferedReader reader)
  25.         throws DbException, IOException, FileNotFoundException
  26.     {
  27.         int ret;
  28.         // Remove the previous database.
  29.         File f = new File(database);
  30.         f.delete();
  31.         dbp = new Db(null, 0);
  32.         dbp.set_error_stream(System.err);
  33.         dbp.set_errpfx(progname);
  34.         dbp.set_pagesize(1024); // 1K page sizes.
  35.         dbp.set_flags(Db.DB_RECNUM); // Record numbers.
  36.         dbp.open(database, null, Db.DB_BTREE, Db.DB_CREATE, 0664);
  37.         //
  38.         // Insert records into the database, where the key is the word
  39.         // preceded by its record number, and the data is the same, but
  40.         // in reverse order.
  41.         //
  42.         for (int cnt = 1; cnt <= 1000; ++cnt) {
  43.             String numstr = String.valueOf(cnt);
  44.             while (numstr.length() < 4)
  45.                 numstr = "0" + numstr;
  46.             String buf = numstr + '_' + reader.readLine();
  47.             StringBuffer rbuf = new StringBuffer(buf).reverse();
  48.             StringDbt key = new StringDbt(buf);
  49.             StringDbt data = new StringDbt(rbuf.toString());
  50.             if ((ret = dbp.put(null, key, data, Db.DB_NOOVERWRITE)) != 0) {
  51.                 if (ret != Db.DB_KEYEXIST)
  52.                     throw new DbException("Db.put failed" + ret);
  53.             }
  54.         }
  55.     }
  56.     void run()
  57.         throws DbException
  58.     {
  59.         int recno;
  60.         int ret;
  61.         // Acquire a cursor for the database.
  62.         dbcp = dbp.cursor(null, 0);
  63.         //
  64.         // Prompt the user for a record number, then retrieve and display
  65.         // that record.
  66.         //
  67.         InputStreamReader reader = new InputStreamReader(System.in);
  68.         for (;;) {
  69.             // Get a record number.
  70.             String line = askForLine(reader, System.out, "recno #> ");
  71.             if (line == null)
  72.                 break;
  73.             try {
  74.                 recno = Integer.parseInt(line);
  75.             }
  76.             catch (NumberFormatException nfe) {
  77.                 System.err.println("Bad record number: " + nfe);
  78.                 continue;
  79.             }
  80.             //
  81.             // Start with a fresh key each time, the dbp.get() routine returns
  82.             // the key and data pair, not just the key!
  83.             //
  84.             RecnoStringDbt key = new RecnoStringDbt(recno, 100);
  85.             RecnoStringDbt data = new RecnoStringDbt(100);
  86.             if ((ret = dbcp.get(key, data, Db.DB_SET_RECNO)) != 0) {
  87.                 throw new DbException("Dbc.get failed", ret);
  88.             }
  89.             // Display the key and data.
  90.             show("k/dt", key, data);
  91.             // Move the cursor a record forward.
  92.             if ((ret = dbcp.get(key, data, Db.DB_NEXT)) != 0) {
  93.                 throw new DbException("Dbc.get failed", ret);
  94.             }
  95.             // Display the key and data.
  96.             show("nextt", key, data);
  97.             RecnoStringDbt datano = new RecnoStringDbt(100);
  98.             //
  99.             // Retrieve the record number for the following record into
  100.             // local memory.
  101.             //
  102.             if ((ret = dbcp.get(key, datano, Db.DB_GET_RECNO)) != 0) {
  103.                 if (ret != Db.DB_NOTFOUND && ret != Db.DB_KEYEMPTY) {
  104.                     throw new DbException("Dbc.get failed", ret);
  105.                 }
  106.             }
  107.             else {
  108.                 recno = datano.getRecno();
  109.                 System.out.println("retrieved recno: " + recno);
  110.             }
  111.         }
  112.         dbcp.close();
  113.         dbcp = null;
  114.     }
  115.     //
  116.     // Print out the number of records in the database.
  117.     //
  118.     void stats()
  119.         throws DbException
  120.     {
  121.         DbBtreeStat statp;
  122.         statp = (DbBtreeStat)dbp.stat(0);
  123.         System.out.println(progname + ": database contains " +
  124.                           statp.bt_ndata + " records");
  125.     }
  126.     void show(String msg, RecnoStringDbt key, RecnoStringDbt data)
  127.         throws DbException
  128.     {
  129.         System.out.println(msg + key.getString() + ": " + data.getString());
  130.     }
  131.     public void shutdown()
  132.         throws DbException
  133.     {
  134.         if (dbcp != null) {
  135.             dbcp.close();
  136.             dbcp = null;
  137.         }
  138.         if (dbp != null) {
  139.             dbp.close(0);
  140.             dbp = null;
  141.         }
  142.     }
  143.     public static void main(String argv[])
  144.     {
  145.         try {
  146.             // Open the word database.
  147.             FileReader freader = new FileReader(wordlist);
  148.     BtRecExample app = new BtRecExample(new BufferedReader(freader));
  149.     // Close the word database.
  150.             freader.close();
  151.             freader = null;
  152.             app.stats();
  153.             app.run();
  154.         }
  155.         catch (FileNotFoundException fnfe) {
  156.             System.err.println(progname + ": unexpected open error " + fnfe);
  157.             System.exit (1);
  158.         }
  159.         catch (IOException ioe) {
  160.             System.err.println(progname + ": open " + wordlist + ": " + ioe);
  161.             System.exit (1);
  162.         }
  163. catch (DbException dbe) {
  164.     System.err.println("Exception: " + dbe);
  165.     System.exit(dbe.get_errno());
  166. }
  167. System.exit(0);
  168.     }
  169.     void
  170.     usage()
  171.     {
  172. System.err.println("usage: " + progname);
  173. System.exit(1);
  174.     }
  175.     // Prompts for a line, and keeps prompting until a non blank
  176.     // line is returned.  Returns null on error.
  177.     //
  178.     static public String askForLine(InputStreamReader reader,
  179.                                     PrintStream out, String prompt)
  180.     {
  181.         String result = "";
  182.         while (result != null && result.length() == 0) {
  183.             out.print(prompt);
  184.             out.flush();
  185.             result = getLine(reader);
  186.         }
  187.         return result;
  188.     }
  189.     // Not terribly efficient, but does the job.
  190.     // Works for reading a line from stdin or a file.
  191.     // Returns null on EOF.  If EOF appears in the middle
  192.     // of a line, returns that line, then null on next call.
  193.     //
  194.     static public String getLine(InputStreamReader reader)
  195.     {
  196.         StringBuffer b = new StringBuffer();
  197.         int c;
  198.         try {
  199.             while ((c = reader.read()) != -1 && c != 'n') {
  200.                 if (c != 'r')
  201.                     b.append((char)c);
  202.             }
  203.         }
  204.         catch (IOException ioe) {
  205.             c = -1;
  206.         }
  207.         if (c == -1 && b.length() == 0)
  208.             return null;
  209.         else
  210.             return b.toString();
  211.     }
  212.     private Dbc dbcp;
  213.     private Db dbp;
  214.     // Here's an example of how you can extend a Dbt in a straightforward
  215.     // way to allow easy storage/retrieval of strings.
  216.     // We've declared it as a static inner class, but it need not be.
  217.     //
  218.     static /*inner*/
  219.     class StringDbt extends Dbt
  220.     {
  221.         StringDbt(byte[] arr)
  222.         {
  223.             set_flags(Db.DB_DBT_USERMEM);
  224.             set_data(arr);
  225.             set_size(arr.length);
  226.         }
  227.         StringDbt()
  228.         {
  229.             set_flags(Db.DB_DBT_MALLOC); // tell Db to allocate on retrieval
  230.         }
  231.         StringDbt(String value)
  232.         {
  233.             setString(value);
  234.             set_flags(Db.DB_DBT_MALLOC); // tell Db to allocate on retrieval
  235.         }
  236.         void setString(String value)
  237.         {
  238.             set_data(value.getBytes());
  239.             set_size(value.length());
  240.             // must set ulen because sometimes a string is returned
  241.             set_ulen(value.length());
  242.         }
  243.         String getString()
  244.         {
  245.             return new String(get_data(), 0, get_size());
  246.         }
  247.     }
  248.     // Here's an example of how you can extend a Dbt to store
  249.     // (potentially) both recno's and strings in the same
  250.     // structure.
  251.     //
  252.     static /*inner*/
  253.     class RecnoStringDbt extends Dbt
  254.     {
  255.         RecnoStringDbt(int maxsize)
  256.         {
  257.             this(0, maxsize);     // let other constructor do most of the work
  258.         }
  259.         RecnoStringDbt(int value, int maxsize)
  260.         {
  261.             set_flags(Db.DB_DBT_USERMEM); // do not allocate on retrieval
  262.             arr = new byte[maxsize];
  263.             set_data(arr);                // use our local array for data
  264.             set_ulen(maxsize);           // size of return storage
  265.             setRecno(value);
  266.         }
  267.         RecnoStringDbt(String value, int maxsize)
  268.         {
  269.             set_flags(Db.DB_DBT_USERMEM); // do not allocate on retrieval
  270.             arr = new byte[maxsize];
  271.             set_data(arr);                // use our local array for data
  272.             set_ulen(maxsize);           // size of return storage
  273.             setString(value);
  274.         }
  275.         void setRecno(int value)
  276.         {
  277.             set_recno_key_data(value);
  278.             set_size(arr.length);
  279.         }
  280.         void setString(String value)
  281.         {
  282.             set_data(value.getBytes());
  283.             set_size(value.length());
  284.         }
  285.         int getRecno()
  286.         {
  287.             return get_recno_key_data();
  288.         }
  289.         String getString()
  290.         {
  291.             return new String(get_data(), 0, get_size());
  292.         }
  293.         byte arr[];
  294.     }
  295. }