demo1.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: demo1.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:37:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: demo1.cpp,v 1000.1 2004/06/01 18:37:43 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Anatoliy Kuznetsov
  35.  *
  36.  * File Description: Demo1 application for NCBI Berkeley DB library (BDB)
  37.  *                   Application shows how to create Berkeley DB data file,
  38.  *                   load data and retrive the information using full scan 
  39.  *                   cursor fetch.
  40.  *
  41.  */
  42. #include <ncbi_pch.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <corelib/ncbiargs.hpp>
  45. #include <bdb/bdb_types.hpp>
  46. #include <bdb/bdb_file.hpp>
  47. #include <bdb/bdb_cursor.hpp>
  48. USING_NCBI_SCOPE;
  49. //////////////////////////////////////////////////////////////////
  50. // 
  51. // Structure implements database table record in "phone book" 
  52. // database table.
  53. //
  54. //
  55. struct SPhoneBookDB : public CBDB_File
  56. {
  57.     CBDB_FieldInt4      person_id;
  58.     CBDB_FieldString    first_name;
  59.     CBDB_FieldString    last_name;
  60.     CBDB_FieldInt4      zip_code;
  61.     CBDB_FieldString    phone;
  62.     // Constructor binds field variables.
  63.     SPhoneBookDB()
  64.     {
  65.         // Bind int primary key. Cannot be NULL.
  66.         BindKey("PersonId", &person_id);
  67.         //  Bind non-PK data fields
  68.         BindData("FirstName", &first_name, 64, eNotNullable);
  69.         BindData("LastName",  &last_name, 64, eNotNullable);
  70.         BindData("Zip",       &zip_code);  // NULLable by default
  71.         BindData("Phone",     &phone, 32); // NULLable by default
  72.     }
  73. };
  74. const char* s_PhoneBookDBFileName = "phone.db";
  75. void LoadPhoneBook()
  76. {
  77.     SPhoneBookDB  dbf;
  78.     dbf.Open(s_PhoneBookDBFileName, CBDB_File::eCreate);
  79.     
  80.     dbf.person_id = 1;
  81.     dbf.first_name = "John";
  82.     dbf.last_name = "Doe";
  83.     dbf.zip_code = 10785;
  84.     dbf.phone = "+1(240)123456";  
  85.     
  86.     EBDB_ErrCode ret = dbf.Insert();
  87.     // Check Insert result, it can be 'eBDB_KeyDup'
  88.     // if primary key already exists
  89.     if (ret != eBDB_Ok) {
  90.         cout << "Insert failed!" << endl;
  91.         exit(1);
  92.     }
  93.     
  94.     dbf.person_id = 2;
  95.     dbf.first_name = "Antony";
  96.     dbf.last_name = "Smith";
  97.     dbf.phone = "(240)234567";  
  98.     ret = dbf.Insert();
  99.     if (ret != eBDB_Ok) {
  100.         cout << "Insert failed!" << endl;
  101.         exit(1);
  102.     }
  103.     dbf.person_id = 3;
  104.     dbf.first_name = "John";
  105.     dbf.last_name = "Public";
  106.       
  107.     ret = dbf.Insert();
  108.     if (ret != eBDB_Ok) {
  109.         cout << "Insert failed!" << endl;
  110.         exit(1);
  111.     }
  112. }
  113. // Function prints the database record.
  114. void PrintRecord(const SPhoneBookDB& rec)
  115. {
  116.     cout << rec.person_id.GetName() << ": " << rec.person_id.Get() << endl;
  117.     cout << rec.first_name.GetName()<< ": ";
  118.     if (rec.first_name.IsNull()) {
  119.         cout << "NULL" << endl;
  120.     } else {
  121.         cout << (const char*) rec.first_name << endl;
  122.     }
  123.     cout << rec.last_name.GetName()<< ": ";
  124.     if (rec.last_name.IsNull()) {
  125.         cout << "NULL" << endl;
  126.     } else {
  127.         cout << (const char*) rec.last_name << endl;
  128.     }
  129.     cout << rec.zip_code.GetName()<< ": ";
  130.     if (rec.zip_code.IsNull()) {
  131.         cout << "NULL" << endl;
  132.     } else {
  133.         cout << (Int4) rec.zip_code << endl;
  134.     }
  135.     cout << rec.phone.GetName()<< ": ";
  136.     if (rec.phone.IsNull()) {
  137.         cout << "NULL" << endl;
  138.     } else {
  139.         cout << (const char*) rec.phone << endl;
  140.     }
  141. }
  142. //
  143. // Function scans all records in the phone book table.
  144. // One of the features of the BDB library is that cursor is attached
  145. // to the main open datafile instance and when we call fetch data become
  146. // immediately available in the datafile structure fields.
  147. // Cursor only defines search criteria.
  148. //
  149. void PrintPhoneBook()
  150. {
  151.     SPhoneBookDB  dbf;
  152.     dbf.Open(s_PhoneBookDBFileName, CBDB_File::eReadOnly);
  153.     CBDB_FileCursor cur(dbf);
  154.     cur.SetCondition(CBDB_FileCursor::eFirst);
  155.     unsigned int recs_fetched = 0;
  156.     while (cur.Fetch() == eBDB_Ok) {
  157.         cout << "====================================" << endl;
  158.         PrintRecord(dbf);
  159.         ++recs_fetched;
  160.     }
  161.     cout << "====================================" << endl;
  162.     cout << "Records found:" << recs_fetched << endl;
  163. }
  164. ////////////////////////////////
  165. // Demo1 application
  166. //
  167. class CBDB_PhoneBookDemo1 : public CNcbiApplication
  168. {
  169. public:
  170.     void Init(void);
  171.     int Run(void);
  172. };
  173. void CBDB_PhoneBookDemo1::Init(void)
  174. {
  175.     SetDiagPostLevel(eDiag_Warning);
  176.     SetDiagPostFlag(eDPF_File);
  177.     SetDiagPostFlag(eDPF_Line);
  178.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  179.     d->SetUsageContext("bdb demo1",
  180.                        "Demo1 application for BDB library");
  181.     SetupArgDescriptions(d.release());
  182. }
  183. int CBDB_PhoneBookDemo1::Run(void)
  184. {
  185.     try
  186.     {
  187.         LoadPhoneBook();
  188.         PrintPhoneBook();
  189.     }
  190.     catch (CBDB_ErrnoException& ex)
  191.     {
  192.         cout << "Error! DBD errno exception:" << ex.what();
  193.         return 1;
  194.     }
  195.     catch (CBDB_LibException& ex)
  196.     {
  197.         cout << "Error! DBD library exception:" << ex.what();
  198.         return 1;
  199.     }
  200.     return 0;
  201. }
  202. int main(int argc, const char* argv[])
  203. {
  204.     return CBDB_PhoneBookDemo1().AppMain(argc, argv, 0, eDS_Default, 0);
  205. }
  206. /*
  207.  * ===========================================================================
  208.  * $Log: demo1.cpp,v $
  209.  * Revision 1000.1  2004/06/01 18:37:43  gouriano
  210.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  211.  *
  212.  * Revision 1.2  2004/05/17 20:55:18  gorelenk
  213.  * Added include of PCH ncbi_pch.hpp
  214.  *
  215.  * Revision 1.1  2003/04/30 14:58:11  kuznets
  216.  * Initial release
  217.  *
  218.  * ===========================================================================
  219.  */