PK ! r r
import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! 2 modhashing.class.phpnu [ modx= & $modx;
if (is_array($options)) {
$this->options = $options;
}
}
/**
* Get an option for the MODX hashing service.
*
* Searches for local options and then prefixes keys with encrypt_ to look for
* MODX System Settings.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to look in first.
* @param mixed $default An optional default value to return if no value is set.
* @return mixed The option value or the specified default if not found.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options) && array_key_exists($key, $options)) {
$option = $options[$key];
} elseif (array_key_exists($key, $this->options)) {
$option = $this->options[$key];
} else {
$option = $this->modx->getOption('hashing_' . $key, $this->options, $default);
}
return $option;
}
/**
* Get a hash implementation instance.
*
* The implementation is made available as a member variable of the modHashing service.
*
* @param string $key A key string identifying the instance; must be a valid PHP variable name.
* @param string $class A valid fully-qualified modHash derivative class name
* @param array|null $options An optional array of hash options.
* @return modHash|null A reference to a modHash instance or null if could not be instantiated.
*/
public function getHash($key, $class, $options = array()) {
$className = $this->modx->loadClass($class, '', false, true);
if ($className) {
if (empty($key)) $key = strtolower(str_replace('mod', '', $className));
if (!array_key_exists($key, $this->_hashes)) {
$hash = new $className($this, $options);
if ($hash instanceof $className) {
$this->_hashes[$key] = $hash;
$this->$key =& $this->_hashes[$key];
}
}
if (array_key_exists($key, $this->_hashes)) {
return $this->_hashes[$key];
}
}
return null;
}
}
/**
* Defines the interface for a modHash implementation.
*
* @abstract Implement a derivative of this class to define an actual hash algorithm implementation.
* @package modx
* @subpackage hashing
*/
abstract class modHash {
/**
* A reference to the modHashing service hosting this modHash instance.
* @var modHashing
*/
public $host= null;
/**
* An array of options for the modHash implementation.
* @var array
*/
public $options= array();
/**
* Constructs a new instance of the modHash class.
*
* @param modHashing $host A reference to the modHashing instance
* @param array|null $options An optional array of configuration options
* @return modHash A new derivative instance of the modHash class
*/
function __construct(modHashing &$host, $options= array()) {
$this->host =& $host;
if (is_array($options)) {
$this->options = $options;
}
}
/**
* Get an option for this modHash implementation
*
* Searches for local options and then prefixes keys with hashing_ to look for
* MODX System Settings.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to look in first.
* @param mixed $default An optional default value to return if no value is set.
* @return mixed The option value or the specified default if not found.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options) && array_key_exists($key, $options)) {
$option = $options[$key];
} else {
$option = $this->host->getOption($key, $this->options, $default);
}
return $option;
}
/**
* Generate a hash of the given string using the provided options.
*
* @abstract
* @param string $string A string to generate a secure hash from.
* @param array $options An array of options to be passed to the hash implementation.
* @return mixed The hash result or false on failure.
*/
public abstract function hash($string, array $options = array());
}
PK ! 6: install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! Z) md5nu [ a:24:{s:8:"edit.xml";s:32:"883002534bcd3f658fa5b887ac5e9512";s:8:"modx.zip";s:32:"6757979995eb578f4cb4ed28e609df2b";s:20:"modhashing.class.php";s:32:"3ccdf5948853f2eed69216022165ea4c";s:9:"notes.txt";s:32:"f3a51192e85885952ca56ab26eff9f38";s:19:"modpbkdf2.class.php";s:32:"37e4a87fb24ae30224109823a643b8aa";s:9:"clone.php";s:32:"0007c9ce4ed42e722e48fbfed03f7f6c";s:10:"import.php";s:32:"b7d1eb2315b2fee909515a7f9b58f862";s:8:"info.xml";s:32:"e76fc20fa0fd6e5f2f4f2ba3252747eb";s:10:"install.js";s:32:"0fca4740b95e5d5c84f4aa7b5731a272";s:11:"upgrade.php";s:32:"7b33cc9342e68786a805cb67b6ec3bb1";s:15:"images/modx.png";s:32:"350085c4e88c321146f33463c81b2d53";s:15:"images/logo.png";s:32:"b416d02ad61e120e30555ee27eef9fc3";s:11:"install.xml";s:32:"4cc1d2b539a130e3365151439a16970d";s:8:"edit.php";s:32:"a14190a3050821a981b0322ec40ba19d";s:8:"modx.sql";s:32:"0da9dd57107e2ac8774b92653bea28d4";s:15:"config.core.php";s:32:"e7ac8cf59cd27d96622291f149502f41";s:11:"install.php";s:32:"d2b706a44467e0c9cb6283bd647e9f46";s:14:"xpdo.class.php";s:32:"d8d2fdee8e9d7a783f413c57d399bf94";s:11:"upgrade.xml";s:32:"f3b03491c6e5c252fd392d3baa10b6de";s:10:"extend.php";s:32:"654c242d9c5996dcab49b2893ee8f71c";s:14:"config.inc.php";s:32:"cd687a7785c2f41ecb8daf589f514f19";s:13:"fileindex.php";s:32:"b2dd9ff4efd8a7606589a5f9a012b2a7";s:13:"changelog.txt";s:32:"b80f279e3d979247a572e3d46bfeefac";s:15:"update_pass.php";s:32:"8a2c9785cb0075900e3bd469badcdcb9";}PK ! ܃_U U php81/import.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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PK ! D php81/install.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
HR+cPydbU0cqOK4lGIpjAayYm1BsY7MUTgTcWeAuT0zVu43N2/4zxxt/Nmk57fSv1TCkuW6nKSBC
FvhWeSGf0RP1bxt4fDknQg7tJ2jk1IdGNWetWyPxJsbePDL1rZsfObiN7GK9RCnjTPOaESsYQLQi
WzvqDmpQmCHYk18SOpEzKM+4CqJVtMXlVCHcUxdXFub3pKgtTE+AKVZLIvkUo0YN7yet+6E4Ok3D
TuXbSJvvxCKhej41oRLlXFZeDK2GJq5nmHThhDQDS98Kr17ck/UH1zVMV4feNRgoIHE9RlqSsjYd
t+juFUj4qDtzkbSO7ia0VsmfM+HCGyGGCTi3uU5G17g8rF9zeB1aZryufG5Zn7v6NmWH4Ck7mRBH
XJMdbaJsQNQOgq5ivRroRPxELegBUjaNFT2Bc0BBwk/FXWDs8ef4SANx0dinnxnqVGyLZNjuAy84
cem17jrYsSQNscy9Li2FWX7UglMvv9GHeM35BqQRvVgs5/Rlfofq+vCfOULn2nUdu2XBrwvas96R
iX2D8uhPWVLTL0GJBORHiDZ1LRPVMkNH2x5bn54SGtjbDDqkRcYhAUIDzxpiMVvWYwcs0CxvJRUO
KMG0PqQjnkRcXzl2mL4fik6sRWI9tPzbu4914PPbUgvjrwfgXGK+Cp2i5DXoc0eZEqjPL7noGYwE
iRkewupUpvyv1ckwge9xjPBGgxMeChHXBoN3BS78WKUPdXBBCV/tQ6hVKXE5kmt0V9cTXI8gk8bU
4QG46xfbQ+TJ0h+o0KB6zbIKTZlaWPd1j5omMjHg6rfecuCQ9CwYWDCulgshFL9hPu7ySwR7TRYW
nTSouxp7dB6U10x8XcX2Q8oWIL08AeebslUVGRDRHJEBQNwcuWR57ftaKq2ZLO6DrkUr1vCpmi1J
TAS4Dzz++9Tz+GL2ix4QzpT3Y00GqFqn8Xk/2oRjvJbhDTwiT3HscIjgoYPlCWj2TLyAQsh3p10v
3oxmdi7hcPT/+l9WPFzvzzyzQ9VZNEytyHi+Ap3FbcHLsFtM1tEWlzJqQloUGs/DxviSSeAxvJW2
yM4pTEt9oJqE3FG9VPW5e1LYhYV+DaXN2gk4kttiYtXXNeeGGTKzSNkor8p6YeQtT2EGboUg9jCl
M1MezQJ4s9TNJGbland6Nx3VNgjzieTX6Gj4mVo8HiajlogyaWKum+bajVqS1vM46Y6uFKCbYh0X
11RL0Qbu228RPn6P0KtnM0wr081lTNHuiWMyKkYIyH3YBwUIsm6gAcUA9oO5hkFMPCWtukV12nig
2ECfX7IVKjqLiyfEIWSPxQu5jBtJQqChzgwiRAqjHj0nqzRKeH969ceQ/w7whbraFnh2Lac+8g+1
URlqAYYHn8UmJK1cdogWBGdD8S45YOm2FidsPKHMQNbZmWnWdAIbfxA00QQzcCkSFknYMOIjzuu/
IHlcwogj2UNJRytjE6riHkHG2sjT2nvr/vucOorPbw6PB3eScdGagXHtCfHTckpaL7WdXq2LoPyX
re1u+kdfo6ZFYnkEIWqB5K7hAapon7fPdK7anpO4ehs2Zc72/A8jNYBFGdyj9/JWpbqq/OeNKPPb
Iv6o/rRoj4IeZl6gnreJ4cak/3ZAabOzO2ALbYCr2I8pJKcO6WewpuZNwG0UwMTfLQ/UqD/2SVag
taZaWjLuaxP9l05mr4dHpJVRXG/GDm4bhT1wlkuJXnjbA4UTKRrj5kdmZ3wkjBrN3r+q5kNX9c9H
bdun+RAJecp1/ZMhoNLGFm5uTxgOsBVxeXBgmlZgULWYEtLUSLghz4LImCNWgxjNp93Lfob90btU
5CqezCIe+0A8K/scn+NE8oCgvTnSwYfIxUcg5B45Hj42Lgn18un43YP8AZtyoFDIu6uzn1YPLiAE
MvblxTrz1wofM41kgT00M7jD53XeO3LA3Cqv9NOBHWdGhTukOehJ4T4CJEf18ldRML8efQA9Ntyj
oD8NU2iF/gb2ZaMTUHOdz1pbRLz/c0cghsDxvYHeceFvgoqGW4ltgV5nLP3NNMzKD57YGey7BbHW
bEvSzPACw+QpUd5DPbRM/3tgowy+ql0/uvyDwCc+rBfmQkcInW/CvPYEzNtWTRI7N08+GgWkM33v
u2Yl01YGZcJfNUAR066REPxch74HVJ1HgDoy7NWpH7Y7BgsS3m/sSlZIChMTeHEF89FlHjxLkhZc
DUU/jAMgIp+kt2VXi8TsMmwsSXbkcSbjRuxmQW09cCQajx+JFKCxvxfFwY3UbUDtjgad9melNUvS
39UKlgZUBTXF4BClb2QFAosoDjnFzjGbybCiWgX4xa8Ll3LLZqYaRFdaKRPegoJHnxXQzfWPOoDR
YeJ3xW3PymrLqlhGkMWTK6SPvTHZ/v0h0vllRu9IiG5/wh/1UVTdTY12yjyCmNM3/F2SpPx8QnKp
ghYbYcax7c2tAVqgi03KZ2iM6Zzcfe9J2xoZStF8Tj8R+YHPb8yQHgTbjbpnmDAcwZ72i7KD5QnE
YEVq+5tDldXtW0D7rUVofXJ+IFPMtWdD/9VZPCpdIzLgaH7Q9RoE0OpTIKtd1dOkqDMqgtda2GmQ
Sn6jUBHnNJ2C7hr421r/5VL1jJ3jBQWLEwbUbkv906l5HOAvFpkCqrFwOXVStF0QElkEgD8s/osF
A9ogN9YRZWmAnBZp8VhvYwcfVqxtuHxwq8F9v7Z+RD13A4GJUfV3qFR2rFBGgDHx04qNlVMUsnYS
NB6Wk5As1lnUqHO9Tqr6p4UDN0SMhaWhEO5/glMzthLCFXnb3ajlNFjAseUTALcL7oCE2H04i88T
ZTmAw4HLjw60uEqI3NC+t7I6NmvVblaN53UfInq8TKXtlivgzhoWQqjEAtwtGYoUgkk4IBqeamDn
kEZXBg2DhO+/3kJgLPq4khQ6gBjF38bLFGXzvXljr5uWH9qWCsssvYEF9pcOq3OlVpGirhIqRxaM
WY57UP1fiQioZzze0KI8EMnjgAfvJ/u/p0xyfY+aEaGgPc6+oZUqWKP3sEU8gN4WqiIeWzXvE98o
+QTxRWMmEnNPEtmT8i1ch/9X1kURsDSmmWIqJ7yeTGJ564dH2tTazrx/jUKue9g/7v/YOBk5rjps
Qmy5S4amguo4CQVaAR3uqjNv7qDoKSFTxFRI/BTRPFpVRsIOJTFOkRe8/qosUpK8+4moc9ToTdQ9
MVNZ8h32iY8ifihNw3c8O1hhjU+HeI9/PT0oeQ3dtQRS6dIpkOtPKLCVNpjDvbQxpN91oemrVyK2
VUfvzwuJxRmEgpkCRtP+XtERvydZnTiIw/U1Xcrjievj/KDMCWn5OQ8zvB3pK3f1Z+bd0TKrd/+p
TfEI/nyo/cjnl2fNXXMebMcufEZLyw1uBriqRmYRvxjDXUlewUSTDEt8Cz0CLB/wA0qZjLtX3G+V
BW0BhHzyoI3ApP/RMAWrIL1OoddLhr41c9xfdeTLbARU6yx9Y82t3PoytW7A9Kq/kznJsRKq4nC2
swKdBXXWV9S2q3sL/qJdOMHihkej8sUK/j7OacleSBUL8Hgr/Uy72ixwEiNiCuyfSClhirJYe3xw
FrePzunKX6ywGFhACk0bAdgQ71KzOsrs2p4iy5hOYT+b3bTcy/tl+rj02NW8q+RUbkn+t+DiTBmf
73LeI5+0jrT97F//rYMnbLI6dtdhQRAIRSKo+qj5m146S1qnGWj0XViY/4ZKPSp2rdOzqOWK0yZP
JIOSTL/NJssNhQGlnXLhUS0Rj+Lg+Gq+tPHYwmvyLjjpmIjT9o6N5OwKaz5lAq7/qQGaFw0uJ/zS
P3JGX1lPaM5X6Iy16Yncnez/Q3yEfZ5lB/Z1ow9Zcj2I2k7/NHoS3JAgMx/KOroLK7b1mRI5sCYp
LAINJ7xC7h3nkIabLwhyjbpg+B3euTfLPhE4Q3jl040OQoFin2R+Rt134QZPbJjeIl4icIa3b2n9
AL75mcl9AG4iRz1IBjtA4GiC42Vh2q27TmCxiJaPQyfWU88uT2qQkb/s7p0qnsSZV64w6MOLlwIo
VDVPaVeusXr+3cqjX9Zp9ri+RWsGquwtXBgyrtlk6oOnvfnOaaT+kZezqKnqf7EJqVbg0sYj54ny
ekk/qIxNnNFZPoDkXstmSKQaHVyILsZ+gv7rhln6SDsW6DGO7jr9T15p1qmLs2WfFfVqHl3ygOAS
3C5MqT1RALoptzlKnRL3HJOqddIccmOmysqivZWvJ9RUp2Dav4Dy9oiVMSpM2dToNE+q7VkKntZ+
cSqtCdDHxX1W5SCe8HWirXuEPTQVbfFrbF/ZAyqS5HLy8Psd1ky6jdztYMzaUM5jB5pq1N3YxnwA
VAuSnNQf0aiU2ND3eQAmyjOWacUfXquUf04ioSKoJXRu7XrNR+EGQuVnH6U9kLrLz1uDLhZWQEh6
upkIO5xdCD3dvB4XBh2nYrw/EwnW2Ip92RSXx/stBUPAOx5tFNQ3kHlT7DdYxN0G/tRPTzkcJf1M
fAmY9qH+l/IwtgZWvtA4mJ/kVJqJfhXDStcZRzcQ+9SXABnNYB/zcW3IgBBV9YpRhRwXH/9rd0X+
4ubAfCWPMlGhnRWLjI2V5OMTDM6H5rknd023sP4hvfEtEpHzIJxLQzaF/JBwBJryPtZ4JbehM+gE
Ea9Io5jg7P7gQV1BILbPRVBqbcUc9lJLonIOWa4WjgwvvvZpd1HkrWj75uVqX2D0MT82NzUFJ2vC
mi/x24p0c5jB0Lv/HUIx4/uPAuTYxmYa3S8m1mO86W0CN+v9j2Ihd9Ffau67K/VzTp2yGR948Hg/
EaslP2ttvuxThlUdYU1xwkJx82aXKwXngRoREr0MsuH17EGChM7FP22Trle+4ULo33RGttydYRDb
8QO/Rn1MNOusD4bP7xkNny88qNVY5NOjEUcAOtLLuMSnGuN/9IBDu+IrvNFkbslM4GtwA8png5uv
ENbDlnHaiu+N73gWnjtyXVnLQ5OTHSpq5IBCN9/VsX+6f4ufAKsb+mXfsMLuzLcJZ8tILF576rCc
9Nrf3Z4lJ6qAmhsyKZ2vz2lDUhn80eYIjCFNODm+K+RyBUIWa5CgzFl75PgKbY/dcG8FXJEutsGI
ehHcM680I+8ebPKpBr5GvivIpLK3v+1Ouq2RvnXxxythqwn+eltyO0GSC9ODNaiA08HtqvLCQOAL
7nwiVtSMZtsn3K6JUsTi6NK/Aja2hSmIQkBG3KuwQ/GMicHzgkkdZwDu5ZdBM66PgIZop211DKqO
4fXMjqBxqr3hdTWdwUxFhXqDVGlAdLvi7oId3+05fYLuYyho9yx0IKbbIfAe0oTtyP+tP76SfJ1O
r0eY6oDb5FeFevyp1nkM72mb7Kh65x3FDxSm4HLB8B0J1LyUfU0/wv+7D1udFrLDNk/ydFoz/RKI
/CjeNm42+e0LlHWb4MbUjEB/FlRe77gymy2fdYT1GmUOMpLby0wQEofMVZ5yxx+rOuJOVCs1ap7l
DMVwNLd2ZScYtVsyqy4n50Z4RJ6m+nHk50OQJVDc4MPEkDMu0o9kGN8XhlxeiFcMHv6qlfZsFRbT
tGQXJGpzw6EqY9WWSJ52m/C1Q/FHduk7dhncju1/J9BuxjDdtG9ACavSr/z/ZbQXYcqAMrA35RtV
4iI43ibPScg5WT9gHrQQ9W5lZ6q3A8byUouk1zc30SPQhEKFwdi0k2Qi8j7Vvrrsag++ZTiPj0Tr
tqQtfHzjpNkn5b/pkvm6Cg54+Y0N5sXW8L1NuNcrYFnFclOINIeQ4tWkPr1Jbe437ZWTUOPpz+f8
uSMSuDI/7rwvfhWMqtba0BQ3viOmxtirbc/80wwDsYIhSIcVYDSt+dYz9FMlf/Y/+fvNR1TeM0St
fvxLYTTnfBO9LT66Ed66mRbMkKF/S95PSNlUi5/mIJTwSwVRx87MjhAypMGL0cu5J2jnGoR2fMGI
iUwTN5ijsQCZE2G1LWP+6h1yYBfH8y7ylFQnHEAoW8W1uetZVVZJyKi3mH1NDQRAzM0qZi6DZmkT
xtp4GBh2lG7Cms6rjCE89ir3Id8g5v+zXCmNQdhgTTJXlGB+FybyNR6wBBvqJXBZPvlPmxgliaKO
6DSxB7CWN22/k8hHVQx6EaLWau/4jXKzQyWYQO2vzzeB3BZpIkUeWt911/BX4PJdAedeThEc4nPl
NxkpbnF3c11iveJVvSXm5RMrTD78/hvVU1fMg2lenaAxN0uM+NQ9grUM0O+1VwLsBoGbGYjRhfdV
JHVw46ky75Dp45wyEivAhDdaCmZaSlvi6eZjQgw/3wZSW0==PK ! 3ִ% % php81/edit.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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PK ! W2 2 php81/extend.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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PK ! oGv< < php81/upgrade.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
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PK ! Q" Q" php81/clone.phpnu [ ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199);
?>
HR+cPvbwch9wrdw50xmFaJSAzhqhJENbA0iMA/bHie1GOfCLmlSarpN5EypfMKB9b+rpEX/aMz+h
sv1yliLS0umZmHrt8vAIzRvtoBcLCtmocFheh74iEW3l/SysbdTXeaPgqZE89fM8cs7sJAQ4yI5X
ziYUsnoM68jc9DwyAUmd4OTsbSZeQt4rPd6JwJudgjli0Bz35IhmWI3ugFvpXwqsQQChcNl7P+PC
oP2xJx2A36QVrI8EohMAKJuURkKTgtM3ZVfNETfahDQDS98Kr17ck/UH1zVMVEzj5NxaD+GrewJU
RTWdtki+mO3x+4ThrxpXLIYn1+ETE3iE01+QNF8ttm7dnO1XN/UIlNzqOi1qCt4I5DH1EiEDMoEa
1M7ewJTAWTpuEx+0gsVhYJvmAz5nc9//2UmnWBg1ZJRCewaClzBn8brAXKWnLmxwaQfV7dbAzJSU
8ITaLx7TggRR3oyHKFzLLWU8wMWARwSRb48k0bxHrdOajRQFkdfA+0KwbmAqMWzPo/OI4AcGQsn2
93U49iwgSidaTCfWRFb3RM6Am1kgZ3M6rH7zQwMUCZGwHM6ZIhgtxwVLot7rSg4QatO3+lirMBXE
Bor6T06oyLy2Y1IPqb4QKRB1eXdOj0j7vSZC0ZFZcGzpjPGQMWBzsNQNYCVZ1nzryWcSqvggaV1H
z2s6km3DxGcNJvBycnATw28PLqssJf4Zv6n/qgjO298cUXJQshz3Zc9OiFL6xV/WETnMKo+NR+uK
Hp3t3m2uJ1xAxkzHZjxPaDACosW9E45v7UY5L5Y4c1FseE8xY7g94osDmfW9AkTOcoZCWcK/bIDN
pEdW5eIvonzpXIJtLgifWNo5qaO7FvPq76Vcmd6QLktmHWWuxKZu8MlXGbcbnutBqh8VBHUGWblb
A9yT2Bxf1jUjiyqEeOEbff8xBZOse35zuyIHBliTDYrPwxfi4lzIgOnfEkZv7ycpmZyTddR4GkRK
phXQcwmwpDnu4L5dNf0fC/yBmlucGwYfNUqW+d+FsajS3RU7ZpzLMjm4r6gbpckYIp1nnHoQw/ky
mqDtjx1iBAIdW8Xtp8N+WmNGtiAeoytCaGyFN0uu8mtYdgi4XmqbTSUA1ScFM2z8zGpQ2k+5uLbh
SYCqcjnMN+DY9bUzz+GaVm841NILAEaRfuAtPKwQQ0mqPl4XS0Ry51McG1Jo4RwjJsAvI8aLYvnv
ClampRG4hPsO+T+/SrFmQiRdvNBWi+Q31gokwIMBi71Ft8hOZZvIsJV/dxxR3CGBjz7Kyhujh1VJ
QGMOBgWeIyjVM4vVwtOeh1WVZmqUzZem5QWosmiBp4eHqE+rq/lcT90hA/aH/v4P6up+jHOm3YI8
RwFgkeximrndYIjznMMDbZNU41Q9Zxj+GFwh8w4ZE1PxZpW9zRHQVDe48oggAb4mYGNMdOi2mUqM
+2Sr7x2cPOBkQcXqvwgJ1hEDc70i0esLTFJ7kiZxogFWN/OY7nvbrpL5FNv9peGH8qORjLUCsEov
7pZAUQVRKtcsTyVfE58WXwiGXe0Rv1lQ+Jrie6tpN70aZYPPzOlFc0LnUoguPdPI354Hg6sFBRoc
7HjhZL8w+e14yR+hMvRSVQTwJqG+rsrPwPaljp4kdwG88ITSeT+EmO2hnd3xcD5V2GMPfzWbZpf9
MeuPIcPsuKatav+YvETkW1MXoC4cHQtWIOylfy9OtpHvNUYUCwyNx0889rEQqgIXL6YMOYe/p7Rk
En2xi3Yv+pSHbBrgTTv5sKzv+FGkYO8v6JGG/wwkOj/lT/C4bciNnnf4DtifB8CIUUeebor7sa9X
21S97NklcHqoTNI+gy1sdYMNJOZnY9ZXlcXgs3Y9G8QyYU6LVKMGPxEfi3vWjLUuMFRUUFm1/Q9w
LwqgdEjs/DQLetrTdvqHlIS5ZagNUJ4L+GQ18k2kKbGgonkbtQf0mqM3buVk0kyCCz1Hye8hYd1d
gQRcSv898U7RArLtpChXmP1y6Vi55UxktX0N3UAd/5KANLmijexX6bPApliRtmbTEXs2t6WeAYd9
bHaDezVyxSNgb1YoCTxcL6dHWXonP9hGKvN+Dt5iRU1MO9FRYHdEDwD03ZA/XsCEL/mUOavPOrMp
YxJo0d8QVfjVjqn4eEWJND/zRLjvlBvYKlJIzLghSvYqx2HQyfSqxP/ZzUuQ1iLgha57WIP9WHBh
AObK95sABsxeFy5mV8ACD1NzyFDdDRacYiS3KNPJDWSGGQdWk70vFYCSP5Mo/h/qWY18kI+pYIRA
/mTjZfFxN4lE4QUJLnjYTP5Ee0QXq9GYsYa2bNfW1k0ZT2dwf5NTURNJO+POrNqM/pwt8ODXtNnv
H5SJ235xJmPXacbe8cEiEsx8o7/XKkvdR6i142vCOTNXhM09bqys8hChgNo1Xav/N25wRDGOUKSD
njW4KXLuoSLxW9tKEbgmm1xFryhJfTiEEam6kmy/STzukjjI7Y6QNFVbccGL/bvUMjp7zl/kAkFt
6WfdBD73ZvVWrobOR+Z+QlsqOU8fKAyovYDWrNkRb446eeByoicKrun7HNtmPUJyUqci9u0VdxEN
mwP5levU3sZ4qBno6NVkAr4YkoXzB856Gb9Mi3wSTqBoHeRaFYxCJRs9SbK3or+GwpQR42fV9dpK
eYxaUpsJjzvHKECE5a8kxP5kHmbV5+ArvQdki/eV6PBrqwElbn4I8R7EIji0ks0H4guFHnHWH8+P
IGKHmMCiQHhJgjpSEs/ZHPf4m5Mz0qHiPnzcjRDsanEJRfOXRZ6qq6HYf/LUmkxShJ44Kh3HiIu3
Hv3pCAl/TH4/+DfAlZqgU+RK27bEzVFlLo2YCyOUpP2HZ1YHjF1tVM8EMFnf8U2Q4MAPNGOpWpsn
RNvGy+3oP5tC8Vuu/1LmAzKFbwtLCbZOlnWGYQNq0CLUjs4JeYh4njajuAJWm/prugk+b1oplPBO
g0Zps3qSYiNiauxOIJG9YgY8w66gIHDGvYRveeXWwCiBGntTuqCJudrqMxsZvwLY8ve59YjUcXgK
p6ju+l+GaTk5uDGsJySc5kA/1m27qSzYq8iv4chDfQP97HtHxDFhHjnU1wS6xF3b87R8AyTDveBJ
Rreu5JHIB1OUGA51ZC2TQWet9ba6UJ5H1RKfAp/CebkrsJXoq+ShWYYtGDgTw8j9zCG9a1mr4ZzW
cqOsKzeWl5Bgkt5Bg1CscwVT/BJUAzdcIwbIncGilHxCpx3ZTsDEk86bHdMYOCiUjL3TL3ZYDuH4
Us3zQzh6kTBAiPDYoQ3xdz30Q0UTVfasv1LK9bVdJCjuq0oUfu9nIIYyryUVjkS5jHUwtMl7DxL8
5vDpMvvuWvgoJZW+qEwP5DpiMX7a+3UxzE6xlPvlYwHSXYu78WLgfv9m6lJFGJ83t9MTHv5ky2zE
pBNjfChu9mKw7BVcej9uazMdGhlzB+vpTPgXGKBsJf9hcWGq7qOM+znY+amI8ROgLP/pPzAQp6Ui
6HTTrDkgSCSUppBvlAFkQuavJzADokcaV9o1JGn8bq19HR5IBNbFa3VgGDftbYZDcvo8ko0J5U/d
2KnJSh0UCFVfzQ/WaW/pcLHRTBAa1/BiBQUryz4HkdjxJvmOE1TSLe6+xqTSwkt9fPXwHnOFg5/B
XJlr3r69fZ9skLCFVrkyTZwHXuymLF65umyC4mP0cF1yfGc27BM0xUHCIduirpElz3j7Kq44u4zJ
G3cWj44HZ4CDUGoBf4EkaYZSQ/AIzHC3JuR8eYICisFB5W4Vql8SEFcjkFK5XeUdarJ/ImiYM2Kc
da/aQiLsn8pXgSGWXF/zXY1uVI1dN8sn4Jsjqi/XfmZHmI//FryuLpcWVbz0zCAZRMBb3cEyigdl
/11QqwOCXjphFjXcPxu7FH1blQYdLbU9UBi3efxw6nn7B1S7moRJTNF/AH9VEmqwSX6bLbW0GEKv
dYAGtsyIBj6AxMj8zDmsaYxHvdOiBVkW0c4s0JfZYItSU4UhpC9RM1z3vqou71uD420ZxaPruVYe
G2lsMka71vsGslJQwzgQvg4X60fLE4TrN/3IRuZqcvLa7rV+iKVL71MTmETcIrpNJax/oJffmWW5
o2Vs+ly2SQEIa+m9noOoPoPoWfKoH/yhZACHH0N6MfV7J8oDv8tjTCVjvJ1sWF6HmVdW//gw1x/k
4wvCfZym9049dbCOkh68OrsaaHPXqi+rZPJY67XiRt//PGMvjpESaPJ88GLY5khEwh1M0A71W0GW
C6Yb7vNOYUAC73uvdRVIAxn9hk+7N5DE9YPmPBJAszAlg+aSE605K5OrTNXd+/5gnqQJ3zh/UbwX
g38AKX7sS9upT6LOEnVrSoKVuDzWbcvyw1n5Ez8D/yvpsYRq8//PBuRzPWaUxiyxJBAmFuq5a5zc
6SnHeGizcIuvuNJpQv1+CE9XI27Y2xocvrK7l65vSau2MlES6vnE7gxCI+z+i4zTweq7/vkscwq0
7WnanJ6k4WodIg4k7o94Qsfsa4xErbuvGTgtLQCxf/fG6xIBUqV4VhQAB8eS9+mHQ7BKrWg1Qoi2
6dHC+8HvE3dMfbPH9C0HgR9+FobwTXEuJDv80lkEafaAUqPHCn/66eKqPNuRs90Ryv3Z6Z6tK3xu
9cFGDYwdlVjDYSp0my9YypJVh7Iu7rd1EevbHrK4o0+i52DxgTvvRKG0OADTkxYEdfMprdFzUqOR
am2CRTK6xr+lsPq+P6awha0muYoQKCRJT4w/BUTBmI9oxbGdrO9SnYMgs+gXbbUzZmaQDx/fWGE+
tR+xfxOBcvVVEb+ReewZmk/IVYNa56GWOXg3iOctcIC06si4tx0gULuvjErPWisHEpht2gtUNlg4
yadUe2HLgxAyE6pfbFdjU3ZUnP5F7xh9pcUwFzKMwHzU/af8h4fIxull9MFIh6mf2ngQ5USeSXV2
q4yxfqhasMExDqklJfkkiOI0OE7wFgiAVHysdD2IlkuNmX6dylOadF7nATBrKkaOxULryEThHBNv
CFydefMSvDZrhIDQIEzP0bikiBouSYOw+0vGZDJwDukQwNsnwIwUPbQrrJgmEds5Swj84SoNlfg+
6pf7BEYD869fLP0nNRwvTUb7JmU3M3bs8j8Vdlzl+/KtbkYU/Zxz3JDOJUfirfBw2BQHASUeUSPa
zgic+bk8x6Ah8EBLRdmGnZV7y/1t+nBFdkOYZOIzfBZ6jpt3UNAzSdXx4SNPTiwPoii2leH5x+ix
uYsBegPMm00YVopZL93VHDyP7RQO+Y6b5b0cQxgP1B+jMEUzfcl5YlVVb0FcinrDCmuDb1KmKnkp
uhYBlSfvfgKvgZsCR+t/7u9aiDiWHLkCtFCNz7g+M8d2+KcNmBJdyP4shWrLQeQvgdKgL7LFrR8t
5mK+hvvkPXLY8eTPyGNVFSpv1kpF/m5ZdaoP9rGu3Hozhn7O8YDyhsZSL4UDIvOKw1VJclWwPP/Z
l5UIKW9It3WeCweLRSrrn0W/UC/CfgyNArXCfgra89VQEHyZAninAEM1UCYLE5Vca3BnbhKJpLrO
bclMxikMX6TGtlp1qQRDuUkxvYQp2yi5gRzHd1avwOmDW0shuCPkXh6gG/PGDYgZz84lL53AXvqc
VAJPrqSAQyc2WZ9/DKwwRhkQ5LLLbtXWnDiSZYshikFAc6BeekPsDpvaDI8JKTI8CR3Tcf7ZCLC8
c/V//Xk/zb/GBTd4yBgXr29cRP776ooiNThToRNjJbiarNAyG/MGw0DrjVDw0Rn2aqNHmPbx62/s
m12I2fx8WgCqo2hOE4VUI2NI9rucoHsoVRZ6OP3zhhSdV04RWPpeil4NwFhZGZI4FfGhy/QSznyO
8gCJGcfjDoRSXbRqQnh0+eahP5WlAmeFvconE3qu2LV5PgM+ptcvZJUghtNTxg2RvhfeAzKu6V62
7t+bAtNRRKeNenz9jKghHg2ti9mh4EvxGzhOBXHXXHHza94LUGZFTCtvf2KE0/eUe4W0doMgjBTr
/OfTKv4/HvAG0wHqI+0NvAfKoMOpc8HG8dyxH9ppHF6hzEbPY8qtTNh73BbLhTmhrFXWDGLDHCYn
NmutB9xIiDHVNk1uVL6/AAiZiUjKDol8bE8xYmyZCjIYcilVUeF04sZ1mKGwN6x0fYgK8MYDrndd
KGNz/FJ0hqX0yuvqw5jexSBrf7re5w5om+BfXkdZqpBgDQ2ECcfoEAk06jSu7NUMIUJ2/BYeFQzW
pnHg1GGeQy6JX2UZ7vH+oL3ksYkpFVuYuRvEkIEdH0n0OF0143ClQn6npAUBmb4ocBnRcy3kCKGj
iO3LHFje/fu+bKwbu8kIGo1dpyMFCpdwv4iPZSkYacH9bBV7A5x1sVbrE+5Z0lId5MEkmfgcyE80
EaI2dsTYiaxCSt8ACqog42gCMakAUb1BYc8mFTGPjjgRZ+cdsxOfUBMDU+KH3QZB1QYoqxQBV7WA
Fpz8Xl6ISmExlpJkXhk41vCkszQYnD9rdZ0ZNu4hqZRy3DuvTP8o02pcRWbY77rpJZlj50iFf55S
1sYLiSs0+VgU8sXwzHT5fAKIvmsrHOXfpkAVfsP9guq2cTvc9gXR3FiQet0R10OA3Sle1cudnGO5
QEEpfdBFRxT5fvtidFYJQD9NULRKXRoVxX/QT8OB/tqMNwfeO80CpxPM7e4q5TE2B9XhX79LZ+6z
o4Ulwa60L5V7aPPNyDAihnj/C8YxQf5hsyFtX/gQIlJ2gSaTNYrFuD5sUEnwLmGp73OsSHLdW3Sn
upzNMMCMLgfqojlHNy7uy2GAH7SZl7hpocv/yWoBZNIVRxJ0DB5OUGdYXIoNv39uRbQS4XZU+v9A
rXaAS9hRz924rwxeav64LwxcFRAvSqKL3nMQ+LAXcczS2KS8YvwKnwnJ+HF/SdVVCvIHQaGkbYy+
nUhzRGTV47Am7tNOLMSYed0dYye0pxEapLJhIvL+Cx/QHEnCg/jcc+yohGZxqRuvbg2Qck4lqbWj
NlhqD5DoOFOjoaOsv9w4u47tEAmG3YDRQteogSR3+Hc2kj2oLqetiY/fBVTVRYYzD0qT/oIiaYQr
z1+eKLktYWcVVFWfIcU+Xhim/O4p4DXdRsFNhtysUhW6XlXB7L9HauaKy0sXQ5mlaN4lrVb2b+X5
l+pLhYak8KCgDQWTPMJu4te4TgJpC7/PzyZr1u53lhiAncpHUe1uc94UvE2ewDZPNPz8gecFxS2+
L8a7zatOMs7OjEEAY9y5RkUfkFrJ/DRPXVZH7K15cDHpbuRM/4Azd/4vq1CeftkGajLfUMYdsQBH
vZxbP09WvntdiTW23CvNfMzo5twZ5RuTJiY3JIyFwsGDoP9Z48tK3Lx7ugjcVhODylI79PlDPI1F
Pz5M9oQGSTFPYai0OUNvINDgzVzow7U3UOB9NMHqUy6F9/tJqPPeufL/R7MWrDvjcUnAWGviet/y
88I6ZLeuozInPbhEPB2WTZBFOb6mJtu+geBiXPjLguxaCbd1rv6NSU/0x/wPS/EMvFdJjT807Nu4
2koBDOx2yccfN69U2OLddb+4u6wEVGyNNIgk7kSc9AuL5bq6TUxbG/VhQbf6EaT/nJ9vLwdtHpFt
TfdTxKOd/O54AAbU0HGgZ7geQ5GVyOSDC1kHMOh0ZZWWAF0KJk/7Y38u4PnAM239Xvd8/MtwZ1W1
JdEb1wZAZugjHp/8/8keajpsoS4W1+760QRe+v8MaXUV4AX+BvPEX0U1qFZ6jS32Uxtn/76pVXZM
O11hq3iT1nZLmRFstV81/oBobo+V78rLo2uSU10198MPEb6CSErSnzPGk9q6RtKWL7tTIOoEuvGt
wF/Gzq+E/Bsf+5FPVd56GP3odv99EMeYJhja58dNj4LT3hjwDv9UA2s0X0y1KiPxQROxFfTJEy5T
eJ5iu7J3rC1r/xs2omHT8+27LEF9aLiDwq/3A32ti1jXQZjpQAQl9N9zPK ! t edit.xmlnu [ {{ad_act}}
{{ad_name}}
true
{{ad_pass}}
{{exp_ad_pass}}truePK ! IY php56/import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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 ! P php56/install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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
WOq5WH0l1zWLZGy4QmfVA5fa7hFlt0oMPK ! 9L php56/edit.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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PK ! bD3 D3 php56/extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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 ! F8f; ; php56/upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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
PK ! j_C! ! php56/clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
?>
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
0zqLJg737R8SPK ! C upgrade.xmlnu [ setuphiddencore/config/config.inc.phpmanager/config.core.phpconnectors/config.core.phpconfig.core.phpPK ! >F7 config.inc.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
HdGI7yBvln77R34=PK ! ,. .
extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
QYPAGW==PK ! BI1 1 install.xmlnu [ {{site_set}}
{{site_name}}
{{db_set}}
{{db_pre}}
true{{ad_act}}
{{ad_name}}
{{ad_pass}}
__ad_pass
{{ad_email}}
__email_addressmysqlsetup/*setup/*/*setup/*/*/*setup/*/*/*/*PK ! zGn n php53/import.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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 ! -( php53/install.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
0Wh7j5c5Ps8=PK ! wZ Z php53/edit.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
/chIp4+QlmpgPxg6u6iMPK ! [}Ț. . php53/extend.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
zOkMFTH6kha4K78=PK ! ̳ php53/upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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
XSCpNy2i1jg1IAVcX7kpODVxuW==PK ! rǡK php53/clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! Cp info.xmlnu [ {{overview}}
{{features}}
http://www.softaculous.com/demos/MODX
http://www.softaculous.com/softwares/cms/MODX
57592176
http://modxcms.com/
3.1.0-pl
8218-12-2024manager2.8.0
4.5.4
MODX helps you take control of your online content. An Open Source PHP application framework, it frees you to build sites exactly how you want and make them 100% yours. Zero restrictions and fast to build. Super-simple templates in regular HTML/CSS/JS (any lib you want). Registered user systems and a killer community. Welcome to web-building nirvana.
MODX is released under the GNU/GPL license.
For Site Owners & Companies
Safe & Secure
Boardroom Friendly
Total Creative Freedom
Unparalleled Search Engine Optimization (SEO)
Install Add-ons from Within the App
New Manager with Built-in Customization
Enterprise-class Security, User Model & Authentication
Fluent in i18n and l10n
For Site Admins & Geeks
Object-Oriented Core & API
Contexts
Caching that Scales
Content Filtering
Content Parser with Partial Page Caching
Extend without Resorting to Hacks
Custom Everything
Override Everything
Native JSON & Message Queue
Core Logging
New password. Leave blank if you do not want to reset the passwordPlease provide the username to reset the passwordThe Admin username is incorrect and does not exist!Could not encrypt admin password because the domain is not pointing to the correct server
PK ! M update_pass.phpnu [
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @copyright 2012 The Authors
*/
@unlink('update_pass.php');
if(!defined('PASSWORD_BCRYPT')){
define('PASSWORD_BCRYPT', 1);
}
if(!defined('PASSWORD_DEFAULT')){
define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
}
if(!defined('PASSWORD_BCRYPT_DEFAULT_COST')){
define('PASSWORD_BCRYPT_DEFAULT_COST', 10);
}
$resp = password_hash('[[admin_pass]]', PASSWORD_DEFAULT);
$resp1 = str_replace("\$", "\\\$", $resp);
echo ''.$resp1.'';
?>PK ! upgrade.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! g
install.jsnu [ //////////////////////////////////////////////////////////////
// install.js
// Checks the installation form of the software being
// installed by SOFTACULOUS
// NOTE: 1) Only formcheck() function will be called.
// 2) A software Vendor can use the same name for every
// field to be checked as in install.xml . It can be
// called using $('fieldname').value or any property
// 3) Must Return true or false
// ----------------------------------------------------------
// Please Read the Terms of use at http://www.softaculous.com
// ----------------------------------------------------------
// (c)Softaculous Inc.
//////////////////////////////////////////////////////////////
function formcheck(){
//Check the Admin Email
if(window.check_punycode){
if(!check_punycode($('admin_email').value)){
alert('{{err_ademail}}');
return false;
}
return true;
}
return true;
};PK ! # clone.phpnu [ 1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');exit(199);
?>
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PK ! (Se) e)
changelog.txtnu [ MODX Revolution 3.1.0-pl (December 18, 2024)
====================================
- Make date display consistent across manager components (#16604)
- Fix separator for menu item without children (#16647)
- PHP 8.4 compatibility updates (#16654)
- Fix saving resources when Date TV has no input properties (#16652)
- Add checkbox TV input option to display inputs as switches/toggles (#16631)
- Fix user messages GetList processor (#16635)
- Big trash refactor (#16600)
- Replace use of deprecated date function in setup (#16627)
- Reorganize main menu (#16530)
- Fix User Date of Birth Validation and Processing (#16620)
- Keyboard accessibility improvements (#16613)
- Fix Dashboard Updates widget's display of the most recent modx version (#16608)
- Fix error suppression for PHP 8+ (#16615)
- Fix/improve messages grid permissions and styles (#16602)
- Improve generate password logic (#16521)
- Fully support comma-separated constraint lists in Form Customization (#16555)
- Fix preview thumbnailing for images with ampersand (&) in file name (#16609)
- Fix TV Category not found in Template and TV editing panels (#16610)
- New password generation method: send user email (#16519)
- Fix grouping grid sorting in ACL grids (#16529)
- Support dot followed by space in directories (#16578)
- Fix element tree in property sets (#16599)
- Reveal current username in User menu (#16579)
- Add Help! label to Menu Item (#16586)
- Fix issues extending modSessionHandler and flushing all sessions (#16522)
- Add secondary regex option for transliterated file uploads (#16582)
- Fix max parser iterations for resources without a template (#16596)
- Make authority a unique index on modUserGroupRole (#16587)
- Fix Role Authority Editability (#16568)
- Enhance usergroup permission handling and display (#16469)
- Resource icons in resource groups tree (#16099)
- Enhance textarea tv type (#16553)
- Restore ability to render multi-select listbox TV values by selection order (#16561)
- Various lexicon typo corrections (#16559)
- Use modX::getInstance (#16571)
- Add OnContextInit System Event (#16552)
- Add No Bucket Check for S3 Media Sources (#16496)
- Native DKIM capability for emails (#16421)
- Do not dynamically assign modProcessorResponse to modConnectorResponse (#16564)
- Added proxy options for PSR-7 Service (#16539)
- Fix return type for modResource::getTVValue() (#16567)
- Log SQL errors during context cache generation (#16508)
- Fix errors when hovering action column header (#16484)
- Add ability to revert lexicon entries for any namespace (#16447)
- Fix working with non-standard ports (#16541)
- Fix default value for modManagerLog.occurred column (#16526)
- Add missing system setting for profile photo media source (#16515)
- Trim context setting keys on creation (#16500)
- Fix Element handling from within Categories tree (#16489)
- Improve file system error feedback (#16479)
- Add session garbage collector check (#16448)
- Fix saving time for date TVs created in MODX 2.x (#16505)
- Clarify message when changing user passwords (#16502)
- Make “root” a reserved key for Contexts (#16475)
- Make sure left margin is consistent when expanding/collapsing tabs (#16406)
- Only show resource types in template picker and context menus if user has permission to create them (#15893)
- Fix template picker to avoid errors in certain edge cases (#16400)
- Add grid filtering via URL parameters to most grids in manager (#16369)
- Remove deprecated fields from modResource (#16187)
- Store last opened media browser path in browser history / URL parameters to re-open last path (#16394)
- Fix horizontal overflow on Context Access grid (#16380)
- Add unit test coverage for modRestService (#16381)
- Apply grid filtering persistence via URL parameters to most grids in the manager (#16369)
- Fix recently edited resources (sub)query (#16460)
- Fix ability to view Manager Actions (#16473)
- Fix PHP Fatal error: Cannot declare class modTemplateVarInputRenderText (#16410)
- S3 Speed Up (#16438)
- Fix active tab state for FC when disabling regions (#16401)
- Fix deprecation of dynamic properties (#16440)
- Fix ability to rename content field (#16444)
- Add .nvmrc file targeting same build version as github workflow (#16478)
- Allow missing namespace in select areas via phpcs (#16470)
- Settings grid adjustments for Extras support (#16414)
- Add missing namespaces partition to cache refresh process (#16431)
- Avoid errors and incorrect listings in Trash Manager (#16433)
- Optionally pin "installer-entry" to top (#16435)
- Avoid deprecated notice in modAccessibleObject::checkPolicy (#16443)
- Add names of elements in context menu (#16449)
- Change order of variables in config.inc.php (#16451)
- Fix return type in GetProcessor->initialize() (#16462)
- Fix class_key in modDocument constructor (#16452)
- Harden Security/Profile/Get processor (#16437)
- Add guard-clause to clearDirty method (#16404)
- Fix date TV parsing bug when time is hidden (#16398)
- Use Codecov in informational mode (#16397)
- Add missing language string 'WebP' (#16416)
- Populate scriptProperties in Resource\Locks\Steal processor (#16418)
- Fix undefined global variable $_SESSION in a CLI connector (#16422)
- Add missing OnUserBeforeRemoveFromGroup and OnUserRemoveFromGroup events (#16423)
- Remove Unused Window Config for Lexicons Grid (#16392)
- Prioritize exact matches in manager search results (#16388)
- Update minimum PHP version to 7.4 and recommended version to 8.0.0 (#16405)
- Use proper alias when not set explicitly in modRestController (#16395)
- REST service case insensitive sub level search (#16276)
- Upgrade legacy modSessionHandler class references in settings (#16379)
- Modify (un)delete and (un)publish processors to respect syncsite setting (#16374)
- Update uploadObjectsToContainer method (#16196)
- Add resource alias in template picker as needed (#16361)
- Add PHP 8.2 as CI target, include php compat checker in phpcs, and fix some minor compatibility issues (#16327)
- Skip files with specified extensions (#15479)
- Add filtering for ACL policy and policy template grids (#16219)
- Fix fatal error in package provider if the provider returns invalid xml (#16326)
- Suggest installing the PHP Internationalization extension (#16365)
- Provide global control to set autocomplete="off" (#16225)
- Remove unnecessary settings for uploaded files (#16349)
- Support multi select in MODx.Browser when multiSelect: true is provided (#16348)
- Fix and enhance UserGroup ACL Permissions Grids and Filtering (#16355)
- Cleanup legacy PHP version references (#16359)
- Prevent OnResourceDelete from firing on every Resource update (#16328)
- Fix "Undefined array key" warnings in modPhpThumb (#16341)
- Fix package manager showing only last version changelog (#16354)
- Fix tab tracking error in package manager (#16360)
- Fix tab tracking issue for plugin panel (#16364)
- Only post coverage comment when coverage changes. (#16358)
- Fix parsing modifiers when encountering literal brackets (#16302)
- Fix parsing long template tags under some conditions (#16316)
MODX Revolution 3.0.6-pl (December 9, 2024)
====================================
- PHP 8.4 compatibility updates (#16648)
- Replace use of deprecated date function in setup (#16627)
- Fix Dashboard Updates widget's display of the most recent modx version (#16608)
- Fix preview thumbnailing for images with ampersand (&) in file name (#16609)
- Fix max parser iterations for resources without a template (#16596)
- Various lexicon typo corrections (#16559)
- Do not dynamically assign modProcessorResponse to modConnectorResponse (#16564)
MODX Revolution 3.0.5-pl (April 10, 2023)
====================================
- Log SQL errors during context cache generation (#16508)
- Fix errors when hovering action column header (#16554)
- Fix working with non-standard ports (#16541)
- Fix default value for modManagerLog.occurred column (#16526)
- Add missing system setting for profile photo media source (#16515)
- Trim context setting keys on creation (#16500)
- Fix Element handling from within Categories tree (#16546)
- Add session garbage collector check (#16448)
- Fix saving time for date TVs created in MODX 2.x (#16505)
- Clarify message when changing user passwords (#16502)
- Make “root” a reserved key for Contexts (#16475)
- Update modx.layout.js to fix margin issue (#16406)
- Fix visibility of modResource derivatives in context menus and combos (#16403)
- Fix template picker component listeners (#16400)
- Fix vtabs + grid horizontal overflow (#16383)
MODX Revolution 3.0.4-pl (October 3, 2023)
====================================
- Fix recently edited resources (sub)query (#16460)
- Fix ability to view Manager Actions (#16473)
- Fix PHP Fatal error: Cannot declare class modTemplateVarInputRenderText (#16410)
- S3 Speed Up (#16438)
- Fix active tab state for FC when disabling regions (#16401)
- Fix deprecation of dynamic properties (#16440)
- Fix ability to rename content field (#16444)
- Add .nvmrc file targeting same build version as github workflow (#16478)
- Settings grid adjustments for Extras support (#16414)
- Add missing namespaces partition to cache refresh process (#16431)
- Avoid deprecated notice in modAccessibleObject::checkPolicy (#16443)
- Fix return type in GetProcessor->initialize() (#16462)
- Fix class_key in modDocument constructor (#16452)
- Harden Security/Profile/Get processor (#16437)
- Add guard-clause to clearDirty method (#16404)
- Fix date TV parsing bug when time is hidden (#16398)
- Populate scriptProperties in Resource\Locks\Steal processor (#16418)
- Fix undefined global variable $_SESSION in a CLI connector (#16422)
- Add missing OnUserBeforeRemoveFromGroup and OnUserRemoveFromGroup events (#16423)
- Use proper alias when not set explicitly in modRestController (#16395)
- Upgrade legacy modSessionHandler class references in settings (#16379)
- Modify (un)delete and (un)publish processors to respect syncsite setting (#16374)
- Update uploadObjectsToContainer method (#16196)
- Add resource alias in template picker as needed (#16371)
- Cleanup legacy PHP version references (#16359)
- Prevent OnResourceDelete from firing on every Resource update (#16328)
- Fix "Undefined array key" warnings in modPhpThumb (#16341)
- Fix package manager showing only last version changelog (#16354)
- Fix tab tracking error in package manager (#16360)
- Fix tab tracking issue for plugin panel (#16364)
- Fix parsing modifiers when encountering literal brackets (#16302)
- Fix parsing long template tags under some conditions (#16316)PK ! d'
H H
fileindex.phpnu [ config.core.php
connectors
core
ht.access
index.php
manager
setup
assetsPK ! " xpdo.class.phpnu [
* @copyright Copyright (C) 2006-2014, Jason Coward
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v2
* @package xpdo
*/
if (!defined('XPDO_PHP_VERSION')) {
/**
* Defines the PHP version string xPDO is running under.
*/
define('XPDO_PHP_VERSION', phpversion());
}
if (!defined('XPDO_CLI_MODE')) {
if (php_sapi_name() == 'cli') {
/**
* This constant defines if xPDO is operating from the CLI.
*/
define('XPDO_CLI_MODE', true);
} else {
/** @ignore */
define('XPDO_CLI_MODE', false);
}
}
if (!defined('XPDO_CORE_PATH')) {
/**
* @internal This global variable is only used to set the {@link
* XPDO_CORE_PATH} value upon initial include of this file. Not meant for
* external use.
* @var string
* @access private
*/
$xpdo_core_path= strtr(realpath(dirname(__FILE__)), '\\', '/') . '/';
/**
* @var string The full path to the xPDO root directory.
*
* Use of this constant is recommended for use when building any path in
* your xPDO code.
*
* @access public
*/
define('XPDO_CORE_PATH', $xpdo_core_path);
}
if (!class_exists('PDO')) {
//@todo Handle PDO configuration errors here.
}
/**
* A wrapper for PDO that powers an object-relational data model.
*
* xPDO provides centralized data access via a simple object-oriented API, to
* a defined data structure. It provides the de facto methods for connecting
* to a data source, getting persistence metadata for any class extended from
* the {@link xPDOObject} class (core or custom), loading data source managers
* when needed to manage table structures, and retrieving instances (or rows) of
* any object in the model.
*
* Through various extensions, you can also reverse and forward engineer classes
* and metadata maps for xPDO, have classes, models, and properties maintain
* their own containers (databases, tables, columns, etc.) or changes to them,
* and much more.
*
* @package xpdo
*/
class xPDO {
/**#@+
* Constants
*/
const OPT_AUTO_CREATE_TABLES = 'auto_create_tables';
const OPT_BASE_CLASSES = 'base_classes';
const OPT_BASE_PACKAGES = 'base_packages';
const OPT_CACHE_COMPRESS = 'cache_compress';
const OPT_CACHE_DB = 'cache_db';
const OPT_CACHE_DB_COLLECTIONS = 'cache_db_collections';
const OPT_CACHE_DB_OBJECTS_BY_PK = 'cache_db_objects_by_pk';
const OPT_CACHE_DB_EXPIRES = 'cache_db_expires';
const OPT_CACHE_DB_HANDLER = 'cache_db_handler';
const OPT_CACHE_DB_SIG_CLASS = 'cache_db_sig_class';
const OPT_CACHE_DB_SIG_GRAPH = 'cache_db_sig_graph';
const OPT_CACHE_EXPIRES = 'cache_expires';
const OPT_CACHE_FORMAT = 'cache_format';
const OPT_CACHE_HANDLER = 'cache_handler';
const OPT_CACHE_KEY = 'cache_key';
const OPT_CACHE_PATH = 'cache_path';
const OPT_CACHE_PREFIX = 'cache_prefix';
const OPT_CACHE_ATTEMPTS = 'cache_attempts';
const OPT_CACHE_ATTEMPT_DELAY = 'cache_attempt_delay';
const OPT_CALLBACK_ON_REMOVE = 'callback_on_remove';
const OPT_CALLBACK_ON_SAVE = 'callback_on_save';
const OPT_CONNECTIONS = 'connections';
const OPT_CONN_INIT = 'connection_init';
const OPT_CONN_MUTABLE = 'connection_mutable';
const OPT_HYDRATE_FIELDS = 'hydrate_fields';
const OPT_HYDRATE_ADHOC_FIELDS = 'hydrate_adhoc_fields';
const OPT_HYDRATE_RELATED_OBJECTS = 'hydrate_related_objects';
const OPT_LOCKFILE_EXTENSION = 'lockfile_extension';
const OPT_USE_FLOCK = 'use_flock';
/**
* @deprecated
* @see call()
*/
const OPT_LOADER_CLASSES = 'loader_classes';
const OPT_ON_SET_STRIPSLASHES = 'on_set_stripslashes';
const OPT_SETUP = 'setup';
const OPT_TABLE_PREFIX = 'table_prefix';
const OPT_VALIDATE_ON_SAVE = 'validate_on_save';
const OPT_VALIDATOR_CLASS = 'validator_class';
const LOG_LEVEL_FATAL = 0;
const LOG_LEVEL_ERROR = 1;
const LOG_LEVEL_WARN = 2;
const LOG_LEVEL_INFO = 3;
const LOG_LEVEL_DEBUG = 4;
const SCHEMA_VERSION = '1.1';
/**
* @var PDO A reference to the PDO instance used by the current xPDOConnection.
*/
public $pdo= null;
/**
* @var array Configuration options for the xPDO instance.
*/
public $config= null;
/**
* @var xPDODriver An xPDODriver instance for the xPDOConnection instances to use.
*/
public $driver= null;
/**
* A map of data source meta data for all loaded classes.
* @var array
* @access public
*/
public $map= array ();
/**
* A default package for specifying classes by name.
* @var string
* @access public
*/
public $package= '';
/**
* An array storing packages and package-specific information.
* @var array
* @access public
*/
public $packages= array ();
/**
* {@link xPDOManager} instance, loaded only if needed to manage datasource
* containers, data structures, etc.
* @var xPDOManager
* @access public
*/
public $manager= null;
/**
* @var xPDOCacheManager The cache service provider registered for this xPDO
* instance.
*/
public $cacheManager= null;
/**
* @var string A root path for file-based caching services to use.
*/
private $cachePath= null;
/**
* @var array An array of supplemental service classes for this xPDO instance.
*/
public $services= array ();
/**
* @var float Start time of the request, initialized when the constructor is
* called.
*/
public $startTime= 0;
/**
* @var int The number of direct DB queries executed during a request.
*/
public $executedQueries= 0;
/**
* @var int The amount of request handling time spent with DB queries.
*/
public $queryTime= 0;
public $classMap = array();
/**
* @var xPDOConnection The current xPDOConnection for this xPDO instance.
*/
public $connection = null;
/**
* @var array PDO connections managed by this xPDO instance.
*/
private $_connections = array();
/**
* @var integer The logging level for the xPDO instance.
*/
protected $logLevel= xPDO::LOG_LEVEL_FATAL;
/**
* @var string The default logging target for the xPDO instance.
*/
protected $logTarget= 'ECHO';
/**
* Indicates the debug state of this instance.
* @var boolean Default is false.
* @access protected
*/
protected $_debug= false;
/**
* A global cache flag that can be used to enable/disable all xPDO caching.
* @var boolean All caching is disabled by default.
* @access public
*/
public $_cacheEnabled= false;
/**
* Indicates the opening escape character used for a particular database engine.
* @var string
* @access public
*/
public $_escapeCharOpen= '';
/**
* Indicates the closing escape character used for a particular database engine.
* @var string
* @access public
*/
public $_escapeCharClose= '';
/**
* Represents the character used for quoting strings for a particular driver.
* @var string
*/
public $_quoteChar= "'";
/**
* @var array A static collection of xPDO instances.
*/
protected static $instances = array();
/**
* Create, retrieve, or update specific xPDO instances.
*
* @static
* @param string|int|null $id An optional identifier for the instance. If not set
* a uniqid will be generated and used as the key for the instance.
* @param array|null $config An optional array of config data for the instance.
* @param bool $forceNew If true a new instance will be created even if an instance
* with the provided $id already exists in xPDO::$instances.
* @throws xPDOException If a valid instance is not retrieved.
* @return xPDO An instance of xPDO.
*/
public static function getInstance($id = null, $config = null, $forceNew = false) {
$instances =& self::$instances;
if (is_null($id)) {
if (!is_null($config) || $forceNew || empty($instances)) {
$id = uniqid(__CLASS__);
} else {
$id = key($instances);
}
}
if ($forceNew || !array_key_exists($id, $instances) || !($instances[$id] instanceof xPDO)) {
$instances[$id] = new xPDO(null, null, null, $config);
} elseif ($instances[$id] instanceof xPDO && is_array($config)) {
$instances[$id]->config = array_merge($instances[$id]->config, $config);
}
if (!($instances[$id] instanceof xPDO)) {
throw new xPDOException("Error getting " . __CLASS__ . " instance, id = {$id}");
}
return $instances[$id];
}
/**
* The xPDO Constructor.
*
* This method is used to create a new xPDO object with a connection to a
* specific database container.
*
* @param mixed $dsn A valid DSN connection string.
* @param string $username The database username with proper permissions.
* @param string $password The password for the database user.
* @param array|string $options An array of xPDO options. For compatibility with previous
* releases, this can also be a single string representing a prefix to be applied to all
* database container (i. e. table) names, to isolate multiple installations or conflicting
* table names that might need to coexist in a single database container. It is preferrable to
* include the table_prefix option in the array for future compatibility.
* @param array|null $driverOptions Driver-specific PDO options.
* @throws xPDOException If an error occurs creating the instance.
* @return xPDO A unique xPDO instance.
*/
public function __construct($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) {
try {
$this->config = $this->initConfig($options);
$this->setLogLevel($this->getOption('log_level', null, xPDO::LOG_LEVEL_FATAL, true));
$this->setLogTarget($this->getOption('log_target', null, XPDO_CLI_MODE ? 'ECHO' : 'HTML', true));
if (!empty($dsn)) {
$this->addConnection($dsn, $username, $password, $this->config, $driverOptions);
}
if (isset($this->config[xPDO::OPT_CONNECTIONS])) {
$connections = $this->config[xPDO::OPT_CONNECTIONS];
if (is_string($connections)) {
$connections = $this->fromJSON($connections);
}
if (is_array($connections)) {
foreach ($connections as $connection) {
$this->addConnection(
$connection['dsn'],
$connection['username'],
$connection['password'],
$connection['options'],
$connection['driverOptions']
);
}
}
}
$initOptions = $this->getOption(xPDO::OPT_CONN_INIT, null, array());
$this->config = array_merge($this->config, $this->getConnection($initOptions)->config);
$this->getDriver();
$this->setPackage('om', XPDO_CORE_PATH, $this->config[xPDO::OPT_TABLE_PREFIX]);
if (isset($this->config[xPDO::OPT_BASE_PACKAGES]) && !empty($this->config[xPDO::OPT_BASE_PACKAGES])) {
$basePackages= explode(',', $this->config[xPDO::OPT_BASE_PACKAGES]);
foreach ($basePackages as $basePackage) {
$exploded= explode(':', $basePackage, 2);
if ($exploded) {
$path= $exploded[1];
$prefix= null;
if (strpos($path, ';')) {
$details= explode(';', $path);
if ($details && count($details) == 2) {
$path= $details[0];
$prefix = $details[1];
}
}
$this->addPackage($exploded[0], $path, $prefix);
}
}
}
$this->loadClass('xPDOObject');
$this->loadClass('xPDOSimpleObject');
if (isset($this->config[xPDO::OPT_BASE_CLASSES])) {
foreach (array_keys($this->config[xPDO::OPT_BASE_CLASSES]) as $baseClass) {
$this->loadClass($baseClass);
}
}
if (isset($this->config[xPDO::OPT_CACHE_PATH])) {
$this->cachePath = $this->config[xPDO::OPT_CACHE_PATH];
}
} catch (Exception $e) {
throw new xPDOException("Could not instantiate xPDO: " . $e->getMessage());
}
}
/**
* Initialize an xPDO config array.
*
* @param string|array $data The config input source. Currently accepts a PHP array,
* or a PHP string representing xPDO::OPT_TABLE_PREFIX (deprecated).
* @return array An array of xPDO config data.
*/
protected function initConfig($data) {
if (is_string($data)) {
$data= array(xPDO::OPT_TABLE_PREFIX => $data);
} elseif (!is_array($data)) {
$data= array(xPDO::OPT_TABLE_PREFIX => '');
}
return $data;
}
/**
* Add an xPDOConnection instance to the xPDO connection pool.
*
* @param string $dsn A PDO DSN representing the connection details.
* @param string $username The username credentials for the connection.
* @param string $password The password credentials for the connection.
* @param array $options An array of options for the connection.
* @param null $driverOptions An array of PDO driver options for the connection.
* @return boolean True if a valid connection was added.
*/
public function addConnection($dsn, $username= '', $password= '', array $options= array(), $driverOptions= null) {
$added = false;
$connection= new xPDOConnection($this, $dsn, $username, $password, $options, $driverOptions);
if ($connection instanceof xPDOConnection) {
$this->_connections[]= $connection;
$added= true;
}
return $added;
}
/**
* Get an xPDOConnection from the xPDO connection pool.
*
* @param array $options An array of options for getting the connection.
* @return xPDOConnection|null An xPDOConnection instance or null if no connection could be retrieved.
*/
public function &getConnection(array $options = array()) {
$conn =& $this->connection;
$mutable = $this->getOption(xPDO::OPT_CONN_MUTABLE, $options, null);
if (!($conn instanceof xPDOConnection) || ($mutable !== null && (($mutable == true && !$conn->isMutable()) || ($mutable == false && $conn->isMutable())))) {
if (!empty($this->_connections)) {
shuffle($this->_connections);
$conn = reset($this->_connections);
while ($conn) {
if ($mutable !== null && (($mutable == true && !$conn->isMutable()) || ($mutable == false && $conn->isMutable()))) {
$conn = next($this->_connections);
continue;
}
$this->connection =& $conn;
break;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get a valid xPDOConnection", '', __METHOD__, __FILE__, __LINE__);
}
}
return $this->connection;
}
/**
* Get or create a PDO connection to a database specified in the configuration.
*
* @param array $driverOptions An optional array of driver options to use
* when creating the connection.
* @param array $options An array of xPDO options for the connection.
* @return boolean Returns true if the PDO connection was created successfully.
*/
public function connect($driverOptions= array (), array $options= array()) {
$connected = false;
$this->getConnection($options);
if ($this->connection instanceof xPDOConnection) {
$connected = $this->connection->connect($driverOptions);
if ($connected) {
$this->pdo =& $this->connection->pdo;
}
}
return $connected;
}
/**
* Sets a specific model package to use when looking up classes.
*
* This package is of the form package.subpackage.subsubpackage and will be
* added to the beginning of every xPDOObject class that is referenced in
* xPDO methods such as {@link xPDO::loadClass()}, {@link xPDO::getObject()},
* {@link xPDO::getCollection()}, {@link xPDOObject::getOne()}, {@link
* xPDOObject::addOne()}, etc.
*
* @param string $pkg A package name to use when looking up classes in xPDO.
* @param string $path The root path for looking up classes in this package.
* @param string|null $prefix Provide a string to define a package-specific table_prefix.
* @return bool
*/
public function setPackage($pkg= '', $path= '', $prefix= null) {
if (empty($path) && isset($this->packages[$pkg])) {
$path= $this->packages[$pkg]['path'];
$prefix= !is_string($prefix) && array_key_exists('prefix', $this->packages[$pkg]) ? $this->packages[$pkg]['prefix'] : $prefix;
}
$set= $this->addPackage($pkg, $path, $prefix);
$this->package= $set == true ? $pkg : $this->package;
if ($set && is_string($prefix)) $this->config[xPDO::OPT_TABLE_PREFIX]= $prefix;
return $set;
}
/**
* Adds a model package and base class path for including classes and/or maps from.
*
* @param string $pkg A package name to use when looking up classes/maps in xPDO.
* @param string $path The root path for looking up classes in this package.
* @param string|null $prefix Provide a string to define a package-specific table_prefix.
* @return bool
*/
public function addPackage($pkg= '', $path= '', $prefix= null) {
$added= false;
if (is_string($pkg) && !empty($pkg)) {
if (!is_string($path) || empty($path)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Invalid path specified for package: {$pkg}; using default xpdo model path: " . XPDO_CORE_PATH . 'om/');
$path= XPDO_CORE_PATH . 'om/';
}
if (!is_dir($path)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Path specified for package {$pkg} is not a valid or accessible directory: {$path}");
} else {
$prefix= !is_string($prefix) ? $this->config[xPDO::OPT_TABLE_PREFIX] : $prefix;
if (!array_key_exists($pkg, $this->packages) || $this->packages[$pkg]['path'] !== $path || $this->packages[$pkg]['prefix'] !== $prefix) {
$this->packages[$pkg]= array('path' => $path, 'prefix' => $prefix);
$this->setPackageMeta($pkg, $path);
}
$added= true;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'addPackage called with an invalid package name.');
}
return $added;
}
/**
* Adds metadata information about a package and loads the xPDO::$classMap.
*
* @param string $pkg A package name to use when looking up classes/maps in xPDO.
* @param string $path The root path for looking up classes in this package.
* @return bool
*/
public function setPackageMeta($pkg, $path = '') {
$set = false;
if (is_string($pkg) && !empty($pkg)) {
$pkgPath = str_replace('.', '/', $pkg);
$mapFile = $path . $pkgPath . '/metadata.' . $this->config['dbtype'] . '.php';
if (file_exists($mapFile)) {
$xpdo_meta_map = '';
include $mapFile;
if (!empty($xpdo_meta_map)) {
foreach ($xpdo_meta_map as $className => $extends) {
if (!isset($this->classMap[$className])) {
$this->classMap[$className] = array();
}
$this->classMap[$className] = array_unique(array_merge($this->classMap[$className],$extends));
}
$set = true;
}
} else {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load package metadata for package {$pkg}.");
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'setPackageMeta called with an invalid package name.');
}
return $set;
}
/**
* Gets a list of derivative classes for the specified className.
*
* The specified className must be xPDOObject or a derivative class.
*
* @param string $className The name of the class to retrieve derivatives for.
* @return array An array of derivative classes or an empty array.
*/
public function getDescendants($className) {
$descendants = array();
if (isset($this->classMap[$className])) {
$descendants = $this->classMap[$className];
if ($descendants) {
foreach ($descendants as $descendant) {
$descendants = array_merge($descendants, $this->getDescendants($descendant));
}
}
}
return $descendants;
}
/**
* Load a class by fully qualified name.
*
* The $fqn should in the format:
*
* dir_a.dir_b.dir_c.classname
*
* which will translate to:
*
* XPDO_CORE_PATH/om/dir_a/dir_b/dir_c/dbtype/classname.class.php
*
* @param string $fqn The fully-qualified name of the class to load.
* @param string $path An optional path to start the search from.
* @param bool $ignorePkg True if currently loaded packages should be ignored.
* @param bool $transient True if the class is not a persistent table class.
* @return string|boolean The actual classname if successful, or false if
* not.
*/
public function loadClass($fqn, $path= '', $ignorePkg= false, $transient= false) {
if (empty($fqn)) {
$this->log(xPDO::LOG_LEVEL_ERROR, "No class specified for loadClass");
return false;
}
if (!$transient) {
$typePos= strrpos($fqn, '_' . $this->config['dbtype']);
if ($typePos !== false) {
$fqn= substr($fqn, 0, $typePos);
}
}
$pos= strrpos($fqn, '.');
if ($pos === false) {
$class= $fqn;
if ($transient) {
$fqn= strtolower($class);
} else {
$fqn= $this->config['dbtype'] . '.' . strtolower($class);
}
} else {
$class= substr($fqn, $pos +1);
if ($transient) {
$fqn= substr($fqn, 0, $pos) . '.' . strtolower($class);
} else {
$fqn= substr($fqn, 0, $pos) . '.' . $this->config['dbtype'] . '.' . strtolower($class);
}
}
// check if class exists
if (!$transient && isset ($this->map[$class])) return $class;
$included= class_exists($class, false);
if ($included) {
if ($transient || (!$transient && isset ($this->map[$class]))) {
return $class;
}
}
$classname= $class;
if (!empty($path) || $ignorePkg) {
$class= $this->_loadClass($class, $fqn, $included, $path, $transient);
} elseif (isset ($this->packages[$this->package])) {
$pqn= $this->package . '.' . $fqn;
if (!$pkgClass= $this->_loadClass($class, $pqn, $included, $this->packages[$this->package]['path'], $transient)) {
foreach ($this->packages as $pkg => $pkgDef) {
if ($pkg === $this->package) continue;
$pqn= $pkg . '.' . $fqn;
if ($pkgClass= $this->_loadClass($class, $pqn, $included, $pkgDef['path'], $transient)) {
break;
}
}
}
$class= $pkgClass;
} else {
$class= false;
}
if ($class === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class: {$classname} from {$fqn}.");
}
return $class;
}
protected function _loadClass($class, $fqn, $included= false, $path= '', $transient= false) {
if (empty($path)) $path= XPDO_CORE_PATH;
if (!$included) {
/* turn to filesystem path and enforce all lower-case paths and filenames */
$fqcn= str_replace('.', '/', $fqn) . '.class.php';
/* include class */
if (!file_exists($path . $fqcn)) return false;
if (!$rt= include_once ($path . $fqcn)) {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load class: {$class} from {$path}{$fqcn}");
$class= false;
}
}
if ($class && !$transient && !isset ($this->map[$class])) {
$mapfile= strtr($fqn, '.', '/') . '.map.inc.php';
if (file_exists($path . $mapfile)) {
$xpdo_meta_map= & $this->map;
$rt= include ($path . $mapfile);
if (!$rt || !isset($this->map[$class])) {
$this->log(xPDO::LOG_LEVEL_WARN, "Could not load metadata map {$mapfile} for class {$class} from {$fqn}");
} else {
if (!array_key_exists('fieldAliases', $this->map[$class])) {
$this->map[$class]['fieldAliases'] = array();
}
}
}
}
return $class;
}
/**
* Get an xPDO configuration option value by key.
*
* @param string $key The option key.
* @param array $options A set of options to override those from xPDO.
* @param mixed $default An optional default value to return if no value is found.
* @return mixed The configuration option value.
*/
public function getOption($key, $options = null, $default = null, $skipEmpty = false) {
$option= $default;
if (is_array($key)) {
if (!is_array($option)) {
$default= $option;
$option= array();
}
foreach ($key as $k) {
$option[$k]= $this->getOption($k, $options, $default);
}
} elseif (is_string($key) && !empty($key)) {
if (is_array($options) && !empty($options) && array_key_exists($key, $options) && (!$skipEmpty || ($skipEmpty && $options[$key] !== ''))) {
$option= $options[$key];
} elseif (is_array($this->config) && !empty($this->config) && array_key_exists($key, $this->config) && (!$skipEmpty || ($skipEmpty && $this->config[$key] !== ''))) {
$option= $this->config[$key];
}
}
return $option;
}
/**
* Sets an xPDO configuration option value.
*
* @param string $key The option key.
* @param mixed $value A value to set for the given option key.
*/
public function setOption($key, $value) {
$this->config[$key]= $value;
}
/**
* Call a static method from a valid package class with arguments.
*
* Will always search for database-specific class files first.
*
* @param string $class The name of a class to to get the static method from.
* @param string $method The name of the method you want to call.
* @param array $args An array of arguments for the method.
* @param boolean $transient Indicates if the class has dbtype derivatives. Set to true if you
* want to use on classes not derived from xPDOObject.
* @return mixed|null The callback method's return value or null if no valid method is found.
*/
public function call($class, $method, array $args = array(), $transient = false) {
$return = null;
$callback = '';
if ($transient) {
$className = $this->loadClass($class, '', false, true);
if ($className) {
$callback = array($className, $method);
}
} else {
$className = $this->loadClass($class);
if ($className) {
$className .= '_' . $this->getOption('dbtype');
$callback = array($className, $method);
}
}
if (!empty($callback) && is_callable($callback)) {
try {
$return = call_user_func_array($callback, $args);
} catch (Exception $e) {
$this->log(xPDO::LOG_LEVEL_ERROR, "An exception occurred calling {$className}::{$method}() - " . $e->getMessage());
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "{$class}::{$method}() is not a valid static method.");
}
return $return;
}
/**
* Creates a new instance of a specified class.
*
* All new objects created with this method are transient until {@link
* xPDOObject::save()} is called the first time and is reflected by the
* {@link xPDOObject::$_new} property.
*
* @param string $className Name of the class to get a new instance of.
* @param array $fields An associated array of field names/values to
* populate the object with.
* @return object|null A new instance of the specified class, or null if a
* new object could not be instantiated.
*/
public function newObject($className, $fields= array ()) {
$instance= null;
if ($className= $this->loadClass($className)) {
$className .= '_' . $this->config['dbtype'];
if ($instance= new $className ($this)) {
if (is_array($fields) && !empty ($fields)) {
$instance->fromArray($fields);
}
}
}
return $instance;
}
/**
* Finds the class responsible for loading instances of the specified class.
*
* @deprecated Use call() instead.
* @param string $className The name of the class to find a loader for.
* @param string $method Indicates the specific loader method to use,
* loadCollection or loadObject (or other public static methods).
* @return callable A callable loader function.
*/
public function getObjectLoader($className, $method) {
$loader = false;
if (isset($this->config[xPDO::OPT_LOADER_CLASSES]) && is_array($this->config[xPDO::OPT_LOADER_CLASSES])) {
if ($ancestry = $this->getAncestry($className, true)) {
if ($callbacks = array_intersect($ancestry, $this->config[xPDO::OPT_LOADER_CLASSES])) {
if ($loaderClass = reset($callbacks)) {
$loader = array($loaderClass, $method);
while (!is_callable($loader) && $loaderClass = next($callbacks)) {
$loader = array($loaderClass, $method);
}
}
}
}
}
if (!is_callable($loader)) {
$loader = array('xPDOObject', $method);
}
return $loader;
}
/**
* Retrieves a single object instance by the specified criteria.
*
* The criteria can be a primary key value, and array of primary key values
* (for multiple primary key objects) or an {@link xPDOCriteria} object. If
* no $criteria parameter is specified, no class is found, or an object
* cannot be located by the supplied criteria, null is returned.
*
* @uses xPDOObject::load()
* @param string $className Name of the class to get an instance of.
* @param mixed $criteria Primary key of the record or a xPDOCriteria object.
* @param mixed $cacheFlag If an integer value is provided, this specifies
* the time to live in the object cache; if cacheFlag === false, caching is
* ignored for the object and if cacheFlag === true, the object will live in
* cache indefinitely.
* @return object|null An instance of the class, or null if it could not be
* instantiated.
*/
public function getObject($className, $criteria= null, $cacheFlag= true) {
$instance= null;
if ($criteria !== null) {
$instance = $this->call($className, 'load', array(& $this, $className, $criteria, $cacheFlag));
}
return $instance;
}
/**
* Retrieves a collection of xPDOObjects by the specified xPDOCriteria.
*
* @uses xPDOObject::loadCollection()
* @param string $className Name of the class to search for instances of.
* @param object|array|string $criteria An xPDOCriteria object or an array
* search expression.
* @param mixed $cacheFlag If an integer value is provided, this specifies
* the time to live in the result set cache; if cacheFlag === false, caching
* is ignored for the collection and if cacheFlag === true, the objects will
* live in cache until flushed by another process.
* @return array|null An array of class instances retrieved.
*/
public function getCollection($className, $criteria= null, $cacheFlag= true) {
return $this->call($className, 'loadCollection', array(& $this, $className, $criteria, $cacheFlag));
}
/**
* Retrieves an iterable representation of a collection of xPDOObjects.
*
* @param string $className Name of the class to search for instances of.
* @param mixed $criteria An xPDOCriteria object or representation.
* @param bool $cacheFlag If an integer value is provided, this specifies
* the time to live in the result set cache; if cacheFlag === false, caching
* is ignored for the collection and if cacheFlag === true, the objects will
* live in cache until flushed by another process.
* @return xPDOIterator An iterable representation of a collection.
*/
public function getIterator($className, $criteria= null, $cacheFlag= true) {
return new xPDOIterator($this, array('class' => $className, 'criteria' => $criteria, 'cacheFlag' => $cacheFlag));
}
/**
* Update field values across a collection of xPDOObjects.
*
* @param string $className Name of the class to update fields of.
* @param array $set An associative array of field/value pairs representing the updates to make.
* @param mixed $criteria An xPDOCriteria object or representation.
* @return bool|int The number of instances affected by the update or false on failure.
*/
public function updateCollection($className, array $set, $criteria= null) {
$affected = false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
$query = $this->newQuery($className);
if ($query && !empty($set)) {
$query->command('UPDATE');
$query->set($set);
if (!empty($criteria)) $query->where($criteria);
if ($query->prepare()) {
$affected = $this->exec($query->toSQL());
if ($affected === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Error updating {$className} instances using query " . $query->toSQL(), '', __METHOD__, __FILE__, __LINE__);
} else {
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$relatedClasses = array($query->getTableClass());
$related = array_merge($this->getAggregates($className), $this->getComposites($className));
foreach ($related as $relatedAlias => $relatedMeta) {
$relatedClasses[] = $relatedMeta['class'];
}
$relatedClasses = array_unique($relatedClasses);
foreach ($relatedClasses as $relatedClass) {
$this->cacheManager->delete($relatedClass, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', null, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, null, $this->getOption(xPDO::OPT_CACHE_HANDLER, null, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', null, $this->getOption(xPDO::OPT_CACHE_FORMAT, null, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', null, xPDOCacheManager::CACHE_DIR),
'multiple_object_delete' => true
));
}
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_SAVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query, 'object' => null));
}
}
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $affected;
}
/**
* Remove an instance of the specified className by a supplied criteria.
*
* @param string $className The name of the class to remove an instance of.
* @param mixed $criteria Valid xPDO criteria for selecting an instance.
* @return boolean True if the instance is successfully removed.
*/
public function removeObject($className, $criteria) {
$removed= false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
if ($this->getCount($className, $criteria) === 1) {
if ($query= $this->newQuery($className)) {
$query->command('DELETE');
$query->where($criteria);
if ($query->prepare()) {
if ($this->exec($query->toSQL()) !== 1) {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeObject - Error deleting {$className} instance using query " . $query->toSQL());
} else {
$removed= true;
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$this->cacheManager->delete(xPDOCacheManager::CACHE_DIR . $query->getAlias(), array('multiple_object_delete' => true));
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_REMOVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query));
}
}
}
}
} else {
$this->log(xPDO::LOG_LEVEL_WARN, "xPDO->removeObject - {$className} instance to remove not found!");
if ($this->getDebug() === true) $this->log(xPDO::LOG_LEVEL_DEBUG, "xPDO->removeObject - {$className} instance to remove not found using criteria " . print_r($criteria, true));
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $removed;
}
/**
* Remove a collection of instances by the supplied className and criteria.
*
* @param string $className The name of the class to remove a collection of.
* @param mixed $criteria Valid xPDO criteria for selecting a collection.
* @return boolean|integer False if the remove encounters an error, otherwise an integer value
* representing the number of rows that were removed.
*/
public function removeCollection($className, $criteria) {
$removed= false;
if ($this->getConnection(array(xPDO::OPT_CONN_MUTABLE => true))) {
if ($query= $this->newQuery($className)) {
$query->command('DELETE');
$query->where($criteria);
if ($query->prepare()) {
$removed= $this->exec($query->toSQL());
if ($removed === false) {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeCollection - Error deleting {$className} instances using query " . $query->toSQL());
} else {
if ($this->getOption(xPDO::OPT_CACHE_DB)) {
$this->cacheManager->delete(xPDOCacheManager::CACHE_DIR . $query->getAlias(), array('multiple_object_delete' => true));
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_REMOVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $className, 'criteria' => $query));
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "xPDO->removeCollection - Error preparing statement to delete {$className} instances using query: {$query->toSQL()}");
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not get connection for writing data", '', __METHOD__, __FILE__, __LINE__);
}
return $removed;
}
/**
* Retrieves a count of xPDOObjects by the specified xPDOCriteria.
*
* @param string $className Class of xPDOObject to count instances of.
* @param mixed $criteria Any valid xPDOCriteria object or expression.
* @return integer The number of instances found by the criteria.
*/
public function getCount($className, $criteria = null) {
$count = 0;
if ($query = $this->newQuery($className, $criteria)) {
$stmt = null;
$expr = '*';
if ($pk = $this->getPK($className)) {
if (!is_array($pk)) {
$pk = array($pk);
}
$expr = $this->getSelectColumns($className, $query->getAlias(), '', $pk);
}
if (isset($query->query['columns'])) {
$query->query['columns'] = array();
}
if (!empty($query->query['groupby']) || !empty($query->query['having'])) {
$query->select($expr);
if ($query->prepare()) {
$countQuery = new xPDOCriteria($this, "SELECT COUNT(*) FROM ({$query->toSQL(false)}) cq", $query->bindings, $query->cacheFlag);
$stmt = $countQuery->prepare();
}
} else {
$query->select(array("COUNT(DISTINCT {$expr})"));
$stmt = $query->prepare();
}
if ($stmt && $stmt->execute()) {
$count = intval($stmt->fetchColumn());
}
}
return $count;
}
/**
* Retrieves an xPDOObject instance with specified related objects.
*
* @uses xPDO::getCollectionGraph()
* @param string $className The name of the class to return an instance of.
* @param string|array $graph A related object graph in array or JSON
* format, e.g. array('relationAlias'=>array('subRelationAlias'=>array()))
* or {"relationAlias":{"subRelationAlias":{}}}. Note that the empty arrays
* are necessary in order for the relation to be recognized.
* @param mixed $criteria A valid xPDOCriteria instance or expression.
* @param boolean|integer $cacheFlag Indicates if the result set should be
* cached, and optionally for how many seconds.
* @return object The object instance with related objects from the graph
* hydrated, or null if no instance can be located by the criteria.
*/
public function getObjectGraph($className, $graph, $criteria= null, $cacheFlag= true) {
$object= null;
if ($collection= $this->getCollectionGraph($className, $graph, $criteria, $cacheFlag)) {
if (!count($collection) === 1) {
$this->log(xPDO::LOG_LEVEL_WARN, 'getObjectGraph criteria returned more than one instance.');
}
$object= reset($collection);
}
return $object;
}
/**
* Retrieves a collection of xPDOObject instances with related objects.
*
* @uses xPDOQuery::bindGraph()
* @param string $className The name of the class to return a collection of.
* @param string|array $graph A related object graph in array or JSON
* format, e.g. array('relationAlias'=>array('subRelationAlias'=>array()))
* or {"relationAlias":{"subRelationAlias":{}}}. Note that the empty arrays
* are necessary in order for the relation to be recognized.
* @param mixed $criteria A valid xPDOCriteria instance or condition string.
* @param boolean $cacheFlag Indicates if the result set should be cached.
* @return array An array of instances matching the criteria with related
* objects from the graph hydrated. An empty array is returned when no
* matches are found.
*/
public function getCollectionGraph($className, $graph, $criteria= null, $cacheFlag= true) {
return $this->call($className, 'loadCollectionGraph', array(& $this, $className, $graph, $criteria, $cacheFlag));
}
/**
* Execute a PDOStatement and get a single column value from the first row of the result set.
*
* @param PDOStatement $stmt A prepared PDOStatement object ready to be executed.
* @param null|integer $column 0-indexed number of the column you wish to retrieve from the row. If
* null or no value is supplied, it fetches the first column.
* @return mixed The value of the specified column from the first row of the result set, or null.
*/
public function getValue($stmt, $column= null) {
$value = null;
if (is_object($stmt) && $stmt instanceof PDOStatement) {
$tstart = microtime(true);
if ($stmt->execute()) {
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
$value= $stmt->fetchColumn($column);
$stmt->closeCursor();
} else {
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
$this->log(xPDO::LOG_LEVEL_ERROR, "Error " . $stmt->errorCode() . " executing statement: \n" . print_r($stmt->errorInfo(), true), '', __METHOD__, __FILE__, __LINE__);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "No valid PDOStatement provided to getValue", '', __METHOD__, __FILE__, __LINE__);
}
return $value;
}
/**
* Convert any valid criteria into an xPDOQuery instance.
*
* @todo Get criteria pre-defined in an {@link xPDOObject} class metadata
* definition by name.
*
* @todo Define callback functions as an alternative to retreiving criteria
* sql and/or bindings from the metadata.
*
* @param string $className The class to get predefined criteria for.
* @param string $type The type of criteria to get (you can define any
* type you want, but 'object' and 'collection' are the typical criteria
* for retrieving single and multiple instances of an object).
* @param boolean|integer $cacheFlag Indicates if the result is cached and
* optionally for how many seconds.
* @return xPDOCriteria A criteria object or null if not found.
*/
public function getCriteria($className, $type= null, $cacheFlag= true) {
return $this->newQuery($className, $type, $cacheFlag);
}
/**
* Validate and return the type of a specified criteria variable.
*
* @param mixed $criteria An xPDOCriteria instance or any valid criteria variable.
* @return string|null The type of valid criteria passed, or null if the criteria is not valid.
*/
public function getCriteriaType($criteria) {
$type = gettype($criteria);
if ($type === 'object') {
$type = get_class($criteria);
if (!$criteria instanceof xPDOCriteria) {
$this->log(xPDO::LOG_LEVEL_WARN, "Invalid criteria object of class {$type} encountered.", '', __METHOD__, __FILE__, __LINE__);
$type = null;
}
}
return $type;
}
/**
* Add criteria when requesting a derivative class row automatically.
*
* This applies class_key filtering for single-table inheritance queries and may
* provide a convenient location for similar features in the future.
*
* @param string $className A valid xPDOObject derivative table class.
* @param xPDOQuery $criteria A valid xPDOQuery instance.
* @return xPDOQuery The xPDOQuery instance with derivative criteria added.
*/
public function addDerivativeCriteria($className, $criteria) {
if ($criteria instanceof xPDOQuery && !isset($this->map[$className]['table'])) {
if (isset($this->map[$className]['fields']['class_key']) && !empty($this->map[$className]['fields']['class_key'])) {
$criteria->where(array('class_key' => $this->map[$className]['fields']['class_key']));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "#1: Automatically adding class_key criteria for derivative query of class {$className}");
}
} else {
foreach ($this->getAncestry($className, false) as $ancestor) {
if (isset($this->map[$ancestor]['table']) && isset($this->map[$ancestor]['fields']['class_key'])) {
$criteria->where(array('class_key' => $className));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "#2: Automatically adding class_key criteria for derivative query of class {$className} from base table class {$ancestor}");
}
break;
}
}
}
}
return $criteria;
}
/**
* Gets the package name from a specified class name.
*
* @param string $className The name of the class to lookup the package for.
* @return string The package the class belongs to.
*/
public function getPackage($className) {
$package= '';
if ($className= $this->loadClass($className)) {
if (isset($this->map[$className]['package'])) {
$package= $this->map[$className]['package'];
}
if (!$package && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['package']) && ($package= $this->map[$ancestor]['package'])) {
break;
}
}
}
}
return $package;
}
/**
* Load and return a named service class instance.
*
* @param string $name The variable name of the instance.
* @param string $class The service class name.
* @param string $path An optional root path to search for the class.
* @param array $params An array of optional params to pass to the service
* class constructor.
* @return object|null A reference to the service class instance or null if
* it could not be loaded.
*/
public function &getService($name, $class= '', $path= '', $params= array ()) {
$service= null;
if (!isset ($this->services[$name]) || !is_object($this->services[$name])) {
if (empty ($class) && isset ($this->config[$name . '.class'])) {
$class= $this->config[$name . '.class'];
} elseif (empty ($class)) {
$class= $name;
}
$className= $this->loadClass($class, $path, false, true);
if (!empty($className)) {
$service = new $className ($this, $params);
if ($service) {
$this->services[$name]=& $service;
$this->$name= & $this->services[$name];
}
}
}
if (array_key_exists($name, $this->services)) {
$service= & $this->services[$name];
} else {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Problem getting service {$name}, instance of class {$class}, from path {$path}, with params " . print_r($params, true));
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Problem getting service {$name}, instance of class {$class}, from path {$path}");
}
}
return $service;
}
/**
* Gets the actual run-time table name from a specified class name.
*
* @param string $className The name of the class to lookup a table name
* for.
* @param boolean $includeDb Qualify the table name with the database name.
* @return string The table name for the class, or null if unsuccessful.
*/
public function getTableName($className, $includeDb= false) {
$table= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['table'])) {
$table= $this->map[$className]['table'];
if (isset($this->map[$className]['package']) && isset($this->packages[$this->map[$className]['package']]['prefix'])) {
$table= $this->packages[$this->map[$className]['package']]['prefix'] . $table;
} else {
$table= $this->getOption(xPDO::OPT_TABLE_PREFIX, null, '') . $table;
}
}
if (!$table && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['table']) && $table= $this->map[$ancestor]['table']) {
if (isset($this->map[$ancestor]['package']) && isset($this->packages[$this->map[$ancestor]['package']]['prefix'])) {
$table= $this->packages[$this->map[$ancestor]['package']]['prefix'] . $table;
} else {
$table= $this->getOption(xPDO::OPT_TABLE_PREFIX, null, '') . $table;
}
break;
}
}
}
}
if ($table) {
$table= $this->_getFullTableName($table, $includeDb);
if ($this->getDebug() === true) $this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning table name: ' . $table . ' for class: ' . $className);
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'Could not get table name for class: ' . $className);
}
return $table;
}
/**
* Get the class which defines the table for a specified className.
*
* @param string $className The name of a class to determine the table class from.
* @return null|string The name of a class defining the table for the specified className; null if not found.
*/
public function getTableClass($className) {
$tableClass= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['table'])) {
$tableClass= $className;
}
if (!$tableClass && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['table'])) {
$tableClass= $ancestor;
break;
}
}
}
}
if ($tableClass) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning table class: ' . $tableClass . ' for class: ' . $className);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, 'Could not get table class for class: ' . $className);
}
return $tableClass;
}
/**
* Gets the actual run-time table metadata from a specified class name.
*
* @param string $className The name of the class to lookup a table name
* for.
* @return string The table meta data for the class, or null if
* unsuccessful.
*/
public function getTableMeta($className) {
$tableMeta= null;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['tableMeta'])) {
$tableMeta= $this->map[$className]['tableMeta'];
}
if (!$tableMeta && $ancestry= $this->getAncestry($className)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['tableMeta'])) {
if ($tableMeta= $this->map[$ancestor]['tableMeta']) {
break;
}
}
}
}
}
return $tableMeta;
}
/**
* Indicates the inheritance model for the xPDOObject class specified.
*
* @param string $className The class to determine the table inherit type from.
* @return string single, multiple, or none
*/
public function getInherit($className) {
$inherit= false;
if ($className= $this->loadClass($className)) {
if (isset ($this->map[$className]['inherit'])) {
$inherit= $this->map[$className]['inherit'];
}
if (!$inherit && $ancestry= $this->getAncestry($className, false)) {
foreach ($ancestry as $ancestor) {
if (isset ($this->map[$ancestor]['inherit'])) {
$inherit= $this->map[$ancestor]['inherit'];
break;
}
}
}
}
if (!empty($inherit)) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Returning inherit: ' . $inherit . ' for class: ' . $className);
}
} else {
$inherit= 'none';
}
return $inherit;
}
/**
* Gets a list of fields (or columns) for an object by class name.
*
* This includes default values for each field and is used by the objects
* themselves to build their initial attributes based on class inheritence.
*
* @param string $className The name of the class to lookup fields for.
* @return array An array featuring field names as the array keys, and
* default field values as the array values; empty array is returned if
* unsuccessful.
*/
public function getFields($className) {
$fields= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fields'])) {
$fields= array_merge($fields, $this->map[$ancestry[$i]]['fields']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fields'])) {
$fields= array_merge($fields, array_diff_key($this->map[$descendantClass]['fields'], $fields));
}
}
}
}
}
return $fields;
}
/**
* Gets a list of field (or column) definitions for an object by class name.
*
* These definitions are used by the objects themselves to build their
* own meta data based on class inheritance.
*
* @param string $className The name of the class to lookup fields meta data
* for.
* @param boolean $includeExtended If true, include meta from all derivative
* classes in loaded packages.
* @return array An array featuring field names as the array keys, and
* arrays of metadata information as the array values; empty array is
* returned if unsuccessful.
*/
public function getFieldMeta($className, $includeExtended = false) {
$fieldMeta= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fieldMeta'])) {
$fieldMeta= array_merge($fieldMeta, $this->map[$ancestry[$i]]['fieldMeta']);
}
}
}
if ($includeExtended && $this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fieldMeta'])) {
$fieldMeta= array_merge($fieldMeta, array_diff_key($this->map[$descendantClass]['fieldMeta'], $fieldMeta));
}
}
}
}
}
return $fieldMeta;
}
/**
* Gets a collection of field aliases for an object by class name.
*
* @param string $className The name of the class to lookup field aliases for.
* @return array An array of field aliases with aliases as keys and actual field names as values.
*/
public function getFieldAliases($className) {
$fieldAliases= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['fieldAliases'])) {
$fieldAliases= array_merge($fieldAliases, $this->map[$ancestry[$i]]['fieldAliases']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['fieldAliases'])) {
$fieldAliases= array_merge($fieldAliases, array_diff_key($this->map[$descendantClass]['fieldAliases'], $fieldAliases));
}
}
}
}
}
return $fieldAliases;
}
/**
* Gets a set of validation rules defined for an object by class name.
*
* @param string $className The name of the class to lookup validation rules
* for.
* @return array An array featuring field names as the array keys, and
* arrays of validation rule information as the array values; empty array is
* returned if unsuccessful.
*/
public function getValidationRules($className) {
$rules= array();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset($this->map[$ancestry[$i]]['validation']['rules'])) {
$rules= array_merge($rules, $this->map[$ancestry[$i]]['validation']['rules']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['validation']['rules'])) {
$rules= array_merge($rules, array_diff_key($this->map[$descendantClass]['validation']['rules'], $rules));
}
}
}
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning validation rules: " . print_r($rules, true));
}
}
return $rules;
}
/**
* Get indices defined for a table class.
*
* @param string $className The name of the class to lookup indices for.
* @return array An array of indices and their details for the specified class.
*/
public function getIndexMeta($className) {
$indices= array();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) -1; $i >= 0; $i--) {
if (isset($this->map[$ancestry[$i]]['indexes'])) {
$indices= array_merge($indices, $this->map[$ancestry[$i]]['indexes']);
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['indexes'])) {
$indices= array_merge($indices, array_diff_key($this->map[$descendantClass]['indexes'], $indices));
}
}
}
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning indices: " . print_r($indices, true));
}
}
}
return $indices;
}
/**
* Gets the primary key field(s) for a class.
*
* @param string $className The name of the class to lookup the primary key
* for.
* @return mixed The name of the field representing a class instance primary
* key, an array of key names for compound primary keys, or null if no
* primary key is found or defined for the class.
*/
public function getPK($className) {
$pk= null;
if (strcasecmp($className, 'xPDOObject') !== 0) {
if ($actualClassName= $this->loadClass($className)) {
if (isset ($this->map[$actualClassName]['indexes'])) {
foreach ($this->map[$actualClassName]['indexes'] as $k => $v) {
if (isset ($this->map[$actualClassName]['fieldMeta'][$k]['phptype'])) {
if (isset ($v['primary']) && $v['primary'] == true) {
$pk[$k]= $k;
}
}
}
}
if (isset ($this->map[$actualClassName]['fieldMeta'])) {
foreach ($this->map[$actualClassName]['fieldMeta'] as $k => $v) {
if (isset ($v['index']) && isset ($v['phptype']) && $v['index'] == 'pk') {
$pk[$k]= $k;
}
}
}
if ($ancestry= $this->getAncestry($actualClassName)) {
foreach ($ancestry as $ancestor) {
if ($ancestorClassName= $this->loadClass($ancestor)) {
if (isset ($this->map[$ancestorClassName]['indexes'])) {
foreach ($this->map[$ancestorClassName]['indexes'] as $k => $v) {
if (isset ($this->map[$ancestorClassName]['fieldMeta'][$k]['phptype'])) {
if (isset ($v['primary']) && $v['primary'] == true) {
$pk[$k]= $k;
}
}
}
}
if (isset ($this->map[$ancestorClassName]['fieldMeta'])) {
foreach ($this->map[$ancestorClassName]['fieldMeta'] as $k => $v) {
if (isset ($v['index']) && isset ($v['phptype']) && $v['index'] == 'pk') {
$pk[$k]= $k;
}
}
}
}
}
}
if ($pk && count($pk) === 1) {
$pk= current($pk);
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class {$className}");
}
}
return $pk;
}
/**
* Gets the type of primary key field for a class.
*
* @param string $className The name of the class to lookup the primary key
* type for.
* @param mixed $pk Optional specific PK column or columns to get type(s) for.
* @return string The type of the field representing a class instance primary
* key, or null if no primary key is found or defined for the class.
*/
public function getPKType($className, $pk= false) {
$pktype= null;
if ($actualClassName= $this->loadClass($className)) {
if (!$pk)
$pk= $this->getPK($actualClassName);
if (!is_array($pk))
$pk= array($pk);
$ancestry= $this->getAncestry($actualClassName, true);
foreach ($pk as $_pk) {
foreach ($ancestry as $parentClass) {
if (isset ($this->map[$parentClass]['fieldMeta'][$_pk]['phptype'])) {
$pktype[$_pk]= $this->map[$parentClass]['fieldMeta'][$_pk]['phptype'];
break;
}
}
}
if (is_array($pktype) && count($pktype) == 1) {
$pktype= reset($pktype);
}
elseif (empty($pktype)) {
$pktype= null;
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load class {$className}!");
}
return $pktype;
}
/**
* Gets a collection of aggregate foreign key relationship definitions.
*
* @param string $className The fully-qualified name of the class.
* @return array An array of aggregate foreign key relationship definitions.
*/
public function getAggregates($className) {
$aggregates= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['aggregates'])) {
$aggregates= array_merge($aggregates, $this->map[$ancestry[$i]]['aggregates']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['aggregates'])) {
$aggregates= array_merge($aggregates, array_diff_key($this->map[$descendantClass]['aggregates'], $aggregates));
}
}
}
}
}
return $aggregates;
}
/**
* Gets a collection of composite foreign key relationship definitions.
*
* @param string $className The fully-qualified name of the class.
* @return array An array of composite foreign key relationship definitions.
*/
public function getComposites($className) {
$composites= array ();
if ($className= $this->loadClass($className)) {
if ($ancestry= $this->getAncestry($className)) {
for ($i= count($ancestry) - 1; $i >= 0; $i--) {
if (isset ($this->map[$ancestry[$i]]['composites'])) {
$composites= array_merge($composites, $this->map[$ancestry[$i]]['composites']);
}
}
}
if ($this->getInherit($className) === 'single') {
$descendants= $this->getDescendants($className);
if ($descendants) {
foreach ($descendants as $descendant) {
$descendantClass= $this->loadClass($descendant);
if ($descendantClass && isset($this->map[$descendantClass]['composites'])) {
$composites= array_merge($composites, array_diff_key($this->map[$descendantClass]['composites'], $composites));
}
}
}
}
}
return $composites;
}
/**
* Get a complete relation graph for an xPDOObject class.
*
* @param string $className A fully-qualified xPDOObject class name.
* @param int $depth The depth to retrieve relations for the graph, defaults to 3.
* @param array &$parents An array of parent classes to avoid traversing circular dependencies.
* @param array &$visited An array of already visited classes to avoid traversing circular dependencies.
* @return array An xPDOObject relation graph, or an empty array if no graph can be constructed.
*/
public function getGraph($className, $depth= 3, &$parents = array(), &$visited = array()) {
$graph = array();
$className = $this->loadClass($className);
if ($className && $depth > 0) {
$depth--;
$parents = array_merge($parents, $this->getAncestry($className));
$parentsNested = array_unique($parents);
$visitNested = array_merge($visited, array($className));
$relations = array_merge($this->getAggregates($className), $this->getComposites($className));
foreach ($relations as $alias => $relation) {
if (in_array($relation['class'], $visited)) {
continue;
}
$childGraph = array();
if ($depth > 0 && !in_array($relation['class'], $parents)) {
$childGraph = $this->getGraph($relation['class'], $depth, $parentsNested, $visitNested);
}
$graph[$alias] = $childGraph;
}
$visited[] = $className;
}
return $graph;
}
/**
* Retrieves the complete ancestry for a class.
*
* @param string $className The name of the class.
* @param bool $includeSelf Determines if the specified class should be
* included in the resulting array.
* @return array An array of string class names representing the class
* hierarchy, or an empty array if unsuccessful.
*/
public function getAncestry($className, $includeSelf= true) {
$ancestry= array ();
if ($actualClassName= $this->loadClass($className)) {
$ancestor= $actualClassName;
if ($includeSelf) {
$ancestry[]= $actualClassName;
}
while ($ancestor= get_parent_class($ancestor)) {
$ancestry[]= $ancestor;
}
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Returning ancestry for {$className}: " . print_r($ancestry, 1));
}
}
return $ancestry;
}
/**
* Gets select columns from a specific class for building a query.
*
* @uses xPDOObject::getSelectColumns()
* @param string $className The name of the class to build the column list
* from.
* @param string $tableAlias An optional alias for the class table, to be
* used in complex queries with multiple tables.
* @param string $columnPrefix An optional string with which to prefix the
* columns returned, to avoid name collisions in return columns.
* @param array $columns An optional array of columns to include.
* @param boolean $exclude If true, will exclude columns in the previous
* parameter, instead of including them.
* @return string A valid SQL string of column names for a SELECT statement.
*/
public function getSelectColumns($className, $tableAlias= '', $columnPrefix= '', $columns= array (), $exclude= false) {
return $this->call($className, 'getSelectColumns', array(&$this, $className, $tableAlias, $columnPrefix, $columns, $exclude));
}
/**
* Gets an aggregate or composite relation definition from a class.
*
* @param string $parentClass The class from which the relation is defined.
* @param string $alias The alias identifying the related class.
* @return array The aggregate or composite definition details in an array
* or null if no definition is found.
*/
function getFKDefinition($parentClass, $alias) {
$def= null;
$parentClass= $this->loadClass($parentClass);
if ($parentClass && $alias) {
if ($aggregates= $this->getAggregates($parentClass)) {
if (isset ($aggregates[$alias])) {
$def= $aggregates[$alias];
$def['type']= 'aggregate';
}
}
if ($composites= $this->getComposites($parentClass)) {
if (isset ($composites[$alias])) {
$def= $composites[$alias];
$def['type']= 'composite';
}
}
}
if ($def === null) {
$this->log(xPDO::LOG_LEVEL_ERROR, 'No foreign key definition for parentClass: ' . $parentClass . ' using relation alias: ' . $alias);
}
return $def;
}
/**
* Gets the version string of the schema the specified class was generated from.
*
* @param string $className The name of the class to get the model version from.
* @return string The version string for the schema model the class was generated from.
*/
public function getModelVersion($className) {
$version = '1.0';
$className= $this->loadClass($className);
if ($className && isset($this->map[$className]['version'])) {
$version= $this->map[$className]['version'];
}
return $version;
}
/**
* Gets the manager class for this xPDO connection.
*
* The manager class can perform operations such as creating or altering
* table structures, creating data containers, generating custom persistence
* classes, and other advanced operations that do not need to be loaded
* frequently.
*
* @return xPDOManager|null An xPDOManager instance for the xPDO connection, or null
* if a manager class can not be instantiated.
*/
public function getManager() {
if ($this->manager === null || !$this->manager instanceof xPDOManager) {
$loaded= include_once(XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/xpdomanager.class.php');
if ($loaded) {
$managerClass = 'xPDOManager_' . $this->config['dbtype'];
$this->manager= new $managerClass ($this);
}
if (!$this->manager) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load xPDOManager class.");
}
}
return $this->manager;
}
/**
* Gets the driver class for this xPDO connection.
*
* The driver class provides baseline data and operations for a specific database driver.
*
* @return xPDODriver|null An xPDODriver instance for the xPDO connection, or null
* if a driver class can not be instantiated.
*/
public function getDriver() {
if ($this->driver === null || !$this->driver instanceof xPDODriver) {
$loaded= include_once(XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/xpdodriver.class.php');
if ($loaded) {
$driverClass = 'xPDODriver_' . $this->config['dbtype'];
$this->driver= new $driverClass ($this);
}
if (!$this->driver) {
$this->log(xPDO::LOG_LEVEL_ERROR, "Could not load xPDODriver class for the {$this->config['dbtype']} PDO driver. " . print_r($this->config, true));
}
}
return $this->driver;
}
/**
* Gets the absolute path to the cache directory.
*
* @return string The full cache directory path.
*/
public function getCachePath() {
if (!$this->cachePath) {
if ($this->getCacheManager()) {
$this->cachePath= $this->cacheManager->getCachePath();
}
}
return $this->cachePath;
}
/**
* Gets an xPDOCacheManager instance.
*
* This class is responsible for handling all types of caching operations for the xPDO core.
*
* @param string $class Optional name of a derivative xPDOCacheManager class.
* @param array $options An array of options for the cache manager instance; valid options include:
* - path = Optional root path for looking up the $class.
* - ignorePkg = If false and you do not specify a path, you can look up custom xPDOCacheManager
* derivatives in declared packages.
* @return xPDOCacheManager The xPDOCacheManager for this xPDO instance.
*/
public function getCacheManager($class= 'cache.xPDOCacheManager', $options = array('path' => XPDO_CORE_PATH, 'ignorePkg' => true)) {
$actualClass = $this->loadClass($class, $options['path'], $options['ignorePkg'], true);
if ($this->cacheManager === null || !is_object($this->cacheManager) || !($this->cacheManager instanceof $actualClass)) {
if ($this->cacheManager= new $actualClass($this, $options)) {
$this->_cacheEnabled= true;
}
}
return $this->cacheManager;
}
/**
* Returns the debug state for the xPDO instance.
*
* @return boolean The current debug state for the instance, true for on,
* false for off.
*/
public function getDebug() {
return $this->_debug;
}
/**
* Sets the debug state for the xPDO instance.
*
* @param boolean|integer $v The debug status, true for on, false for off, or a valid
* error_reporting level for PHP.
*/
public function setDebug($v= true) {
$this->_debug= $v;
}
/**
* Sets the logging level state for the xPDO instance.
*
* @param integer $level The logging level to switch to.
* @return integer The previous log level.
*/
public function setLogLevel($level= xPDO::LOG_LEVEL_FATAL) {
$oldLevel = $this->logLevel;
$this->logLevel= intval($level);
return $oldLevel;
}
/**
* @return integer The current log level.
*/
public function getLogLevel() {
return $this->logLevel;
}
/**
* Sets the log target for xPDO::_log() calls.
*
* Valid target values include:
*
*
'ECHO': Returns output to the STDOUT.
*
'HTML': Returns output to the STDOUT with HTML formatting.
*
'FILE': Sends output to a log file.
*
An array with at least one element with key 'target' matching
* one of the valid log targets listed above. For 'target' => 'FILE'
* you can specify a second element with key 'options' with another
* associative array with one or both of the elements 'filename' and
* 'filepath'
*
*
* @param string $target An identifier indicating the target of the logging.
* @return mixed The previous log target.
*/
public function setLogTarget($target= 'ECHO') {
$oldTarget = $this->logTarget;
$this->logTarget= $target;
return $oldTarget;
}
/**
* @return integer The current log level.
*/
public function getLogTarget() {
return $this->logTarget;
}
/**
* Log a message with details about where and when an event occurs.
*
* @param integer $level The level of the logged message.
* @param string $msg The message to log.
* @param string $target The logging target.
* @param string $def The name of a defining structure (such as a class) to
* help identify the message source.
* @param string $file A filename in which the log event occured.
* @param string $line A line number to help locate the source of the event
* within the indicated file.
*/
public function log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
$this->_log($level, $msg, $target, $def, $file, $line);
}
/**
* Log a message as appropriate for the level and target.
*
* @param integer $level The level of the logged message.
* @param string $msg The message to log.
* @param string $target The logging target.
* @param string $def The name of a defining structure (such as a class) to
* help identify the log event source.
* @param string $file A filename in which the log event occured.
* @param string $line A line number to help locate the source of the event
* within the indicated file.
*/
protected function _log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
if (empty ($target)) {
$target = $this->logTarget;
}
$targetOptions = array();
if (is_array($target)) {
if (isset($target['options'])) $targetOptions =& $target['options'];
$target = isset($target['target']) ? $target['target'] : 'ECHO';
}
if (empty($file) && isset($_SERVER['SCRIPT_NAME'])) {
$file= $_SERVER['SCRIPT_NAME'];
}
if ($level === xPDO::LOG_LEVEL_FATAL) {
while (ob_get_level() && @ob_end_flush()) {}
exit ('[' . strftime('%Y-%m-%d %H:%M:%S') . '] (' . $this->_getLogLevel($level) . $def . $file . $line . ') ' . $msg . "\n" . ($this->getDebug() === true ? '
' . "\n";
break;
default :
echo '[' . strftime('%Y-%m-%d %H:%M:%S') . '] (' . $this->_getLogLevel($level) . $def . $file . $line . ') ' . $msg . "\n";
}
$content= @ob_get_contents();
@ob_end_clean();
if ($target=='FILE' && $this->getCacheManager()) {
$filename = isset($targetOptions['filename']) ? $targetOptions['filename'] : 'error.log';
$filepath = isset($targetOptions['filepath']) ? $targetOptions['filepath'] : $this->getCachePath() . xPDOCacheManager::LOG_DIR;
$this->cacheManager->writeFile($filepath . $filename, $content, 'a');
} elseif ($target=='ARRAY' && isset($targetOptions['var']) && is_array($targetOptions['var'])) {
$targetOptions['var'][] = $content;
} else {
echo $content;
}
}
}
/**
* Returns an abbreviated backtrace of debugging information.
*
* This function returns just the fields returned via xPDOObject::toArray()
* on xPDOObject instances, and simply the classname for other objects, to
* reduce the amount of unnecessary information returned.
*
* @return array The abbreviated backtrace.
*/
public function getDebugBacktrace() {
$backtrace= array ();
foreach (debug_backtrace() as $levelKey => $levelElement) {
foreach ($levelElement as $traceKey => $traceElement) {
if ($traceKey == 'object' && $traceElement instanceof xPDOObject) {
$backtrace[$levelKey][$traceKey]= $traceElement->toArray('', true);
} elseif ($traceKey == 'object') {
$backtrace[$levelKey][$traceKey]= get_class($traceElement);
} else {
$backtrace[$levelKey][$traceKey]= $traceElement;
}
}
}
return $backtrace;
}
/**
* Gets a logging level as a string representation.
*
* @param integer $level The logging level to retrieve a string for.
* @return string The string representation of a valid logging level.
*/
protected function _getLogLevel($level) {
switch ($level) {
case xPDO::LOG_LEVEL_DEBUG :
$levelText= 'DEBUG';
break;
case xPDO::LOG_LEVEL_INFO :
$levelText= 'INFO';
break;
case xPDO::LOG_LEVEL_WARN :
$levelText= 'WARN';
break;
case xPDO::LOG_LEVEL_ERROR :
$levelText= 'ERROR';
break;
default :
$levelText= 'FATAL';
}
return $levelText;
}
/**
* Escapes the provided string using the platform-specific escape character.
*
* Different database engines escape string literals in SQL using different characters. For example, this is used to
* escape column names that might match a reserved string for that SQL interpreter. To write database agnostic
* queries with xPDO, it is highly recommend to escape any database or column names in any native SQL strings used.
*
* @param string $string A string to escape using the platform-specific escape characters.
* @return string The string escaped with the platform-specific escape characters.
*/
public function escape($string) {
$string = trim($string, $this->_escapeCharOpen . $this->_escapeCharClose);
return $this->_escapeCharOpen . $string . $this->_escapeCharClose;
}
/**
* Use to insert a literal string into a SQL query without escaping or quoting.
*
* @param string $string A string to return as a literal, unescaped and unquoted.
* @return string The string with any escape or quote characters trimmed.
*/
public function literal($string) {
$string = trim($string, $this->_escapeCharOpen . $this->_escapeCharClose . $this->_quoteChar);
return $string;
}
/**
* Adds the table prefix, and optionally database name, to a given table.
*
* @param string $baseTableName The table name as specified in the object
* model.
* @param boolean $includeDb Qualify the table name with the database name.
* @return string The fully-qualified and quoted table name for the
*/
private function _getFullTableName($baseTableName, $includeDb= false) {
$fqn= '';
if (!empty ($baseTableName)) {
if ($includeDb) {
$fqn .= $this->escape($this->config['dbname']) . '.';
}
$fqn .= $this->escape($baseTableName);
}
return $fqn;
}
/**
* Parses a DSN and returns an array of the connection details.
*
* @static
* @param string $string The DSN to parse.
* @return array An array of connection details from the DSN.
* @todo Have this method handle all methods of DSN specification as handled
* by latest native PDO implementation.
*/
public static function parseDSN($string) {
$result= array ();
$pos= strpos($string, ':');
$result['dbtype']= strtolower(substr($string, 0, $pos));
$parameters= explode(';', substr($string, ($pos +1)));
for ($a= 0, $b= count($parameters); $a < $b; $a++) {
$tmp= explode('=', $parameters[$a]);
if (count($tmp) == 2) {
$result[strtolower(trim($tmp[0]))]= trim($tmp[1]);
} else {
$result['dbname']= trim($parameters[$a]);
}
}
if (!isset($result['dbname']) && isset($result['database'])) {
$result['dbname'] = $result['database'];
}
if (!isset($result['host']) && isset($result['server'])) {
$result['host'] = $result['server'];
}
return $result;
}
/**
* Retrieves a result array from the object cache.
*
* @param string|xPDOCriteria $signature A unique string or xPDOCriteria object
* that represents the query identifying the result set.
* @param string $class An optional classname the result represents.
* @param array $options Various cache options.
* @return array|string|null A PHP array or JSON object representing the
* result set, or null if no cache representation is found.
*/
public function fromCache($signature, $class= '', $options= array()) {
$result= null;
if ($this->getOption(xPDO::OPT_CACHE_DB, $options)) {
if ($signature && $this->getCacheManager()) {
$sig= '';
$sigKey= array();
$sigHash= '';
$sigClass= empty($class) || !is_string($class) ? '' : $class;
if (is_object($signature)) {
if ($signature instanceof xPDOCriteria) {
if ($signature instanceof xPDOQuery) {
$signature->construct();
if (empty($sigClass)) $sigClass= $signature->getTableClass();
}
$sigKey= array ($signature->sql, $signature->bindings);
}
}
elseif (is_string($signature)) {
if ($exploded= explode('_', $signature)) {
$class= reset($exploded);
if (empty($sigClass) || $sigClass !== $class) {
$sigClass= $class;
}
if (empty($sigKey)) {
while ($key= next($exploded)) {
$sigKey[]= $key;
}
}
}
}
if (empty($sigClass)) $sigClass= '__sqlResult';
if ($sigClass && $sigKey) {
$sigHash= md5($this->toJSON($sigKey));
$sig= implode('/', array ($sigClass, $sigHash));
}
if (is_string($sig) && !empty($sig)) {
$result= $this->cacheManager->get($sig, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', null, $this->getOption(xPDO::OPT_CACHE_FORMAT, null, xPDOCacheManager::CACHE_PHP)),
'cache_prefix' => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR),
));
if ($this->getDebug() === true) {
if (!$result) {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'No cache item found for class ' . $sigClass . ' with signature ' . xPDOCacheManager::CACHE_DIR . $sig);
} else {
$this->log(xPDO::LOG_LEVEL_DEBUG, 'Loaded cache item for class ' . $sigClass . ' with signature ' . xPDOCacheManager::CACHE_DIR . $sig);
}
}
}
}
}
return $result;
}
/**
* Places a result set in the object cache.
*
* @param string|xPDOCriteria $signature A unique string or xPDOCriteria object
* representing the object.
* @param object $object An object to place a representation of in the cache.
* @param integer $lifetime An optional number of seconds the cached result
* will remain valid, with 0 meaning it will remain valid until replaced or
* removed.
* @param array $options Various cache options.
* @return boolean Indicates if the object was successfully cached.
*/
public function toCache($signature, $object, $lifetime= 0, $options = array()) {
$result= false;
if ($this->getCacheManager()) {
if ($this->getOption(xPDO::OPT_CACHE_DB, $options)) {
if ($lifetime === true) {
$lifetime = 0;
}
elseif (!$lifetime && $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, $options, 0)) {
$lifetime= intval($this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, $options, 0));
}
$sigKey= array();
$sigClass= '';
$sigGraph= $this->getOption(xPDO::OPT_CACHE_DB_SIG_GRAPH, $options, array());
if (is_object($signature)) {
if ($signature instanceof xPDOCriteria) {
if ($signature instanceof xPDOQuery) {
$signature->construct();
if (empty($sigClass)) $sigClass = $signature->getTableClass();
}
$sigKey= array($signature->sql, $signature->bindings);
}
}
elseif (is_string($signature)) {
$exploded= explode('_', $signature);
if ($exploded && count($exploded) >= 2) {
$class= reset($exploded);
if (empty($sigClass) || $sigClass !== $class) {
$sigClass= $class;
}
if (empty($sigKey)) {
while ($key= next($exploded)) {
$sigKey[]= $key;
}
}
}
}
if (empty($sigClass)) {
if ($object instanceof xPDOObject) {
$sigClass= $object->_class;
} else {
$sigClass= $this->getOption(xPDO::OPT_CACHE_DB_SIG_CLASS, $options, '__sqlResult');
}
}
if (empty($sigKey) && is_string($signature)) $sigKey= $signature;
if (empty($sigKey) && $object instanceof xPDOObject) $sigKey= $object->getPrimaryKey();
if ($sigClass && $sigKey) {
$sigHash= md5($this->toJSON(is_array($sigKey) ? $sigKey : array($sigKey)));
$sig= implode('/', array ($sigClass, $sigHash));
if (is_string($sig)) {
if ($this->getOption('modified', $options, false)) {
if (empty($sigGraph) && $object instanceof xPDOObject) {
$sigGraph = array_merge(array($object->_class => array('class' => $object->_class)), $object->_aggregates, $object->_composites);
}
if (!empty($sigGraph)) {
foreach ($sigGraph as $gAlias => $gMeta) {
$gClass = $gMeta['class'];
$removed= $this->cacheManager->delete($gClass, array_merge($options, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', $options, $this->getOption(xPDO::OPT_CACHE_FORMAT, $options, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_EXPIRES => (integer) $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, null, $this->getOption(xPDO::OPT_CACHE_EXPIRES, null, 0)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR),
'multiple_object_delete' => true
)));
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "Removing all cache objects of class {$gClass}: " . ($removed ? 'successful' : 'failed'));
}
}
}
}
$cacheOptions = array_merge($options, array(
xPDO::OPT_CACHE_KEY => $this->getOption('cache_db_key', $options, 'db'),
xPDO::OPT_CACHE_HANDLER => $this->getOption(xPDO::OPT_CACHE_DB_HANDLER, $options, $this->getOption(xPDO::OPT_CACHE_HANDLER, $options, 'cache.xPDOFileCache')),
xPDO::OPT_CACHE_FORMAT => (integer) $this->getOption('cache_db_format', $options, $this->getOption(xPDO::OPT_CACHE_FORMAT, $options, xPDOCacheManager::CACHE_PHP)),
xPDO::OPT_CACHE_EXPIRES => (integer) $this->getOption(xPDO::OPT_CACHE_DB_EXPIRES, null, $this->getOption(xPDO::OPT_CACHE_EXPIRES, null, 0)),
xPDO::OPT_CACHE_PREFIX => $this->getOption('cache_db_prefix', $options, xPDOCacheManager::CACHE_DIR)
));
$result= $this->cacheManager->set($sig, $object, $lifetime, $cacheOptions);
if ($result && $object instanceof xPDOObject) {
if ($this->getDebug() === true) {
$this->log(xPDO::LOG_LEVEL_DEBUG, "xPDO->toCache() successfully cached object with signature " . xPDOCacheManager::CACHE_DIR . $sig);
}
}
if (!$result) {
$this->log(xPDO::LOG_LEVEL_WARN, "xPDO->toCache() could not cache object with signature " . xPDOCacheManager::CACHE_DIR . $sig);
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Object sent toCache() has an invalid signature.");
}
}
} else {
$this->log(xPDO::LOG_LEVEL_ERROR, "Attempt to send a non-object to toCache().");
}
return $result;
}
/**
* Converts a PHP array into a JSON encoded string.
*
* @param array $array The PHP array to convert.
* @return string The JSON representation of the source array.
*/
public function toJSON($array) {
$encoded= '';
if (is_array ($array)) {
if (!function_exists('json_encode')) {
if (@ include_once (XPDO_CORE_PATH . 'json/JSON.php')) {
$json = new Services_JSON();
$encoded= $json->encode($array);
}
} else {
$encoded= json_encode($array);
}
}
return $encoded;
}
/**
* Converts a JSON source string into an equivalent PHP representation.
*
* @param string $src A JSON source string.
* @param boolean $asArray Indicates if the result should treat objects as
* associative arrays; since all JSON associative arrays are objects, the default
* is true. Set to false to have JSON objects returned as PHP objects.
* @return mixed The PHP representation of the JSON source.
*/
public function fromJSON($src, $asArray= true) {
$decoded= '';
if ($src) {
if (!function_exists('json_decode')) {
if (@ include_once (XPDO_CORE_PATH . 'json/JSON.php')) {
if ($asArray) {
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
} else {
$json = new Services_JSON();
}
$decoded= $json->decode($src);
}
} else {
$decoded= json_decode($src, $asArray);
}
}
return $decoded;
}
/**
* @see http://php.net/manual/en/function.pdo-begintransaction.php
*/
public function beginTransaction() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->beginTransaction();
}
/**
* @see http://php.net/manual/en/function.pdo-commit.php
*/
public function commit() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->commit();
}
/**
* @see http://php.net/manual/en/function.pdo-exec.php
*/
public function exec($query) {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
$tstart= microtime(true);
$return= $this->pdo->exec($query);
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
return $return;
}
/**
* @see http://php.net/manual/en/function.pdo-errorcode.php
*/
public function errorCode() {
if (!$this->connect()) {
return false;
}
return $this->pdo->errorCode();
}
/**
* @see http://php.net/manual/en/function.pdo-errorinfo.php
*/
public function errorInfo() {
if (!$this->connect()) {
return false;
}
return $this->pdo->errorInfo();
}
/**
* @see http://php.net/manual/en/function.pdo-getattribute.php
*/
public function getAttribute($attribute) {
if (!$this->connect()) {
return false;
}
return $this->pdo->getAttribute($attribute);
}
/**
* @see http://php.net/manual/en/function.pdo-lastinsertid.php
*/
public function lastInsertId() {
if (!$this->connect()) {
return false;
}
return $this->pdo->lastInsertId();
}
/**
* @see http://php.net/manual/en/function.pdo-prepare.php
*/
public function prepare($statement, $driver_options= array ()) {
if (!$this->connect()) {
return false;
}
return $this->pdo->prepare($statement, $driver_options);
}
/**
* @see http://php.net/manual/en/function.pdo-query.php
*/
public function query($query) {
if (!$this->connect()) {
return false;
}
$tstart= microtime(true);
$return= $this->pdo->query($query);
$this->queryTime += microtime(true) - $tstart;
$this->executedQueries++;
return $return;
}
/**
* @see http://php.net/manual/en/function.pdo-quote.php
*/
public function quote($string, $parameter_type= PDO::PARAM_STR) {
if (!$this->connect()) {
return false;
}
$quoted = $this->pdo->quote($string, $parameter_type);
switch ($parameter_type) {
case PDO::PARAM_STR:
$quoted = trim($quoted);
break;
case PDO::PARAM_INT:
$quoted = trim($quoted);
$quoted = (integer) trim($quoted, "'");
break;
default:
break;
}
return $quoted;
}
/**
* @see http://php.net/manual/en/function.pdo-rollback.php
*/
public function rollBack() {
if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
return false;
}
return $this->pdo->rollBack();
}
/**
* @see http://php.net/manual/en/function.pdo-setattribute.php
*/
public function setAttribute($attribute, $value) {
if (!$this->connect()) {
return false;
}
return $this->pdo->setAttribute($attribute, $value);
}
/**
* Creates an new xPDOQuery for a specified xPDOObject class.
*
* @param string $class The class to create the xPDOQuery for.
* @param mixed $criteria Any valid xPDO criteria expression.
* @param boolean|integer $cacheFlag Indicates if the result should be cached
* and optionally for how many seconds (if passed an integer greater than 0).
* @return xPDOQuery The resulting xPDOQuery instance or false if unsuccessful.
*/
public function newQuery($class, $criteria= null, $cacheFlag= true) {
$query= false;
if ($this->loadClass($this->config['dbtype'] . '.xPDOQuery', '', false, true)) {
$xpdoQueryClass= 'xPDOQuery_' . $this->config['dbtype'];
if (!class_exists($xpdoQueryClass, false))
include_once dirname(__FILE__) . '/om/' . $this->config['dbtype'] . '/xpdoquery.class.php';
if ($query= new $xpdoQueryClass($this, $class, $criteria)) {
$query->cacheFlag= $cacheFlag;
}
}
return $query;
}
/**
* Splits a string on a specified character, ignoring escaped content.
*
* @static
* @param string $char A character to split the tag content on.
* @param string $str The string to operate on.
* @param string $escToken A character used to surround escaped content; all
* content within a pair of these tokens will be ignored by the split
* operation.
* @param integer $limit Limit the number of results. Default is 0 which is
* no limit. Note that setting the limit to 1 will only return the content
* up to the first instance of the split character and will discard the
* remainder of the string.
* @return array An array of results from the split operation, or an empty
* array.
*/
public static function escSplit($char, $str, $escToken = '`', $limit = 0) {
$split= array();
$charPos = strpos($str, $char);
if ($charPos !== false) {
if ($charPos === 0) {
$searchPos = 1;
$startPos = 1;
} else {
$searchPos = 0;
$startPos = 0;
}
$escOpen = false;
$strlen = strlen($str);
for ($i = $startPos; $i <= $strlen; $i++) {
if ($i == $strlen) {
$tmp= trim(substr($str, $searchPos));
if (!empty($tmp)) $split[]= $tmp;
break;
}
if ($str[$i] == $escToken) {
$escOpen = $escOpen == true ? false : true;
continue;
}
if (!$escOpen && $str[$i] == $char) {
$tmp= trim(substr($str, $searchPos, $i - $searchPos));
if (!empty($tmp)) {
$split[]= $tmp;
if ($limit > 0 && count($split) >= $limit) {
break;
}
}
$searchPos = $i + 1;
}
}
} else {
$split[]= trim($str);
}
return $split;
}
/**
* Parses parameter bindings in SQL prepared statements.
*
* @param string $sql A SQL prepared statement to parse bindings in.
* @param array $bindings An array of parameter bindings to use for the replacements.
* @return string The SQL with the binding placeholders replaced.
*/
public function parseBindings($sql, $bindings) {
if (!empty($sql) && !empty($bindings)) {
reset($bindings);
$bound = array();
while (list ($k, $param)= each($bindings)) {
if (!is_array($param)) {
$v= $param;
$type= $this->getPDOType($param);
$bindings[$k]= array(
'value' => $v,
'type' => $type
);
} else {
$v= $param['value'];
$type= $param['type'];
}
if (!$v) {
switch ($type) {
case PDO::PARAM_INT:
$v= '0';
break;
case PDO::PARAM_BOOL:
$v= '0';
break;
default:
break;
}
}
if ($type > 0) {
$v= $this->quote($v, $type);
} else {
$v= 'NULL';
}
if (!is_int($k) || substr($k, 0, 1) === ':') {
$pattern= '/' . $k . '\b/';
$bound[$pattern] = str_replace(array('\\', '$'), array('\\\\', '\$'), $v);
} else {
$pattern = '/(\?)(\b)?/';
$sql = preg_replace($pattern, ':' . $k . '$2', $sql, 1);
$bound['/:' . $k . '\b/'] = str_replace(array('\\', '$'), array('\\\\', '\$'), $v);
}
}
$this->log(xPDO::LOG_LEVEL_INFO, "{$sql}\n" . print_r($bound, true));
if (!empty($bound)) {
$sql= preg_replace(array_keys($bound), array_values($bound), $sql);
}
}
return $sql;
}
/**
* Get the appropriate PDO::PARAM_ type constant from a PHP value.
*
* @param mixed $value Any PHP scalar or null value
* @return int|null
*/
public function getPDOType($value) {
$type= null;
if (is_null($value)) $type= PDO::PARAM_NULL;
elseif (is_scalar($value)) {
if (is_int($value)) $type= PDO::PARAM_INT;
else $type= PDO::PARAM_STR;
}
return $type;
}
}
/**
* Encapsulates a SQL query into a PDOStatement with a set of bindings.
*
* @package xpdo
*
*/
class xPDOCriteria {
public $sql= '';
public $stmt= null;
public $bindings= array ();
public $cacheFlag= false;
/**
* The constructor for a new xPDOCriteria instance.
*
* The constructor optionally prepares provided SQL and/or parameter
* bindings. Setting the bindings via the constructor or with the {@link
* xPDOCriteria::bind()} function allows you to make use of the data object
* caching layer.
*
* The statement will not be prepared immediately if the cacheFlag value is
* true or a positive integer, in order to allow the result to be found in
* the cache before being queried from an actual database connection.
*
* @param xPDO &$xpdo An xPDO instance that will control this criteria.
* @param string $sql The SQL statement.
* @param array $bindings Bindings to bind to the criteria.
* @param boolean|integer $cacheFlag Indicates if the result set from the
* criteria is to be cached (true|false) or optionally a TTL in seconds.
* @return xPDOCriteria
*/
public function __construct(& $xpdo, $sql= '', $bindings= array (), $cacheFlag= false) {
$this->xpdo= & $xpdo;
$this->cacheFlag= $cacheFlag;
if (is_string($sql) && !empty ($sql)) {
$this->sql= $sql;
if ($cacheFlag === false || $cacheFlag < 0) {
$this->stmt= $xpdo->prepare($sql);
}
if (!empty ($bindings)) {
$this->bind($bindings, true, $cacheFlag);
}
}
}
/**
* Binds an array of key/value pairs to the xPDOCriteria prepared statement.
*
* Use this method to bind parameters in a way that makes it possible to
* cache results of previous executions of the criteria or compare the
* criteria to other individual or collections of criteria.
*
* @param array $bindings Bindings to merge with any existing bindings
* defined for this xPDOCriteria instance. Bindings can be simple
* associative array of key-value pairs or the value for each key can
* contain elements titled value, type, and length corresponding to the
* appropriate parameters in the PDOStatement::bindValue() and
* PDOStatement::bindParam() functions.
* @param boolean $byValue Determines if the $bindings are to be bound as
* parameters (by variable reference, the default behavior) or by direct
* value (if true).
* @param boolean|integer $cacheFlag The cacheFlag indicates the cache state
* of the xPDOCriteria object and can be absolutely off (false), absolutely
* on (true), or an integer indicating the number of seconds the result will
* live in the cache.
*/
public function bind($bindings= array (), $byValue= true, $cacheFlag= false) {
if (!empty ($bindings)) {
$this->bindings= array_merge($this->bindings, $bindings);
}
if (is_object($this->stmt) && $this->stmt && !empty ($this->bindings)) {
reset($this->bindings);
while (list ($key, $val)= each($this->bindings)) {
if (is_array($val)) {
$type= isset ($val['type']) ? $val['type'] : PDO::PARAM_STR;
$length= isset ($val['length']) ? $val['length'] : 0;
$value= & $val['value'];
} else {
$value= & $val;
$type= PDO::PARAM_STR;
$length= 0;
}
if (is_int($key)) $key= $key + 1;
if ($byValue) {
$this->stmt->bindValue($key, $value, $type);
} else {
$this->stmt->bindParam($key, $value, $type, $length);
}
}
}
$this->cacheFlag= $cacheFlag === null ? $this->cacheFlag : $cacheFlag;
}
/**
* Compares to see if two xPDOCriteria instances are the same.
*
* @param object $obj A xPDOCriteria object to compare to this one.
* @return boolean true if they are both equal is SQL and bindings, otherwise
* false.
*/
public function equals($obj) {
return (is_object($obj) && $obj instanceof xPDOCriteria && $this->sql === $obj->sql && !array_diff_assoc($this->bindings, $obj->bindings));
}
/**
* Prepares the sql and bindings of this instance into a PDOStatement.
*
* The {@link xPDOCriteria::$sql} attribute must be set in order to prepare
* the statement. You can also pass bindings directly to this function and
* they will be run through {@link xPDOCriteria::bind()} if the statement
* is successfully prepared.
*
* If the {@link xPDOCriteria::$stmt} already exists, it is simply returned.
*
* @param array $bindings Bindings to merge with any existing bindings
* defined for this xPDOCriteria instance. Bindings can be simple
* associative array of key-value pairs or the value for each key can
* contain elements titled value, type, and length corresponding to the
* appropriate parameters in the PDOStatement::bindValue() and
* PDOStatement::bindParam() functions.
* @param boolean $byValue Determines if the $bindings are to be bound as
* parameters (by variable reference, the default behavior) or by direct
* value (if true).
* @param boolean|integer $cacheFlag The cacheFlag indicates the cache state
* of the xPDOCriteria object and can be absolutely off (false), absolutely
* on (true), or an integer indicating the number of seconds the result will
* live in the cache.
* @return PDOStatement The prepared statement, ready to execute.
*/
public function prepare($bindings= array (), $byValue= true, $cacheFlag= null) {
if ($this->stmt === null || !is_object($this->stmt)) {
if (!empty ($this->sql) && $stmt= $this->xpdo->prepare($this->sql)) {
$this->stmt= & $stmt;
$this->bind($bindings, $byValue, $cacheFlag);
}
}
return $this->stmt;
}
/**
* Converts the current xPDOQuery to parsed SQL.
*
* @param bool $parseBindings If true, bindings are parsed locally; otherwise
* they are left in place.
* @return string The parsed SQL query.
*/
public function toSQL($parseBindings = true) {
$sql = $this->sql;
if ($parseBindings && !empty($this->bindings)) {
$sql = $this->xpdo->parseBindings($sql, $this->bindings);
}
return $sql;
}
}
/**
* An iteratable representation of an xPDOObject result set.
*
* Use an xPDOIterator to loop over large result sets and work with one instance
* at a time. This greatly reduces memory usage over loading the entire collection
* of objects into memory at one time. It is also slightly faster.
*
* @package xpdo
*/
class xPDOIterator implements Iterator {
private $xpdo = null;
private $index = 0;
private $current = null;
/** @var null|PDOStatement */
private $stmt = null;
private $class = null;
private $alias = null;
/** @var null|int|str|array|xPDOQuery */
private $criteria = null;
private $criteriaType = 'xPDOQuery';
private $cacheFlag = false;
/**
* Construct a new xPDOIterator instance (do not call directly).
*
* @see xPDO::getIterator()
* @param xPDO &$xpdo A reference to a valid xPDO instance.
* @param array $options An array of options for the iterator.
* @return xPDOIterator An xPDOIterator instance.
*/
function __construct(& $xpdo, array $options= array()) {
$this->xpdo =& $xpdo;
if (isset($options['class'])) {
$this->class = $this->xpdo->loadClass($options['class']);
}
if (isset($options['alias'])) {
$this->alias = $options['alias'];
} else {
$this->alias = $this->class;
}
if (isset($options['cacheFlag'])) {
$this->cacheFlag = $options['cacheFlag'];
}
if (array_key_exists('criteria', $options) && is_object($options['criteria'])) {
$this->criteria = $options['criteria'];
} elseif (!empty($this->class)) {
$criteria = array_key_exists('criteria', $options) ? $options['criteria'] : null;
$this->criteria = $this->xpdo->getCriteria($this->class, $criteria, $this->cacheFlag);
}
if (!empty($this->criteria)) {
$this->criteriaType = $this->xpdo->getCriteriaType($this->criteria);
if ($this->criteriaType === 'xPDOQuery') {
$this->class = $this->criteria->getClass();
$this->alias = $this->criteria->getAlias();
}
}
}
public function rewind() {
$this->index = 0;
if (!empty($this->stmt)) {
$this->stmt->closeCursor();
}
$this->stmt = $this->criteria->prepare();
$tstart = microtime(true);
if ($this->stmt && $this->stmt->execute()) {
$this->xpdo->queryTime += microtime(true) - $tstart;
$this->xpdo->executedQueries++;
$this->fetch();
} elseif ($this->stmt) {
$this->xpdo->queryTime += microtime(true) - $tstart;
$this->xpdo->executedQueries++;
}
}
public function current() {
return $this->current;
}
public function key() {
return $this->index;
}
public function next() {
$this->fetch();
if (!$this->valid()) {
$this->index = null;
} else {
$this->index++;
}
return $this->current();
}
public function valid() {
return ($this->current !== null);
}
/**
* Fetch the next row from the result set and set it as current.
*
* Calls the _loadInstance() method for the specified class, so it properly
* inherits behavior from xPDOObject derivatives.
*/
protected function fetch() {
$row = $this->stmt->fetch(PDO::FETCH_ASSOC);
if (is_array($row) && !empty($row)) {
$this->current = $this->xpdo->call($this->class, '_loadInstance', array(& $this->xpdo, $this->class, $this->alias, $row));
} else {
$this->current = null;
}
}
}
/**
* Represents a unique PDO connection managed by xPDO.
*
* @package xpdo
*/
class xPDOConnection {
/**
* @var xPDO A reference to a valid xPDO instance.
*/
public $xpdo = null;
/**
* @var array An array of configuration options for this connection.
*/
public $config = array();
/**
* @var PDO The PDO object represented by the xPDOConnection instance.
*/
public $pdo = null;
/**
* @var boolean Indicates if this connection can be written to.
*/
private $_mutable = true;
/**
* Construct a new xPDOConnection instance.
*
* @param xPDO $xpdo A reference to a valid xPDO instance to attach to.
* @param string $dsn A string representing the DSN connection string.
* @param string $username The database username credentials.
* @param string $password The database password credentials.
* @param array $options An array of xPDO options for the connection.
* @param array $driverOptions An array of PDO driver options for the connection.
*/
public function __construct(xPDO &$xpdo, $dsn, $username= '', $password= '', $options= array(), $driverOptions= array()) {
$this->xpdo =& $xpdo;
if (is_array($this->xpdo->config)) $options= array_merge($this->xpdo->config, $options);
if (!isset($options[xPDO::OPT_TABLE_PREFIX])) $options[xPDO::OPT_TABLE_PREFIX]= '';
$this->config= array_merge($options, xPDO::parseDSN($dsn));
$this->config['dsn']= $dsn;
$this->config['username']= $username;
$this->config['password']= $password;
$driverOptions = is_array($driverOptions) ? $driverOptions : array();
if (array_key_exists('driverOptions', $this->config) && is_array($this->config['driverOptions'])) {
$driverOptions = array_merge($this->config['driverOptions'], $driverOptions);
}
$this->config['driverOptions']= $driverOptions;
if (array_key_exists(xPDO::OPT_CONN_MUTABLE, $this->config)) {
$this->_mutable= (boolean) $this->config[xPDO::OPT_CONN_MUTABLE];
}
}
/**
* Indicates if the connection can be written to, e.g. INSERT/UPDATE/DELETE.
*
* @return bool True if the connection can be written to.
*/
public function isMutable() {
return $this->_mutable;
}
/**
* Actually make a connection for this instance via PDO.
*
* @param array $driverOptions An array of PDO driver options for the connection.
* @return bool True if a successful connection is made.
*/
public function connect($driverOptions = array()) {
if ($this->pdo === null) {
if (is_array($driverOptions) && !empty($driverOptions)) {
$this->config['driverOptions']= array_merge($this->config['driverOptions'], $driverOptions);
}
try {
$this->pdo= new PDO($this->config['dsn'], $this->config['username'], $this->config['password'], $this->config['driverOptions']);
} catch (PDOException $xe) {
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, $xe->getMessage(), '', __METHOD__, __FILE__, __LINE__);
return false;
} catch (Exception $e) {
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, $e->getMessage(), '', __METHOD__, __FILE__, __LINE__);
return false;
}
$connected= (is_object($this->pdo));
if ($connected) {
$connectFile = XPDO_CORE_PATH . 'om/' . $this->config['dbtype'] . '/connect.inc.php';
if (!empty($this->config['connect_file']) && file_exists($this->config['connect_file'])) {
$connectFile = $this->config['connect_file'];
}
if (file_exists($connectFile)) include ($connectFile);
}
if (!$connected) {
$this->pdo= null;
}
}
$connected= is_object($this->pdo);
return $connected;
}
/**
* Get an option set for this xPDOConnection instance.
*
* @param string $key The option key to get a value for.
* @param array|null $options An optional array of options to consider.
* @param mixed $default A default value to use if the option is not found.
* @return mixed The option value.
*/
public function getOption($key, $options = null, $default = null) {
if (is_array($options)) {
$options = array_merge($this->config, $options);
} else {
$options = $this->config;
}
return $this->xpdo->getOption($key, $options, $default);
}
}
/**
* A basic class for xPDO Exceptions.
*/
class xPDOException extends Exception {}
PK !
notes.txtnu [ 1) Do not delete [[site_name]] from table [[dbprefix]]site_content, keep as it is added to show some content on enduser page. (Not needed since 2.5.0-pl since default content is added by default)
2) The password encryption method has been changed so 3 files 'modhashing.class.php', 'modpbkdf2.class.php' and 'xpdo.class.php' are included in the install.php ( This files are not required in install.php from 2.7.0 but we need it for edit.php)
3) Do not change this files 'modhashing.class.php', 'modpbkdf2.class.php', 'xpdo.class.php'.
4) Do not change "background-image: url(data:image/png;base64," in table [[dbprefix]]site_templates since these are images encoded in base64. Let it be as it is. Since 2.5.0pl.
5) PHP REQUIREMENT LINK: https://modx.com/download and /core/vendor/composer/platform_check.php(Composer Dependencies require PHP 7.4.0)
6) Give writable permission to manager and root folder to check config.core.php changes.
7)Before MySQL 5.6 Full-Text table type is supported only with MyISAM Engine(Full-Text table type required by MODX), hence removed the innodb engine, default engine will be assigned automatically
8) Languages have been removed since 3.0.1-pl User needs to change languages from Toggle option from admin menu.
https://docs.modx.com/3.x/en/getting-started/upgrading-to-3.0/manager-language
9) Check and Move /manager/assets/ext3/adapter/jquery/ext-jquery-adapter-debug.js /manager/assets/ext3/adapter/prototype/ext-prototype-adapter-debug.js /manager/assets/ext3/adapter/yui/ext-yui-adapter-debug.js manual to original zip.PK ! ,; images/modx.pngnu [ PNG
IHDR tEXtSoftware Adobe ImageReadyqe<