SimplePropertiesSection.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <SimpleProperties.hpp>
  14. #include <TransporterDefinitions.hpp>
  15. #include "LongSignal.hpp"
  16. SimplePropertiesSectionReader::SimplePropertiesSectionReader
  17. (struct SegmentedSectionPtr & ptr, class SectionSegmentPool & pool)
  18.   : m_pool(pool)
  19. {
  20.   if(ptr.p == 0){
  21.     m_pos = 0;
  22.     m_len = 0;
  23.     m_head = 0;
  24.     m_currentSegment = 0;
  25.   } else {
  26.     m_pos = 0;
  27.     m_len = ptr.p->m_sz;
  28.     m_head = ptr.p;
  29.     m_currentSegment = ptr.p;
  30.   }
  31.   first();
  32. }
  33.   
  34. void
  35. SimplePropertiesSectionReader::reset(){
  36.   m_pos = 0;
  37.   m_currentSegment = m_head;
  38. }
  39. bool
  40. SimplePropertiesSectionReader::step(Uint32 len){
  41.   if(m_pos + len >= m_len) {
  42.     m_pos++;
  43.     return false;
  44.   }
  45.   while(len > SectionSegment::DataLength){
  46.     m_currentSegment = m_pool.getPtr(m_currentSegment->m_nextSegment);
  47.     len -= SectionSegment::DataLength;
  48.     m_pos += SectionSegment::DataLength;
  49.   }
  50.   
  51.   Uint32 ind = m_pos % SectionSegment::DataLength;
  52.   while(len > 0){
  53.     len--;
  54.     m_pos++;
  55.     
  56.     ind++;
  57.     if(ind == SectionSegment::DataLength){
  58.       ind = 0;
  59.       m_currentSegment = m_pool.getPtr(m_currentSegment->m_nextSegment);
  60.     }
  61.   }
  62.   return true;
  63. }
  64. bool
  65. SimplePropertiesSectionReader::getWord(Uint32 * dst){
  66.   if (peekWord(dst)) {
  67.     step(1);
  68.     return true;
  69.   }
  70.   return false;
  71. }
  72. bool
  73. SimplePropertiesSectionReader::peekWord(Uint32 * dst) const {
  74.   if(m_pos < m_len){
  75.     Uint32 ind = m_pos % SectionSegment::DataLength; 
  76.     * dst = m_currentSegment->theData[ind];
  77.     return true;
  78.   }
  79.   return false;
  80. }
  81. bool
  82. SimplePropertiesSectionReader::peekWords(Uint32 * dst, Uint32 len) const {
  83.   if(m_pos + len > m_len){
  84.     return false;
  85.   }
  86.   Uint32 ind = (m_pos % SectionSegment::DataLength);
  87.   Uint32 left = (SectionSegment::DataLength - ind);
  88.   SectionSegment * p = m_currentSegment;
  89.   while(len > left){
  90.     memcpy(dst, &p->theData[ind], 4 * left);
  91.     dst += left;
  92.     len -= left;
  93.     ind = 0;
  94.     left = SectionSegment::DataLength;
  95.     p = m_pool.getPtr(p->m_nextSegment);
  96.   }
  97.   
  98.   memcpy(dst, &p->theData[ind], 4 * len);      
  99.   return true;
  100. }
  101. bool
  102. SimplePropertiesSectionReader::getWords(Uint32 * dst, Uint32 len){
  103.   if(peekWords(dst, len)){
  104.     step(len);
  105.     return true;
  106.   }
  107.   return false;
  108. }
  109. SimplePropertiesSectionWriter::SimplePropertiesSectionWriter(class SectionSegmentPool & pool)
  110.   : m_pool(pool)
  111. {
  112.   Ptr<SectionSegment> first;
  113.   if(m_pool.seize(first)){
  114.     ;
  115.   } else {
  116.     m_pos = -1;
  117.     m_head = 0;
  118.     m_currentSegment = 0;
  119.     m_prevPtrI = RNIL;
  120.     return;
  121.   }
  122.   m_sz = 0;
  123.   m_pos = 0;
  124.   m_head = first.p;
  125.   m_head->m_lastSegment = first.i;
  126.   m_currentSegment = first.p;
  127.   m_prevPtrI = RNIL;
  128. }
  129.   
  130. bool
  131. SimplePropertiesSectionWriter::reset(){
  132.   if(m_pos >= 0){
  133.     m_pos = 0;
  134.     return true;
  135.   }
  136.   return false;
  137. }
  138. bool
  139. SimplePropertiesSectionWriter::putWord(Uint32 val){
  140.   return putWords(&val, 1);
  141. }
  142. bool
  143. SimplePropertiesSectionWriter::putWords(const Uint32 * src, Uint32 len){
  144.   Uint32 left = SectionSegment::DataLength - m_pos;
  145.   
  146.   while(len >= left){
  147.     memcpy(&m_currentSegment->theData[m_pos], src, 4 * left);
  148.     Ptr<SectionSegment> next;    
  149.     if(m_pool.seize(next)){
  150.       m_prevPtrI = m_currentSegment->m_lastSegment;
  151.       m_currentSegment->m_nextSegment = next.i;
  152.       next.p->m_lastSegment = next.i;
  153.       m_currentSegment = next.p;
  154.       
  155.       len -= left;
  156.       src += left;
  157.       m_sz += left;
  158.       
  159.       left = SectionSegment::DataLength;
  160.       m_pos = 0;
  161.     } else {
  162.       abort();
  163.       return false;
  164.     }
  165.   }
  166.   memcpy(&m_currentSegment->theData[m_pos], src, 4 * len);
  167.   m_sz += len;
  168.   m_pos += len;
  169.   
  170.   assert(m_pos < (int)SectionSegment::DataLength);
  171.   return true;
  172. }
  173. void
  174. SimplePropertiesSectionWriter::getPtr(struct SegmentedSectionPtr & dst){
  175.   // Set last ptr and size
  176.   if(m_pos >= 0){
  177.     dst.p = m_head;
  178.     dst.i = m_head->m_lastSegment;
  179.     dst.sz = m_sz;
  180.     m_head->m_sz = m_sz;
  181.     m_head->m_lastSegment = m_currentSegment->m_lastSegment;
  182.     if((m_pos % SectionSegment::DataLength) == 0){
  183.       m_pool.release(m_currentSegment->m_lastSegment);
  184.       m_head->m_lastSegment = m_prevPtrI;
  185.     }
  186.     m_sz = 0;
  187.     m_pos = -1;
  188.     m_head = m_currentSegment = 0;
  189.     m_prevPtrI = RNIL;
  190.     return ;
  191.   }
  192.   dst.p = 0;
  193.   dst.sz = 0;
  194.   dst.i = RNIL;
  195.   m_pool.release(m_head->m_lastSegment);
  196.   
  197.   m_sz = 0;
  198.   m_pos = -1;
  199.   m_head = m_currentSegment = 0;
  200.   m_prevPtrI = RNIL;
  201. }