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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blobreader.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:23:10  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blobreader.cpp,v 1000.0 2004/06/01 19:23:10 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:  Vladimir Soussov
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <dbapi/driver/exception.hpp>
  39. #include <dbapi/driver/driver_mgr.hpp>
  40. #include <dbapi/driver/util/blobstore.hpp>
  41. USING_NCBI_SCOPE;
  42. static char* getParam(char tag, int argc, char* argv[], bool* flag= 0)
  43. {
  44.     for(int i= 1; i < argc; i++) {
  45.         if(((*argv[i] == '-') || (*argv[i] == '/')) && 
  46.            (*(argv[i]+1) == tag)) { // tag found
  47.             if(flag)
  48.                 *flag= true;
  49.             if(*(argv[i]+2) == '') { // tag is a separate arg
  50.                 if(i == argc - 1)
  51.                     return 0;
  52.                 if(*argv[i+1] != *argv[i])
  53.                     return argv[i+1];
  54.                 else
  55.                     return 0;
  56.             }
  57.             else {
  58.                 return argv[i]+2;
  59.             }
  60.         }
  61.     }
  62.     if(flag)
  63.         *flag= false;
  64.     return 0;
  65. }
  66. int main(int argc, char* argv[])
  67. {
  68.     string driver_name;
  69.     string server_name;
  70.     string user_name;
  71.     string passwd;
  72.     string query;
  73.     string table_name= kEmptyStr;
  74.     string blob_key;
  75.     if(argc < 2) {
  76.         cerr << argv[0]
  77.              << " [-d<driver_name>] [-S<server_name>]"
  78.              << " [-U<user_name>] [-P<password>] [-Q<query> | -T<table_name> -K<blob_id>] [-Z<compress_method>]"
  79.              << endl;
  80.         return 0;
  81.     }
  82.     const char* p= getParam('S', argc, argv);
  83.     if(p == 0) {
  84.         p= getenv("SQL_SERVER");
  85.     }
  86.     server_name= p? p : "MS_DEV1";
  87.     
  88.     p= getParam('d', argc, argv);
  89.     if (p) {
  90.         driver_name= p;
  91.     } else {
  92.         p= getenv("DBAPI_DRIVER");
  93.         if(p == 0) {
  94.             driver_name= (server_name.find("MS") != NPOS)? "ftds" : "ctlib";
  95.         }
  96.         else driver_name= p;
  97.     }
  98.     p= getParam('U', argc, argv);
  99.     if(p == 0) {
  100.         p= getenv("SQL_USER");
  101.     }
  102.     user_name= p? p : "anyone";
  103.     p= getParam('P', argc, argv);
  104.     if(p == 0) {
  105.         p= getenv("SQL_PASSWD");
  106.     }
  107.     passwd= p? p : "allowed";
  108.     ECompressMethod cm= eNone;
  109.     p= getParam('Z', argc, argv);
  110.     if(p) {
  111.         if(*p == 'z') cm= eZLib;
  112.         else cm= eBZLib;
  113.     }
  114.     bool f;
  115.     p= getParam('Q', argc, argv, &f);
  116.     if(p) {
  117.         query= string("set TEXTSIZE 2147483647 ") + p;
  118.     }
  119.     else {
  120.         if(f) { // query is on stdin
  121.             query= "set TEXTSIZE 2147483647 ";
  122.             cout << "query is on ctdin" << endl;
  123.             char c;
  124.             c= cin.get();
  125.             while(!cin.eof()) {
  126.                 cout << c;
  127.                 query+= c;
  128.                 c= cin.get();
  129.             }
  130.             cout << endl;
  131.         }
  132.         if(query.empty()) {
  133.             p= getParam('T', argc, argv);
  134.             if(p == 0)
  135.                 p= getenv("DATA_TABLE");
  136.             table_name= p? p : "";
  137.             p= getParam('K', argc, argv);
  138.             blob_key= p? p : "";
  139.         }
  140.     }
  141.     try {
  142.         C_DriverMgr drv_mgr;
  143.         string err_msg;
  144.         map<string, string> packet;
  145.         packet.insert (map<string, string>::value_type (string("packet"),
  146.                                                         string("2048")));
  147.         I_DriverContext* my_context= drv_mgr.GetDriverContext(driver_name,
  148.                                                               &err_msg, &packet);
  149.         if(!my_context) {
  150.             cerr << "blobreader: Can not load a driver " << driver_name << " [" 
  151.                  << err_msg << "] " << endl;
  152.             return 1;
  153.         }
  154.         if(!table_name.empty()) {
  155.             CDB_Connection* con= my_context->Connect(server_name, user_name, passwd, 0, true);
  156.             query= "select * from " + table_name + " where 0=1";
  157.             CDB_LangCmd* lcmd = con->LangCmd(query);
  158.             lcmd->Send();
  159.             unsigned int n;
  160.             int k= 0;
  161.             string key_col_name;
  162.             string num_col_name;
  163.             query= "set TEXTSIZE 2147483647 select ";
  164.             while (lcmd->HasMoreResults()) {
  165.                 CDB_Result* r = lcmd->Result();
  166.                 if (!r)
  167.                     continue;
  168.                 
  169.                 if (r->ResultType() == eDB_RowResult) {
  170.                     n= r->NofItems();
  171.                     if(n < 2) {
  172.                         delete r;
  173.                         continue;
  174.                     }
  175.                     
  176.                     
  177.                     for(unsigned int j= 0; j < n; j++) {
  178.                         switch (r->ItemDataType(j)) {
  179.                         case eDB_VarChar:
  180.                         case eDB_Char:
  181.                         case eDB_LongChar: 
  182.                             key_col_name= r->ItemName(j);
  183.                             break;
  184.                             
  185.                         case eDB_Int:
  186.                         case eDB_SmallInt:
  187.                         case eDB_TinyInt:
  188.                         case eDB_BigInt:
  189.                             num_col_name= r->ItemName(j);
  190.                             break;
  191.                             
  192.                         case eDB_Text:
  193.                         case eDB_Image:
  194.                             if(k++) query+= ",";
  195.                             query+= r->ItemName(j);
  196.                         }
  197.                     }
  198.                     while(r->Fetch());
  199.                 }
  200.                 delete r;
  201.             }
  202.             delete lcmd;
  203.             delete con;
  204.             if(k < 1) {
  205.                 query+= "*";
  206.             }
  207.             query+= " from " + table_name;
  208.             if((!blob_key.empty()) && (!key_col_name.empty())) {
  209.                 query+= " where " + key_col_name + "= '" + blob_key + "'";
  210.                 if(!num_col_name.empty()) {
  211.                     query+= " order by " + num_col_name;
  212.                 }
  213.             }
  214.             else if(!key_col_name.empty()) {
  215.                 query+= " order by " + key_col_name;
  216.                 if(!num_col_name.empty()) {
  217.                     query+= "," + num_col_name;
  218.                 }
  219.             }
  220.         }
  221.             
  222.         CBlobRetriever retr(my_context, server_name, user_name, passwd, query);
  223.         while(retr.IsReady()) {
  224.             retr.Dump(cout, cm);
  225.         }
  226.     } catch (CDB_Exception& e) {
  227.         CDB_UserHandler_Stream myExHandler(&cerr);
  228.         
  229.         myExHandler.HandleIt(&e);
  230.         return 1;
  231.     }
  232.     return 0;
  233. }
  234. /*
  235.  * ===========================================================================
  236.  * $Log: blobreader.cpp,v $
  237.  * Revision 1000.0  2004/06/01 19:23:10  gouriano
  238.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  239.  *
  240.  * Revision 1.3  2004/05/25 19:47:28  soussov
  241.  * moves blobstore.hpp header to include
  242.  *
  243.  * Revision 1.2  2004/05/17 21:18:21  gorelenk
  244.  * Added include of PCH ncbi_pch.hpp
  245.  *
  246.  * Revision 1.1  2004/05/03 16:47:10  soussov
  247.  * initial commit
  248.  *
  249.  *
  250.  * ===========================================================================
  251.  */