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

生物技术

开发平台:

C/C++

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