/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ #include "BlobEncoder.h" #include #include #include #include #include namespace qpid { namespace store { namespace ms_sql { template void BlobEncoder::encode(const ITEM &item) { SAFEARRAYBOUND bound[1] = {0, 0}; bound[0].cElements = item.encodedSize(); blob = SafeArrayCreate(VT_UI1, 1, bound); if (S_OK != SafeArrayLock(blob)) { SafeArrayDestroy(blob); blob = 0; throw qpid::Exception("Error locking blob area for persistable item"); } try { qpid::framing::Buffer buff((char *)blob->pvData, bound[0].cElements); item.encode(buff); } catch(...) { SafeArrayUnlock(blob); SafeArrayDestroy(blob); blob = 0; throw; } this->vt = VT_ARRAY | VT_UI1; this->parray = blob; SafeArrayUnlock(blob); } template <> void BlobEncoder::encode(const boost::intrusive_ptr &item) { // NOTE! If this code changes, verify the recovery code in MessageRecordset SAFEARRAYBOUND bound[1] = {0, 0}; bound[0].cElements = item->encodedSize() + sizeof(uint32_t); blob = SafeArrayCreate(VT_UI1, 1, bound); if (S_OK != SafeArrayLock(blob)) { SafeArrayDestroy(blob); blob = 0; throw qpid::Exception("Error locking blob area for message"); } try { uint32_t headerSize = item->encodedHeaderSize(); qpid::framing::Buffer buff((char *)blob->pvData, bound[0].cElements); buff.putLong(headerSize); item->encode(buff); } catch(...) { SafeArrayUnlock(blob); SafeArrayDestroy(blob); blob = 0; throw; } this->vt = VT_ARRAY | VT_UI1; this->parray = blob; SafeArrayUnlock(blob); } template <> void BlobEncoder::encode(const std::string &item) { SAFEARRAYBOUND bound[1] = {0, 0}; bound[0].cElements = item.size(); blob = SafeArrayCreate(VT_UI1, 1, bound); if (S_OK != SafeArrayLock(blob)) { SafeArrayDestroy(blob); blob = 0; throw qpid::Exception("Error locking blob area for string"); } memcpy_s(blob->pvData, item.size(), item.data(), item.size()); this->vt = VT_ARRAY | VT_UI1; this->parray = blob; SafeArrayUnlock(blob); } BlobEncoder::BlobEncoder(const qpid::broker::Persistable &item) : blob(0) { encode(item); } BlobEncoder::BlobEncoder(const boost::intrusive_ptr &msg) : blob(0) { encode(msg); } BlobEncoder::BlobEncoder(const qpid::framing::FieldTable &fields) : blob(0) { encode(fields); } BlobEncoder::BlobEncoder(const std::string &data) : blob(0) { encode(data); } BlobEncoder::~BlobEncoder() { if (blob) SafeArrayDestroy(blob); blob = 0; this->parray = 0; } }}} // namespace qpid::store::ms_sql