Node_Database.class.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Functionality for the navigation tree
  5. *
  6. * @package PhpMyAdmin-Navigation
  7. */
  8. if (! defined('PHPMYADMIN')) {
  9. exit;
  10. }
  11. /**
  12. * Represents a database node in the navigation tree
  13. */
  14. class Node_Database extends Node
  15. {
  16. /**
  17. * Initialises the class
  18. *
  19. * @param string $name An identifier for the new node
  20. * @param int $type Type of node, may be one of CONTAINER or OBJECT
  21. * @param bool $is_group Whether this object has been created
  22. * while grouping nodes
  23. *
  24. * @return Node_Database
  25. */
  26. public function __construct($name, $type = Node::OBJECT, $is_group = false)
  27. {
  28. parent::__construct($name, $type, $is_group);
  29. $this->icon = PMA_Util::getImage(
  30. 's_db.png',
  31. __('Database operations')
  32. );
  33. $this->links = array(
  34. 'text' => $GLOBALS['cfg']['DefaultTabDatabase']
  35. . '?server=' . $GLOBALS['server']
  36. . '&amp;db=%1$s&amp;token=' . $GLOBALS['token'],
  37. 'icon' => 'db_operations.php?server=' . $GLOBALS['server']
  38. . '&amp;db=%1$s&amp;token=' . $GLOBALS['token']
  39. );
  40. $this->classes = 'database';
  41. }
  42. /**
  43. * Returns the number of children of type $type present inside this container
  44. * This method is overridden by the Node_Database and Node_Table classes
  45. *
  46. * @param string $type The type of item we are looking for
  47. * ('tables', 'views', etc)
  48. * @param string $searchClause A string used to filter the results of the query
  49. *
  50. * @return int
  51. */
  52. public function getPresence($type = '', $searchClause = '')
  53. {
  54. $retval = 0;
  55. $db = $this->real_name;
  56. switch ($type) {
  57. case 'tables':
  58. if (! $GLOBALS['cfg']['Server']['DisableIS'] || PMA_DRIZZLE) {
  59. $db = PMA_Util::sqlAddSlashes($db);
  60. $query = "SELECT COUNT(*) ";
  61. $query .= "FROM `INFORMATION_SCHEMA`.`TABLES` ";
  62. $query .= "WHERE `TABLE_SCHEMA`='$db' ";
  63. if (PMA_DRIZZLE) {
  64. $query .= "AND `TABLE_TYPE`='BASE' ";
  65. } else {
  66. $query .= "AND `TABLE_TYPE`='BASE TABLE' ";
  67. }
  68. if (! empty($searchClause)) {
  69. $query .= "AND `TABLE_NAME` LIKE '%";
  70. $query .= PMA_Util::sqlAddSlashes(
  71. $searchClause, true
  72. );
  73. $query .= "%'";
  74. }
  75. $retval = (int)PMA_DBI_fetch_value($query);
  76. } else {
  77. $query = "SHOW FULL TABLES FROM ";
  78. $query .= PMA_Util::backquote($db);
  79. $query .= " WHERE `Table_type`='BASE TABLE' ";
  80. if (! empty($searchClause)) {
  81. $query .= "AND " . PMA_Util::backquote(
  82. "Tables_in_" . $db
  83. );
  84. $query .= " LIKE '%" . PMA_Util::sqlAddSlashes(
  85. $searchClause, true
  86. );
  87. $query .= "%'";
  88. }
  89. $retval = PMA_DBI_num_rows(PMA_DBI_try_query($query));
  90. }
  91. break;
  92. case 'views':
  93. if (! $GLOBALS['cfg']['Server']['DisableIS'] || PMA_DRIZZLE) {
  94. $db = PMA_Util::sqlAddSlashes($db);
  95. $query = "SELECT COUNT(*) ";
  96. $query .= "FROM `INFORMATION_SCHEMA`.`TABLES` ";
  97. $query .= "WHERE `TABLE_SCHEMA`='$db' ";
  98. if (PMA_DRIZZLE) {
  99. $query .= "AND `TABLE_TYPE`!='BASE' ";
  100. } else {
  101. $query .= "AND `TABLE_TYPE`!='BASE TABLE' ";
  102. }
  103. if (! empty($searchClause)) {
  104. $query .= "AND `TABLE_NAME` LIKE '%";
  105. $query .= PMA_Util::sqlAddSlashes(
  106. $searchClause, true
  107. );
  108. $query .= "%'";
  109. }
  110. $retval = (int)PMA_DBI_fetch_value($query);
  111. } else {
  112. $query = "SHOW FULL TABLES FROM ";
  113. $query .= PMA_Util::backquote($db);
  114. $query .= " WHERE `Table_type`!='BASE TABLE' ";
  115. if (! empty($searchClause)) {
  116. $query .= "AND " . PMA_Util::backquote(
  117. "Tables_in_" . $db
  118. );
  119. $query .= " LIKE '%" . PMA_Util::sqlAddSlashes(
  120. $searchClause, true
  121. );
  122. $query .= "%'";
  123. }
  124. $retval = PMA_DBI_num_rows(PMA_DBI_try_query($query));
  125. }
  126. break;
  127. case 'procedures':
  128. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  129. $db = PMA_Util::sqlAddSlashes($db);
  130. $query = "SELECT COUNT(*) ";
  131. $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` ";
  132. $query .= "WHERE `ROUTINE_SCHEMA`='$db'";
  133. $query .= "AND `ROUTINE_TYPE`='PROCEDURE' ";
  134. if (! empty($searchClause)) {
  135. $query .= "AND `ROUTINE_NAME` LIKE '%";
  136. $query .= PMA_Util::sqlAddSlashes(
  137. $searchClause, true
  138. );
  139. $query .= "%'";
  140. }
  141. $retval = (int)PMA_DBI_fetch_value($query);
  142. } else {
  143. $db = PMA_Util::sqlAddSlashes($db);
  144. $query = "SHOW PROCEDURE STATUS WHERE `Db`='$db' ";
  145. if (! empty($searchClause)) {
  146. $query .= "AND `Name` LIKE '%";
  147. $query .= PMA_Util::sqlAddSlashes(
  148. $searchClause, true
  149. );
  150. $query .= "%'";
  151. }
  152. $retval = PMA_DBI_num_rows(PMA_DBI_try_query($query));
  153. }
  154. break;
  155. case 'functions':
  156. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  157. $db = PMA_Util::sqlAddSlashes($db);
  158. $query = "SELECT COUNT(*) ";
  159. $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` ";
  160. $query .= "WHERE `ROUTINE_SCHEMA`='$db' ";
  161. $query .= "AND `ROUTINE_TYPE`='FUNCTION' ";
  162. if (! empty($searchClause)) {
  163. $query .= "AND `ROUTINE_NAME` LIKE '%";
  164. $query .= PMA_Util::sqlAddSlashes(
  165. $searchClause, true
  166. );
  167. $query .= "%'";
  168. }
  169. $retval = (int)PMA_DBI_fetch_value($query);
  170. } else {
  171. $db = PMA_Util::sqlAddSlashes($db);
  172. $query = "SHOW FUNCTION STATUS WHERE `Db`='$db' ";
  173. if (! empty($searchClause)) {
  174. $query .= "AND `Name` LIKE '%";
  175. $query .= PMA_Util::sqlAddSlashes(
  176. $searchClause, true
  177. );
  178. $query .= "%'";
  179. }
  180. $retval = PMA_DBI_num_rows(PMA_DBI_try_query($query));
  181. }
  182. break;
  183. case 'events':
  184. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  185. $db = PMA_Util::sqlAddSlashes($db);
  186. $query = "SELECT COUNT(*) ";
  187. $query .= "FROM `INFORMATION_SCHEMA`.`EVENTS` ";
  188. $query .= "WHERE `EVENT_SCHEMA`='$db' ";
  189. if (! empty($searchClause)) {
  190. $query .= "AND `EVENT_NAME` LIKE '%";
  191. $query .= PMA_Util::sqlAddSlashes(
  192. $searchClause, true
  193. );
  194. $query .= "%'";
  195. }
  196. $retval = (int)PMA_DBI_fetch_value($query);
  197. } else {
  198. $db = PMA_Util::backquote($db);
  199. $query = "SHOW EVENTS FROM $db ";
  200. if (! empty($searchClause)) {
  201. $query .= "WHERE `Name` LIKE '%";
  202. $query .= PMA_Util::sqlAddSlashes(
  203. $searchClause, true
  204. );
  205. $query .= "%'";
  206. }
  207. $retval = PMA_DBI_num_rows(PMA_DBI_try_query($query));
  208. }
  209. break;
  210. default:
  211. break;
  212. }
  213. return $retval;
  214. }
  215. /**
  216. * Returns the names of children of type $type present inside this container
  217. * This method is overridden by the Node_Database and Node_Table classes
  218. *
  219. * @param string $type The type of item we are looking for
  220. * ('tables', 'views', etc)
  221. * @param int $pos The offset of the list within the results
  222. * @param string $searchClause A string used to filter the results of the query
  223. *
  224. * @return array
  225. */
  226. public function getData($type, $pos, $searchClause = '')
  227. {
  228. $maxItems = $GLOBALS['cfg']['MaxNavigationItems'];
  229. $retval = array();
  230. $db = $this->real_name;
  231. switch ($type) {
  232. case 'tables':
  233. if (! $GLOBALS['cfg']['Server']['DisableIS'] || PMA_DRIZZLE) {
  234. $db = PMA_Util::sqlAddSlashes($db);
  235. $query = "SELECT `TABLE_NAME` AS `name` ";
  236. $query .= "FROM `INFORMATION_SCHEMA`.`TABLES` ";
  237. $query .= "WHERE `TABLE_SCHEMA`='$db' ";
  238. if (PMA_DRIZZLE) {
  239. $query .= "AND `TABLE_TYPE`='BASE' ";
  240. } else {
  241. $query .= "AND `TABLE_TYPE`='BASE TABLE' ";
  242. }
  243. if (! empty($searchClause)) {
  244. $query .= "AND `TABLE_NAME` LIKE '%";
  245. $query .= PMA_Util::sqlAddSlashes(
  246. $searchClause, true
  247. );
  248. $query .= "%'";
  249. }
  250. $query .= "ORDER BY `TABLE_NAME` ASC ";
  251. $query .= "LIMIT " . intval($pos) . ", $maxItems";
  252. $retval = PMA_DBI_fetch_result($query);
  253. } else {
  254. $query = " SHOW FULL TABLES FROM ";
  255. $query .= PMA_Util::backquote($db);
  256. $query .= " WHERE `Table_type`='BASE TABLE' ";
  257. if (! empty($searchClause)) {
  258. $query .= "AND " . PMA_Util::backquote(
  259. "Tables_in_" . $db
  260. );
  261. $query .= " LIKE '%" . PMA_Util::sqlAddSlashes(
  262. $searchClause, true
  263. );
  264. $query .= "%'";
  265. }
  266. $handle = PMA_DBI_try_query($query);
  267. if ($handle !== false) {
  268. $count = 0;
  269. while ($arr = PMA_DBI_fetch_array($handle)) {
  270. if ($pos <= 0 && $count < $maxItems) {
  271. $retval[] = $arr[0];
  272. $count++;
  273. }
  274. $pos--;
  275. }
  276. }
  277. }
  278. break;
  279. case 'views':
  280. if (! $GLOBALS['cfg']['Server']['DisableIS'] || PMA_DRIZZLE) {
  281. $db = PMA_Util::sqlAddSlashes($db);
  282. $query = "SELECT `TABLE_NAME` AS `name` ";
  283. $query .= "FROM `INFORMATION_SCHEMA`.`TABLES` ";
  284. $query .= "WHERE `TABLE_SCHEMA`='$db' ";
  285. if (PMA_DRIZZLE) {
  286. $query .= "AND `TABLE_TYPE`!='BASE' ";
  287. } else {
  288. $query .= "AND `TABLE_TYPE`!='BASE TABLE' ";
  289. }
  290. if (! empty($searchClause)) {
  291. $query .= "AND `TABLE_NAME` LIKE '%";
  292. $query .= PMA_Util::sqlAddSlashes(
  293. $searchClause, true
  294. );
  295. $query .= "%'";
  296. }
  297. $query .= "ORDER BY `TABLE_NAME` ASC ";
  298. $query .= "LIMIT " . intval($pos) . ", $maxItems";
  299. $retval = PMA_DBI_fetch_result($query);
  300. } else {
  301. $query = "SHOW FULL TABLES FROM ";
  302. $query .= PMA_Util::backquote($db);
  303. $query .= " WHERE `Table_type`!='BASE TABLE' ";
  304. if (! empty($searchClause)) {
  305. $query .= "AND " . PMA_Util::backquote(
  306. "Tables_in_" . $db
  307. );
  308. $query .= " LIKE '%" . PMA_Util::sqlAddSlashes(
  309. $searchClause, true
  310. );
  311. $query .= "%'";
  312. }
  313. $handle = PMA_DBI_try_query($query);
  314. if ($handle !== false) {
  315. $count = 0;
  316. while ($arr = PMA_DBI_fetch_array($handle)) {
  317. if ($pos <= 0 && $count < $maxItems) {
  318. $retval[] = $arr[0];
  319. $count++;
  320. }
  321. $pos--;
  322. }
  323. }
  324. }
  325. break;
  326. case 'procedures':
  327. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  328. $db = PMA_Util::sqlAddSlashes($db);
  329. $query = "SELECT `ROUTINE_NAME` AS `name` ";
  330. $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` ";
  331. $query .= "WHERE `ROUTINE_SCHEMA`='$db'";
  332. $query .= "AND `ROUTINE_TYPE`='PROCEDURE' ";
  333. if (! empty($searchClause)) {
  334. $query .= "AND `ROUTINE_NAME` LIKE '%";
  335. $query .= PMA_Util::sqlAddSlashes(
  336. $searchClause, true
  337. );
  338. $query .= "%'";
  339. }
  340. $query .= "ORDER BY `ROUTINE_NAME` ASC ";
  341. $query .= "LIMIT " . intval($pos) . ", $maxItems";
  342. $retval = PMA_DBI_fetch_result($query);
  343. } else {
  344. $db = PMA_Util::sqlAddSlashes($db);
  345. $query = "SHOW PROCEDURE STATUS WHERE `Db`='$db' ";
  346. if (! empty($searchClause)) {
  347. $query .= "AND `Name` LIKE '%";
  348. $query .= PMA_Util::sqlAddSlashes(
  349. $searchClause, true
  350. );
  351. $query .= "%'";
  352. }
  353. $handle = PMA_DBI_try_query($query);
  354. if ($handle !== false) {
  355. $count = 0;
  356. while ($arr = PMA_DBI_fetch_array($handle)) {
  357. if ($pos <= 0 && $count < $maxItems) {
  358. $retval[] = $arr['Name'];
  359. $count++;
  360. }
  361. $pos--;
  362. }
  363. }
  364. }
  365. break;
  366. case 'functions':
  367. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  368. $db = PMA_Util::sqlAddSlashes($db);
  369. $query = "SELECT `ROUTINE_NAME` AS `name` ";
  370. $query .= "FROM `INFORMATION_SCHEMA`.`ROUTINES` ";
  371. $query .= "WHERE `ROUTINE_SCHEMA`='$db' ";
  372. $query .= "AND `ROUTINE_TYPE`='FUNCTION' ";
  373. if (! empty($searchClause)) {
  374. $query .= "AND `ROUTINE_NAME` LIKE '%";
  375. $query .= PMA_Util::sqlAddSlashes(
  376. $searchClause, true
  377. );
  378. $query .= "%'";
  379. }
  380. $query .= "ORDER BY `ROUTINE_NAME` ASC ";
  381. $query .= "LIMIT " . intval($pos) . ", $maxItems";
  382. $retval = PMA_DBI_fetch_result($query);
  383. } else {
  384. $db = PMA_Util::sqlAddSlashes($db);
  385. $query = "SHOW FUNCTION STATUS WHERE `Db`='$db' ";
  386. if (! empty($searchClause)) {
  387. $query .= "AND `Name` LIKE '%";
  388. $query .= PMA_Util::sqlAddSlashes(
  389. $searchClause, true
  390. );
  391. $query .= "%'";
  392. }
  393. $handle = PMA_DBI_try_query($query);
  394. if ($handle !== false) {
  395. $count = 0;
  396. while ($arr = PMA_DBI_fetch_array($handle)) {
  397. if ($pos <= 0 && $count < $maxItems) {
  398. $retval[] = $arr['Name'];
  399. $count++;
  400. }
  401. $pos--;
  402. }
  403. }
  404. }
  405. break;
  406. case 'events':
  407. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  408. $db = PMA_Util::sqlAddSlashes($db);
  409. $query = "SELECT `EVENT_NAME` AS `name` ";
  410. $query .= "FROM `INFORMATION_SCHEMA`.`EVENTS` ";
  411. $query .= "WHERE `EVENT_SCHEMA`='$db' ";
  412. if (! empty($searchClause)) {
  413. $query .= "AND `EVENT_NAME` LIKE '%";
  414. $query .= PMA_Util::sqlAddSlashes(
  415. $searchClause, true
  416. );
  417. $query .= "%'";
  418. }
  419. $query .= "ORDER BY `EVENT_NAME` ASC ";
  420. $query .= "LIMIT " . intval($pos) . ", $maxItems";
  421. $retval = PMA_DBI_fetch_result($query);
  422. } else {
  423. $db = PMA_Util::backquote($db);
  424. $query = "SHOW EVENTS FROM $db ";
  425. if (! empty($searchClause)) {
  426. $query .= "WHERE `Name` LIKE '%";
  427. $query .= PMA_Util::sqlAddSlashes(
  428. $searchClause, true
  429. );
  430. $query .= "%'";
  431. }
  432. $handle = PMA_DBI_try_query($query);
  433. if ($handle !== false) {
  434. $count = 0;
  435. while ($arr = PMA_DBI_fetch_array($handle)) {
  436. if ($pos <= 0 && $count < $maxItems) {
  437. $retval[] = $arr['Name'];
  438. $count++;
  439. }
  440. $pos--;
  441. }
  442. }
  443. }
  444. break;
  445. default:
  446. break;
  447. }
  448. return $retval;
  449. }
  450. }
  451. ?>