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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blobstore.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:22:43  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_UTILS___BLOBSTORE__HPP
  10. #define DBAPI_UTILS___BLOBSTORE__HPP
  11. /* $Id: blobstore.hpp,v 1000.0 2004/06/01 19:22:43 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Vladimir Soussov
  37.  *
  38.  * File Description:  Blob store classes
  39.  *
  40.  */
  41. #include <util/reader_writer.hpp>
  42. #include <dbapi/driver/public.hpp>
  43. BEGIN_NCBI_SCOPE
  44. enum ECompressMethod {
  45.     eNone,
  46.     eZLib,
  47.     eBZLib
  48. };
  49. class CBlobReader : public IReader {
  50.  public:
  51.     CBlobReader(CDB_Result* res, I_BaseCmd* cmd= 0, I_Connection* con= 0) {
  52.         m_Res= res;
  53.         m_Cmd= cmd;
  54.         m_Con= con;
  55.         m_ItemNum= 0;
  56.         m_AllDone= false;
  57.     }
  58.     /// Read as many as count bytes into a buffer pointed
  59.     /// to by buf argument.  Store the number of bytes actually read,
  60.     /// or 0 on EOF or error, via the pointer "bytes_read", if provided.
  61.     /// Special case:  if count passed as 0, then the value of
  62.     /// buf is ignored, and the return value is always eRW_Success, but
  63.     /// no change is actually done to the state of input device.
  64.     virtual ERW_Result Read(void*   buf,
  65.                             size_t  count,
  66.                             size_t* bytes_read = 0);
  67.     
  68.     /// Return the number of bytes ready to be read from input
  69.     /// device without blocking.  Return 0 if no such number is
  70.     /// available (in case of an error or EOF).
  71.     virtual ERW_Result PendingCount(size_t* count);
  72.     virtual ~CBlobReader();
  73.  private:
  74.     CBlobReader();
  75.     CDB_Result* m_Res;
  76.     I_BaseCmd* m_Cmd;
  77.     I_Connection* m_Con;
  78.     int m_ItemNum;
  79.     bool m_AllDone;
  80. };
  81. class ItDescriptorMaker {
  82.  public:
  83.     virtual bool Init(CDB_Connection* con)= 0;
  84.     virtual I_ITDescriptor& ItDescriptor(void)= 0;
  85.     virtual bool Fini(void)= 0;
  86.     virtual ~ItDescriptorMaker(){};
  87. };
  88. class CBlobWriter : public IWriter
  89. {
  90. public:
  91.     enum EFlags {
  92.         fLogBlobs = 0x1,
  93.         fOwnDescr= 0x2, 
  94.         fOwnCon= 0x4,
  95.         fOwnAll= fOwnDescr + fOwnCon
  96.     };
  97.     typedef int TFlags;
  98.         
  99.     CBlobWriter(CDB_Connection* con, 
  100.                 ItDescriptorMaker*    desc_func, 
  101.                 size_t          image_limit= 0x7FFFFFFF, 
  102.                 TFlags          flags= 0);
  103.     /// Write up to count bytes from the buffer pointed to by
  104.     /// buf argument onto output device.  Store the number
  105.     /// of bytes actually written, or 0 if either count was
  106.     /// passed as 0 (buf is ignored in this case) or an error occured,
  107.     /// via the "bytes_written" pointer, if provided.
  108.     virtual ERW_Result Write(const void* buf,
  109.                              size_t      count,
  110.                              size_t*     bytes_written = 0);
  111.     /// Flush pending data (if any) down to output device.
  112.     virtual ERW_Result Flush(void);
  113.     virtual ~CBlobWriter();
  114.  private:
  115.     CBlobWriter();
  116.     bool storeBlob(void);
  117.     CDB_Image m_Blob;
  118.     ItDescriptorMaker *m_dMaker;
  119.     size_t m_Limit;
  120.     CDB_Connection* m_Con;
  121.     bool m_LogIt;
  122.     bool m_DelDesc;
  123.     bool m_DelCon;
  124. };
  125. class CBlobRetriever {
  126.  public:
  127.     CBlobRetriever(I_DriverContext* pCntxt,
  128.                    const string& server, 
  129.                    const string& user,
  130.                    const string& passwd,
  131.                    const string& query);
  132.     bool IsReady() const {
  133.         return m_IsGood;
  134.     }
  135.     bool Dump(ostream& s, ECompressMethod cm= eNone);
  136.     ~CBlobRetriever();
  137.  private:
  138.     CBlobRetriever();
  139.     CDB_Connection* m_Conn;
  140.     CDB_LangCmd* m_Cmd;
  141.     CDB_Result* m_Res;
  142.     bool m_IsGood;
  143. };
  144. class CBlobLoader {
  145.  public:
  146.     CBlobLoader(I_DriverContext* pCntxt,
  147.                 const string& server, 
  148.                 const string& user,
  149.                 const string& passwd,
  150.                 ItDescriptorMaker* d_maker
  151.                 );
  152.     bool IsReady() const {
  153.         return m_IsGood;
  154.     }
  155.     bool Load(istream& s, ECompressMethod cm= eNone, 
  156.               size_t image_limit= 0, bool log_it= false);
  157.     ~CBlobLoader() {
  158.         if(m_Conn) delete m_Conn;
  159.     }
  160.  private:
  161.     CBlobLoader();
  162.     CDB_Connection* m_Conn;
  163.     ItDescriptorMaker* m_dMaker;
  164.     bool m_IsGood;
  165. };
  166. /***************************************************************************************
  167.  * The SimpleBlobStore is a ready to use implementation of ItDescriptorMaker
  168.  * it uses a table of the form:
  169.  * create table TABLE_NAME (
  170.  * ID varchar(n),
  171.  * NUM int,240-271-8512
  172.  * DATA1 image NULL, ... DATAn image NULL)
  173.  *
  174.  */
  175. class CMY_ITDescriptor : public CDB_ITDescriptor {
  176.  public:
  177.     CMY_ITDescriptor(const string& table_name) : 
  178.         CDB_ITDescriptor(table_name, kEmptyStr, kEmptyStr)
  179.     {};
  180.     void SetColumn(const string& col_name) {
  181.         m_ColumnName= col_name;
  182.     }
  183.     void SetSearchConditions(const string& s) {
  184.         m_SearchConditions= s;
  185.     }
  186. };
  187. class CSimpleBlobStore : public ItDescriptorMaker {
  188.  public:
  189.     CSimpleBlobStore(const string& table_name,
  190.                      const string& key_col_name,
  191.                      const string& num_col_name,
  192.                      const string blob_column[],
  193.                      bool is_text= false);
  194.     void SetKey(const string& key) {
  195.         if(!key.empty())
  196.             m_Key= key;
  197.     }
  198.     virtual bool Init(CDB_Connection* con);
  199.     virtual I_ITDescriptor& ItDescriptor(void);
  200.     virtual bool Fini(void);
  201.     virtual ~CSimpleBlobStore();
  202.  protected:
  203.     string m_TableName;
  204.     string m_KeyColName;
  205.     string m_NumColName;
  206.     string m_sCMD;
  207.     string* m_DataColName;
  208.     CDB_Connection* m_Con;
  209.     CDB_LangCmd*    m_Cmd;
  210.     int m_nofDataCols;
  211.     int m_ImageNum;
  212.     CDB_VarChar m_Key;
  213.     CDB_Int m_RowNum;
  214.     CMY_ITDescriptor m_Desc;
  215. };
  216. /***************************************************************************************
  217.  * CBlobStore - the simple interface to deal with reading and writing the image/text data
  218.  * from a C++ application
  219.  */
  220. class CBlobStore {
  221.  public:
  222.     CBlobStore(I_DriverContext* pCntxt,
  223.                const string& server, 
  224.                const string& user,
  225.                const string& passwd,
  226.                const string& table_name,
  227.                ECompressMethod cm= eNone, 
  228.                size_t image_limit= 0, 
  229.                bool log_it= false);
  230.     bool Exists(const string& blob_id);
  231.     //user has to delete istream240-271-8512
  232.     istream* OpenForRead(const string& blob_id);
  233.     // user has to delete ostream
  234.     ostream* OpenForWrite(const string& blob_id);
  235.     void Delete(const string& blob_id);
  236.     ~CBlobStore();
  237.  protected:
  238.     I_DriverContext* m_Cntxt;
  239.     string m_Server;
  240.     string m_User;
  241.     string m_Passwd;
  242.     string m_Table;
  243.     ECompressMethod m_Cm;
  244.     size_t m_Limit;
  245.     bool m_LogIt;
  246.     bool m_IsText;
  247.     string m_Pool;
  248.     string m_KeyColName;
  249.     string m_NumColName;
  250.     string m_ReadQuery;
  251.     string* m_BlobColumn;
  252.     int m_NofBC;
  253. };
  254.     
  255. END_NCBI_SCOPE
  256. /*
  257.  * ===========================================================================
  258.  * $Log: blobstore.hpp,v $
  259.  * Revision 1000.0  2004/06/01 19:22:43  gouriano
  260.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  261.  *
  262.  * Revision 1.2  2004/05/24 19:40:47  soussov
  263.  * adds CBlobStore implementation
  264.  *
  265.  * Revision 1.1  2004/05/03 16:47:10  soussov
  266.  * initial commit
  267.  *
  268.  *
  269.  * ===========================================================================
  270.  */
  271. #endif  /* DBAPI_UTILS___BLOBSTORE__HPP */