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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: demo2.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:37:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: demo2.cpp,v 1000.1 2004/06/01 18:37:46 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: Demo2 application for NCBI Berkeley DB library (BDB).
  37.  *                   Application shows how to fetch a single known record from 
  38.  *                   the datafile. Also demonstrated how to delete records and handle
  39.  *                   record not found situations.
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <bdb/bdb_types.hpp>
  45. #include <bdb/bdb_file.hpp>
  46. #include <bdb/bdb_cursor.hpp>
  47. USING_NCBI_SCOPE;
  48. //////////////////////////////////////////////////////////////////
  49. // 
  50. // Structure implements database table record in "phone book" 
  51. // database table.
  52. //
  53. //
  54. struct SPhoneBookDB : public CBDB_File
  55. {
  56.     CBDB_FieldInt4      person_id;
  57.     CBDB_FieldString    first_name;
  58.     CBDB_FieldString    last_name;
  59.     CBDB_FieldInt4      zip_code;
  60.     CBDB_FieldString    phone;
  61.     // Constructor binds field variables.
  62.     SPhoneBookDB()
  63.     {
  64.         // Bind int primary key. Cannot be NULL.
  65.         BindKey("PersonId", &person_id);
  66.         //  Bind non-PK data fields
  67.         BindData("FirstName", &first_name, 64, eNotNullable);
  68.         BindData("LastName",  &last_name, 64, eNotNullable);
  69.         BindData("Zip",       &zip_code);  // NULLable by default
  70.         BindData("Phone",     &phone, 32); // NULLable by default
  71.     }
  72. };
  73. const char* s_PhoneBookDBFileName = "phone.db";
  74. void LoadPhoneBook()
  75. {
  76.     SPhoneBookDB  dbf;
  77.     dbf.Open(s_PhoneBookDBFileName, CBDB_File::eCreate);
  78.     
  79.     dbf.person_id = 1;
  80.     dbf.first_name = "John";
  81.     dbf.last_name = "Doe";
  82.     dbf.zip_code = 10785;
  83.     dbf.phone = "+1(240)123456";  
  84.     
  85.     EBDB_ErrCode ret = dbf.Insert();
  86.     // Check Insert result, it can be 'eBDB_KeyDup'
  87.     // if primary key already exists
  88.     if (ret != eBDB_Ok) {
  89.         cout << "Insert failed!" << endl;
  90.         exit(1);
  91.     }
  92.     
  93.     dbf.person_id = 2;
  94.     dbf.first_name = "Antony";
  95.     dbf.last_name = "Smith";
  96.     dbf.phone = "(240)234567";  
  97.     ret = dbf.Insert();
  98.     if (ret != eBDB_Ok) {
  99.         cout << "Insert failed!" << endl;
  100.         exit(1);
  101.     }
  102.     dbf.person_id = 3;
  103.     dbf.first_name = "John";
  104.     dbf.last_name = "Public";
  105.       
  106.     ret = dbf.Insert();
  107.     if (ret != eBDB_Ok) {
  108.         cout << "Insert failed!" << endl;
  109.         exit(1);
  110.     }
  111. }
  112. //
  113. // Delete record function. 
  114. // NOTE: When deleting record Berkeley DB does not free the space in the datafile.
  115. // File does not shrink in size. Empty block will be reused by the next insert.
  116. //
  117. void DeletePhoneBookRecord(SPhoneBookDB& dbf, int person_id)
  118. {
  119.     dbf.person_id = person_id;
  120.     dbf.Delete();
  121. }
  122. // Function prints the database record.
  123. void PrintRecord(const SPhoneBookDB& rec)
  124. {
  125.     cout << rec.person_id.GetName() << ": " << rec.person_id.Get() << endl;
  126.     cout << rec.first_name.GetName()<< ": ";
  127.     if (rec.first_name.IsNull()) {
  128.         cout << "NULL" << endl;
  129.     } else {
  130.         cout << (const char*) rec.first_name << endl;
  131.     }
  132.     cout << rec.last_name.GetName()<< ": ";
  133.     if (rec.last_name.IsNull()) {
  134.         cout << "NULL" << endl;
  135.     } else {
  136.         cout << (const char*) rec.last_name << endl;
  137.     }
  138.     cout << rec.zip_code.GetName()<< ": ";
  139.     if (rec.zip_code.IsNull()) {
  140.         cout << "NULL" << endl;
  141.     } else {
  142.         cout << (Int4) rec.zip_code << endl;
  143.     }
  144.     cout << rec.phone.GetName()<< ": ";
  145.     if (rec.phone.IsNull()) {
  146.         cout << "NULL" << endl;
  147.     } else {
  148.         cout << (const char*) rec.phone << endl;
  149.     }
  150. }
  151. //
  152. // Function seeks the requested datafile record and prints it.
  153. // In case of only one record to fetch we do not need to explicitly create
  154. // a cursor. Instead we can position datafile class on the requested record
  155. // using method "Fetch". If record cannot be found 'Fetch' returns eBDB_NotFound
  156. // return code.
  157. //
  158. void PrintPhoneBookRecord(SPhoneBookDB& dbf, int person_id)
  159. {
  160.     dbf.person_id = person_id;
  161.     EBDB_ErrCode ret = dbf.Fetch();
  162.     if (ret == eBDB_NotFound) {
  163.         cout << "Record " << person_id << " cannot be found." << endl;
  164.         return;
  165.     }
  166.     PrintRecord(dbf);
  167. }
  168. ////////////////////////////////
  169. // Demo2 application
  170. //
  171. class CBDB_PhoneBookDemo2 : public CNcbiApplication
  172. {
  173. public:
  174.     void Init(void);
  175.     int Run(void);
  176. };
  177. void CBDB_PhoneBookDemo2::Init(void)
  178. {
  179.     SetDiagPostLevel(eDiag_Warning);
  180.     SetDiagPostFlag(eDPF_File);
  181.     SetDiagPostFlag(eDPF_Line);
  182.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  183.     d->SetUsageContext("bdb demo2",
  184.                        "Demo2 application for BDB library");
  185.     SetupArgDescriptions(d.release());
  186. }
  187. int CBDB_PhoneBookDemo2::Run(void)
  188. {
  189.     try
  190.     {
  191.         LoadPhoneBook();
  192.         SPhoneBookDB  dbf;
  193.         dbf.Open(s_PhoneBookDBFileName, CBDB_File::eReadWrite);
  194.         PrintPhoneBookRecord(dbf, 3);
  195.         cout << "====================================" << endl;
  196.         cout << "Deleting record 3." << endl;
  197.         DeletePhoneBookRecord(dbf, 3);
  198.         PrintPhoneBookRecord(dbf, 3);
  199.     }
  200.     catch (CBDB_ErrnoException& ex)
  201.     {
  202.         cout << "Error! DBD errno exception:" << ex.what();
  203.         return 1;
  204.     }
  205.     catch (CBDB_LibException& ex)
  206.     {
  207.         cout << "Error! DBD library exception:" << ex.what();
  208.         return 1;
  209.     }
  210.     return 0;
  211. }
  212. int main(int argc, const char* argv[])
  213. {
  214.     return CBDB_PhoneBookDemo2().AppMain(argc, argv, 0, eDS_Default, 0);
  215. }
  216. /*
  217.  * ===========================================================================
  218.  * $Log: demo2.cpp,v $
  219.  * Revision 1000.1  2004/06/01 18:37:46  gouriano
  220.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  221.  *
  222.  * Revision 1.4  2004/05/17 20:55:18  gorelenk
  223.  * Added include of PCH ncbi_pch.hpp
  224.  *
  225.  * Revision 1.3  2003/05/02 16:23:13  kuznets
  226.  * Cosmetic fixes
  227.  *
  228.  * Revision 1.2  2003/04/30 15:59:51  kuznets
  229.  * Fixed typo
  230.  *
  231.  * Revision 1.1  2003/04/30 15:44:40  kuznets
  232.  * Initial revision
  233.  *
  234.  * ===========================================================================
  235.  */