rte_list.lib.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Common functions for generating lists of Routines, Triggers and Events.
  5. *
  6. * @package PhpMyAdmin
  7. */
  8. if (! defined('PHPMYADMIN')) {
  9. exit;
  10. }
  11. /**
  12. * Creates a list of items containing the relevant
  13. * information and some action links.
  14. *
  15. * @param string $type One of ['routine'|'trigger'|'event']
  16. * @param array $items An array of items
  17. *
  18. * @return string HTML code of the list of items
  19. */
  20. function PMA_RTE_getList($type, $items)
  21. {
  22. global $table;
  23. /**
  24. * Conditional classes switch the list on or off
  25. */
  26. $class1 = 'hide';
  27. $class2 = '';
  28. if (! $items) {
  29. $class1 = '';
  30. $class2 = ' hide';
  31. }
  32. /**
  33. * Generate output
  34. */
  35. $retval = "<!-- LIST OF " . PMA_RTE_getWord('docu') . " START -->\n";
  36. $retval .= "<fieldset>\n";
  37. $retval .= " <legend>\n";
  38. $retval .= " " . PMA_RTE_getWord('title') . "\n";
  39. $retval .= " " . PMA_Util::showMySQLDocu(PMA_RTE_getWord('docu')) . "\n";
  40. $retval .= " </legend>\n";
  41. $retval .= " <div class='$class1' id='nothing2display'>\n";
  42. $retval .= " " . PMA_RTE_getWord('nothing') . "\n";
  43. $retval .= " </div>\n";
  44. $retval .= " <table class='data$class2'>\n";
  45. $retval .= " <!-- TABLE HEADERS -->\n";
  46. $retval .= " <tr>\n";
  47. // th cells with a colspan need corresponding td cells, according to W3C
  48. switch ($type) {
  49. case 'routine':
  50. $retval .= " <th>" . __('Name') . "</th>\n";
  51. $retval .= " <th colspan='4'>" . __('Action') . "</th>\n";
  52. $retval .= " <th>" . __('Type') . "</th>\n";
  53. $retval .= " <th>" . __('Returns') . "</th>\n";
  54. $retval .= " </tr>\n";
  55. $retval .= " <tr style='display: none'>\n"; // see comment above
  56. for ($i = 0; $i < 7; $i++) {
  57. $retval .= " <td></td>\n";
  58. }
  59. break;
  60. case 'trigger':
  61. $retval .= " <th>" . __('Name') . "</th>\n";
  62. if (empty($table)) {
  63. $retval .= " <th>" . __('Table') . "</th>\n";
  64. }
  65. $retval .= " <th colspan='3'>" . __('Action') . "</th>\n";
  66. $retval .= " <th>" . __('Time') . "</th>\n";
  67. $retval .= " <th>" . __('Event') . "</th>\n";
  68. $retval .= " </tr>\n";
  69. $retval .= " <tr style='display: none'>\n"; // see comment above
  70. for ($i = 0; $i < (empty($table) ? 7 : 6); $i++) {
  71. $retval .= " <td></td>\n";
  72. }
  73. break;
  74. case 'event':
  75. $retval .= " <th>" . __('Name') . "</th>\n";
  76. $retval .= " <th>" . __('Status') . "</th>\n";
  77. $retval .= " <th colspan='3'>" . __('Action') . "</th>\n";
  78. $retval .= " <th>" . __('Type') . "</th>\n";
  79. $retval .= " </tr>\n";
  80. $retval .= " <tr style='display: none'>\n"; // see comment above
  81. for ($i = 0; $i < 6; $i++) {
  82. $retval .= " <td></td>\n";
  83. }
  84. break;
  85. default:
  86. break;
  87. }
  88. $retval .= " </tr>\n";
  89. $retval .= " <!-- TABLE DATA -->\n";
  90. $count = 0;
  91. foreach ($items as $item) {
  92. $rowclass = ($count % 2 == 0) ? 'odd' : 'even';
  93. if ($GLOBALS['is_ajax_request'] && empty($_REQUEST['ajax_page_request'])) {
  94. $rowclass .= ' ajaxInsert hide';
  95. }
  96. // Get each row from the correct function
  97. switch ($type) {
  98. case 'routine':
  99. $retval .= PMA_RTN_getRowForList($item, $rowclass);
  100. break;
  101. case 'trigger':
  102. $retval .= PMA_TRI_getRowForList($item, $rowclass);
  103. break;
  104. case 'event':
  105. $retval .= PMA_EVN_getRowForList($item, $rowclass);
  106. break;
  107. default:
  108. break;
  109. }
  110. $count++;
  111. }
  112. $retval .= " </table>\n";
  113. $retval .= "</fieldset>\n";
  114. $retval .= "<!-- LIST OF " . PMA_RTE_getWord('docu') . " END -->\n";
  115. return $retval;
  116. } // end PMA_RTE_getList()
  117. /**
  118. * Creates the contents for a row in the list of routines
  119. *
  120. * @param array $routine An array of routine data
  121. * @param string $rowclass Empty or one of ['even'|'odd']
  122. *
  123. * @return string HTML code of a row for the list of routines
  124. */
  125. function PMA_RTN_getRowForList($routine, $rowclass = '')
  126. {
  127. global $ajax_class, $url_query, $db, $titles;
  128. $sql_drop = sprintf(
  129. 'DROP %s IF EXISTS %s',
  130. $routine['ROUTINE_TYPE'],
  131. PMA_Util::backquote($routine['SPECIFIC_NAME'])
  132. );
  133. $type_link = "item_type={$routine['ROUTINE_TYPE']}";
  134. $retval = " <tr class='noclick $rowclass'>\n";
  135. $retval .= " <td>\n";
  136. $retval .= " <span class='drop_sql hide'>"
  137. . htmlspecialchars($sql_drop) . "</span>\n";
  138. $retval .= " <strong>\n";
  139. $retval .= " "
  140. . htmlspecialchars($routine['SPECIFIC_NAME']) . "\n";
  141. $retval .= " </strong>\n";
  142. $retval .= " </td>\n";
  143. $retval .= " <td>\n";
  144. if ($routine['ROUTINE_DEFINITION'] !== null
  145. ) {
  146. $retval .= ' <a ' . $ajax_class['edit']
  147. . ' href="db_routines.php?'
  148. . $url_query
  149. . '&amp;edit_item=1'
  150. . '&amp;item_name='
  151. . urlencode($routine['SPECIFIC_NAME'])
  152. . '&amp;' . $type_link
  153. . '">' . $titles['Edit'] . "</a>\n";
  154. } else {
  155. $retval .= " {$titles['NoEdit']}\n";
  156. }
  157. $retval .= " </td>\n";
  158. $retval .= " <td>\n";
  159. // There is a problem with PMA_Util::currentUserHasPrivilege():
  160. // it does not detect all kinds of privileges, for example
  161. // a direct privilege on a specific routine. So, at this point,
  162. // we show the Execute link, hoping that the user has the correct rights.
  163. // Also, information_schema might be hiding the ROUTINE_DEFINITION
  164. // but a routine with no input parameters can be nonetheless executed.
  165. // Check if he routine has any input parameters. If it does,
  166. // we will show a dialog to get values for these parameters,
  167. // otherwise we can execute it directly.
  168. $routine_details = PMA_RTN_getDataFromName(
  169. $routine['SPECIFIC_NAME'],
  170. $routine['ROUTINE_TYPE'],
  171. false
  172. );
  173. if ($routine !== false) {
  174. $execute_action = 'execute_routine';
  175. for ($i=0; $i<$routine_details['item_num_params']; $i++) {
  176. if ($routine_details['item_type'] == 'PROCEDURE'
  177. && $routine_details['item_param_dir'][$i] == 'OUT'
  178. ) {
  179. continue;
  180. }
  181. $execute_action = 'execute_dialog';
  182. break;
  183. }
  184. $retval .= ' <a ' . $ajax_class['exec']
  185. . ' href="db_routines.php?'
  186. . $url_query
  187. . '&amp;' . $execute_action . '=1'
  188. . '&amp;item_name='
  189. . urlencode($routine['SPECIFIC_NAME'])
  190. . '&amp;' . $type_link
  191. . '">' . $titles['Execute'] . "</a>\n";
  192. }
  193. $retval .= " </td>\n";
  194. $retval .= " <td>\n";
  195. $retval .= ' <a ' . $ajax_class['export']
  196. . ' href="db_routines.php?'
  197. . $url_query
  198. . '&amp;export_item=1'
  199. . '&amp;item_name='
  200. . urlencode($routine['SPECIFIC_NAME'])
  201. . '&amp;' . $type_link
  202. . '">' . $titles['Export'] . "</a>\n";
  203. $retval .= " </td>\n";
  204. $retval .= " <td>\n";
  205. $retval .= ' <a ' . $ajax_class['drop']
  206. . ' href="sql.php?'
  207. . $url_query
  208. . '&amp;sql_query=' . urlencode($sql_drop)
  209. . '&amp;goto=db_routines.php'
  210. . urlencode("?db={$db}")
  211. . '" >' . $titles['Drop'] . "</a>\n";
  212. $retval .= " </td>\n";
  213. $retval .= " <td>\n";
  214. $retval .= " {$routine['ROUTINE_TYPE']}\n";
  215. $retval .= " </td>\n";
  216. $retval .= " <td>\n";
  217. $retval .= " "
  218. . htmlspecialchars($routine['DTD_IDENTIFIER']) . "\n";
  219. $retval .= " </td>\n";
  220. $retval .= " </tr>\n";
  221. return $retval;
  222. } // end PMA_RTN_getRowForList()
  223. /**
  224. * Creates the contents for a row in the list of triggers
  225. *
  226. * @param array $trigger An array of routine data
  227. * @param string $rowclass Empty or one of ['even'|'odd']
  228. *
  229. * @return string HTML code of a cell for the list of triggers
  230. */
  231. function PMA_TRI_getRowForList($trigger, $rowclass = '')
  232. {
  233. global $ajax_class, $url_query, $db, $table, $titles;
  234. $retval = " <tr class='noclick $rowclass'>\n";
  235. $retval .= " <td>\n";
  236. $retval .= " <span class='drop_sql hide'>"
  237. . htmlspecialchars($trigger['drop']) . "</span>\n";
  238. $retval .= " <strong>\n";
  239. $retval .= " " . htmlspecialchars($trigger['name']) . "\n";
  240. $retval .= " </strong>\n";
  241. $retval .= " </td>\n";
  242. if (empty($table)) {
  243. $retval .= " <td>\n";
  244. $retval .= "<a href='db_triggers.php?{$url_query}"
  245. . "&amp;table=" . urlencode($trigger['table']) . "'>"
  246. . urlencode($trigger['table']) . "</a>";
  247. $retval .= " </td>\n";
  248. }
  249. $retval .= " <td>\n";
  250. if (PMA_Util::currentUserHasPrivilege('TRIGGER', $db, $table)) {
  251. $retval .= ' <a ' . $ajax_class['edit']
  252. . ' href="db_triggers.php?'
  253. . $url_query
  254. . '&amp;edit_item=1'
  255. . '&amp;item_name='
  256. . urlencode($trigger['name'])
  257. . '">' . $titles['Edit'] . "</a>\n";
  258. } else {
  259. $retval .= " {$titles['NoEdit']}\n";
  260. }
  261. $retval .= " </td>\n";
  262. $retval .= " <td>\n";
  263. $retval .= ' <a ' . $ajax_class['export']
  264. . ' href="db_triggers.php?'
  265. . $url_query
  266. . '&amp;export_item=1'
  267. . '&amp;item_name='
  268. . urlencode($trigger['name'])
  269. . '">' . $titles['Export'] . "</a>\n";
  270. $retval .= " </td>\n";
  271. $retval .= " <td>\n";
  272. if (PMA_Util::currentUserHasPrivilege('TRIGGER', $db)) {
  273. $retval .= ' <a ' . $ajax_class['drop']
  274. . ' href="sql.php?'
  275. . $url_query
  276. . '&amp;sql_query='
  277. . urlencode($trigger['drop'])
  278. . '&amp;goto=db_triggers.php'
  279. . urlencode("?db={$db}")
  280. . '" >' . $titles['Drop'] . "</a>\n";
  281. } else {
  282. $retval .= " {$titles['NoDrop']}\n";
  283. }
  284. $retval .= " </td>\n";
  285. $retval .= " <td>\n";
  286. $retval .= " {$trigger['action_timing']}\n";
  287. $retval .= " </td>\n";
  288. $retval .= " <td>\n";
  289. $retval .= " {$trigger['event_manipulation']}\n";
  290. $retval .= " </td>\n";
  291. $retval .= " </tr>\n";
  292. return $retval;
  293. } // end PMA_TRI_getRowForList()
  294. /**
  295. * Creates the contents for a row in the list of events
  296. *
  297. * @param array $event An array of routine data
  298. * @param string $rowclass Empty or one of ['even'|'odd']
  299. *
  300. * @return string HTML code of a cell for the list of events
  301. */
  302. function PMA_EVN_getRowForList($event, $rowclass = '')
  303. {
  304. global $ajax_class, $url_query, $db, $titles;
  305. $sql_drop = sprintf(
  306. 'DROP EVENT IF EXISTS %s',
  307. PMA_Util::backquote($event['EVENT_NAME'])
  308. );
  309. $retval = " <tr class='noclick $rowclass'>\n";
  310. $retval .= " <td>\n";
  311. $retval .= " <span class='drop_sql hide'>"
  312. . htmlspecialchars($sql_drop) . "</span>\n";
  313. $retval .= " <strong>\n";
  314. $retval .= " "
  315. . htmlspecialchars($event['EVENT_NAME']) . "\n";
  316. $retval .= " </strong>\n";
  317. $retval .= " </td>\n";
  318. $retval .= " <td>\n";
  319. $retval .= " {$event['STATUS']}\n";
  320. $retval .= " </td>\n";
  321. $retval .= " <td>\n";
  322. if (PMA_Util::currentUserHasPrivilege('EVENT', $db)) {
  323. $retval .= ' <a ' . $ajax_class['edit']
  324. . ' href="db_events.php?'
  325. . $url_query
  326. . '&amp;edit_item=1'
  327. . '&amp;item_name='
  328. . urlencode($event['EVENT_NAME'])
  329. . '">' . $titles['Edit'] . "</a>\n";
  330. } else {
  331. $retval .= " {$titles['NoEdit']}\n";
  332. }
  333. $retval .= " </td>\n";
  334. $retval .= " <td>\n";
  335. $retval .= ' <a ' . $ajax_class['export']
  336. . ' href="db_events.php?'
  337. . $url_query
  338. . '&amp;export_item=1'
  339. . '&amp;item_name='
  340. . urlencode($event['EVENT_NAME'])
  341. . '">' . $titles['Export'] . "</a>\n";
  342. $retval .= " </td>\n";
  343. $retval .= " <td>\n";
  344. if (PMA_Util::currentUserHasPrivilege('EVENT', $db)) {
  345. $retval .= ' <a ' . $ajax_class['drop']
  346. . ' href="sql.php?'
  347. . $url_query
  348. . '&amp;sql_query=' . urlencode($sql_drop)
  349. . '&amp;goto=db_events.php'
  350. . urlencode("?db={$db}")
  351. . '" >' . $titles['Drop'] . "</a>\n";
  352. } else {
  353. $retval .= " {$titles['NoDrop']}\n";
  354. }
  355. $retval .= " </td>\n";
  356. $retval .= " <td>\n";
  357. $retval .= " {$event['EVENT_TYPE']}\n";
  358. $retval .= " </td>\n";
  359. $retval .= " </tr>\n";
  360. return $retval;
  361. } // end PMA_EVN_getRowForList()
  362. ?>