Skip to content

Commit 56b0909

Browse files
committed
Optimized Couchdb document storage
1 parent a6fe083 commit 56b0909

1 file changed

Lines changed: 49 additions & 3 deletions

File tree

lib/Phpfastcache/Drivers/Couchdb/Driver.php

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,12 @@ protected function driverRead(CacheItemInterface $item)
145145
throw new PhpfastcacheDriverException('Got error while trying to get a document: ' . $e->getMessage(), 0, $e);
146146
}
147147

148-
if ($response->status === 404 || empty($response->body['data'])) {
148+
if ($response->status === 404 || empty($response->body[ExtendedCacheItemPoolInterface::DRIVER_DATA_WRAPPER_INDEX])) {
149149
return null;
150150
}
151151

152152
if ($response->status === 200) {
153-
return $this->decode($response->body['data']);
153+
return $this->decode($response->body);
154154
}
155155

156156
throw new PhpfastcacheDriverException('Got unexpected HTTP status: ' . $response->status);
@@ -170,7 +170,7 @@ protected function driverWrite(CacheItemInterface $item): bool
170170
if ($item instanceof Item) {
171171
try {
172172
$this->instance->putDocument(
173-
['data' => $this->encode($this->driverPreWrap($item))],
173+
$this->encodeDocument($this->driverPreWrap($item)),
174174
$this->getCouchDbItemKey($item),
175175
$this->getLatestDocumentRevision($this->getCouchDbItemKey($item))
176176
);
@@ -247,4 +247,50 @@ protected function driverClear(): bool
247247

248248
return true;
249249
}
250+
251+
/**
252+
* @param array $data
253+
* @return array
254+
*/
255+
protected function encodeDocument(array $data): array
256+
{
257+
$data[ExtendedCacheItemPoolInterface::DRIVER_DATA_WRAPPER_INDEX] = $this->encode($data[ExtendedCacheItemPoolInterface::DRIVER_DATA_WRAPPER_INDEX]);
258+
259+
return $data;
260+
}
261+
262+
/**
263+
* Specific document decoder for Couchdb
264+
* since we dont store encoded version
265+
* for performance purposes
266+
*
267+
* @param $value
268+
* @return mixed
269+
* @throws \Exception
270+
*/
271+
protected function decode($value)
272+
{
273+
$value[ExtendedCacheItemPoolInterface::DRIVER_DATA_WRAPPER_INDEX] = \unserialize($value[ExtendedCacheItemPoolInterface::DRIVER_DATA_WRAPPER_INDEX], ['allowed_classes' => true]);
274+
275+
$value[ExtendedCacheItemPoolInterface::DRIVER_EDATE_WRAPPER_INDEX] = new \DateTime(
276+
$value[ExtendedCacheItemPoolInterface::DRIVER_EDATE_WRAPPER_INDEX]['date'],
277+
new \DateTimeZone($value[ExtendedCacheItemPoolInterface::DRIVER_EDATE_WRAPPER_INDEX]['timezone'])
278+
);
279+
280+
if(isset($value[ExtendedCacheItemPoolInterface::DRIVER_CDATE_WRAPPER_INDEX])){
281+
$value[ExtendedCacheItemPoolInterface::DRIVER_CDATE_WRAPPER_INDEX] = new \DateTime(
282+
$value[ExtendedCacheItemPoolInterface::DRIVER_CDATE_WRAPPER_INDEX]['date'],
283+
new \DateTimeZone($value[ExtendedCacheItemPoolInterface::DRIVER_CDATE_WRAPPER_INDEX]['timezone'])
284+
);
285+
}
286+
287+
if(isset($value[ExtendedCacheItemPoolInterface::DRIVER_MDATE_WRAPPER_INDEX])){
288+
$value[ExtendedCacheItemPoolInterface::DRIVER_MDATE_WRAPPER_INDEX] = new \DateTime(
289+
$value[ExtendedCacheItemPoolInterface::DRIVER_MDATE_WRAPPER_INDEX]['date'],
290+
new \DateTimeZone($value[ExtendedCacheItemPoolInterface::DRIVER_MDATE_WRAPPER_INDEX]['timezone'])
291+
);
292+
}
293+
294+
return $value;
295+
}
250296
}

0 commit comments

Comments
 (0)