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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blob_splitter_params.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:24:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blob_splitter_params.cpp,v 1000.2 2004/06/01 19:24:53 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:  Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Application for splitting blobs withing ID1 cache
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objmgr/split/blob_splitter_params.hpp>
  43. #include <objmgr/split/id2_compress.hpp>
  44. #include <objmgr/objmgr_exception.hpp>
  45. #include <util/compress/zlib.hpp>
  46. BEGIN_NCBI_SCOPE
  47. BEGIN_SCOPE(objects)
  48. static const size_t kChunkSize = 32*1024;
  49. void CId2Compressor::Compress(const SSplitterParams& params,
  50.                               list<vector<char>*>& dst,
  51.                               const char* data, size_t size)
  52. {
  53.     vector<char>* vec;
  54.     dst.push_back(vec = new vector<char>);
  55.     CompressHeader(params, *vec, size);
  56.     while ( size ) {
  57.         size_t chunk_size = min(size, kChunkSize);
  58.         CompressChunk(params, *vec, data, chunk_size);
  59.         data += chunk_size;
  60.         size -= chunk_size;
  61.         if ( size ) { // another vector<char> for next chunk
  62.             dst.push_back(vec = new vector<char>);
  63.         }
  64.     }
  65.     CompressFooter(params, *vec, size);
  66. }
  67. void CId2Compressor::Compress(const SSplitterParams& params,
  68.                               vector<char>& dst,
  69.                               const char* data, size_t size)
  70. {
  71.     CompressHeader(params, dst, size);
  72.     CompressChunk(params, dst, data, size);
  73.     CompressFooter(params, dst, size);
  74. }
  75. void CId2Compressor::CompressChunk(const SSplitterParams& params,
  76.                                    vector<char>& dst,
  77.                                    const char* data, size_t size)
  78. {
  79.     switch ( params.m_Compression ) {
  80.     case SSplitterParams::eCompression_none:
  81.         sx_Append(dst, data, size);
  82.         break;
  83.     case SSplitterParams::eCompression_nlm_zip:
  84.     {{
  85.         size_t pos = dst.size();
  86.         CZipCompression compr(CCompression::eLevel_Default);
  87.         dst.resize(pos + 32 + size_t(double(size)*1.01));
  88.         unsigned real_size = 0;
  89.         if ( !compr.CompressBuffer(data, size,
  90.                                    &dst[pos+8], dst.size()-(pos+8),
  91.                                    &real_size) ) {
  92.             NCBI_THROW(CLoaderException, eCompressionError,
  93.                 "zip compression failed");
  94.         }
  95.         for ( size_t i = 0, s = real_size; i < 4; ++i, s <<= 8 ) {
  96.             dst[pos+i] = char(s >> 24);
  97.         }
  98.         for ( size_t i = 0, s = size; i < 4; ++i, s <<= 8 ) {
  99.             dst[pos+4+i] = char(s >> 24);
  100.         }
  101.         dst.resize(pos+8+real_size);
  102.         break;
  103.     }}
  104.     default:
  105.         NCBI_THROW(CLoaderException, eCompressionError,
  106.             "compression method is not implemented");
  107.     }
  108. }
  109. void CId2Compressor::CompressHeader(const SSplitterParams& params,
  110.                                     vector<char>& dst,
  111.                                     size_t)
  112. {
  113.     switch ( params.m_Compression ) {
  114.     case SSplitterParams::eCompression_none:
  115.         break;
  116.     case SSplitterParams::eCompression_nlm_zip:
  117.         sx_Append(dst, "ZIP", 4);
  118.         break;
  119.     default:
  120.         NCBI_THROW(CLoaderException, eCompressionError,
  121.             "compression method is not implemented");
  122.     }
  123. }
  124. void CId2Compressor::CompressFooter(const SSplitterParams& ,
  125.                                     vector<char>& ,
  126.                                     size_t)
  127. {
  128. }
  129. void CId2Compressor::sx_Append(vector<char>& dst,
  130.                                const char* data, size_t size)
  131. {
  132.     size_t pos = dst.size();
  133.     dst.resize(pos + size);
  134.     memcpy(&dst[pos], data, size);
  135. }
  136. END_SCOPE(objects)
  137. END_NCBI_SCOPE
  138. /*
  139. * ---------------------------------------------------------------------------
  140. * $Log: blob_splitter_params.cpp,v $
  141. * Revision 1000.2  2004/06/01 19:24:53  gouriano
  142. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  143. *
  144. * Revision 1.8  2004/05/21 21:42:14  gorelenk
  145. * Added PCH ncbi_pch.hpp
  146. *
  147. * Revision 1.7  2004/01/07 17:36:24  vasilche
  148. * Moved id2_split headers to include/objmgr/split.
  149. * Fixed include path to genbank.
  150. *
  151. * Revision 1.6  2003/12/30 16:06:14  vasilche
  152. * Compression methods moved to separate header: id2_compress.hpp.
  153. *
  154. * Revision 1.5  2003/12/18 21:15:57  vasilche
  155. * Fixed size_t <-> unsigned incompatibility.
  156. *
  157. * Revision 1.4  2003/11/26 23:04:58  vasilche
  158. * Removed extra semicolons after BEGIN_SCOPE and END_SCOPE.
  159. *
  160. * Revision 1.3  2003/11/26 17:56:02  vasilche
  161. * Implemented ID2 split in ID1 cache.
  162. * Fixed loading of splitted annotations.
  163. *
  164. * Revision 1.2  2003/11/19 22:18:05  grichenk
  165. * All exceptions are now CException-derived. Catch "exception" rather
  166. * than "runtime_error".
  167. *
  168. * Revision 1.1  2003/11/12 16:18:28  vasilche
  169. * First implementation of ID2 blob splitter withing cache.
  170. *
  171. * ===========================================================================
  172. */