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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: parameters.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:19:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: parameters.cpp,v 1000.1 2004/06/01 19:19:19 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.  * File Description:  Param container implementation
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <dbapi/driver/util/parameters.hpp>
  41. #include <ctype.h>
  42. BEGIN_NCBI_SCOPE
  43. CDB_Params::CDB_Params(unsigned int nof_params)
  44. {
  45.     m_NofParams = nof_params;
  46.     m_Params= 0;
  47.     if (m_NofParams != 0) {
  48.         m_Params = new SParam[m_NofParams];
  49.         for (unsigned int i = 0;  i < m_NofParams;  m_Params[i++].status = 0)
  50.             continue;
  51.     }
  52. }
  53. bool CDB_Params::BindParam(unsigned int param_no, const string& param_name,
  54.                            CDB_Object* param, bool is_out)
  55. {
  56.     if (param_no >= m_NofParams) {
  57.         // try to find the place for this param
  58.         param_no = m_NofParams;
  59.         if ( !param_name.empty() ) {
  60.             // try to find this name
  61.             for (param_no = 0;  param_no < m_NofParams;  param_no++) {
  62.                 if (m_Params[param_no].status != 0  && 
  63.                     param_name.compare(m_Params[param_no].name) == 0)
  64.                     break;
  65.             }
  66.         }
  67.         if (param_no >= m_NofParams) {
  68.             for (param_no = 0;
  69.                  param_no < m_NofParams  &&  m_Params[param_no].status != 0;
  70.                  ++param_no)
  71.                 continue;
  72.         }
  73.     }
  74.     if(param_no >= m_NofParams) { // we need more memory
  75.         SParam* t= new SParam[param_no + 1];
  76.         unsigned int i;
  77.         if(m_Params) {
  78.             for(i= 0; i < m_NofParams; i++) {
  79.                 t[i]= m_Params[i];
  80.             }
  81.             delete [] m_Params;
  82.         }
  83.         m_Params= t;
  84.         for(i= m_NofParams; i <= param_no; m_Params[i++].status = 0);
  85.         m_NofParams= param_no + 1;
  86.     }
  87.     if (param_no < m_NofParams) {
  88.         // we do have a param number
  89.         if ((m_Params[param_no].status & fSet) != 0) {
  90.             // we need to free the old one
  91.             delete m_Params[param_no].param;
  92.             m_Params[param_no].status ^= fSet;
  93.         }
  94.         if ( !param_name.empty() ) {
  95.             if (param_name.compare(m_Params[param_no].name) != 0) {
  96.                 m_Params[param_no].name = param_name;
  97.             }
  98.         } else {
  99.             if(m_Params[param_no].status) {
  100.                 string n= m_Params[param_no].name;
  101.                 if(!n.empty()) m_Params[param_no].name.erase();
  102.             }
  103.         }
  104.         m_Params[param_no].param = param;
  105.         m_Params[param_no].status |= fBound | (is_out ? fOutput : 0) ;
  106.         return true;
  107.     }
  108.     return false;
  109. }
  110. bool CDB_Params::SetParam(unsigned int param_no, const string& param_name,
  111.                           CDB_Object* param, bool is_out)
  112. {
  113.     if (param_no >= m_NofParams) {
  114.         // try to find the place for this param
  115.         param_no = m_NofParams;
  116.         if ( !param_name.empty() ) {
  117.             // try to find this name
  118.             for (param_no = 0;  param_no < m_NofParams;  param_no++) {
  119.                 if (m_Params[param_no].status != 0  && 
  120.                     m_Params[param_no].name.compare(param_name) == 0)
  121.                     break;
  122.             }
  123.         }
  124.         if (param_no >= m_NofParams) {
  125.             for (param_no = 0;
  126.                  param_no < m_NofParams  &&  m_Params[param_no].status != 0;
  127.                  ++param_no);
  128.         }
  129.     }
  130.     if(param_no >= m_NofParams) { // we need more memory
  131.         SParam* t= new SParam[param_no + 1];
  132.         unsigned int i;
  133.         if(m_Params) {
  134.             for(i= 0; i < m_NofParams; i++) {
  135.                 t[i]= m_Params[i];
  136.             }
  137.             delete [] m_Params;
  138.         }
  139.         m_Params= t;
  140.         for(i= m_NofParams; i <= param_no; m_Params[i++].status = 0);
  141.         m_NofParams= param_no + 1;
  142.     }
  143.     
  144.     if (param_no < m_NofParams) {
  145.         // we do have a param number
  146.         if ((m_Params[param_no].status & fSet) != 0) { 
  147.             if (m_Params[param_no].param->GetType() == param->GetType()) {
  148.                 // types are the same
  149.                 m_Params[param_no].param->AssignValue(*param);
  150.             }
  151.             else 
  152.                 { // we need to delete the old one
  153.                     delete m_Params[param_no].param;
  154.                     m_Params[param_no].param = param->Clone();
  155.                 }
  156.         }
  157.         else {
  158.             m_Params[param_no].param = param->Clone();
  159.         }
  160.         if ( !param_name.empty()) {
  161.             if (m_Params[param_no].name.compare(param_name) != 0) {
  162.                 m_Params[param_no].name = param_name;
  163.             }
  164.         }
  165.         else {
  166.             if(!m_Params[param_no].name.empty()) m_Params[param_no].name.erase();
  167.         }
  168.         m_Params[param_no].status |= fSet | (is_out ? fOutput : 0);
  169.         return true;
  170.     }
  171.     return false;
  172. }
  173. CDB_Params::~CDB_Params()
  174. {
  175.     if ( !m_NofParams  || !m_Params)
  176.         return;
  177.     for (unsigned int i = 0;  i < m_NofParams;  i++) {
  178.         if ((m_Params[i].status & fSet) != 0)
  179.             delete m_Params[i].param;
  180.     }
  181.     delete [] m_Params;
  182. }
  183. void g_SubstituteParam(string& query, const string& name, const string& val)
  184. {
  185.     size_t name_len = name.length();
  186.     size_t val_len = val.length();
  187.     size_t len = query.length();
  188.     char q = 0;
  189.     for (size_t pos = 0;  pos < len;  pos++) {
  190.         if (q) {
  191.             if (query[pos] == q)
  192.                 q = 0;
  193.             continue;
  194.         }
  195.         if (query[pos] == '"' || query[pos] == ''') {
  196.             q = query[pos];
  197.             continue;
  198.         }
  199.         if (NStr::Compare(query, pos, name_len, name) == 0
  200.             && (pos == 0 || !isalnum(query[pos - 1]))
  201.             && !isalnum(query[pos + name_len])
  202.             && query[pos + name_len] != '_') {
  203.             query.replace(pos, name_len, val);
  204.             len = query.length();
  205.             pos += val_len;
  206.         }
  207.     }
  208. }
  209. END_NCBI_SCOPE
  210. /*
  211.  * ===========================================================================
  212.  * $Log: parameters.cpp,v $
  213.  * Revision 1000.1  2004/06/01 19:19:19  gouriano
  214.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  215.  *
  216.  * Revision 1.13  2004/05/17 21:11:38  gorelenk
  217.  * Added include of PCH ncbi_pch.hpp
  218.  *
  219.  * Revision 1.12  2003/06/04 18:18:46  soussov
  220.  * Sets m_Params to 0 if no params in constructor
  221.  *
  222.  * Revision 1.11  2002/12/02 17:00:07  soussov
  223.  * replacing delete m_Params with delete [] m_Params
  224.  *
  225.  * Revision 1.10  2002/11/27 19:26:10  soussov
  226.  * fixes bug with erasing the empty strings
  227.  *
  228.  * Revision 1.9  2002/11/26 17:49:03  soussov
  229.  * reallocation if more than declared parameters added
  230.  *
  231.  * Revision 1.8  2002/05/16 21:33:00  soussov
  232.  * Replaces the temp fix in SetParam with the permanent one
  233.  *
  234.  * Revision 1.7  2002/05/15 22:29:40  soussov
  235.  * temporary fix for SetParam
  236.  *
  237.  * Revision 1.6  2001/11/06 17:59:53  lavr
  238.  * Formatted uniformly as the rest of the library
  239.  *
  240.  * Revision 1.5  2001/10/25 00:22:10  vakatov
  241.  * string::compare() with 4 args does not work with GCC ver. < 3, so
  242.  * use NStr::Compare() instead.
  243.  *
  244.  * Revision 1.4  2001/10/24 19:05:29  lavr
  245.  * g_SubstituteParam() fixed to correctly replace names with values
  246.  *
  247.  * Revision 1.3  2001/10/22 15:21:45  lavr
  248.  * +g_SubstituteParam
  249.  *
  250.  * Revision 1.2  2001/10/04 18:41:24  soussov
  251.  * fixes bug in CDB_Params::SetParam
  252.  *
  253.  * Revision 1.1  2001/09/21 23:40:00  vakatov
  254.  * -----  Initial (draft) revision.  -----
  255.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  256.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  257.  * The revamp involved massive code shuffling and grooming, numerous local
  258.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  259.  *
  260.  * ===========================================================================
  261.  */