1<?php
2/**
3 * SimplePie
4 *
5 * A PHP-Based RSS and Atom Feed Framework.
6 * Takes the hard work out of managing a complete RSS/Atom solution.
7 *
8 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without modification, are
12 * permitted provided that the following conditions are met:
13 *
14 * 	* Redistributions of source code must retain the above copyright notice, this list of
15 * 	  conditions and the following disclaimer.
16 *
17 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
18 * 	  of conditions and the following disclaimer in the documentation and/or other materials
19 * 	  provided with the distribution.
20 *
21 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
22 * 	  to endorse or promote products derived from this software without specific prior
23 * 	  written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
28 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 *
35 * @package SimplePie
36 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
37 * @author Ryan Parman
38 * @author Sam Sneddon
39 * @author Ryan McCue
40 * @link http://simplepie.org/ SimplePie
41 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
42 */
43
44/**
45 * Base class for database-based caches
46 *
47 * @package SimplePie
48 * @subpackage Caching
49 */
50abstract class SimplePie_Cache_DB implements SimplePie_Cache_Base
51{
52	/**
53	 * Helper for database conversion
54	 *
55	 * Converts a given {@see SimplePie} object into data to be stored
56	 *
57	 * @param SimplePie $data
58	 * @return array First item is the serialized data for storage, second item is the unique ID for this item
59	 */
60	protected static function prepare_simplepie_object_for_cache($data)
61	{
62		$items = $data->get_items();
63		$items_by_id = array();
64
65		if (!empty($items))
66		{
67			foreach ($items as $item)
68			{
69				$items_by_id[$item->get_id()] = $item;
70			}
71
72			if (count($items_by_id) !== count($items))
73			{
74				$items_by_id = array();
75				foreach ($items as $item)
76				{
77					$items_by_id[$item->get_id(true)] = $item;
78				}
79			}
80
81			if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
82			{
83				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
84			}
85			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
86			{
87				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
88			}
89			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
90			{
91				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
92			}
93			elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
94			{
95				$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
96			}
97			else
98			{
99				$channel = null;
100			}
101
102			if ($channel !== null)
103			{
104				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
105				{
106					unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
107				}
108				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
109				{
110					unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
111				}
112				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
113				{
114					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
115				}
116				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
117				{
118					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
119				}
120				if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
121				{
122					unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
123				}
124			}
125			if (isset($data->data['items']))
126			{
127				unset($data->data['items']);
128			}
129			if (isset($data->data['ordered_items']))
130			{
131				unset($data->data['ordered_items']);
132			}
133		}
134		return array(serialize($data->data), $items_by_id);
135	}
136}
137