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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi_testspeed_util.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:22:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbapi_testspeed_util.cpp,v 1000.3 2004/06/01 19:22:38 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 Description:
  35. *     Misc. functions for test program that measures dbapi driver speed
  36. *     (adapted from dbapi_bcp_util.cpp).
  37. *
  38. *============================================================================
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include "dbapi_testspeed.hpp"
  42. #include <string>
  43. const char* prnType(EDB_Type t)
  44. {
  45.   switch(t) {
  46.     case eDB_Int           : return "Int4";
  47.     case eDB_SmallInt      : return "Int2";
  48.     case eDB_TinyInt       : return "Uint1";
  49.     case eDB_BigInt        : return "Int8";
  50.     case eDB_VarChar       : return "VarChar";
  51.     case eDB_Char          : return "Char";
  52.     case eDB_VarBinary     : return "VarBinary";
  53.     case eDB_Binary        : return "Binary";
  54.     case eDB_Float         : return "Float";
  55.     case eDB_Double        : return "Double";
  56.     case eDB_DateTime      : return "DateTime";
  57.     case eDB_SmallDateTime : return "SmallDateTime";
  58.     case eDB_Text          : return "Text";
  59.     case eDB_Image         : return "Image";
  60.     case eDB_Bit           : return "Bit";
  61.     case eDB_Numeric       : return "Numeric";
  62.     default                : return "Unsupported";
  63.   }
  64. }
  65. const char* prnSeverity(EDB_Severity s)
  66. {
  67.   switch(s) {
  68.     case eDB_Info:    return "Info";
  69.     case eDB_Warning: return "Warning";
  70.     case eDB_Error:   return "Error";
  71.     case eDB_Fatal:   return "Fatal Error";
  72.     default:          return "Unknown severity";
  73.   }
  74. }
  75. void prnDSEx(CDB_DSEx* ex)
  76. {
  77.   cerr << prnSeverity(ex->Severity()) << " Err.code=" << ex->ErrCode()
  78.        << " Data source: " << ex->OriginatedFrom()
  79.        << " t| <" << ex->Message()<< ">" << endl;
  80. }
  81. static void prnRPCEx(CDB_RPCEx* ex)
  82. {
  83.   cerr << prnSeverity(ex->Severity()) << " Err code=" << ex->ErrCode()
  84.        << " SQL/Open server: " << ex->OriginatedFrom()
  85.        << " Procedure: " << ex->ProcName() << " Line: " << ex->ProcLine()
  86.        << " t| <" << ex->Message() << ">" << endl;
  87. }
  88. static void prnSQLEx(CDB_SQLEx* ex)
  89. {
  90.   cerr << prnSeverity(ex->Severity()) << " Err code=" << ex->ErrCode()
  91.        << " SQL server: " << ex->OriginatedFrom() << " SQL: " << ex->SqlState()
  92.        << " Line: " << ex->BatchLine()
  93.        << " t| <" << ex->Message() << ">" << endl;
  94. }
  95. static void prnDeadlockEx(CDB_DeadlockEx* ex)
  96. {
  97.   cerr << prnSeverity(ex->Severity()) << " SQL server: " << ex->OriginatedFrom()
  98.        << " t| <" << ex->Message() << ">" << endl;
  99. }
  100. static void prnTimeoutEx(CDB_TimeoutEx* ex)
  101. {
  102.   cerr << prnSeverity(ex->Severity()) << " SQL server: " << ex->OriginatedFrom()
  103.        << " t| <" << ex->Message() << ">" << endl;
  104. }
  105. static void prnCliEx(CDB_ClientEx* ex)
  106. {
  107.   cerr << prnSeverity(ex->Severity()) << " (Err.code=" << ex->ErrCode()
  108.        << ") tSource: " << ex->OriginatedFrom() << " n <<<"
  109.        << ex->Message() << ">>>" << endl;
  110. }
  111. bool HandleIt(const CDB_Exception* ex)
  112. {
  113.   switch(ex->Type()) {
  114.     case CDB_Exception::eDS       : prnDSEx((CDB_DSEx*)ex);             break;
  115.     case CDB_Exception::eRPC      : prnRPCEx((CDB_RPCEx*)ex);           break;
  116.     case CDB_Exception::eSQL      : prnSQLEx((CDB_SQLEx*)ex);           break;
  117.     case CDB_Exception::eDeadlock : prnDeadlockEx((CDB_DeadlockEx*)ex); break;
  118.     case CDB_Exception::eTimeout  : prnTimeoutEx((CDB_TimeoutEx*)ex);   break;
  119.     case CDB_Exception::eClient   : prnCliEx((CDB_ClientEx*)ex);        break;
  120.     default:
  121.       cerr << prnSeverity(ex->Severity())
  122.            << " message: Error code=" << ex->ErrCode()
  123.            << " t| <" << ex->what() << ">" << endl;
  124.   }
  125.   return true;
  126. }
  127. // Read a command line argument
  128. char* getParam(char tag, int argc, char* argv[], bool* flag)
  129. {
  130.   static int last_processed=0;
  131.   if(tag=='') {
  132.     // Return the next positional argument
  133.     if(last_processed>=argc-1) return 0;
  134.     return argv[++last_processed];
  135.   }
  136.   for(int i= 1; i < argc; i++) {
  137.     if( (argv[i][0] == '-' || argv[i][0] == '/') && argv[i][1] == tag ) {
  138.       // tag found
  139.       if(flag) *flag= true;
  140.       char* res=0;
  141.       if(*(argv[i]+2) == '')  {
  142.         // tag is a separate arg
  143.         if( i <= argc - 1 && argv[i+1][0] != argv[i][0] ) res=argv[++i];
  144.       }
  145.       else {
  146.         res=argv[i]+2;
  147.       }
  148.       if(last_processed<i) last_processed=i;
  149.       return res;
  150.     }
  151.   }
  152.   if(flag) *flag= false;
  153.   return 0;
  154. }
  155. // Also drops any pre-existing table.
  156. int CreateTable (CDB_Connection* con, const string& table_name)
  157. {
  158.   try {
  159.     string s = "IF EXISTS(select * from sysobjects WHERE name = '";
  160.     s+= table_name;
  161.     s+= "' AND type = 'U') begin DROP TABLE ";
  162.     s+= table_name;
  163.     s+= " end";
  164.     CDB_LangCmd* lcmd = con->LangCmd(s);
  165.     lcmd->Send();
  166.     while(lcmd->HasMoreResults()) {
  167.       CDB_Result* r = lcmd->Result();
  168.       if(r) delete r;
  169.     }
  170.     delete lcmd;
  171.     s = "create table ";
  172.     s+= table_name;
  173.     s+= "(int_val  int      not null,"
  174.         " fl_val   real         null,"
  175.         " date_val datetime     null,"
  176.         " str_val  varchar(255) null,"
  177.         " txt_val  text         null)";
  178.     lcmd = con->LangCmd(s);
  179.     lcmd->Send();
  180.     while (lcmd->HasMoreResults()) {
  181.       CDB_Result* r = lcmd->Result();
  182.       if(r) delete r;
  183.     }
  184.     delete lcmd;
  185.   }
  186.   catch (CDB_Exception& e) {
  187.     HandleIt(&e);
  188.     return 1;
  189.   }
  190.   return 0;
  191. }
  192. int FetchResults (CDB_Connection* con, const string& table_name, bool readItems)
  193. {
  194.   char* txt_buf = NULL ;
  195.   long len_txt = 0;
  196.   try {
  197.     string query = "select int_val,fl_val,date_val,str_val,txt_val from ";
  198.     query+=table_name;
  199.     CDB_LangCmd* lcmd = con->LangCmd(query);
  200.     lcmd->Send();
  201.     while (lcmd->HasMoreResults()) {
  202.       CDB_Result* r = lcmd->Result();
  203.       if (!r) continue;
  204.       if (r->ResultType() == eDB_RowResult) {
  205.         while (r->Fetch()) {
  206.           // cout << "<ROW>"<< endl;
  207.           for (unsigned int j = 0;  j < r->NofItems(); j++) {
  208.             //    Determination of data type:
  209.             EDB_Type rt = r->ItemDataType(j);
  210.             const char* iname= r->ItemName(j);
  211.             //    Printing to stdout:
  212.             if(iname == 0) iname= "";
  213.             // cout << iname << '=';
  214.             if( readItems && rt!=eDB_Numeric &&
  215.                 rt!=eDB_DateTime && rt!=eDB_SmallDateTime )
  216.             {
  217.               bool isNull;
  218.               char buf[1024];
  219.               int sz=0;
  220.               while( j == r->CurrentItemNo() ) {
  221.                 sz+=r->ReadItem(buf, sizeof(buf), &isNull);
  222.               }
  223.               // cout << j << " " << sz << (j == r->NofItems()-1 ? "n" : ", ");
  224.               continue;
  225.             }
  226.             // Type-specific GetItem()
  227.             if (rt == eDB_Char || rt == eDB_VarChar) {
  228.               CDB_VarChar str_val;
  229.               r->GetItem(&str_val);
  230.               // cout << (str_val.IsNULL()? "{NULL}" : str_val.Value()) << endl << endl ;
  231.             }
  232.             else if (rt == eDB_Int || rt == eDB_SmallInt || rt == eDB_TinyInt) {
  233.               CDB_Int int_val;
  234.               r->GetItem(&int_val);
  235.               if (int_val.IsNULL()) {
  236.                 // cout << "{NULL}";
  237.               }
  238.               else {
  239.                 // cout << int_val.Value() << endl << endl ;
  240.               }
  241.             }
  242.             else if (rt == eDB_Float) {
  243.               CDB_Float fl_val;
  244.               r->GetItem(&fl_val);
  245.               if(fl_val.IsNULL()) {
  246.                 // cout << "{NULL}";
  247.               }
  248.               else {
  249.                 // cout << fl_val.Value() << endl<< endl ;
  250.               }
  251.             }
  252.             else if (rt == eDB_Double) {
  253.               CDB_Double fl_val;
  254.               r->GetItem(&fl_val);
  255.               if(fl_val.IsNULL()) {
  256.                 // cout << "{NULL}";
  257.               }
  258.               else {
  259.                 // cout << fl_val.Value() << endl<< endl ;
  260.               }
  261.             }
  262.             else if (rt == eDB_DateTime || rt == eDB_SmallDateTime) {
  263.               CDB_DateTime date_val;
  264.               r->GetItem(&date_val);
  265.               if(date_val.IsNULL()) {
  266.                 // cout << "{NULL}";
  267.               }
  268.               else {
  269.                 // cout << date_val.Value().AsString() << endl<< endl ;
  270.               }
  271.             }
  272.             else if(rt == eDB_Text) {
  273.               CDB_Text text_val;
  274.               r->GetItem(&text_val);
  275.               if(text_val.IsNULL()) {
  276.                 // cout << "{NULL}";
  277.               }
  278.               else {
  279.                 txt_buf = ( char*) malloc (text_val.Size());
  280.                 len_txt = text_val.Read (( char*)txt_buf, text_val.Size());
  281.                 txt_buf[text_val.Size()] = '';
  282.                 // cout << txt_buf << endl<< endl ;
  283.               }
  284.             }
  285.             else {
  286.               r->SkipItem();
  287.               // cout << "{unprintable}";
  288.             }
  289.           }
  290.           // cout << "</ROW>" << endl << endl;
  291.         }
  292.         delete r;
  293.       }
  294.     }
  295.     delete lcmd;
  296.   }
  297.   catch (CDB_Exception& e) {
  298.      HandleIt(&e);
  299.     return 1;
  300.   }
  301.   return 0;
  302. }
  303. int FetchFile(CDB_Connection* con, const string& table_name, bool readItems)
  304. {
  305.   CDB_VarChar str_val;
  306.   CDB_DateTime date_val;
  307.   try {
  308.     string query = "select date_val,str_val,txt_val from ";
  309.     query+=table_name;
  310.     CDB_LangCmd* lcmd = con->LangCmd(query);
  311.     lcmd->Send();
  312.     //CTime fileTime;
  313.     while (lcmd->HasMoreResults()) {
  314.       CDB_Result* r = lcmd->Result();
  315.       if (!r) continue;
  316.       if (r->ResultType() == eDB_RowResult) {
  317.         while (r->Fetch()) {
  318.           CNcbiOfstream f("testspeed.out", IOS_BASE::trunc|IOS_BASE::out|IOS_BASE::binary);
  319.           for (unsigned int j = 0;  j < r->NofItems(); j++) {
  320.             EDB_Type rt = r->ItemDataType(j);
  321.             const char* iname= r->ItemName(j);
  322.             if( readItems && rt == eDB_Text )
  323.             {
  324.               bool isNull=false;
  325.               char txt_buf[10240];
  326.               // cout<< "j=" << j
  327.               //    << " CurrentItemNo()=" << r->CurrentItemNo() << "n";
  328.               for(;;) {
  329.                 int len_txt = r->ReadItem(txt_buf, sizeof(txt_buf), &isNull);
  330.                 //cout << "len_txt=" << len_txt << " isNull=" << isNull << "n";
  331.                 if(isNull || len_txt<=0) break;
  332.                 f.write(txt_buf, len_txt);
  333.               }
  334.               f.close();
  335.               continue;
  336.             }
  337.             // Type-specific GetItem()
  338.             if (rt == eDB_Char || rt == eDB_VarChar) {
  339.               r->GetItem(&str_val);
  340.             }
  341.             else if (rt == eDB_DateTime || rt == eDB_SmallDateTime) {
  342.               r->GetItem(&date_val);
  343.             }
  344.             else if(rt == eDB_Text) {
  345.               CDB_Text text_val;
  346.               r->GetItem(&text_val);
  347.               if(text_val.IsNULL()) {
  348.                 // cout << "{NULL}";
  349.               }
  350.               else {
  351.                 char txt_buf[10240];
  352.                 //cout << "text_val.Size()=" << text_val.Size() << "n";
  353.                 for(;;) {
  354.                   int len_txt = text_val.Read( txt_buf, sizeof(txt_buf) );
  355.                   if(len_txt<=0) break;
  356.                   f.write(txt_buf, len_txt);
  357.                 }
  358.               }
  359.               f.close();
  360.             }
  361.             else {
  362.               r->SkipItem();
  363.               // cout << "{unprintable}";
  364.             }
  365.           }
  366.           // cout << "</ROW>" << endl << endl;
  367.         }
  368.         delete r;
  369.       }
  370.     }
  371.     delete lcmd;
  372.   }
  373.   catch (CDB_Exception& e) {
  374.      HandleIt(&e);
  375.     return 1;
  376.   }
  377.   cout<< "File " << str_val.Value() << " dated " << date_val.Value().AsString()
  378.       << " was written to testspeed.out using "
  379.       << (readItems?"ReadItem":"GetItem") << "n";
  380.   return 0;
  381. }
  382. int DeleteTable (CDB_Connection* con, const string& table_name)
  383. {
  384.   try {
  385.     string s = "drop table ";
  386.     s+= table_name;
  387.     CDB_LangCmd* lcmd = con->LangCmd(s);
  388.     lcmd->Send();
  389.     while(lcmd->HasMoreResults()) {
  390.       CDB_Result* r = lcmd->Result();
  391.       if(r) delete r;
  392.     }
  393.     delete lcmd;
  394.   }
  395.   catch (CDB_Exception& e) {
  396.     HandleIt(&e);
  397.     return 1;
  398.   }
  399.   return 0;
  400. }