| inlib
    1.2.0
    | 


| Public Member Functions | |
| virtual const std::string & | store_cls () const | 
| virtual bool | stream (buffer &a_buffer) const | 
| basket (ifile &a_file, seek a_seek_parent_dir, const std::string &a_object_name, const std::string &a_object_title, const std::string &a_object_class, uint32 a_basket_size) | |
| virtual | ~basket () | 
| buffer & | datbuf () | 
| bool | update (uint32 a_offset) | 
| bool | write_on_file (uint16 a_cycle, uint32 &a_nbytes) | 
| Static Public Member Functions | |
| static const std::string & | s_class () | 
| Protected Member Functions | |
| basket (const basket &a_from) | |
| basket & | operator= (const basket &a_from) | 
| uint32 | header_record_size (uint32 a_version) const | 
| bool | _stream_header (buffer &a_buffer, char a_flag=0) const | 
| Protected Attributes | |
| buffer | m_data | 
| uint32 | m_nev_buf_size | 
| uint32 | m_nev | 
| uint32 | m_last | 
| uint32 * | m_entry_offset | 
| int * | m_displacement | 
| inlib::wroot::basket::basket | ( | ifile & | a_file, | 
| seek | a_seek_parent_dir, | ||
| const std::string & | a_object_name, | ||
| const std::string & | a_object_title, | ||
| const std::string & | a_object_class, | ||
| uint32 | a_basket_size | ||
| ) |  [inline] | 
Definition at line 95 of file basket.
:key(a_file,a_seek_parent_dir, a_object_name,a_object_title,a_object_class,0) ,m_data(a_file.out(),a_file.byte_swap(),a_basket_size) ,m_nev_buf_size(1000) ,m_nev(0) ,m_last(0) ,m_entry_offset(0) ,m_displacement(0) { #ifdef INLIB_MEM mem::increment(s_class().c_str()); #endif m_key_length = header_record_size(m_version); initialize(0); if(m_nev_buf_size) m_entry_offset = new uint32[m_nev_buf_size]; }
| virtual inlib::wroot::basket::~basket | ( | ) |  [inline, virtual] | 
Definition at line 119 of file basket.
                   {
    delete [] m_entry_offset;
    delete [] m_displacement;
    m_entry_offset = 0;
    m_displacement = 0;
#ifdef INLIB_MEM
    mem::decrement(s_class().c_str());
#endif
  }
| inlib::wroot::basket::basket | ( | const basket & | a_from | ) |  [inline, protected] | 
Definition at line 129 of file basket.
: ibo(a_from) ,key(a_from) ,m_data(m_file.out(),m_file.byte_swap(),256) ,m_nev_buf_size(a_from.m_nev_buf_size) ,m_nev(a_from.m_nev) ,m_last(a_from.m_last) ,m_entry_offset(0) ,m_displacement(0) { #ifdef INLIB_MEM mem::increment(s_class().c_str()); #endif }
| bool inlib::wroot::basket::_stream_header | ( | buffer & | a_buffer, | 
| char | a_flag = 0 | ||
| ) | const  [inline, protected] | 
Definition at line 324 of file basket.
                                                              {
   {uint32 l = key::record_size(m_version);
    if((a_buffer.length()+l)>a_buffer.size()) {
      if(!a_buffer.expand(a_buffer.size()+l)) return false;
    }
    wbuf wb(m_file.out(),m_file.byte_swap(),a_buffer.max_pos(),a_buffer.pos());
    if(!key::to_buffer(wb)) return false;}
    if(!a_buffer.write_version(2)) return false;
    if(!a_buffer.write(m_buf_size)) return false;
    if(!a_buffer.write(m_nev_buf_size)) return false;
    if(!a_buffer.write(m_nev)) return false;
    if(!a_buffer.write(m_last)) return false;
    if(!a_buffer.write(a_flag)) return false;
    return true;
  }
| buffer& inlib::wroot::basket::datbuf | ( | ) |  [inline] | 
Definition at line 143 of file basket.
                                         {
    key::operator=(a_from);
    m_nev_buf_size = a_from.m_nev_buf_size;
    m_nev = a_from.m_nev;
    m_last = a_from.m_last;
    return *this;
  }
| static const std::string& inlib::wroot::basket::s_class | ( | ) |  [inline, static] | 
Reimplemented from inlib::wroot::key.
Definition at line 17 of file basket.
                                    {
    static const std::string s_v("inlib::wroot::basket");
    return s_v;
  }
| virtual const std::string& inlib::wroot::basket::store_cls | ( | ) | const  [inline, virtual] | 
Implements inlib::wroot::ibo.
Definition at line 22 of file basket.
                                             {
    static const std::string s_v("TBasket");
    return s_v;
  }
| virtual bool inlib::wroot::basket::stream | ( | buffer & | a_buffer | ) | const  [inline, virtual] | 
Implements inlib::wroot::ibo.
Definition at line 26 of file basket.
                                              {
    // in principle we pass here only for the last basket
    // of a branch when it is streamed from branch::stream().
    // some consitency checks :
    if(!m_data.length()) {
      // to be sure to not work on a basket already written
      // with write_on_file()
      m_file.out() << "inlib::wroot::basket::stream :" 
                   << " m_data.length() is null."
                   << std::endl;
      return false;
    }
    if(m_seek_key) {
      m_file.out() << "inlib::wroot::basket::stream :" 
                   << " m_seek_key is not null."
                   << std::endl;
      return false;
    }
    if(m_last) {
      m_file.out() << "inlib::wroot::basket::stream :" 
                   << " m_last is not null."
                   << std::endl;
      return false;
    }
    if(!m_entry_offset) {
      m_file.out() << "inlib::wroot::basket::stream :" 
                   << " m_entry_offset is null."
                   << std::endl;
      return false;
    }
   {uint32 last = m_data.length()+m_key_length;
    if(last>m_last) {
      const_cast<basket&>(*this).m_last = last;
    }}
    if(m_last>m_buf_size) {
      const_cast<basket&>(*this).m_buf_size = m_last;
    }
    char flag = 11;
    if(m_displacement)  flag += 40;
    if(!_stream_header(a_buffer,flag)) return false;
    if(m_entry_offset && m_nev) {
      if(!a_buffer.write_array(m_entry_offset,m_nev)) return false;
      if(m_displacement) {
        if(!a_buffer.write_array(m_displacement,m_nev)) return false;
      }
    }
 
    if(m_data.to_displace()) {
      //NOTE : how / when handle the displacements ?
      m_file.out() << "inlib::wroot::basket::stream :" 
                   << " WARNING : m_data buffer has offsets to displace."
                   << std::endl;
      //if(!const_cast<basket&>(*this).m_data.displace_mapped(m_key_length))
      //  return false; //???
    }
    buffer bref(m_file.out(),m_file.byte_swap(),256);
    if(!_stream_header(bref)) return false; //then header stored twice !
    //if(bref.length()!=m_key_length) {}
    if(!bref.write_fast_array(m_data.buf(),m_data.length())) return false;
    if(!a_buffer.write_fast_array(bref.buf(),bref.length())) return false;
    return true;
  }
| bool inlib::wroot::basket::update | ( | uint32 | a_offset | ) |  [inline] | 
Definition at line 153 of file basket.
                               {
    if(m_entry_offset) {
      if((m_nev+1)>=m_nev_buf_size) { //why +1 ?
        uint32 newsize = mx<uint32>(10,2*m_nev_buf_size);
        if(!realloc<uint32>(m_entry_offset,newsize,m_nev_buf_size,true)){
          m_file.out() << "inlib::wroot::basket::update : realloc failed."
                << std::endl;
          return false;
        }
        if(m_displacement) {
          if(!realloc<int>(m_displacement,newsize,m_nev_buf_size,true)){
            m_file.out() << "inlib::wroot::basket::update : realloc failed."
                  << std::endl;
            return false;
          }
        }
        m_nev_buf_size = newsize;
        // Update branch only for the first 10 baskets
        //if (fBranch.writeBasket() < 10) 
        //  fBranch.setEntryOffsetLength(newsize);
      }
      m_entry_offset[m_nev] = a_offset;
      //if (skipped!=offset && !m_displacement){
      //  m_displacement = new int[m_nevSize];
      //  for(int i=0;i<m_nev_buf_size;i++)
      //     m_displacement[i] = m_entry_offset[i];
      //}
      //if (m_displacement) {
      //  m_displacement[m_nev] = skipped;
      //  fBufferRef->setDisplacement(skipped);
      //}
    }
    m_nev++;
    return true;
  }
Definition at line 193 of file basket.
                                                      {
    // write m_data buffer into file.
    //NOTE : m_data does not contain the key at its head.
    //       At this point m_seek_key should be 0.
    a_nbytes = 0;
    if(m_seek_key) {
      m_file.out() << "inlib::wroot::basket::write_on_file :" 
                   << " m_seek_key should be 0."
                   << std::endl;
      return false;
    }
    if(m_version>1000) {
    } else {
      if(m_file.END()>START_BIG_FILE()) {
        //GB : enforce m_version>1000 if m_version is still 2 but
        //     seek_key>START_BIG_FILE. If not doing that we shall
        //     write a big m_seek_key on a seek32 and then have
        //     a problem when reading.
  
        //m_file.out() << "inlib::wroot::basket::write_on_file : " 
        //             << " WARNING : pos>START_BIG_FILE."
        //             << std::endl;
        m_version += 1000;
        m_key_length += 8;
  
        if(m_entry_offset) {
          for(uint32 i=0;i<m_nev;i++) m_entry_offset[i] += 8;
          if(m_displacement) {
            //??? Do we have to shift them ?
            m_file.out() << "inlib::wroot::basket::write_on_file : " 
                         << " displace logic : m_displacement not null."
                         << std::endl;
          }
        }
  
      }
    }
    // Transfer m_entry_offset table at the end of fBuffer. Offsets to fBuffer
    // are transformed in entry length to optimize compression algorithm.
    m_last = m_key_length+m_data.length();
    if(m_entry_offset) {
      if(!m_data.write_array<uint32>(m_entry_offset,m_nev+1)) { //GB : why +1 ?
        delete [] m_entry_offset; 
        m_entry_offset = 0;
        return false;
      }
      delete [] m_entry_offset; 
      m_entry_offset = 0;
      if(m_displacement) {
        if(!m_data.write_array<int>(m_displacement,m_nev+1)) {
          delete [] m_displacement; 
          m_displacement = 0;
          return false;
        }
        delete [] m_displacement; 
        m_displacement = 0;
      }
    }
    
    m_object_size = m_data.length(); //uncompressed size.
    m_cycle = a_cycle;
    if(!m_data.displace_mapped(m_key_length)) return false;
    char* kbuf = 0;
    uint32 klen = 0;
    bool kdelete = false;
    m_file.compress_buffer(m_data,kbuf,klen,kdelete);
    if(klen>m_object_size) {
      m_file.out() << "inlib::wroot::basket::write_on_file :" 
                   << " compression anomaly "
                   << " m_object_size " << m_object_size
                   << " klen " << klen
                   << std::endl;
      if(kdelete) delete [] kbuf;
      return false;
    }
    if(!initialize(klen)) { //it will do a file.set_END()
      m_file.out() << "inlib::wroot::basket::write_on_file :" 
                   << " initialize() failed." 
                   << std::endl;
      if(kdelete) delete [] kbuf;
      return false;
    }
    //write header of the key :
   {buffer bref(m_file.out(),m_file.byte_swap(),256);
    if(!_stream_header(bref)) return false;
    if(bref.length()!=m_key_length) {
      m_file.out() << "inlib::wroot::basket::write_on_file :" 
                   << " key len anomaly " << bref.length()
                   << " m_key_length " << m_key_length
                   << std::endl;
      if(kdelete) delete [] kbuf;
      return false;
    }
    ::memcpy(m_buffer,bref.buf(),m_key_length);}
    ::memcpy(m_buffer+m_key_length,kbuf,klen);
    if(kdelete) delete [] kbuf;
    
    uint32 nbytes;
    if(!key::write_file(nbytes)) return false;
  
    m_data.pos() = m_data.buf(); //empty m_data.
    a_nbytes = m_key_length + klen;
    return true;
  }
| buffer inlib::wroot::basket::m_data  [protected] | 
| int* inlib::wroot::basket::m_displacement  [protected] | 
| uint32* inlib::wroot::basket::m_entry_offset  [protected] | 
| uint32 inlib::wroot::basket::m_last  [protected] | 
| uint32 inlib::wroot::basket::m_nev  [protected] | 
| uint32 inlib::wroot::basket::m_nev_buf_size  [protected] | 
 1.7.5.1
 1.7.5.1