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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mysql_lang.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:21:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: mysql_lang.cpp,v 1000.2 2004/06/01 19:21:35 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:  Anton Butanayev
  35.  *
  36.  * This simple program illustrates how to use the language command
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <dbapi/driver/exception.hpp>
  41. #include <dbapi/driver/mysql/interfaces.hpp>
  42. #include <memory>
  43. USING_NCBI_SCOPE;
  44. int main(int argc, char **argv)
  45. {
  46.   if(argc != 5)
  47.   {
  48.     cerr << "Usage: " << argv[0] << " host database user_name passwd" << endl;
  49.     return 1;
  50.   }
  51.   try
  52.   {
  53.     CMySQLContext my_context;
  54.     auto_ptr<CDB_Connection> con(my_context.Connect(argv[1], argv[3], argv[4], 0));
  55.     // changing database
  56.     {
  57.       auto_ptr<CDB_LangCmd>
  58.         lcmd(con->LangCmd(string("use ") + argv[2]));
  59.       lcmd->Send();
  60.       cout << "Database changed" << endl;
  61.     }
  62.     // creating table
  63.     {
  64.       auto_ptr<CDB_LangCmd>
  65.         lcmd(con->LangCmd(
  66.                           "create temporary table tmp_t1("
  67.                           "a int,"
  68.                           "b datetime,"
  69.                           "c varchar(100),"
  70.                           "d text,"
  71.                           "e double,"
  72.                           "bl BLOB)"
  73.                          ));
  74.       lcmd->Send();
  75.       cout << "Table created" << endl;
  76.     }
  77.     int nBlobSize = 0xffff;
  78.     auto_ptr<char> buff( new char[nBlobSize]);
  79.     
  80.     // inserting data
  81.     {
  82.       char* p = buff.get();
  83.       for( int i = 0; i < nBlobSize; i++)
  84.         *(p++) = i;
  85.       auto_ptr<CDB_LangCmd>
  86.         lcmd(con->LangCmd(
  87.                           "insert into tmp_t1 values"
  88.                           "(1, '2002-11-25 12:45:59', 'Hello, world', 'SOME TEXT', 3.1415, '"
  89.                          ));
  90.       lcmd->More( reinterpret_cast<CMySQL_LangCmd*>(lcmd.get())->EscapeString( buff.get(), nBlobSize));
  91.       lcmd->More( "')");
  92.       lcmd->Send();
  93.       cout << "Data inserted " << lcmd->RowCount() << " row(s) affected" << endl;
  94.     }
  95.     // selecting data
  96.     {
  97.       auto_ptr<CDB_LangCmd> lcmd(con->LangCmd("select * from tmp_t1"));
  98.       lcmd->Send();
  99.       while (lcmd->HasMoreResults())
  100.       {
  101.         auto_ptr<CDB_Result> r(lcmd->Result());
  102.         while (r->Fetch())
  103.         {
  104.           CDB_Int a;
  105.           CDB_DateTime b;
  106.           CDB_VarChar c;
  107.           CDB_VarChar d;
  108.           CDB_Double e;
  109.           CDB_Image blob;
  110.           r->GetItem(&a);
  111.           r->GetItem(&b);
  112.           r->GetItem(&c);
  113.           r->GetItem(&d);
  114.           r->GetItem(&e);
  115.           r->GetItem(&blob);
  116.   auto_ptr<char> buff2( new char[blob.Size()]);
  117.   blob.Read( buff2.get(), blob.Size());
  118.           int correct = memcmp( buff2.get(), buff.get(), nBlobSize);
  119.           
  120.           cout
  121.             << "a=" << a.Value() << endl
  122.             << "b=" << b.Value().AsString() << endl
  123.             << "c=" << c.Value() << endl
  124.             << "d=" << d.Value() << endl
  125.             << "e=" << e.Value() << endl
  126.             << "blob size is " << nBlobSize << " blob data is " << (!correct ? "correct" : "not correct") << endl;
  127.         }
  128.       }
  129.     }
  130.     // selecting data as strings
  131.     {
  132.       auto_ptr<CDB_LangCmd> lcmd(con->LangCmd("select * from tmp_t1"));
  133.       lcmd->Send();
  134.       while (lcmd->HasMoreResults())
  135.       {
  136.         auto_ptr<CDB_Result> r(lcmd->Result());
  137.         for(unsigned i = 0; i < r->NofItems(); ++i)
  138.           cout << "[" << r->ItemName(i) << "]";
  139.         cout << endl;
  140.         while (r->Fetch())
  141.         {
  142.           for(unsigned i = 0; i < r->NofItems(); ++i)
  143.           {
  144.             CDB_VarChar field;
  145.             r->GetItem(&field);
  146.             if(! field.IsNULL())
  147.               cout << field.Value() << endl;
  148.             else
  149.               cout << "NULLn";
  150.           }
  151.         }
  152.       }
  153.     }
  154.   }
  155.   catch (CDB_Exception& e)
  156.   {
  157.     CDB_UserHandler_Stream myExHandler(&cerr);
  158.     myExHandler.HandleIt(&e);
  159.     return 1;
  160.   }
  161.   return 0;
  162. }
  163. /*
  164.  * ===========================================================================
  165.  * $Log: mysql_lang.cpp,v $
  166.  * Revision 1000.2  2004/06/01 19:21:35  gouriano
  167.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  168.  *
  169.  * Revision 1.8  2004/05/17 21:15:48  gorelenk
  170.  * Added include of PCH ncbi_pch.hpp
  171.  *
  172.  * Revision 1.7  2004/03/24 19:45:16  vysokolo
  173.  * Added blob support
  174.  *
  175.  * Revision 1.6  2003/05/29 21:25:47  butanaev
  176.  * Added function to return last insert id, fixed RowCount, Send,
  177.  * added call to RowCount in sample app.
  178.  *
  179.  * Revision 1.5  2003/02/19 16:16:13  ucko
  180.  * +<memory> for auto_ptr<>
  181.  *
  182.  * Revision 1.4  2002/08/29 15:41:44  butanaev
  183.  * Command line interface improved.
  184.  *
  185.  * Revision 1.3  2002/08/28 17:18:20  butanaev
  186.  * Improved error handling, demo app.
  187.  *
  188.  * Revision 1.2  2002/08/13 20:30:24  butanaev
  189.  * Username/password changed.
  190.  *
  191.  * Revision 1.1  2002/08/13 20:23:14  butanaev
  192.  * The beginning.
  193.  *
  194.  * ===========================================================================
  195.  */