PageRenderTime 43ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/obsolete/DataBaseHTS.php

https://bitbucket.org/Balancer/bors-core
PHP | 1369 lines | 1122 code | 189 blank | 58 comment | 158 complexity | 7befd1c40227d2bb83f1f236d20ee09e MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. require_once ("DataBase.php");
  3. require_once ("engines/bors.php");
  4. require_once ("inc/global-data.php");
  5. define('DBHPROTOMASK', '!^([\w/]+)://(.*[^/])/?$!');
  6. class DataBaseHTS
  7. {
  8. var $dbh;
  9. var $uri;
  10. function instance($uri)
  11. {
  12. return new DataBaseHTS($uri);
  13. }
  14. function DataBaseHTS($data = NULL)
  15. {
  16. if($data && is_array($data))
  17. {
  18. $this->uri = @$data['uri'];
  19. $this->dbh = new DataBase(@$data['db']);
  20. }
  21. else
  22. {
  23. if(preg_match("!^/!", $data))
  24. $data = "http://{$_SERVER['HTTP_HOST']}{$data}";
  25. if(preg_match("!^[\w]+://!", $data))
  26. {
  27. $this->uri = $data;
  28. $this->dbh = new DataBase('HTS');
  29. }
  30. else
  31. {
  32. $this->uri = NULL;
  33. if(!$data)
  34. $data = 'HTS';
  35. $this->dbh = new DataBase($data);
  36. }
  37. }
  38. if (!$this->dbh)
  39. exit (__FILE__.__LINE." Can't create DataBase class");
  40. }
  41. function normalize_uri($uri, $base_page = '')
  42. {
  43. if ($base_page)
  44. {
  45. if (preg_match("!^http://!", $uri))
  46. return $this->normalize_uri($uri);
  47. if (!preg_match("!^/!", $uri))
  48. $uri = $base_page.$uri;
  49. return $this->normalize_uri("http://{$_SERVER['HTTP_HOST']}$uri");
  50. }
  51. $orig_uri = $uri;
  52. list ($uri, $params) = explode('?', $uri.'?');
  53. if (is_global_key('normalize_uri', $uri))
  54. return global_key('normalize_uri', $uri);
  55. // ??????? ??????? ????? ? ?????? (????? http://)
  56. $uri = preg_replace("!([^:])//+!", "$1/", $uri);
  57. // ???? ????????? ?????? ?? '/' ? ???????????? ?? ?? ??? ?????
  58. if (!preg_match("!/$!", $uri))
  59. if (preg_match("!^.*/[^\\.\\\\]+?$!", $uri))
  60. $uri .= '/';
  61. $uri = preg_replace("!^{$_SERVER['DOCUMENT_ROOT']}/+!", "/", $uri);
  62. if(preg_match("!^/!", $uri))
  63. $uri = 'http://'.$_SERVER['HTTP_HOST'].$uri;
  64. $uri = preg_replace("!/index\.\w+$!", "/", $uri);
  65. $uri = preg_replace("!(/\w+)\.(phtml|hts)$!", "$1.php", $uri);
  66. $uri = preg_replace("!^http://www\.!i", "http://", $uri);
  67. $save_log_level = isset ($GLOBALS['log_level']) ? $GLOBALS['log_level'] : NULL;
  68. $GLOBALS['log_level'] = 0;
  69. $m = array ();
  70. if (preg_match("!^http://([^/]+)(/.*?)([^/]*)$!", $uri, $m))
  71. {
  72. $host = $m[1];
  73. $path = $m[2];
  74. $file = $m[3];
  75. // if ($to_host = $this->dbh->get_value('hts_host_redirect', 'from', $host, 'to'))
  76. // $host = preg_replace("!^$host$!i", "$to_host", $host);
  77. $uri = "http://$host$path$file";
  78. }
  79. // if($alias = $this->dbh->get_value('hts_aliases', 'alias', $uri, 'uri'))
  80. // $uri = $alias;
  81. $GLOBALS['log_level'] = $save_log_level;
  82. // echolog("Normalize uri '$orig_uri' to '$uri'");
  83. return set_global_key('normalize_uri', $uri, $uri);
  84. }
  85. function clear_data_cache($uri, $key, $default = NULL, $inherit = false, $skip = false)
  86. {
  87. clear_global_key("uri_data($uri,$inherit,$skip)", $key);
  88. }
  89. function pre_data_check($uri, $key)
  90. {
  91. // if (!empty ($_GET['debug']))
  92. // echo "<small>pre_data_check('$uri', '$key')</small><br/>\n";
  93. if (empty ($GLOBALS['cms']['data_prehandler'][$key]))
  94. return false;
  95. if(is_global_key("uri_data($uri)", $key))
  96. return global_key("uri_data($uri)", $key);
  97. $m = array ();
  98. foreach ($GLOBALS['cms']['data_prehandler'][$key] as $regexp => $data)
  99. {
  100. // echo "$regexp<br />";
  101. if (preg_match($regexp, $uri, $m))
  102. if (($res = $data['func'] ($uri, $m, $data['plugin_data'], $key)) != NULL)
  103. {
  104. // echo "Pre data ($key, $uri, ".print_r($data, true).") = $res<br/>";
  105. // if($key == 'nav_name')
  106. // echo "=$key($uri)=$regexp={$data['func']}= -> $res<br />\n";
  107. return set_global_key("uri_data($uri)", $key, $res);
  108. }
  109. }
  110. return false;
  111. }
  112. function post_data_check($uri, $key)
  113. {
  114. if(($ret = $this->_post_data_check($uri, $key, $key)) !== false)
  115. return $ret;
  116. return $this->_post_data_check($uri, $key, '*');
  117. }
  118. function _post_data_check($uri, $key, $idx)
  119. {
  120. // if (!empty ($_GET['debug']))
  121. // echo "<small>post_data_check('$uri', '$key', '$idx')</small><br/>\n";
  122. if (empty ($GLOBALS['cms']['data_posthandler'][$idx]))
  123. return false;
  124. if(is_global_key("uri_data($uri)", $key))
  125. return global_key("uri_data($uri)", $key);
  126. $m = array ();
  127. // print_r($GLOBALS['cms']['data_posthandler'][$idx]);
  128. foreach ($GLOBALS['cms']['data_posthandler'][$idx] as $regexp => $array)
  129. {
  130. foreach($array as $data)
  131. {
  132. // echo "<xmp>"; print_r($data); echo "</xmp>";
  133. // echo "Check post_data_check($uri, $key) for $regexp<br/>\n";
  134. if (preg_match($regexp, $uri, $m))
  135. {
  136. // echo "Match for $key/$uri: {$data['func']}<br />";
  137. if (($res = $data['func'] ($uri, $m, $data['plugin_data'], $key)) !== NULL)
  138. {
  139. // if (!empty ($_GET['debug']))
  140. // echo "<small>post_data_check return $res</small><br/>\n";
  141. return set_global_key("uri_data($uri)", $key, $res);
  142. }
  143. }
  144. }
  145. }
  146. return false;
  147. }
  148. function get($uri, $key = NULL)
  149. {
  150. if($key == NULL)
  151. return $this->get_data($this->uri, $uri);
  152. else
  153. return $this->get_data($uri, $key);
  154. }
  155. function check_uri_handler($uri)
  156. {
  157. if(empty($GLOBALS['bors_data']['hts_uri_bors_handlers']))
  158. return false;
  159. foreach($GLOBALS['bors_data']['hts_uri_bors_handlers'] as $regexp => $class_name)
  160. if(preg_match($regexp, $uri))
  161. return class_uri_load($class_name, $uri);
  162. return false;
  163. }
  164. function get_data($uri, $key, $default = NULL, $inherit = false, $skip = false, $fields = '`value`', $search = '`id`')
  165. {
  166. if($obj = $this->check_uri_handler($uri))
  167. if(method_exists($obj, $key))
  168. return $obj->$key();
  169. if($key == 'template')
  170. {
  171. if($fields == '`value`' && $search == '`id`' && !$skip && is_global_key("uri_data($uri)", $key))
  172. {
  173. // echo "*";
  174. return global_key("uri_data($uri)", $key);
  175. }
  176. }
  177. // if(!empty($_GET['debug']))
  178. // if($key == 'source')
  179. // echo("<small><tt>Get key '$key' for '$uri'</tt></small><br />");
  180. global $transmap;
  181. // print_r($transmap);
  182. // echo "$uri($key)<br/>";
  183. if(!preg_match('!^http://!', $uri))
  184. if(preg_match(DBHPROTOMASK, $uri, $m) && (!empty($transmap[@$m[1]]) || !empty($GLOBALS['bors'])) )
  185. {
  186. // echo "transmap for {$m[1]} = {$transmap[@$m[1]]}<br />";
  187. $ret = $this->get_proto($m[1], $m[2]."/", $key);
  188. if($ret !== NULL)
  189. return $ret;
  190. }
  191. $m = array ();
  192. if (preg_match("!^raw:(.+)$!", $key, $m))
  193. {
  194. $key = $m[1];
  195. $raw = true;
  196. }
  197. else
  198. $raw = false;
  199. $uri = $this->normalize_uri($uri);
  200. if (!$raw && isset ($GLOBALS['page_data_preset'][$key][$uri]))
  201. return $GLOBALS['page_data_preset'][$key][$uri];
  202. $skip_save = $skip;
  203. if (!$fields && !$search && !$skip && is_global_key("uri_data($uri)", $key)) // && global_key("uri_data($uri,$inherit,$skip_save)",$key))
  204. return global_key("uri_data($uri)", $key);
  205. if (!$raw && ($res = $this->pre_data_check($uri, $key)) !== false)
  206. return $res;
  207. if (!$raw && isset ($GLOBALS['page_data_preset'][$key][$uri]))
  208. return $GLOBALS['page_data_preset'][$key][$uri];
  209. $key_table_name = $this->create_data_table($key);
  210. $loops = 0;
  211. $host = '/';
  212. if(preg_match("!^(http://[^/]+)!", $uri, $m))
  213. $host = $m[1].'/';
  214. do
  215. {
  216. if (!$skip && $val = $this->dbh->get("SELECT $fields FROM `$key_table_name` WHERE $search='".addslashes($uri)."'", true))
  217. return set_global_key("uri_data($uri)", $key, $val); //stripslashes(
  218. if ($inherit)
  219. {
  220. $skip = false;
  221. if ($loops ++ > 10)
  222. $uri = $host;
  223. if ($uri == $host)
  224. break;
  225. $res = $this->get_data_array($uri, 'parent');
  226. if ($res)
  227. {
  228. sort($res);
  229. $uri = $res[0];
  230. }
  231. else
  232. $uri = $host;
  233. }
  234. else
  235. break;
  236. }
  237. while ($uri && $uri != $host && $loops < 10);
  238. // echo "post $uri($key)<br/>";
  239. if (!$raw && ($res = $this->post_data_check($uri, $key)) !== false)
  240. return set_global_key("uri_data($uri)", $key, $res);
  241. // include_once("funcs/DataBaseHTS/ipb.php");
  242. $value = NULL; //dbhts_ipb($uri, $key, $this);
  243. set_global_key("uri_data($uri)", $key, $value);
  244. // if(!empty($_GET['debug']))
  245. // echo("Get key '$key' for '$uri' => '$value'");
  246. return $value ? $value : $default;
  247. }
  248. function get_array($uri, $key = array(), $params = array())
  249. {
  250. if(is_array($key))
  251. return $this->get_data_array($this->uri, $uri, $key);
  252. else
  253. return $this->get_data_array($uri, $key, $params);
  254. }
  255. function get_data_array($uri, $key, $params = array())
  256. {
  257. if(substr($uri, 0, 7) != 'http://')
  258. {
  259. if(!preg_match(DBHPROTOMASK, $uri, $m))
  260. return array();
  261. if(!function_exists('class_load'))
  262. return array();
  263. $obj = class_load($m[1], $m[2]."/");
  264. if(method_exists($obj, $key))
  265. return $obj->$key();
  266. else
  267. return array();
  268. }
  269. if(empty($params['fields']))
  270. $params['fields'] = "`value`";
  271. if(empty($params['where']))
  272. $params['where'] = "`id`";
  273. $fields = $params['fields'];
  274. $search = $params['where'];
  275. $ignore_error = !empty($params['ignore_error']);
  276. $order = "";
  277. if(!empty($params['order']))
  278. {
  279. $order = array();
  280. foreach(explode(',', $params['order']) as $ord)
  281. {
  282. $ord = trim($ord);
  283. if($ord{0} == "+")
  284. $ord = substr($ord, 1);
  285. if($ord{0} == "-")
  286. $ord = substr($ord, 1).' DESC';
  287. $order[] = $ord;
  288. }
  289. $order = " ORDER BY ".join(', ', $order);
  290. }
  291. // echolog("Get keys array '$key' for '$uri' (fields=$fields, search=$search)");
  292. // $uri = $this->normalize_uri($uri);
  293. if (($res = $this->pre_data_check($uri, $key)) !== false)
  294. return $res;
  295. $key_table_name = $this->create_data_table($key);
  296. $res = $this->dbh->get_array("SELECT $fields FROM `$key_table_name` WHERE $search='".addslashes($uri)."' $order", $ignore_error);
  297. if ($res)
  298. return $res;
  299. if (($res = $this->post_data_check($uri, $key)) !== false)
  300. return $res;
  301. return array ();
  302. }
  303. function get_data_array_size($uri, $key)
  304. {
  305. // echolog("Get keys array size '$key' for '$uri' (fields=$fields, search=id)");
  306. $uri = $this->normalize_uri($uri);
  307. if (($res = $this->pre_data_check($uri, $key)) !== false)
  308. return sizeof($res);
  309. $key_table_name = $this->create_data_table($key);
  310. $res = $this->dbh->get("SELECT COUNT(*) FROM `$key_table_name` WHERE id='".addslashes($uri)."'");
  311. if ($res)
  312. return $res;
  313. if (($res = $this->post_data_check($uri, $key)) !== false)
  314. return sizeof($res);
  315. return 0;
  316. }
  317. function data_exists($uri, $key, $value)
  318. {
  319. foreach ($this->get_data_array($uri, $key, array('ignore_error'=>true)) as $val)
  320. {
  321. if ($val == $value)
  322. return true;
  323. }
  324. return false;
  325. }
  326. function set($uri, $key, $value)
  327. {
  328. return $this->set_data($uri, $key, $value);
  329. }
  330. function set_data($uri, $key, $value, $params = array (), $append = false)
  331. {
  332. if($obj = $this->check_uri_handler($uri))
  333. {
  334. $method = "set_$key";
  335. if(method_exists($obj, $method))
  336. return $obj->$method($value);
  337. }
  338. global $transmap;
  339. if(!preg_match('!^http://!', $uri))
  340. if(preg_match('!^(\w+)://(.+[^/])$!', $uri, $m) && !empty($transmap[$m[1]]))
  341. return $this->set_proto($m[1], $m[2], $key, $value);
  342. if (!is_null($value) && is_global_key("uri_data($uri)", $key) && global_key("uri_data($uri)", $key) == $value)
  343. return;
  344. $uri = $this->normalize_uri($uri);
  345. $key_table_name = $this->create_data_table($key);
  346. if (is_null($value))
  347. $this->dbh->query("DELETE FROM $key_table_name WHERE `id`='".addslashes($uri)."'");
  348. else
  349. $this->dbh->store($key_table_name, "`id`='".addslashes($uri)."'", array ('id' => $uri, 'value' => $value) + $params, $append);
  350. set_global_key("uri_data($uri)", $key, $value);
  351. return $value;
  352. }
  353. function update_data($uri, $key, $fields, $search = "`id`")
  354. {
  355. echolog("Set for '$uri' as '$key' $fields => $search");
  356. $uri = $this->normalize_uri($uri);
  357. $key_table_name = $this->create_data_table($key);
  358. // $GLOBALS['log_level'] = 9;
  359. $this->dbh->store($key_table_name, "$search='".addslashes($uri)."'", $fields);
  360. // $GLOBALS['log_level'] = 2;
  361. }
  362. function append_data($uri, $key, $value, $params = array ())
  363. {
  364. echolog("Append for '$uri' as '$key'='$value'");
  365. $uri = $this->normalize_uri($uri);
  366. $key_table_name = $this->create_data_table($key);
  367. $this->dbh->store($key_table_name, "`id`='".addslashes($uri)."'", array ('id' => $uri, 'value' => $value) + $params, true);
  368. // $this->dbh->query("DELETE FROM `$key_table_name` WHERE `id`=$page_id AND `value`='$value'");
  369. // $this->dbh->query("INSERT INTO `$key_table_name` (`id`,`value`) VALUES ($page_id,'".mysql_real_escape_string($value,$this->dbh->dbh)."')");
  370. // echo 'charset='.$this->dbh->get("SELECT @@character_set_client");
  371. }
  372. function remove_data($uri, $key, $value = NULL)
  373. {
  374. $uri = $this->normalize_uri($uri);
  375. $key_table_name = $this->create_data_table($key);
  376. if (is_null($value))
  377. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `id`='".addslashes($uri)."'");
  378. else
  379. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `id`='".addslashes($uri)."' AND `value`='".addslashes($value)."'");
  380. }
  381. function nav_link($iparent, $ichild)
  382. {
  383. // echo "try linked $iparent, $ichild<br>";
  384. $parent = $this->normalize_uri($iparent);
  385. $child = $this->normalize_uri($ichild);
  386. if (!$parent || !$child)
  387. {
  388. debug(__FILE__.':'.__LINE__." Can't nav pair: $iparent-$ichild to $parent-$child", 1);
  389. return;
  390. }
  391. $GLOBALS['tmp_dbhts_nav_check_count'] = 0;
  392. if (!$this->parent_check($parent, $child))
  393. {
  394. debug(__FILE__.':'.__LINE__." Try to cycle parents-link: $child to $parent", 1);
  395. return;
  396. }
  397. $this->append_data($parent, 'child', $child);
  398. $this->append_data($child, 'parent', $parent);
  399. }
  400. function add_child($parent, $child)
  401. {
  402. $parent = $this->normalize_uri($parent);
  403. $child = $this->normalize_uri($child);
  404. if (!$parent || !$child)
  405. {
  406. debug(__FILE__.':'.__LINE__." Can't add child link: $parent-$child", 1);
  407. return;
  408. }
  409. $GLOBALS['tmp_dbhts_nav_check_count'] = 0;
  410. if (!$this->parent_check($parent, $child))
  411. {
  412. debug(__FILE__.':'.__LINE__." Try to cycle parents-link: $child to $parent", 1);
  413. return;
  414. }
  415. // echo "Add $child as child for $parent";
  416. $this->append_data($parent, 'child', $child);
  417. }
  418. function parent_add($uri, $parent)
  419. {
  420. $uri = $this->normalize_uri($uri);
  421. $parent = $this->normalize_uri($parent);
  422. if (!$parent || !$uri)
  423. {
  424. debug(__FILE__.':'.__LINE__." Can't add parent link $uri-$parent", 1);
  425. return;
  426. }
  427. if (!$this->parent_check($parent, $uri))
  428. {
  429. debug(__FILE__.':'.__LINE__." Try to cycle parents-link: $parent to $uri", 1);
  430. return;
  431. }
  432. // echo "Add $child as child for $parent";
  433. $this->append_data($uri, 'parent', $parent);
  434. }
  435. function parent_check($page, $parent_check)
  436. {
  437. if ($page == $parent_check)
  438. return false;
  439. if (empty ($GLOBALS['tmp_dbhts_nav_check_count']))
  440. $GLOBALS['tmp_dbhts_nav_check_count'] = 0;
  441. if ($GLOBALS['tmp_dbhts_nav_check_count']++ > 10)
  442. {
  443. debug(__FILE__.':'.__LINE__." Cycled parents-link: $page to $parent_check", 1);
  444. return false;
  445. }
  446. $no_circuit = true;
  447. foreach ($this->get_data_array($page, 'parent') as $p)
  448. $no_circuit = $no_circuit && $this->parent_check($p, $parent_check);
  449. return $no_circuit;
  450. }
  451. function remove_nav_link($iparent, $ichild = NULL)
  452. {
  453. $parent = $this->normalize_uri($iparent);
  454. if ($ichild)
  455. {
  456. $child = $this->normalize_uri($ichild);
  457. $t_c = $t_p = array ();
  458. if ($parent)
  459. {
  460. $t_c[] = "`id` = '".addslashes($parent)."'";
  461. $t_p[] = "`value` = '".addslashes($parent)."'";
  462. }
  463. if ($child)
  464. {
  465. $t_c[] = "`value` = '".addslashes($child)."'";
  466. $t_p[] = "`id` = '".addslashes($child)."'";
  467. }
  468. if ($parent || $child)
  469. {
  470. $t_c = join(' AND ', $t_c);
  471. $t_p = join(' AND ', $t_p);
  472. if ($t_c)
  473. $this->dbh->query("DELETE FROM `hts_data_child` WHERE $t_c");
  474. if ($t_p)
  475. $this->dbh->query("DELETE FROM `hts_data_parent` WHERE $t_p");
  476. }
  477. }
  478. else
  479. {
  480. $this->dbh->query("DELETE FROM `hts_data_child` WHERE `id` = '".addslashes($parent)."' OR `value` = '".addslashes($parent)."'");
  481. $this->dbh->query("DELETE FROM `hts_data_parent` WHERE `id` = '".addslashes($parent)."' OR `value` = '".addslashes($parent)."'");
  482. }
  483. }
  484. function child_remove($uri, $child)
  485. {
  486. if (!$uri || !$child)
  487. {
  488. debug(__FILE__.':'.__LINE__." Can't remove child link: $uri-$child", 1);
  489. return;
  490. }
  491. $uri = $this->normalize_uri($uri);
  492. $child = $this->normalize_uri($child);
  493. $this->dbh->query("DELETE FROM `hts_data_child` WHERE `id` = '".addslashes($uri)."' AND `value` = '".addslashes($child)."'");
  494. }
  495. function parent_remove($uri, $parent)
  496. {
  497. if (!$parent || !$uri)
  498. {
  499. debug(__FILE__.':'.__LINE__." Can't remove parent link: $uri-$parent", 1);
  500. return;
  501. }
  502. $uri = $this->normalize_uri($uri);
  503. $parent = $this->normalize_uri($parent);
  504. $this->dbh->query("DELETE FROM `hts_data_parent` WHERE `id` = '".addslashes($uri)."' AND `value` = '".addslashes($parent)."'");
  505. }
  506. function page_uri_by_value($key, $value)
  507. {
  508. $key_table_name = $this->create_data_table($key);
  509. return $this->dbh->get("SELECT `id` FROM `$key_table_name` WHERE `value`='".addslashes($value)."'");
  510. }
  511. function uri_array_by_value($key, $value)
  512. {
  513. $key_table_name = $this->create_data_table($key);
  514. return $this->dbh->get_array("SELECT `id` FROM `$key_table_name` WHERE `value` = '".addslashes($value)."'");
  515. }
  516. function uri_array_by_condition($key, $condition)
  517. {
  518. $key_table_name = $this->create_data_table($key);
  519. return $this->dbh->get_array("SELECT `id` FROM `$key_table_name` WHERE $condition");
  520. }
  521. function create_data_table($key, $create_table = true)
  522. {
  523. // echo "Create table name for $key";
  524. if (is_global_key('key_table_name', $key) && global_key('key_table_name', $key))
  525. return global_key('key_table_name', $key);
  526. $key_table_name = "hts_data_$key";
  527. set_global_key('key_table_name', $key, $key_table_name);
  528. if (1 || !$create_table)
  529. return $key_table_name;
  530. $res = $this->dbh->get("SELECT * FROM `hts_keys` WHERE `name`='".addslashes($key)."'");
  531. $type = $res['type'];
  532. if (!$type)
  533. return;
  534. $params_fields = '';
  535. $params_key = '';
  536. if ($res['params'])
  537. {
  538. foreach (explode(",", $res['params']) as $p)
  539. {
  540. list ($f, $t) = explode("=", $p);
  541. $params_fields .= "`$f` $t NOT NULL,\n";
  542. if ($t != 'TEXT' && substr($t, 0, 7) != 'VARCHAR')
  543. $params_key .= ", `$f`";
  544. }
  545. }
  546. $inc = $res['autoinc_value'] ? ' AUTO_INCREMENT ' : '';
  547. $index_id = !$res['array'] ? ' PRIMARY KEY `id` (`id`), ' : ' KEY `id` (`id`), ';
  548. $charset = (substr($type, 0, 3) == 'INT' ? '' : 'CHARACTER SET utf8');
  549. $index = '';
  550. $length = '';
  551. switch (substr($type, 0, 3))
  552. {
  553. case 'TEX' :
  554. $index = 'FULLTEXT KEY `value` (`value`)';
  555. $length = "(166)";
  556. break;
  557. case 'VAR' :
  558. $index = 'FULLTEXT KEY `value` (`value`)';
  559. break;
  560. case 'INT' :
  561. $index = 'KEY `value` (`value`)';
  562. break;
  563. }
  564. // $GLOBALS['log_level']=9;
  565. $q = "
  566. CREATE TABLE IF NOT EXISTS `$key_table_name` (
  567. `id` VARCHAR(166) NOT NULL,
  568. `value` $type $charset NOT NULL $inc,
  569. $params_fields
  570. $index_id
  571. UNIQUE KEY `pair` ( `id` , `value` $length $params_key),
  572. $index
  573. );"; // CHARACTER SET = utf8
  574. // echo $q;
  575. $this->dbh->query($q);
  576. // $GLOBALS['log_level']=2;
  577. /*
  578. CREATE TABLE `hts_keys` (
  579. `name` VARCHAR( 255 ) CHARACTER SET utf8 NOT NULL ,
  580. `type` VARCHAR( 255 ) CHARACTER SET utf8 NOT NULL ,
  581. `protected` TINYINT NOT NULL
  582. ) CHARACTER SET = utf8;
  583. */
  584. return $key_table_name;
  585. }
  586. function delete_by_mask($uri)
  587. {
  588. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys`") as $key)
  589. {
  590. $key_table_name = $this->create_data_table($key);
  591. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `id` LIKE '".addslashes($uri)."'");
  592. }
  593. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys` WHERE `id_in_value` = 1") as $key)
  594. {
  595. $key_table_name = $this->create_data_table($key);
  596. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `value` LIKE '".addslashes($uri)."'");
  597. }
  598. $this->dbh->query("DELETE FROM `hts_aliases` WHERE `alias` LIKE '".addslashes($uri)."' OR `uri` LIKE '".addslashes($uri)."'");
  599. }
  600. function delete_page($uri)
  601. {
  602. $uri = $this->normalize_uri($uri);
  603. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys`") as $key)
  604. {
  605. $key_table_name = $this->create_data_table($key);
  606. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `id` = '".addslashes($uri)."'");
  607. }
  608. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys` WHERE `id_in_value` = 1") as $key)
  609. {
  610. $key_table_name = $this->create_data_table($key);
  611. $this->dbh->query("DELETE FROM `$key_table_name` WHERE `value` = '".addslashes($uri)."'");
  612. }
  613. $this->dbh->query("DELETE FROM `hts_aliases` WHERE `alias` = '".addslashes($uri)."' OR `uri` = '".addslashes($uri)."'");
  614. }
  615. function rename_host($from, $to)
  616. {
  617. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys`") as $key)
  618. {
  619. $key_table_name = $this->create_data_table($key);
  620. $this->dbh->query("UPDATE IGNORE `$key_table_name` SET `id` = REPLACE(`id`, '".addslashes($from)."', '".addslashes($to)."');");
  621. }
  622. foreach ($this->dbh->get_array("SELECT `name` FROM `hts_keys` WHERE `id_in_value` = 1") as $key)
  623. {
  624. $key_table_name = $this->create_data_table($key);
  625. $this->dbh->query("UPDATE `$key_table_name` SET `value` = REPLACE(`value`, '".addslashes($from)."', '".addslashes($to)."');");
  626. }
  627. $this->dbh->query("UPDATE `hts_aliases` SET `alias` = REPLACE(`alias`, '".addslashes($from)."', '".addslashes($to)."');");
  628. }
  629. function parse_uri($uri)
  630. {
  631. $uri = $this->normalize_uri($uri);
  632. $data = parse_url($uri);
  633. if (empty ($data['host']))
  634. $data['host'] = $_SERVER['HTTP_HOST'];
  635. if (preg_match("!^{$_SERVER['HTTP_HOST']}$!", $data['host']))
  636. $data['root'] = $_SERVER['DOCUMENT_ROOT'];
  637. else
  638. $data['root'] = $this->dbh->get("SELECT `doc_root` as `root` FROM `hts_hosts` WHERE `host` = '".addslashes($data['host'])."'");
  639. $data['local'] = !empty ($data['root']);
  640. $data['local_path'] = $data['root'].str_replace('http://'.$data['host'], '', $uri);
  641. $data['uri'] = "http://".@ $data['host'].@ $data['path'];
  642. return $data;
  643. }
  644. function base_value($key, $def = NULL)
  645. {
  646. if (is_global_key('base_value', $key))
  647. return global_key('base_value', $key);
  648. $val = $this->dbh->get("SELECT `$key` FROM `hts_hosts` WHERE `host` LIKE '{$_SERVER['HTTP_HOST']}'", true);
  649. return set_global_key('base_value', $key, $val ? $val : $def);
  650. }
  651. /* function move_page($old_name, $new_name)
  652. {
  653. $new_name = $this->normalize_uri($new_name);
  654. $old_name = $this->normalize_uri($old_name);
  655. if (!$new_name || !$old_name)
  656. return false;
  657. $this->dbh->insert('hts_aliases', array ('alias' => $old_name, 'uri' => $new_name));
  658. return true;
  659. }
  660. */
  661. function viewses_inc($uri)
  662. {
  663. if (!$this->get_data($uri, 'views_first'))
  664. $this->set_data($uri, 'views_first', time());
  665. $this->set_data($uri, 'views_last', time());
  666. $this->set_data($uri, 'views', $this->get_data($uri, 'views') + 1);
  667. }
  668. function sys_var($key, $default = NULL)
  669. {
  670. $ret = $this->dbh->get("SELECT `value` FROM `hts_ext_system_data` WHERE `key`='".addslashes($key)."'");
  671. if (!$ret)
  672. $ret = $default;
  673. return $ret;
  674. }
  675. function set_flag($uri, $flag)
  676. {
  677. global $transmap;
  678. if(!preg_match('!^http://!', $uri))
  679. if(preg_match(DBHPROTOMASK, $uri, $m) && !empty($transmap[@$m[1]]))
  680. return $this->set_proto($m[1], $m[2]."/", $flag, 1);
  681. $this->append_data($uri, 'flags', $flag);
  682. }
  683. function drop_flag($uri, $flag)
  684. {
  685. global $transmap;
  686. if(!preg_match('!^http://!', $uri))
  687. if(preg_match(DBHPROTOMASK, $uri, $m) && !empty($transmap[@$m[1]]))
  688. return $this->set_proto($m[1], $m[2]."/", $flag, NULL);
  689. $this->remove_data($uri, 'flags', $flag);
  690. }
  691. function is_flag($uri, $flag)
  692. {
  693. global $transmap;
  694. if(!preg_match('!^http://!', $uri))
  695. if(preg_match(DBHPROTOMASK, $uri, $m) && !empty($transmap[@$m[1]]))
  696. return $this->get_proto($m[1], $m[2]."/", $flag) ? true : false;
  697. return $this->data_exists($uri, 'flags', $flag);
  698. }
  699. function pages_with_flag($uri_like, $flag)
  700. {
  701. return $this->dbh->get_array("SELECT id FROM hts_data_flags WHERE value LIKE '".addslashes($flag)."' AND id RLIKE '".addslashes($uri_like)."'");
  702. }
  703. function export($uri)
  704. {
  705. $save = '';
  706. foreach (explode(' ', 'title source') as $i)
  707. $save .= "$i = ".$this->get_data($uri, $i).";\n\n";
  708. return $save;
  709. }
  710. function getNextId($uri)
  711. {
  712. $uri = addslashes($this->normalize_uri($uri));
  713. $this->dbh->query("INSERT INTO `hts_ids` SET `uri` = '$uri'");
  714. $id = $this->dbh->last_id();
  715. if (!$id)
  716. exit ("Unknown error. Can't get next ID for " + $uri);
  717. return $id;
  718. }
  719. function pages_with_parent($uri)
  720. {
  721. return $this->dbh->get_array("SELECT id FROM hts_data_parent WHERE value LIKE '".addslashes($uri)."'");
  722. }
  723. function get_children_array_ex($parent, $params = array ())
  724. {
  725. $start = intval(empty ($params['start']) ? 0 : $params['start']);
  726. $limit = intval(empty ($params['limit']) ? 20 : $params['limit']);
  727. $range = intval(empty ($params['range']) ? 86400 : $params['range']);
  728. $stop_time = time();
  729. $start_time = $range > 0 ? $stop_time - $range : 0;
  730. $join = $cond = "";
  731. $order = "ORDER BY mt.value DESC";
  732. $tab = 1;
  733. if(!empty($params['order']))
  734. {
  735. list($table, $asc) = preg_split("!\s+!", $params['order']);
  736. $join .= " LEFT JOIN hts_data_".addslashes($table)." tab$tab ON (c.value = tab$tab.id)\n";
  737. $order = "ORDER BY tab$tab.value $asc\n";
  738. }
  739. if(!empty ($params['closed']))
  740. {
  741. $not = $params['closed'] == 'yes' ? "NOT" : "";
  742. $join .= " LEFT JOIN hts_data_flags fc ON (c.value = fc.id AND fc.value='closed')";
  743. $cond .= " AND fc.id IS $not NULL";
  744. }
  745. if(empty ($params['hidden']) || $params['hidden'] == 'only')
  746. {
  747. $not = @$params['hidden'] == 'only' ? "NOT" : "";
  748. $join .= " LEFT JOIN hts_data_flags fh ON (c.value = fh.id AND fh.value='hidden')";
  749. $cond .= " AND fh.id IS $not NULL";
  750. }
  751. if (empty ($params['deleted']) || $params['deleted'] == 'only')
  752. {
  753. $not = @$params['deleted'] == 'only' ? "NOT" : "";
  754. $join .= " LEFT JOIN hts_data_flags fd ON (c.value = fd.id AND fd.value='deleted')";
  755. $cond .= " AND fd.id IS $not NULL";
  756. }
  757. $query = "SELECT c.value as uri
  758. FROM hts_data_child c
  759. LEFT JOIN hts_data_modify_time mt ON (c.value = mt.id)
  760. $join
  761. WHERE c.id = '".addslashes($parent)."'
  762. AND mt.value >= $start_time
  763. AND mt.value < $stop_time
  764. $cond
  765. $order
  766. LIMIT $start, $limit;";
  767. return $this->dbh->get_array($query);
  768. }
  769. function get_children_array_ex_size($parent, $params = array ())
  770. {
  771. $range = intval(empty ($params['range']) ? 86400 : $params['range']);
  772. $stop_time = time();
  773. $start_time = $range > 0 ? $stop_time - $range : 0;
  774. $join = $cond = "";
  775. $tab = 1;
  776. if(!empty ($params['closed']))
  777. {
  778. $not = $params['closed'] == 'yes' ? "NOT" : "";
  779. $join .= " LEFT JOIN hts_data_flags fc ON (c.value = fc.id AND fc.value='closed')";
  780. $cond .= " AND fc.id IS $not NULL";
  781. }
  782. if(empty ($params['hidden']) || $params['hidden'] == 'only')
  783. {
  784. $not = @$params['hidden'] == 'only' ? "NOT" : "";
  785. $join .= " LEFT JOIN hts_data_flags fh ON (c.value = fh.id AND fh.value='hidden')";
  786. $cond .= " AND fh.id IS $not NULL";
  787. }
  788. if (empty ($params['deleted']) || $params['deleted'] == 'only')
  789. {
  790. $not = @$params['deleted'] == 'only' ? "NOT" : "";
  791. $join .= " LEFT JOIN hts_data_flags fd ON (c.value = fd.id AND fd.value='deleted')";
  792. $cond .= " AND fd.id IS $not NULL";
  793. }
  794. $query = "
  795. SELECT COUNT(*) FROM hts_data_child c
  796. LEFT JOIN hts_data_modify_time mt ON (c.value = mt.id)
  797. $join
  798. WHERE c.id = '".addslashes($parent)."'
  799. AND mt.value >= $start_time
  800. AND mt.value < $stop_time
  801. $cond
  802. ";
  803. return $this->dbh->get($query);
  804. }
  805. function get_array_ex($regexp, $table, $params = array ())
  806. {
  807. //print_r($params);
  808. $limit = intval(empty ($params['limit']) ? 20 : $params['limit']);
  809. $range = intval(empty ($params['range']) ? 86400 : $params['range']);
  810. $stop_time = intval(empty ($params['stop_time']) ? time() : $params['stop_time']);
  811. $start_time = intval(empty ($params['start_time']) ? $stop_time - $range : $params['start_time']);
  812. $join = $cond = "";
  813. //echo $params['like_type'];
  814. $like_type = empty ($params['like_type']) ? '=' : addslashes($params['like_type']);
  815. if(empty ($params['hidden']))
  816. {
  817. $join .= " LEFT JOIN hts_data_flags fh ON (ct.value = fh.id AND fh.value='hidden')";
  818. $cond .= " AND fh.id IS NULL";
  819. }
  820. if(empty ($params['deleted']))
  821. {
  822. $join .= " LEFT JOIN hts_data_flags fd ON (ct.value = fd.id AND fd.value='deleted')";
  823. $cond .= " AND fd.id IS NULL";
  824. }
  825. $this->add_where($params, $join, $cond);
  826. $query = "SELECT ct.id as uri
  827. FROM hts_data_".addslashes($table)." ct
  828. LEFT JOIN hts_data_modify_time mt ON (ct.id = mt.id)
  829. $join
  830. WHERE ct.id $like_type '".addslashes($regexp)."'
  831. $cond
  832. ORDER BY mt.value DESC
  833. LIMIT $limit;";
  834. $ret = $this->dbh->get_array($query);
  835. return $ret;
  836. }
  837. function add_where($params, &$join, &$cond)
  838. {
  839. if(!is_array(@$params['where']))
  840. return;
  841. $joined = array ();
  842. $join_cnt = 0;
  843. $m2 = array ();
  844. foreach ($params['where'] as $field => $value)
  845. {
  846. if(preg_match("!^(.+)\s+(.+?)$!", $field, $m2))
  847. {
  848. $field = $m2[1];
  849. $op = addslashes($m2[2]);
  850. }
  851. else
  852. $op = "=";
  853. $field = addslashes($field);
  854. if(empty ($joined[$field]))
  855. {
  856. $join_cnt ++;
  857. $jt = $joined[$field] = "j$join_cnt";
  858. $join .= " LEFT JOIN hts_data_$field $jt ON (ct.id = $jt.id) ";
  859. }
  860. else
  861. $jt = "j".$joined[$field];
  862. $cond .= " AND $jt.value $op ".addslashes($value)." ";
  863. }
  864. }
  865. function get_proto($proto, $id, $key)
  866. {
  867. // echo "Get proto $proto://$id -> $key()<br />";
  868. if(function_exists('class_load') && ($obj = class_load($proto, $id)) && method_exists($obj, $key))
  869. return $obj->$key();
  870. global $transmap;
  871. $t = &$transmap[$proto];
  872. if(preg_match('!^http://!', $id) && $t['uri>id'])
  873. $id = $t['uri>id']['rf']($id);
  874. if(is_array($key))
  875. {
  876. $fields = array();
  877. $join = array();
  878. foreach($key as $k)
  879. {
  880. $fields[] = $t[$k]['r'];
  881. if(empty($joined[$t[$k]['join']]))
  882. {
  883. $join[] = $t[$k]['join'];
  884. $joined[$t[$k]['join']] = true;
  885. }
  886. }
  887. $fields = join(", ", $fields);
  888. $join = join(" ", $join);
  889. }
  890. else
  891. {
  892. if(@$t[$key]['rf'])
  893. return $t[$key]['rf']($id);
  894. $fields = @$t[$key]['r'];
  895. $join = @$t[$key]['join'];
  896. }
  897. if(!empty($t['db']))
  898. $db = "`{$t['db']}`.";
  899. else
  900. $db = "";
  901. $table = @$t[is_array($key)?$key[0]:$key]['table'];
  902. if(empty($fields) || empty($table))
  903. return NULL;
  904. $r = $this->dbh->get("SELECT $fields FROM $db$table $join WHERE {$t['*']} = '".addslashes($id)."'");
  905. if(is_array($key))
  906. {
  907. foreach($key as $k)
  908. if($t[$k]['q'])
  909. $r[$k] = html_entity_decode($r[$k], ENT_COMPAT, 'UTF-8');
  910. }
  911. else
  912. if($t[$key]['q'])
  913. $r = html_entity_decode($r, ENT_COMPAT, 'UTF-8');
  914. return $r;
  915. }
  916. function get_proto_array($proto, $id, $key, $para = array())
  917. {
  918. global $transmap;
  919. $t = &$transmap[$proto];
  920. if(preg_match('!^http://!', $id))
  921. $id = $t['uri>id']['rf']($id);
  922. if(is_array($key))
  923. {
  924. $fields = array();
  925. $join = array();
  926. foreach($key as $k)
  927. {
  928. $fields[] = $t[$k]['r'];
  929. if(empty($joined[$t[$k]['join']]))
  930. {
  931. $join[] = $t[$k]['join'];
  932. $joined[$t[$k]['join']] = true;
  933. }
  934. }
  935. $fields = join(", ", $fields);
  936. $join = join(" ", $join);
  937. }
  938. else
  939. $fields = $t[$key]['r'];
  940. if(empty($para['like_type']))
  941. $para['like_type'] = 'like';
  942. if($para['like_type'] == 'like')
  943. $where = "{$t['*']} LIKE '".addslashes($id)."'";
  944. $limit = "";
  945. if(isset($para['start']) && isset($para['limit']))
  946. $limit = "LIMIT ".intval($para['start']).", ".intval($para['limit']);
  947. $order = "";
  948. if(isset($para['order']))
  949. $order = "ORDER BY {$t[$para['order']]['k']}";
  950. if(!empty($t['db']))
  951. $db = "`{$t['db']}`.";
  952. else
  953. $db = "";
  954. $table = @$t[is_array($key)?$key[0]:$key]['table'];
  955. $r = $this->dbh->get_array("SELECT $fields FROM $db$table $join WHERE $where $order $limit");
  956. if(is_array($key))
  957. {
  958. foreach($key as $k)
  959. if($t[$k]['q'])
  960. for($i=0, $stop=sizeof($r); $i<$stop; $i++)
  961. $r[$i][$k] = html_entity_decode($r[$i][$k], ENT_COMPAT, 'UTF-8');
  962. }
  963. else
  964. if($t[$key]['q'])
  965. for($i=0, $stop=sizeof($r); $i<$stop; $i++)
  966. $r[$i] = html_entity_decode($r[$i], ENT_COMPAT, 'UTF-8');
  967. return $r;
  968. }
  969. function get_proto_array_size($proto, $id, $para = array())
  970. {
  971. global $transmap;
  972. $t = &$transmap[$proto];
  973. if(preg_match('!^http://!', $id))
  974. $id = $t['uri>id']['rf']($id);
  975. if(empty($para['like_type']))
  976. $para['like_type'] = 'like';
  977. if($para['like_type'] == 'like')
  978. $where = "{$t['*']} LIKE '".addslashes($id)."'";
  979. if(!empty($t['db']))
  980. $db = "`{$t['db']}`.";
  981. else
  982. $db = "";
  983. return intval($this->dbh->get("SELECT COUNT(*) FROM $db{$t['table']} WHERE $where"));
  984. }
  985. function set_proto($proto, $id, $key, $value)
  986. {
  987. global $transmap;
  988. $t = &$transmap[$proto];
  989. if(preg_match('!^http://!', $id))
  990. $id = $t['uri>id']['rf']($id);
  991. $w = str_replace('$1', $value, @$t[$key]['w']);
  992. if(@$t[$key]['q'])
  993. $value = htmlspecialchars($value);
  994. if(!empty($t['db']))
  995. $db = "`{$t['db']}`.";
  996. else
  997. $db = "";
  998. // exit("$proto://$id/, $key=$value: UPDATE $db{$t[$key]['table']} SET $w WHERE {$t['*']} = '".addslashes($id)."'");
  999. // if($value != 'NULL')
  1000. $this->dbh->query("UPDATE $db{$t[$key]['table']} SET $w WHERE {$t['*']} = '".addslashes($id)."'");
  1001. // else
  1002. // $this->dbh->query("DELETE FROM $db{$t[$key]['table']} WHERE {$t['*']} = '".addslashes($id)."'");
  1003. }
  1004. }
  1005. function register_data_translate($proto, $table, $trans)
  1006. {
  1007. global $transmap;
  1008. $t = &$transmap[$proto];
  1009. if(preg_match("!^(\w+)\.(\w+)$!", $table, $m))
  1010. {
  1011. $t['db'] = $m[1];
  1012. $table = $m[2];
  1013. }
  1014. if($table)
  1015. $t['table'] = $table;
  1016. if(empty($t['*']))
  1017. $t['*'] = 'id';
  1018. foreach($trans as $key => $value)
  1019. {
  1020. if(is_int($key))
  1021. $key = $value;
  1022. $t[$key]['table'] = $table;
  1023. if(preg_match('!^Q:(.+)$!i', $value, $m))
  1024. {
  1025. $t[$key]['q'] = true;
  1026. $value = $m[1];
  1027. }
  1028. else
  1029. $t[$key]['q'] = false;
  1030. if($key == 'id')
  1031. $t['*'] = $key;
  1032. $t[$key]['join'] = NULL;
  1033. $t[$key]['rf'] = NULL;
  1034. if(!preg_match('!^(.+)\|(.+)$!', $value, $m))
  1035. {
  1036. if(preg_match("!^(\S+)\.(\S+?)\s+(\S+)=(\S+)$!", $value, $m))
  1037. {
  1038. $value = "{$m[1]}.`{$m[2]}`";
  1039. $t[$key]['k'] = $value;
  1040. $t[$key]['r'] = "$value AS $key";
  1041. $t[$key]['w'] = "$value = '$1'";
  1042. $t[$key]['join'] = "LEFT JOIN {$m[1]} ON `$table`.`{$m[3]}` = {$m[1]}.`{$m[4]}`";
  1043. }
  1044. else
  1045. {
  1046. if(function_exists($value))
  1047. {
  1048. $t[$key]['rf'] = $value;
  1049. }
  1050. else
  1051. {
  1052. $t[$key]['k'] = $value;
  1053. if(preg_match("!^(\w+)\.(\w+)$!", $value, $m2))
  1054. {
  1055. $value = $m2[2];
  1056. $t[$key]['table'] = $m2[1];
  1057. }
  1058. // $value = explode(".", $value);
  1059. // $value = "`".join("`.`", $value)."`";
  1060. $t[$key]['r'] = "`$value` AS $key";
  1061. $t[$key]['w'] = "`$value` = '$1'";
  1062. }
  1063. }
  1064. }
  1065. else
  1066. {
  1067. $r = trim($m[1]);
  1068. $w = trim($m[2]);
  1069. $t[$key]['k'] = $r;
  1070. $t[$key]['r'] = "$r AS $key";
  1071. $t[$key]['w'] = $w;
  1072. }
  1073. }
  1074. }
  1075. function register_hts_uri_bors_handler($regexp, $class)
  1076. {
  1077. $GLOBALS['bors_data']['hts_uri_bors_handlers'][$regexp] = $class;
  1078. }