| 212 | DO_EXTRACT |
| 213 | }; |
| 214 | bool GetData(i64 key, TVector<char>* buf, EGetOp op) { |
| 215 | buf->resize(0); |
| 216 | TGuard<TMutex> gg(Lock); |
| 217 | SetDataFromQueueLocked(); |
| 218 | TDataHash::iterator z = Data.find(key); |
| 219 | if (z == Data.end()) { |
| 220 | Y_ASSERT(0); |
| 221 | return false; |
| 222 | } |
| 223 | |
| 224 | if (z->second.GetData().size() == 1) { |
| 225 | if (op == DO_COPY) |
| 226 | *buf = z->second.GetData().at(0); |
| 227 | else { // DO_EXTRACT |
| 228 | buf->swap(z->second.GetData().at(0)); |
| 229 | Data.erase(z); |
| 230 | } |
| 231 | } else { |
| 232 | buf->resize(0); |
| 233 | if (op == DO_COPY) { |
| 234 | for (size_t i = 0; i < z->second.GetData().size(); ++i) { |
| 235 | buf->insert(buf->end(), z->second.GetData().at(i).begin(), z->second.GetData().at(i).end()); |
| 236 | } |
| 237 | } else { // DO_EXTRACT |
| 238 | for (size_t i = 0; i < z->second.GetData().size(); ++i) { |
| 239 | buf->insert(buf->end(), z->second.GetData().at(i).begin(), z->second.GetData().at(i).end()); |
| 240 | TVector<char>().swap(z->second.GetData().at(i)); |
| 241 | } |
| 242 | Data.erase(z); |
| 243 | } |
| 244 | } |
| 245 | return true; |
| 246 | } |
| 247 | |
| 248 | bool GetData(i64 key, TVector<TVector<char>>* buf, EGetOp op) { |
| 249 | buf->resize(0); |