rte_list.lib.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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('SQL-Syntax', 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. $ct = 0;
  91. foreach ($items as $item) {
  92. $rowclass = ($ct % 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. $ct++;
  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'>" . htmlspecialchars($sql_drop) . "</span>\n";
  137. $retval .= " <strong>\n";
  138. $retval .= " " . htmlspecialchars($routine['SPECIFIC_NAME']) . "\n";
  139. $retval .= " </strong>\n";
  140. $retval .= " </td>\n";
  141. $retval .= " <td>\n";
  142. if ($routine['ROUTINE_DEFINITION'] !== null
  143. && PMA_Util::currentUserHasPrivilege('ALTER ROUTINE', $db)
  144. && PMA_Util::currentUserHasPrivilege('CREATE ROUTINE', $db)
  145. ) {
  146. $retval .= ' <a ' . $ajax_class['edit']
  147. . ' href="db_routines.php?'
  148. . $url_query
  149. . '&amp;edit_item=1'
  150. . '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
  151. . '&amp;' . $type_link
  152. . '">' . $titles['Edit'] . "</a>\n";
  153. } else {
  154. $retval .= " {$titles['NoEdit']}\n";
  155. }
  156. $retval .= " </td>\n";
  157. $retval .= " <td>\n";
  158. if ($routine['ROUTINE_DEFINITION'] !== null
  159. && PMA_Util::currentUserHasPrivilege('EXECUTE', $db)
  160. ) {
  161. // Check if he routine has any input parameters. If it does,
  162. // we will show a dialog to get values for these parameters,
  163. // otherwise we can execute it directly.
  164. $routine_details = PMA_RTN_getDataFromName(
  165. $routine['SPECIFIC_NAME'],
  166. $routine['ROUTINE_TYPE'],
  167. false
  168. );
  169. if ($routine !== false) {
  170. $execute_action = 'execute_routine';
  171. for ($i=0; $i<$routine_details['item_num_params']; $i++) {
  172. if ($routine_details['item_type'] == 'PROCEDURE'
  173. && $routine_details['item_param_dir'][$i] == 'OUT'
  174. ) {
  175. continue;
  176. }
  177. $execute_action = 'execute_dialog';
  178. break;
  179. }
  180. $retval .= ' <a ' . $ajax_class['exec']
  181. . ' href="db_routines.php?'
  182. . $url_query
  183. . '&amp;' . $execute_action . '=1'
  184. . '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
  185. . '&amp;' . $type_link
  186. . '">' . $titles['Execute'] . "</a>\n";
  187. }
  188. } else {
  189. $retval .= " {$titles['NoExecute']}\n";
  190. }
  191. $retval .= " </td>\n";
  192. $retval .= " <td>\n";
  193. $retval .= ' <a ' . $ajax_class['export']
  194. . ' href="db_routines.php?'
  195. . $url_query
  196. . '&amp;export_item=1'
  197. . '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
  198. . '&amp;' . $type_link
  199. . '">' . $titles['Export'] . "</a>\n";
  200. $retval .= " </td>\n";
  201. $retval .= " <td>\n";
  202. if (PMA_Util::currentUserHasPrivilege('ALTER ROUTINE', $db)) {
  203. $retval .= ' <a ' . $ajax_class['drop']
  204. . ' href="sql.php?'
  205. . $url_query
  206. . '&amp;sql_query=' . urlencode($sql_drop)
  207. . '&amp;goto=db_routines.php' . urlencode("?db={$db}")
  208. . '" >' . $titles['Drop'] . "</a>\n";
  209. } else {
  210. $retval .= " {$titles['NoDrop']}\n";
  211. }
  212. $retval .= " </td>\n";
  213. $retval .= " <td>\n";
  214. $retval .= " {$routine['ROUTINE_TYPE']}\n";
  215. $retval .= " </td>\n";
  216. $retval .= " <td>\n";
  217. $retval .= " " . htmlspecialchars($routine['DTD_IDENTIFIER']) . "\n";
  218. $retval .= " </td>\n";
  219. $retval .= " </tr>\n";
  220. return $retval;
  221. } // end PMA_RTN_getRowForList()
  222. /**
  223. * Creates the contents for a row in the list of triggers
  224. *
  225. * @param array $trigger An array of routine data
  226. * @param string $rowclass Empty or one of ['even'|'odd']
  227. *
  228. * @return string HTML code of a cell for the list of triggers
  229. */
  230. function PMA_TRI_getRowForList($trigger, $rowclass = '')
  231. {
  232. global $ajax_class, $url_query, $db, $table, $titles;
  233. $retval = " <tr class='noclick $rowclass'>\n";
  234. $retval .= " <td>\n";
  235. $retval .= " <span class='drop_sql hide'>" . htmlspecialchars($trigger['drop']) . "</span>\n";
  236. $retval .= " <strong>\n";
  237. $retval .= " " . htmlspecialchars($trigger['name']) . "\n";
  238. $retval .= " </strong>\n";
  239. $retval .= " </td>\n";
  240. if (empty($table)) {
  241. $retval .= " <td>\n";
  242. $retval .= "<a href='db_triggers.php?{$url_query}"
  243. . "&amp;table=" . urlencode($trigger['table']) . "'>"
  244. . urlencode($trigger['table']) . "</a>";
  245. $retval .= " </td>\n";
  246. }
  247. $retval .= " <td>\n";
  248. if (PMA_Util::currentUserHasPrivilege('TRIGGER', $db, $table)) {
  249. $retval .= ' <a ' . $ajax_class['edit']
  250. . ' href="db_triggers.php?'
  251. . $url_query
  252. . '&amp;edit_item=1'
  253. . '&amp;item_name=' . urlencode($trigger['name'])
  254. . '">' . $titles['Edit'] . "</a>\n";
  255. } else {
  256. $retval .= " {$titles['NoEdit']}\n";
  257. }
  258. $retval .= " </td>\n";
  259. $retval .= " <td>\n";
  260. $retval .= ' <a ' . $ajax_class['export']
  261. . ' href="db_triggers.php?'
  262. . $url_query
  263. . '&amp;export_item=1'
  264. . '&amp;item_name=' . urlencode($trigger['name'])
  265. . '">' . $titles['Export'] . "</a>\n";
  266. $retval .= " </td>\n";
  267. $retval .= " <td>\n";
  268. if (PMA_Util::currentUserHasPrivilege('TRIGGER', $db)) {
  269. $retval .= ' <a ' . $ajax_class['drop']
  270. . ' href="sql.php?'
  271. . $url_query
  272. . '&amp;sql_query=' . urlencode($trigger['drop'])
  273. . '&amp;goto=db_triggers.php' . urlencode("?db={$db}")
  274. . '" >' . $titles['Drop'] . "</a>\n";
  275. } else {
  276. $retval .= " {$titles['NoDrop']}\n";
  277. }
  278. $retval .= " </td>\n";
  279. $retval .= " <td>\n";
  280. $retval .= " {$trigger['action_timing']}\n";
  281. $retval .= " </td>\n";
  282. $retval .= " <td>\n";
  283. $retval .= " {$trigger['event_manipulation']}\n";
  284. $retval .= " </td>\n";
  285. $retval .= " </tr>\n";
  286. return $retval;
  287. } // end PMA_TRI_getRowForList()
  288. /**
  289. * Creates the contents for a row in the list of events
  290. *
  291. * @param array $event An array of routine data
  292. * @param string $rowclass Empty or one of ['even'|'odd']
  293. *
  294. * @return string HTML code of a cell for the list of events
  295. */
  296. function PMA_EVN_getRowForList($event, $rowclass = '')
  297. {
  298. global $ajax_class, $url_query, $db, $titles;
  299. $sql_drop = sprintf(
  300. 'DROP EVENT IF EXISTS %s',
  301. PMA_Util::backquote($event['EVENT_NAME'])
  302. );
  303. $retval = " <tr class='noclick $rowclass'>\n";
  304. $retval .= " <td>\n";
  305. $retval .= " <span class='drop_sql hide'>" . htmlspecialchars($sql_drop) . "</span>\n";
  306. $retval .= " <strong>\n";
  307. $retval .= " " . htmlspecialchars($event['EVENT_NAME']) . "\n";
  308. $retval .= " </strong>\n";
  309. $retval .= " </td>\n";
  310. $retval .= " <td>\n";
  311. $retval .= " {$event['STATUS']}\n";
  312. $retval .= " </td>\n";
  313. $retval .= " <td>\n";
  314. if (PMA_Util::currentUserHasPrivilege('EVENT', $db)) {
  315. $retval .= ' <a ' . $ajax_class['edit']
  316. . ' href="db_events.php?'
  317. . $url_query
  318. . '&amp;edit_item=1'
  319. . '&amp;item_name=' . urlencode($event['EVENT_NAME'])
  320. . '">' . $titles['Edit'] . "</a>\n";
  321. } else {
  322. $retval .= " {$titles['NoEdit']}\n";
  323. }
  324. $retval .= " </td>\n";
  325. $retval .= " <td>\n";
  326. $retval .= ' <a ' . $ajax_class['export']
  327. . ' href="db_events.php?'
  328. . $url_query
  329. . '&amp;export_item=1'
  330. . '&amp;item_name=' . urlencode($event['EVENT_NAME'])
  331. . '">' . $titles['Export'] . "</a>\n";
  332. $retval .= " </td>\n";
  333. $retval .= " <td>\n";
  334. if (PMA_Util::currentUserHasPrivilege('EVENT', $db)) {
  335. $retval .= ' <a ' . $ajax_class['drop']
  336. . ' href="sql.php?'
  337. . $url_query
  338. . '&amp;sql_query=' . urlencode($sql_drop)
  339. . '&amp;goto=db_events.php' . urlencode("?db={$db}")
  340. . '" >' . $titles['Drop'] . "</a>\n";
  341. } else {
  342. $retval .= " {$titles['NoDrop']}\n";
  343. }
  344. $retval .= " </td>\n";
  345. $retval .= " <td>\n";
  346. $retval .= " {$event['EVENT_TYPE']}\n";
  347. $retval .= " </td>\n";
  348. $retval .= " </tr>\n";
  349. return $retval;
  350. } // end PMA_EVN_getRowForList()
  351. ?>