📄 simpleproperties.cpp
字号:
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <ndb_global.h>#include <SimpleProperties.hpp>#include <NdbOut.hpp>#include <NdbTCP.h>#include <UtilBuffer.hpp>boolSimpleProperties::Writer::first(){ return reset();}bool SimpleProperties::Writer::add(Uint16 key, Uint32 value){ Uint32 head = Uint32Value; head <<= 16; head += key; if(!putWord(htonl(head))) return false; return putWord(htonl(value));}boolSimpleProperties::Writer::add(const char * value, int len){ const Uint32 valLen = (len + 3) / 4; if ((len % 4) == 0) return putWords((Uint32*)value, valLen); const Uint32 putLen= valLen - 1; if (!putWords((Uint32*)value, putLen)) return false; // Special handling of last bytes union { Uint32 lastWord; char lastBytes[4]; } tmp; tmp.lastWord =0 ; memcpy(tmp.lastBytes, value + putLen*4, len - putLen*4); return putWord(tmp.lastWord);}boolSimpleProperties::Writer::add(Uint16 key, const char * value){ Uint32 head = StringValue; head <<= 16; head += key; if(!putWord(htonl(head))) return false; Uint32 strLen = strlen(value) + 1; // Including NULL-byte if(!putWord(htonl(strLen))) return false; return add(value, (int)strLen);}boolSimpleProperties::Writer::add(Uint16 key, const void* value, int len){ Uint32 head = BinaryValue; head <<= 16; head += key; if(!putWord(htonl(head))) return false; if(!putWord(htonl(len))) return false; return add((const char*)value, len);}SimpleProperties::Reader::Reader(){ m_itemLen = 0;}bool SimpleProperties::Reader::first(){ reset(); m_itemLen = 0; return readValue();}boolSimpleProperties::Reader::next(){ return readValue();} boolSimpleProperties::Reader::valid() const { return m_type != InvalidValue;}Uint16SimpleProperties::Reader::getKey() const{ return m_key;}Uint16SimpleProperties::Reader::getValueLen() const { switch(m_type){ case Uint32Value: return 4; case StringValue: case BinaryValue: return m_strLen; case InvalidValue: return 0; } return 0;}SimpleProperties::ValueTypeSimpleProperties::Reader::getValueType() const { return m_type;} Uint32SimpleProperties::Reader::getUint32() const { return m_ui32_value;}char * SimpleProperties::Reader::getString(char * dst) const { if(peekWords((Uint32*)dst, m_itemLen)) return dst; return 0;}boolSimpleProperties::Reader::readValue(){ if(!step(m_itemLen)){ m_type = InvalidValue; return false; } Uint32 tmp; if(!getWord(&tmp)){ m_type = InvalidValue; return false; } tmp = ntohl(tmp); m_key = tmp & 0xFFFF; m_type = (SimpleProperties::ValueType)(tmp >> 16); switch(m_type){ case Uint32Value: m_itemLen = 1; if(!peekWord(&m_ui32_value)) return false; m_ui32_value = ntohl(m_ui32_value); return true; case StringValue: case BinaryValue: if(!getWord(&tmp)) return false; m_strLen = ntohl(tmp); m_itemLen = (m_strLen + 3)/4; return true; default: m_itemLen = 0; m_type = InvalidValue; return false; }}SimpleProperties::UnpackStatus SimpleProperties::unpack(Reader & it, void * dst, const SP2StructMapping _map[], Uint32 mapSz, bool ignoreMinMax, bool ignoreUnknownKeys){ do { if(!it.valid()) break; bool found = false; Uint16 key = it.getKey(); for(Uint32 i = 0; i<mapSz; i++){ if(key == _map[i].Key){ found = true; if(_map[i].Type == InvalidValue) return Break; if(_map[i].Type != it.getValueType()) return TypeMismatch; char * _dst = (char *)dst; _dst += _map[i].Offset; switch(it.getValueType()){ case Uint32Value:{ const Uint32 val = it.getUint32(); if(!ignoreMinMax){ if(val < _map[i].minValue) return ValueTooLow; if(val > _map[i].maxValue) return ValueTooHigh; } * ((Uint32 *)_dst) = val; break; } case BinaryValue: case StringValue:{ unsigned len = it.getValueLen(); if(len < _map[i].minValue) return ValueTooLow; if(len > _map[i].maxValue) return ValueTooHigh; it.getString(_dst); break; } default: abort(); } break; } } if(!found && !ignoreUnknownKeys) return UnknownKey; } while(it.next()); return Eof;}SimpleProperties::UnpackStatus SimpleProperties::pack(Writer & it, const void * __src, const SP2StructMapping _map[], Uint32 mapSz, bool ignoreMinMax){ const char * _src = (const char *)__src; for(Uint32 i = 0; i<mapSz; i++){ bool ok = false; const char * src = _src + _map[i].Offset; switch(_map[i].Type){ case SimpleProperties::InvalidValue: ok = true; break; case SimpleProperties::Uint32Value:{ Uint32 val = * ((Uint32*)src); if(!ignoreMinMax){ if(val < _map[i].minValue) return ValueTooLow; if(val > _map[i].maxValue) return ValueTooHigh; } ok = it.add(_map[i].Key, val); } break; case SimpleProperties::BinaryValue:{ const char * src_len = _src + _map[i].Length_Offset; Uint32 len = *((Uint32*)src_len); if(!ignoreMinMax){ if(len == _map[i].maxValue) return ValueTooHigh; } ok = it.add(_map[i].Key, src, len); break; } case SimpleProperties::StringValue: if(!ignoreMinMax){ size_t len = strlen(src); if(len == _map[i].maxValue) return ValueTooHigh; } ok = it.add(_map[i].Key, src); break; } if(!ok) return OutOfMemory; } return Eof;}voidSimpleProperties::Reader::printAll(NdbOut& ndbout){ char tmp[1024]; for(first(); valid(); next()){ switch(getValueType()){ case SimpleProperties::Uint32Value: ndbout << "Key: " << getKey() << " value(" << getValueLen() << ") : " << getUint32() << endl; break; case SimpleProperties::BinaryValue: case SimpleProperties::StringValue: if(getValueLen() < 1024){ getString(tmp); ndbout << "Key: " << getKey() << " value(" << getValueLen() << ") : " << "\"" << tmp << "\"" << endl; } else { ndbout << "Key: " << getKey() << " value(" << getValueLen() << ") : " << "\"" << "<TOO LONG>" << "\"" << endl; } break; default: ndbout << "Unknown type for key: " << getKey() << " type: " << (Uint32)getValueType() << endl; } }}SimplePropertiesLinearReader::SimplePropertiesLinearReader(const Uint32 * src, Uint32 len){ m_src = src; m_len = len; m_pos = 0; first();}void SimplePropertiesLinearReader::reset() { m_pos = 0;}bool SimplePropertiesLinearReader::step(Uint32 len){ m_pos += len; return m_pos < m_len;} boolSimplePropertiesLinearReader::getWord(Uint32 * dst) { if(m_pos<m_len){ * dst = m_src[m_pos++]; return true; } return false;}bool SimplePropertiesLinearReader::peekWord(Uint32 * dst) const { if(m_pos<m_len){ * dst = m_src[m_pos]; return true; } return false;}bool SimplePropertiesLinearReader::peekWords(Uint32 * dst, Uint32 len) const { if(m_pos + len <= m_len){ memcpy(dst, &m_src[m_pos], 4 * len); return true; } return false;}LinearWriter::LinearWriter(Uint32 * src, Uint32 len){ m_src = src; m_len = len; reset();}bool LinearWriter::reset() { m_pos = 0; return m_len > 0;}bool LinearWriter::putWord(Uint32 val){ if(m_pos < m_len){ m_src[m_pos++] = val; return true; } return false;}bool LinearWriter::putWords(const Uint32 * src, Uint32 len){ if(m_pos + len <= m_len){ memcpy(&m_src[m_pos], src, 4 * len); m_pos += len; return true; } return false;}Uint32LinearWriter::getWordsUsed() const { return m_pos;}UtilBufferWriter::UtilBufferWriter(UtilBuffer & b) : m_buf(b){ reset();}bool UtilBufferWriter::reset() { m_buf.clear(); return true;}bool UtilBufferWriter::putWord(Uint32 val){ return (m_buf.append(&val, 4) == 0);}bool UtilBufferWriter::putWords(const Uint32 * src, Uint32 len){ return (m_buf.append(src, 4 * len) == 0);}Uint32UtilBufferWriter::getWordsUsed() const { return m_buf.length() / 4;}#if 0LinearPagesReader::LinearPagesReader(const Uint32 * base, Uint32 pageSize, Uint32 headerSize, Uint32 noOfPages, Uint32 len){ m_base = base; m_pageSz = pageSize; m_noOfPages = noOfPages; m_pageHeaderSz = headerSize; m_len = len; reset();}void LinearPagesReader::reset() { m_pos = 0;}bool LinearPagesReader::step(Uint32 len){ m_pos += len; return m_pos < m_len;}bool LinearPagesReader::getWord(Uint32 * dst) { if(m_pos<m_len){ * dst = m_base[getPos(m_pos++)]; return true; } return false;}bool LinearPagesReader::peekWord(Uint32 * dst) const { if(m_pos<m_len){ * dst = m_base[getPos(m_pos)]; return true; } return false;}bool LinearPagesReader::peekWords(Uint32 * dst, Uint32 len) const { if(m_pos + len <= m_len){ for(Uint32 i = 0; i<len; i++) * (dst + i) = m_base[getPos(m_pos + i)]; return true; } return false;}Uint32 LinearPagesReader::getPos(Uint32 pos) const { const Uint32 sz = (m_pageSz - m_pageHeaderSz); Uint32 no = pos / sz; Uint32 in = pos % sz; return no * m_pageSz + m_pageHeaderSz + in;}LinearPagesWriter::LinearPagesWriter(Uint32 * base, Uint32 pageSize, Uint32 noOfPages, Uint32 headerSize){ m_base = base; m_pageSz = pageSize; m_noOfPages = noOfPages; m_pageHeaderSz = headerSize; m_len = noOfPages * (pageSize - headerSize); reset();}bool LinearPagesWriter::putWord(Uint32 val){ if(m_pos < m_len){ m_base[getPos(m_pos++)] = val; return true; } return false;}bool LinearPagesWriter::putWords(const Uint32 * src, Uint32 len){ if(m_pos + len <= m_len){ for(Uint32 i = 0; i<len; i++) m_base[getPos(m_pos++)] = src[i]; return true; } return false;}#if 0Uint32 LinearPagesWriter::getWordsUsed() const { return getPos(m_pos);}#endifUint32 LinearPagesWriter::getPagesUsed() const { return m_pos / (m_pageSz - m_pageHeaderSz);}Uint32 LinearPagesWriter::getPos(Uint32 pos) const { const Uint32 sz = (m_pageSz - m_pageHeaderSz); Uint32 no = pos / sz; Uint32 in = pos % sz; return no * m_pageSz + m_pageHeaderSz + in;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -