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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blobwriter.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:23:21  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blobwriter.cpp,v 1000.0 2004/06/01 19:23: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.  * 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 blob_key;
  73.     string table_name;
  74.     string key_col_name;
  75.     string num_col_name;
  76.     size_t imagesize= 0;
  77.     if(argc < 2) {
  78.         cerr << argv[0]
  79.              << " -K<blob_id> [-d<driver_name>] [-S<server_name>]"
  80.              << " [-U<user_name>] [-P<password>] [-L<image size>] [-Z<compress_method>]"
  81.              << " [-T<table_name>]"
  82.              << endl;
  83.         return 0;
  84.     }
  85.     const char* p= getParam('K', argc, argv);
  86.     if(p == 0) {
  87.         cerr << argv[0] << "Blob ID is missing" << endl;
  88.         return 1;
  89.     }
  90.     blob_key= p;
  91.     p= getParam('S', argc, argv);
  92.     if(p == 0) {
  93.         p= getenv("SQL_SERVER");
  94.     }
  95.     server_name= p? p : "MS_DEV1";
  96.     
  97.     p= getParam('d', argc, argv);
  98.     if (p) {
  99.         driver_name= p;
  100.     } else {
  101.         p= getenv("DBAPI_DRIVER");
  102.         if(p == 0) {
  103.             driver_name= (server_name.find("MS") != NPOS)? "ftds" : "ctlib";
  104.         }
  105.         else driver_name= p;
  106.     }
  107.     p= getParam('U', argc, argv);
  108.     if(p == 0) {
  109.         p= getenv("SQL_USER");
  110.     }
  111.     user_name= p? p : "anyone";
  112.     p= getParam('P', argc, argv);
  113.     if(p == 0) {
  114.         p= getenv("SQL_PASSWD");
  115.     }
  116.     passwd= p? p : "allowed";
  117.     ECompressMethod cm= eNone;
  118.     p= getParam('Z', argc, argv);
  119.     if(p) {
  120.         if(*p == 'z') cm= eZLib;
  121.         else cm= eBZLib;
  122.     }
  123.     p= getParam('L', argc, argv);
  124.     if(p) imagesize= atoi(p);
  125.     p= getParam('T', argc, argv);
  126.     if(p == 0) {
  127.         p= getenv("DATA_TABLE");
  128.     }
  129.     table_name= p? p : "MyDataTable";
  130.     string *blob_column;
  131.     
  132.     try {
  133.         C_DriverMgr drv_mgr;
  134.         string err_msg;
  135.         map<string, string> packet;
  136.         packet.insert (map<string, string>::value_type (string("packet"),
  137.                                                         string("2048")));
  138.         I_DriverContext* my_context= drv_mgr.GetDriverContext(driver_name,
  139.                                                               &err_msg, &packet);
  140.         if(!my_context) {
  141.             cerr << "Can not load a driver " << driver_name << " [" 
  142.                  << err_msg << "] " << endl;
  143.             return 1;
  144.         }
  145.         CDB_Connection* con= my_context->Connect(server_name, user_name, passwd, 0, true);
  146.         string query= "select * from " + table_name + " where 0=1";
  147.         CDB_LangCmd* lcmd = con->LangCmd(query);
  148.         lcmd->Send();
  149.         unsigned int n;
  150.         int k= 0;
  151.         bool is_text= false;
  152.         while (lcmd->HasMoreResults()) {
  153.             CDB_Result* r = lcmd->Result();
  154.             if (!r)
  155.                 continue;
  156.             
  157.             if (r->ResultType() == eDB_RowResult) {
  158.                 n= r->NofItems();
  159.                 if(n < 2) {
  160.                     delete r;
  161.                     continue;
  162.                 }
  163.                 
  164.                 blob_column= new string[n];
  165.                 for(unsigned int j= 0; j < n; j++) {
  166.                     switch (r->ItemDataType(j)) {
  167.                     case eDB_VarChar:
  168.                     case eDB_Char:
  169.                     case eDB_LongChar: 
  170.                         key_col_name= r->ItemName(j);
  171.                         break;
  172.                     case eDB_Int:
  173.                     case eDB_SmallInt:
  174.                     case eDB_TinyInt:
  175.                     case eDB_BigInt:
  176.                         num_col_name= r->ItemName(j);
  177.                         break;
  178.                     case eDB_Text: is_text= true;
  179.                     case eDB_Image:
  180.                         blob_column[k++]= r->ItemName(j);
  181.                     }
  182.                 }
  183.                 blob_column[k]= kEmptyStr;
  184.                 while(r->Fetch());
  185.             }
  186.             delete r;
  187.         }
  188.         delete lcmd;
  189.         delete con;
  190.         CSimpleBlobStore sbs(table_name, key_col_name, num_col_name, blob_column, is_text);
  191.         CBlobLoader bload(my_context, server_name, user_name, passwd, &sbs);
  192.         sbs.SetKey(blob_key);
  193.         bload.Load(cin, cm, imagesize);
  194.     } catch (CDB_Exception& e) {
  195.         CDB_UserHandler_Stream myExHandler(&cerr);
  196.         
  197.         myExHandler.HandleIt(&e);
  198.         return 1;
  199.     }
  200.     return 0;
  201. }
  202. /*
  203.  * ===========================================================================
  204.  * $Log: blobwriter.cpp,v $
  205.  * Revision 1000.0  2004/06/01 19:23:21  gouriano
  206.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  207.  *
  208.  * Revision 1.4  2004/05/25 19:47:28  soussov
  209.  * moves blobstore.hpp header to include
  210.  *
  211.  * Revision 1.3  2004/05/24 19:41:46  soussov
  212.  * adjusts to new blobstore API
  213.  *
  214.  * Revision 1.2  2004/05/17 21:18:21  gorelenk
  215.  * Added include of PCH ncbi_pch.hpp
  216.  *
  217.  * Revision 1.1  2004/05/03 16:47:10  soussov
  218.  * initial commit
  219.  *
  220.  *
  221.  * ===========================================================================
  222.  */