1<?php
2
3	/**
4	 * List triggers on a table
5	 *
6	 * $Id: triggers.php,v 1.37 2007/09/19 14:42:12 ioguix Exp $
7	 */
8
9	// Include application functions
10	include_once('./libraries/lib.inc.php');
11	include_once('./classes/class.select.php');
12
13	$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : '';
14
15	/**
16	 * Function to save after altering a trigger
17	 */
18	function doSaveAlter() {
19		global $data, $lang;
20
21		$status = $data->alterTrigger($_POST['table'], $_POST['trigger'], $_POST['name']);
22		if ($status == 0)
23			doDefault($lang['strtriggeraltered']);
24		else
25			doAlter($lang['strtriggeralteredbad']);
26	}
27
28	/**
29	 * Function to allow altering of a trigger
30	 */
31	function doAlter($msg = '') {
32		global $data, $misc;
33		global $lang;
34
35		$misc->printTrail('trigger');
36		$misc->printTitle($lang['stralter'],'pg.trigger.alter');
37		$misc->printMsg($msg);
38
39		$triggerdata = $data->getTrigger($_REQUEST['table'], $_REQUEST['trigger']);
40
41		if ($triggerdata->recordCount() > 0) {
42
43			if (!isset($_POST['name'])) $_POST['name'] = $triggerdata->fields['tgname'];
44
45			echo "<form action=\"triggers.php\" method=\"post\">\n";
46			echo "<table>\n";
47			echo "<tr><th class=\"data\">{$lang['strname']}</th>\n";
48			echo "<td class=\"data1\">";
49			echo "<input name=\"name\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"",
50				htmlspecialchars($_POST['name']), "\" />\n";
51			echo "</table>\n";
52			echo "<p><input type=\"hidden\" name=\"action\" value=\"alter\" />\n";
53			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
54			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
55			echo $misc->form;
56			echo "<input type=\"submit\" name=\"alter\" value=\"{$lang['strok']}\" />\n";
57			echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
58			echo "</form>\n";
59		}
60		else echo "<p>{$lang['strnodata']}</p>\n";
61	}
62
63	/**
64	 * Show confirmation of drop and perform actual drop
65	 */
66	function doDrop($confirm) {
67		global $data, $misc;
68		global $lang;
69
70		if ($confirm) {
71			$misc->printTrail('trigger');
72			$misc->printTitle($lang['strdrop'],'pg.trigger.drop');
73
74			echo "<p>", sprintf($lang['strconfdroptrigger'], $misc->printVal($_REQUEST['trigger']),
75				$misc->printVal($_REQUEST['table'])), "</p>\n";
76
77			echo "<form action=\"triggers.php\" method=\"post\">\n";
78			echo "<input type=\"hidden\" name=\"action\" value=\"drop\" />\n";
79			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
80			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
81			echo $misc->form;
82			echo "<p><input type=\"checkbox\" id=\"cascade\" name=\"cascade\" /> <label for=\"cascade\">{$lang['strcascade']}</label></p>\n";
83			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
84			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
85			echo "</form>\n";
86		}
87		else {
88			$status = $data->dropTrigger($_POST['trigger'], $_POST['table'], isset($_POST['cascade']));
89			if ($status == 0)
90				doDefault($lang['strtriggerdropped']);
91			else
92				doDefault($lang['strtriggerdroppedbad']);
93		}
94
95	}
96
97	/**
98	 * Show confirmation of enable trigger and perform enabling the trigger
99	 */
100	function doEnable($confirm) {
101		global $data, $misc;
102		global $lang;
103
104		if ($confirm) {
105			$misc->printTrail('trigger');
106			$misc->printTitle($lang['strenable'],'pg.table.alter');
107
108			echo "<p>", sprintf($lang['strconfenabletrigger'], $misc->printVal($_REQUEST['trigger']),
109				$misc->printVal($_REQUEST['table'])), "</p>\n";
110
111			echo "<form action=\"triggers.php\" method=\"post\">\n";
112			echo "<input type=\"hidden\" name=\"action\" value=\"enable\" />\n";
113			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
114			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
115			echo $misc->form;
116			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
117			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
118			echo "</form>\n";
119		}
120		else {
121			$status = $data->enableTrigger($_POST['trigger'], $_POST['table']);
122			if ($status == 0)
123				doDefault($lang['strtriggerenabled']);
124			else
125				doDefault($lang['strtriggerenabledbad']);
126		}
127
128	}
129
130	/**
131	 * Show confirmation of disable trigger and perform disabling the trigger
132	 */
133	function doDisable($confirm) {
134		global $data, $misc;
135		global $lang;
136
137		if ($confirm) {
138			$misc->printTrail('trigger');
139			$misc->printTitle($lang['strdisable'],'pg.table.alter');
140
141			echo "<p>", sprintf($lang['strconfdisabletrigger'], $misc->printVal($_REQUEST['trigger']),
142				$misc->printVal($_REQUEST['table'])), "</p>\n";
143
144			echo "<form action=\"triggers.php\" method=\"post\">\n";
145			echo "<input type=\"hidden\" name=\"action\" value=\"disable\" />\n";
146			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
147			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
148			echo $misc->form;
149			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
150			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
151			echo "</form>\n";
152		}
153		else {
154			$status = $data->disableTrigger($_POST['trigger'], $_POST['table']);
155			if ($status == 0)
156				doDefault($lang['strtriggerdisabled']);
157			else
158				doDefault($lang['strtriggerdisabledbad']);
159		}
160
161	}
162
163	/**
164	 * Let them create s.th.
165	 */
166	function doCreate($msg = '') {
167		global $data, $misc;
168		global $lang;
169
170		$misc->printTrail('table');
171		$misc->printTitle($lang['strcreatetrigger'],'pg.trigger.create');
172		$misc->printMsg($msg);
173
174		// Get all the functions that can be used in triggers
175		$funcs = $data->getTriggerFunctions();
176		if ($funcs->recordCount() == 0) {
177			doDefault($lang['strnofunctions']);
178			return;
179		}
180
181		/* Populate functions */
182		$sel0 = new XHTML_Select('formFunction');
183		while (!$funcs->EOF) {
184			$sel0->add(new XHTML_Option($funcs->fields['proname']));
185			$funcs->moveNext();
186		}
187
188		/* Populate times */
189		$sel1 = new XHTML_Select('formExecTime');
190		$sel1->set_data($data->triggerExecTimes);
191
192		/* Populate events */
193		$sel2 = new XHTML_Select('formEvent');
194		$sel2->set_data($data->triggerEvents);
195
196		/* Populate occurrences */
197		$sel3 = new XHTML_Select('formFrequency');
198		$sel3->set_data($data->triggerFrequency);
199
200		echo "<form action=\"triggers.php\" method=\"post\">\n";
201		echo "<table>\n";
202		echo "<tr>\n";
203		echo "		<th class=\"data\">{$lang['strname']}</th>\n";
204		echo "		<th class=\"data\">{$lang['strwhen']}</th>\n";
205		echo "</tr>\n";
206		echo "<tr>\n";
207		echo "		<td class=\"data1\"> <input type=\"text\" name=\"formTriggerName\" size=\"32\" /></td>\n";
208		echo "		<td class=\"data1\"> ", $sel1->fetch(), "</td>\n";
209		echo "</tr>\n";
210		echo "<tr>\n";
211		echo "    <th class=\"data\">{$lang['strevent']}</th>\n";
212		echo "    <th class=\"data\">{$lang['strforeach']}</th>\n";
213		echo "</tr>\n";
214		echo "<tr>\n";
215		echo "     <td class=\"data1\"> ", $sel2->fetch(), "</td>\n";
216		echo "     <td class=\"data1\"> ", $sel3->fetch(), "</td>\n";
217		echo "</tr>\n";
218		echo "<tr><th class=\"data\"> {$lang['strfunction']}</th>\n";
219		echo "<th class=\"data\"> {$lang['strarguments']}</th></tr>\n";
220		echo "<tr><td class=\"data1\">", $sel0->fetch(), "</td>\n";
221		echo "<td class=\"data1\">(<input type=\"text\" name=\"formTriggerArgs\" size=\"32\" />)</td>\n";
222		echo "</tr></table>\n";
223		echo "<p><input type=\"submit\" value=\"{$lang['strcreate']}\" />\n";
224		echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
225		echo "<input type=\"hidden\" name=\"action\" value=\"save_create\" />\n";
226		echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
227		echo $misc->form;
228		echo "</form>\n";
229	}
230
231	/**
232	 * Actually creates the new trigger in the database
233	 */
234	function doSaveCreate() {
235		global $data;
236		global $lang;
237
238		// Check that they've given a name and a definition
239
240		if ($_POST['formFunction'] == '')
241			doCreate($lang['strtriggerneedsfunc']);
242		elseif ($_POST['formTriggerName'] == '')
243			doCreate($lang['strtriggerneedsname']);
244		elseif ($_POST['formEvent'] == '')
245			doCreate();
246		else {
247			$status = $data->createTrigger($_POST['formTriggerName'], $_POST['table'],
248					$_POST['formFunction'], $_POST['formExecTime'], $_POST['formEvent'],
249					$_POST['formFrequency'], $_POST['formTriggerArgs']);
250			if ($status == 0)
251				doDefault($lang['strtriggercreated']);
252			else
253				doCreate($lang['strtriggercreatedbad']);
254		}
255	}
256
257	/**
258	 * List all the triggers on the table
259	 */
260	function doDefault($msg = '') {
261		global $data, $misc, $database;
262		global $lang;
263
264		function tgPre(&$rowdata,$actions) {
265			global $data;
266			// toggle enable/disable trigger per trigger
267			if( ! $data->phpBool( $rowdata->fields["tgenabled"] ) ) {
268				unset( $actions['disable'] );
269			}
270			else{
271				unset( $actions['enable'] );
272			}
273
274			return $actions;
275		}
276
277		$misc->printTrail('table');
278		$misc->printTabs('table','triggers');
279		$misc->printMsg($msg);
280
281		$triggers = $data->getTriggers($_REQUEST['table']);
282
283		$columns = array(
284			'trigger' => array(
285				'title' => $lang['strname'],
286				'field' => field('tgname'),
287			),
288			'definition' => array(
289				'title' => $lang['strdefinition'],
290				'field' => field('tgdef'),
291			),
292			'function' => array(
293				'title' => $lang['strfunction'],
294				'field' => field('proproto'),
295				'url' => "functions.php?action=properties&amp;server={$_REQUEST['server']}&amp;database={$_REQUEST['database']}&amp;",
296				'vars' => array(
297					'schema' => 'pronamespace',
298					'function' => 'proproto',
299					'function_oid' => 'prooid',
300				),
301			),
302			'actions' => array(
303				'title' => $lang['stractions'],
304			),
305		);
306
307		$actions = array(
308			'alter' => array(
309				'content' => $lang['stralter'],
310					'attr'=> array (
311						'href' => array (
312							'url' => 'triggers.php',
313							'urlvars' => array (
314								'action' => 'confirm_alter',
315								'table' => $_REQUEST['table'],
316								'trigger' => field('tgname')
317							)
318						)
319					)
320			),
321			'drop' => array(
322				'content' => $lang['strdrop'],
323					'attr'=> array (
324						'href' => array (
325							'url' => 'triggers.php',
326							'urlvars' => array (
327								'action' => 'confirm_drop',
328								'table' => $_REQUEST['table'],
329								'trigger' => field('tgname')
330							)
331						)
332					)
333			),
334		);
335		if($data->hasDisableTriggers()) {
336			$actions['enable'] = array(
337				'content' => $lang['strenable'],
338				'attr'=> array (
339					'href' => array (
340						'url' => 'triggers.php',
341						'urlvars' => array (
342							'action' => 'confirm_enable',
343							'table' => $_REQUEST['table'],
344							'trigger' => field('tgname')
345						)
346					)
347				)
348			);
349			$actions['disable'] = array(
350				'content' => $lang['strdisable'],
351				'attr'=> array (
352					'href' => array (
353						'url' => 'triggers.php',
354						'urlvars' => array (
355							'action' => 'confirm_disable',
356							'table' => $_REQUEST['table'],
357							'trigger' => field('tgname')
358						)
359					)
360				)
361			);
362		}
363
364		$misc->printTable($triggers, $columns, $actions, 'triggers-triggers', $lang['strnotriggers'], 'tgPre');
365
366		$misc->printNavLinks(array ('create' => array (
367				'attr'=> array (
368					'href' => array (
369					'url' => 'triggers.php',
370						'urlvars' => array (
371							'action' => 'create',
372							'server' => $_REQUEST['server'],
373							'database' => $_REQUEST['database'],
374							'schema' => $_REQUEST['schema'],
375							'table' => $_REQUEST['table']
376						)
377					)
378				),
379				'content' => $lang['strcreatetrigger']
380			)), 'triggers-triggers', get_defined_vars());
381	}
382
383	function doTree() {
384
385		global $misc, $data;
386
387		$triggers = $data->getTriggers($_REQUEST['table']);
388
389		$reqvars = $misc->getRequestVars('table');
390
391		$attrs = array(
392			'text'   => field('tgname'),
393			'icon'   => 'Trigger',
394		);
395
396		$misc->printTree($triggers, $attrs, 'triggers');
397		exit;
398	}
399
400	if ($action == 'tree') doTree();
401
402	$misc->printHeader($lang['strtables'] . ' - ' . $_REQUEST['table'] . ' - ' . $lang['strtriggers']);
403	$misc->printBody();
404
405	switch ($action) {
406		case 'alter':
407			if (isset($_POST['alter'])) doSaveAlter();
408			else doDefault();
409			break;
410		case 'confirm_alter':
411			doAlter();
412			break;
413		case 'confirm_enable':
414			doEnable(true);
415			break;
416		case 'confirm_disable':
417			doDisable(true);
418			break;
419		case 'save_create':
420			if (isset($_POST['cancel'])) doDefault();
421			else doSaveCreate();
422			break;
423		case 'create':
424			doCreate();
425			break;
426		case 'drop':
427			if (isset($_POST['yes'])) doDrop(false);
428			else doDefault();
429			break;
430		case 'confirm_drop':
431			doDrop(true);
432			break;
433		case 'enable':
434			if (isset($_POST['yes'])) doEnable(false);
435			else doDefault();
436			break;
437		case 'disable':
438			if (isset($_POST['yes'])) doDisable(false);
439			else doDefault();
440			break;
441		default:
442			doDefault();
443			break;
444	}
445
446	$misc->printFooter();
447
448?>
449