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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi_cursor_util.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:21  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbapi_cursor_util.cpp,v 1000.1 2004/06/01 19:22:21 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. * File Name:  $Id: dbapi_cursor_util.cpp,v 1000.1 2004/06/01 19:22:21 gouriano Exp $
  35. *
  36. * File Description: Implementation of dbapi bcp
  37. * $Log: dbapi_cursor_util.cpp,v $
  38. * Revision 1000.1  2004/06/01 19:22:21  gouriano
  39. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  40. *
  41. * Revision 1.6  2004/05/17 21:17:16  gorelenk
  42. * Added include of PCH ncbi_pch.hpp
  43. *
  44. * Revision 1.5  2003/02/27 20:21:35  starchen
  45. * correct a lang call
  46. *
  47. * Revision 1.4  2002/12/09 16:25:21  starchen
  48. * remove the text files from samples
  49. *
  50. * Revision 1.3  2002/09/04 22:20:40  vakatov
  51. * Get rid of comp.warnings
  52. *
  53. * Revision 1.2  2002/07/18 19:51:04  starchen
  54. * fixed some error
  55. *
  56. * Revision 1.1  2002/07/18 15:47:42  starchen
  57. * first entry
  58. *
  59. * Revision 1.1  2002/07/18 15:18:02  starchen
  60. * first entry
  61. *
  62. *
  63. *============================================================================
  64. */
  65. #include <ncbi_pch.hpp>
  66. #include "dbapi_cursor.hpp"
  67. const char*  file_name[] = {
  68.     "../test1.txt",
  69.     "../test2.txt",
  70.     "../test3.txt",
  71.     "../test4.txt",
  72.     "../test5.txt",
  73.     ""
  74. };
  75.  const char* prnType(EDB_Type t)
  76. {
  77.     switch(t) {
  78.     case eDB_Int: return "Int4";
  79.     case eDB_SmallInt: return "Int2";
  80.     case eDB_TinyInt:  return "Uint1";
  81.     case eDB_BigInt:   return "Int8";
  82.     case eDB_VarChar : return "VarChar";
  83.     case eDB_Char:     return "Char";
  84.     case eDB_VarBinary: return "VarBinary";
  85.     case eDB_Binary :   return "Binary";
  86.     case eDB_Float : return "Float";
  87.     case eDB_Double: return "Double";
  88.     case eDB_DateTime : return "DateTime";
  89.     case eDB_SmallDateTime : return "SmallDateTime";
  90.     case eDB_Text : return "Text";
  91.     case eDB_Image : return "Image";
  92.     case eDB_Bit : return "Bit";
  93.     case eDB_Numeric : return "Numeric";
  94.     default: return "Unsupported";
  95.     }
  96. }
  97.  const char* prnSeverity(EDB_Severity s) 
  98. {
  99.     switch(s) {
  100.     case eDB_Info:    return "Info";
  101.     case eDB_Warning: return "Warning";
  102.     case eDB_Error:   return "Error";
  103.     case eDB_Fatal:   return "Fatal Error";
  104.     default:          return "Unknown severity";
  105.     }
  106. }
  107.  void prnDSEx(CDB_DSEx* ex)
  108. {
  109.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: Err.code=" << ex->ErrCode() <<
  110. " Data source: " << ex->OriginatedFrom() << " t| <" << ex->Message() << ">" << endl;
  111. }
  112. static void prnRPCEx(CDB_RPCEx* ex)
  113. {
  114.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: Err code=" << ex->ErrCode() <<
  115. " SQL/Open server: " << ex->OriginatedFrom() << " Procedure: " << ex->ProcName() << " Line: " << ex->ProcLine() <<
  116. " t| <" << ex->Message() << ">" << endl;
  117. }
  118. static void prnSQLEx(CDB_SQLEx* ex)
  119. {
  120.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: Err code=" << ex->ErrCode() <<
  121. " SQL server: " << ex->OriginatedFrom() << " SQL: " << ex->SqlState() << " Line: " << ex->BatchLine() <<
  122. " t| <" << ex->Message() << ">" << endl;
  123. }
  124. static void prnDeadlockEx(CDB_DeadlockEx* ex)
  125. {
  126.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: SQL server: " << ex->OriginatedFrom() << 
  127. " t| <" << ex->Message() << ">" << endl;
  128. }
  129. static void prnTimeoutEx(CDB_TimeoutEx* ex)
  130. {
  131.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: SQL server: " << ex->OriginatedFrom() << 
  132. " t| <" << ex->Message() << ">" << endl;
  133. }
  134. static void prnCliEx(CDB_ClientEx* ex)
  135. {
  136.     cerr << "Sybase " << prnSeverity(ex->Severity()) << " Message: (Err.code=" << ex->ErrCode() <<
  137. ") tSource: " << ex->OriginatedFrom() << " n <<<" << ex->Message() << ">>>" << endl;
  138. }
  139.  bool HandleIt(const CDB_Exception* ex) 
  140. {
  141.     switch(ex->Type()) {
  142.     case CDB_Exception::eDS :
  143. prnDSEx((CDB_DSEx*)ex);
  144. break;
  145.     case CDB_Exception::eRPC :
  146. prnRPCEx((CDB_RPCEx*)ex);
  147. break;
  148.     case CDB_Exception::eSQL :
  149. prnSQLEx((CDB_SQLEx*)ex);
  150. break;
  151.     case CDB_Exception::eDeadlock :
  152. prnDeadlockEx((CDB_DeadlockEx*)ex);
  153. break;
  154.     case CDB_Exception::eTimeout :
  155. prnTimeoutEx((CDB_TimeoutEx*)ex);
  156. break;
  157.     case CDB_Exception::eClient :
  158. prnCliEx((CDB_ClientEx*)ex);
  159. break;
  160.     default:
  161. cerr << "Sybase " << prnSeverity(ex->Severity()) << " message: Error code=" << ex->ErrCode() << " t| <" <<
  162.     ex->what() << ">" << endl;
  163.     }
  164.     return true;
  165. }
  166. // getParam is reading arguments from the command line
  167.  char* getParam(char tag, int argc, char* argv[], bool* flag)
  168. {
  169.     for(int i= 1; i < argc; i++) {
  170.         if(((*argv[i] == '-') || (*argv[i] == '/')) && 
  171.            (*(argv[i]+1) == tag)) { // tag found
  172.             if(flag) *flag= true;
  173.             if(*(argv[i]+2) == '')  { // tag is a separate arg
  174.                 if(i == argc - 1) return 0;
  175.                 if(*argv[i+1] != *argv[i]) return argv[i+1];
  176.                 else return 0;
  177.             }
  178.             else return argv[i]+2;
  179.         }
  180.     }
  181.     if(flag) *flag= false;
  182.     return 0;
  183. }
  184. // function CreateTable is creating table in the database
  185. //   and populate it by using BCP
  186. int CreateTable (CDB_Connection* con)
  187. {
  188.    CDB_BCPInCmd* bcp;
  189.    try {
  190.  
  191.        CDB_LangCmd* lcmd = con->LangCmd ( 
  192.                      " IF EXISTS(select * from sysobjects WHERE name = 'CursorSample'"
  193.                        " AND   type = 'U') begin "
  194.                        " DROP TABLE CursorSample end ");
  195.        lcmd->Send();
  196.        while (lcmd->HasMoreResults()) {
  197.             CDB_Result* r = lcmd->Result();
  198.             if (!r) {
  199.                 continue;
  200.             }
  201.             delete r;
  202.         }
  203.         delete lcmd;
  204.         lcmd = con->LangCmd (  " create table CursorSample"
  205.                      " (int_val int not null,fl_val real not null,"
  206.                      " date_val datetime not null ,str_val varchar(255) null,"
  207.                      " text_val text null, primary key clustered(int_val))");
  208.         lcmd->Send();
  209.         while (lcmd->HasMoreResults()) {
  210.             CDB_Result* r = lcmd->Result();
  211.             if (!r) {
  212.                 continue;
  213.             }
  214.             delete r;
  215.         }
  216.         delete lcmd;
  217.      bcp = con->BCPIn("CursorSample", 5);
  218.         CDB_Int int_val;
  219.         CDB_Float fl_val;
  220.         CDB_DateTime date_val;
  221.         CDB_VarChar str_val;
  222.         CDB_Text pTxt;
  223.      int i;
  224.         pTxt.Append("This is a test string.");
  225.         // Bind data from a program variables  
  226.         bcp->Bind(0, &int_val);
  227.         bcp->Bind(1, &fl_val);
  228.         bcp->Bind(2, &date_val);
  229.         bcp->Bind(3, &str_val);
  230.         bcp->Bind(4, &pTxt);
  231.      for(i= 0; *file_name[i] != ''; i++) {
  232.             int_val = i;
  233.             fl_val = i + 0.999;
  234.             date_val = date_val.Value();
  235.             str_val= file_name[i];
  236.             pTxt.MoveTo(0);
  237.        
  238.          bcp->SendRow();
  239.          
  240.      }
  241.         bcp->CompleteBCP();
  242.      delete bcp;  
  243.    }  catch (CDB_Exception& e) {
  244.    HandleIt(&e);
  245.       return 1;
  246.    }
  247.    return 0;
  248. }
  249. //ShowResults is printing resuts on screen
  250. int ShowResults (CDB_Connection* con)
  251. {
  252.     char* txt_buf = NULL ;
  253.     long len_txt = 0;
  254.     try {   
  255.         string query = "select int_val,fl_val,date_val,str_val,text_val from CursorSample";
  256.         CDB_LangCmd* lcmd = con->LangCmd(query);
  257.         lcmd->Send();
  258.         //    Fetching  results:
  259.         while (lcmd->HasMoreResults()) {
  260.             CDB_Result* r = lcmd->Result();
  261.             if (!r) continue;
  262.             
  263.             if (r->ResultType() == eDB_RowResult) {
  264.                 while (r->Fetch()) {
  265.                    cout << "<ROW>"<< endl;
  266.                    for (unsigned int j = 0;  j < r->NofItems(); j++) {
  267.                      //    Determination of data type:
  268.                      EDB_Type rt = r->ItemDataType(j);
  269.                      const char* iname= r->ItemName(j);
  270.                      //    Printing to stdout:
  271.                      if(iname == 0) iname= "";
  272.                      cout  << iname << '=';
  273.                      if (rt == eDB_Char || rt == eDB_VarChar) {
  274.                          CDB_VarChar str_val;
  275.                          r->GetItem(&str_val);
  276.                          cout << (str_val.IsNULL()? "{NULL}" : str_val.Value()) << endl << endl ;
  277.                      } else if (rt == eDB_Int ||
  278.                                 rt == eDB_SmallInt ||
  279.                                 rt == eDB_TinyInt) {
  280.                          CDB_Int int_val;
  281.                          r->GetItem(&int_val);
  282.                          if (int_val.IsNULL()) {
  283.                              cout << "{NULL}";
  284.                          } else {
  285.                              cout << int_val.Value() << endl << endl ;
  286.                          }
  287.                       } else if (rt == eDB_Float) {
  288.                             CDB_Float fl_val;
  289.                             r->GetItem(&fl_val);
  290.                             if(fl_val.IsNULL()) {
  291.                                 cout << "{NULL}";
  292.                             } else {
  293.                                 cout << fl_val.Value() << endl<< endl ;
  294.                             }
  295.                       } else if (rt == eDB_Double) {
  296.                             CDB_Double fl_val;
  297.                             r->GetItem(&fl_val);
  298.                             if(fl_val.IsNULL()) {
  299.                                 cout << "{NULL}";
  300.                             } else {
  301.                                 cout << fl_val.Value() << endl<< endl ;
  302.                             }
  303.                        } else if (rt == eDB_DateTime ||
  304.                                   rt == eDB_SmallDateTime) {
  305.                             CDB_DateTime date_val;
  306.                             r->GetItem(&date_val);
  307.                             if(date_val.IsNULL()) {
  308.                                 cout << "{NULL}";
  309.                             } else {
  310.                                 cout << date_val.Value().AsString() << endl<< endl ;
  311.                             }
  312.                         } else if (rt == eDB_Text){
  313.                             CDB_Text text_val;
  314.                             r->GetItem(&text_val);
  315.                             if(text_val.IsNULL()) {
  316.                                 cout << "{NULL}";
  317.                             } else {
  318.                                 txt_buf = ( char*) malloc (text_val.Size()+1);
  319.                                 len_txt = text_val.Read (( char*)txt_buf, text_val.Size());
  320.                                 txt_buf[text_val.Size()] = ''; 
  321.                                 cout << txt_buf << endl << endl ;
  322.                             }
  323.                         } else {
  324.                             r->SkipItem();
  325.                             cout << "{unprintable}";
  326.                         }
  327.                     }
  328.                     cout << "</ROW>" << endl << endl;
  329.                 }
  330.                 delete r;
  331.             }
  332.         }
  333.         delete lcmd;
  334.     } catch (CDB_Exception& e) {
  335.    HandleIt(&e);
  336.       return 1;
  337.     }
  338.     return 0;
  339. }
  340. //DeleteTable is destroying a table after program finished to work with it
  341. int DeleteTable (CDB_Connection* con)
  342. {
  343.     try {
  344.         CDB_LangCmd* lcmd = con->LangCmd("drop table CursorSample");
  345.         lcmd->Send();
  346.         while (lcmd->HasMoreResults()) {
  347.             CDB_Result* r = lcmd->Result();
  348.             if (!r) {
  349.                 continue;
  350.             }
  351.             delete r;
  352.         }
  353.         delete lcmd;
  354.      } catch (CDB_Exception& e) {
  355.    HandleIt(&e);
  356.       return 1;
  357.      }
  358.     return 0;
  359. }