The buttonbar at the top of each page is now a fixed 'div' element
[gnucomo.git] / src / web / parameter.php
1 <?php 
2
3 /**************************************************************************
4 **  (c) Copyright 2003, Andromeda Technology & Automation
5 ** This is free software; you can redistribute it and/or modify it under the
6 ** terms of the GNU General Public License, see the file COPYING.
7 ***************************************************************************
8 ** MODULE INFORMATION *
9 ***********************
10 **      FILE NAME      : parameter.php
11 **      SYSTEM NAME    : Gnucomo - Gnu Computer Monitoring
12 **      VERSION NUMBER : $Revision: 1.9 $
13 **
14 **  DESCRIPTION      : Parameter administration for a specific object.
15 **                     Input - GET[oid]    : Object id
16 **
17 **  EXPORTED OBJECTS : 
18 **  LOCAL    OBJECTS : 
19 **  MODULES  USED    :
20 ***************************************************************************
21 **  ADMINISTRATIVE INFORMATION *
22 ********************************
23 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
24 **      CREATION DATE   : Dec 04, 2002
25 **      LAST UPDATE     : Aug 04, 2003
26 **      MODIFICATIONS   : 
27 **************************************************************************/
28
29 /*****************************
30    $Log: parameter.php,v $
31    Revision 1.9  2007-11-21 14:38:06  arjen
32    The buttonbar at the top of each page is now a fixed 'div' element
33    instead of a framed page.
34    Contributed by Edwin Nadorp.
35
36    Revision 1.8  2007/01/11 13:44:29  arjen
37    Manually edit parameters.
38    View logs from abusing IP addresses.
39
40    Revision 1.7  2003/12/03 08:03:28  arjen
41    Optionally show or hide removed parameters from the parameter
42    comparison page.
43
44    Revision 1.6  2003/08/14 10:33:01  arjen
45    Added performance measurement.
46
47    Revision 1.5  2003/07/15 11:06:45  arjen
48    Removed parameters are displayed in a shaded style.
49
50    Revision 1.4  2003/02/21 08:50:12  arjen
51    Database optimizations.
52
53    Revision 1.3  2003/02/13 09:01:29  arjen
54    All web interface pages use the page class.
55
56    Revision 1.2  2003/02/05 09:47:39  arjen
57    Display the difference of all package class parameters for two objects
58
59 ******************************/
60
61 // RCSID = "$Id: parameter.php,v 1.9 2007-11-21 14:38:06 arjen Exp $";
62
63
64 ini_set('include_path', '.:./classes:../phpclasses');
65
66 require_once('page.class.php');
67
68
69 /*  Local functions */
70
71 function getmicrotime()
72 {
73    list ($usec, $sec) = explode(" ", microtime());
74    return (float)$sec + (float)$usec;
75 }
76
77 function object_selection($db, $skip_oid)
78 {
79    /*  Create and print an HTML option list of objects */
80
81    $res = pg_exec("SELECT objectid, objectname FROM object WHERE objectid != "
82                      . $skip_oid . "ORDER BY objectname");
83    for ($row = 0; $row < pg_numrows($res); $row++)
84    {
85       $obj = pg_fetch_object($res, $row);
86       echo "<option value='" . $obj->objectid . "'>";
87       echo $obj->objectname;
88       echo "</option>";
89    }
90 }
91
92 class param_page extends page
93 {
94
95    function Body()
96    {
97
98    if (!empty($_GET['oid']))
99    {
100       $ObjId = $_GET['oid'];
101
102       $res = pg_exec($this->database, "SELECT objectname FROM object WHERE objectid=CAST('" . $ObjId ."' AS BIGINT)");
103       $obj = pg_fetch_object($res, 0);
104       echo "<script type='text/ecmascript'>document.getElementById('menu_title').innerHTML = '<h1>Parameters for " . $obj->objectname . "<\/h1>'</script><br>";
105
106       if( isset($_POST['action']) ) {
107          echo "Action = " . $_POST['action'] . "<br>";
108       }
109       //  See if we have an update for the database
110       if (isset($_POST['action']) && $_POST['action'] == 'Create Parameter')
111       {
112          $name = $_POST['paramname'];
113          $class = $_POST['paramclass'];
114          $description = $_POST['paramdescr'];
115
116          echo "<h2>Creating parameter $name of class $class.</h2>";
117
118          echo "<form action='parameter.php?oid=$ObjId' method='post'>";
119          echo "<input type='hidden' name='paramclass' value='$class'>";
120          echo "<input type='hidden' name='paramname' value='$name'>";
121          echo "Description : <input type='text' name='paramdescr' value='$description'>";
122          echo "<br>";
123          echo "<table>";
124          echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>";
125
126          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='$class'");
127          for ($row = 0; $row < pg_numrows($class_res); $row++)
128          {
129             $prop = pg_fetch_object($class_res, $row);
130             echo "<tr>";
131             echo "<td>", $prop->property_name, "</td><td>", $prop->description, "</td>";
132             echo "<td><input type='text' name='" . $prop->property_name . "'></td>";
133             echo "</tr>";
134          }
135          echo "</table>";
136          echo "<input type='submit' name='action' value='Save New Parameter'>";
137          echo "</form>";
138       }
139
140       if (isset($_POST['action']) && $_POST['action'] == 'Save New Parameter')
141       {
142          $name = $_POST['paramname'];
143          $class = $_POST['paramclass'];
144          $description = $_POST['paramdescr'];
145
146          echo "<h2>Saving new parameter $name of class $class.</h2>";
147
148          echo "Description : $description";
149          echo "<br>";
150
151          $insertion = "insert into parameter (objectid, name, class, description) values ";
152          $insertion .= "('$ObjId', '$name', '$class', '$description')";
153          pg_exec($this->database, $insertion);
154          $par = pg_fetch_object(pg_exec($this->database, "select currval('paramid_seq')"), 0);
155
156          echo "<table>";
157          echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>";
158
159          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='$class'");
160          for ($row = 0; $row < pg_numrows($class_res); $row++)
161          {
162             $prop = pg_fetch_object($class_res, $row);
163             $insertion = "insert into property (paramid, name, value, type, min, max) values ('";
164             $insertion .= $par->currval . "', '" . $prop->property_name . "', '";
165             $insertion .= $_POST[$prop->property_name] . "', '" . $prop->property_type . "', '";
166             $insertion .= $prop->min . "', '" . $prop->max . "')";
167
168             pg_exec($this->database, $insertion);
169
170             $insertion = "insert into history (paramid, modified, change_nature, changed_property, new_value)";
171             $insertion .= " values ('" . $par->currval . "', '";
172             $insertion .= date('Y-m-d H:i:s') . "', 'CREATED', '";
173             $insertion .= $prop->property_name . "', '" . $_POST[$prop->property_name] . "')";
174
175             pg_exec($this->database, $insertion);
176  
177             echo "<tr>";
178             echo "<td>", $prop->property_name, "</td><td>", $prop->description, "</td>";
179             echo "<td>" . $_POST[$prop->property_name] . "</td>";
180             echo "</tr>";
181          }
182          echo "</table>";
183       }
184
185       
186      ?>
187      <form action='parameter_compare.php' method='post'>
188        <input type='hidden' name='oid' value='<?php echo $ObjId  ?>'>
189        Compare to object:
190        <select name='compare_to'>
191          <?php object_selection($this->database, $ObjId ); ?>
192        </select>
193        <input type='hidden' name='class' value='package'>
194        <input type='checkbox' name='show_removed' value='on'>Show removed parameters
195        <input type='submit' value=' Show Difference'>
196      </form>
197      <?php
198       echo "<hr>";
199       echo "<table>";
200       $row = 0;
201       $start_time = getmicrotime();
202       $res = pg_exec($this->database, "SELECT paramid, class, name, description FROM parameter "
203                      ."WHERE objectid= CAST('" . $ObjId  . "' AS BIGINT) order by class, name");
204       while ($row < pg_numrows($res))
205       {
206          $par = pg_fetch_object($res, $row);
207          $qry ="select change_nature from history where paramid= CAST('";
208          $qry .= $par->paramid . "' AS BIGINT) order by modified desc";
209          $rhist = pg_exec($this->database, $qry);
210          $hist = pg_fetch_object($rhist, 0);
211          if ($hist->change_nature != "REMOVED")
212          {
213             ?>
214             <tr><td align='center'>
215                <?php echo $par->class?>
216             </td><td>
217                <?php echo "<a href=\"parameter.php?paramid=" . $par->paramid . "\">" . $par->name . "</a>"?>
218             </td><td>
219                <?php echo $par->description?>
220             </td><td>
221                <?php
222                   $r = pg_exec($this->database, "SELECT name, value FROM property
223                                               WHERE paramid=CAST('" . $par->paramid . "' AS BIGINT)");
224                   for ($p = 0; $p < pg_numrows($r); $p++)
225                   {
226                      $prop = pg_fetch_object($r, $p);
227                      echo $prop->name . "=" . $prop->value . " ";
228                   }
229                ?>
230             </td></tr>
231             <?php
232          }
233          $row++;
234       }
235       echo "</table>";
236       $duration = getmicrotime() - $start_time;
237
238       echo "$row parameters in " . round($duration, 3) . " seconds (";
239       echo round($duration / $row * 1000, 3) . " milliseconds per parameter).<br>";
240       ?>
241         <h2>Create new parameter:</h2>
242         <form action='parameter.php?oid=<?php echo $ObjId ?>' method='post'>
243           Class : <input type='text' name='paramclass'>
244           Name : <input type='text' name='paramname'>
245           Description : <input type='text' name='paramdescr'>
246         <br>
247         <input type='submit' name='action' value='Create Parameter'>
248         </form>
249       <?php 
250    }
251    if (!empty($_GET['paramid']))
252    {
253       // Edit a specific parameter
254
255       $paramid = $_GET['paramid'];
256       $par = pg_fetch_object(pg_exec($this->database, "SELECT * FROM parameter WHERE paramid='$paramid'"), 0);
257
258       if (isset($_POST['action']) && $_POST['action'] == 'Update Parameter')
259       {
260          //  Update each property if its value has changed
261
262          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='" . $par->class . "'");
263          for ($row = 0; $row < pg_numrows($class_res); $row++)
264          {
265             $prop = pg_fetch_object($class_res, $row);
266             $pname = $prop->property_name;
267             $property = pg_fetch_object(pg_exec($this->database,
268                             "SELECT value FROM property WHERE paramid='$paramid' AND name='$pname'"), 0);
269             $pvalue = $property->value;
270             if ($pvalue != $_POST[$pname])
271             {
272                $pvalue = $_POST[$pname];
273
274                pg_exec($this->database, "UPDATE property SET value='$pvalue' WHERE paramid='$paramid' AND name='$pname'");
275
276                $insertion = "insert into history (paramid, modified, change_nature, changed_property, new_value)";
277                $insertion .= " values ('" . $paramid . "', '";
278                $insertion .= date('Y-m-d H:i:s') . "', 'MODIFIED', '";
279                $insertion .= $pname . "', '" . $pvalue . "')";
280
281                pg_exec($this->database, $insertion);
282             }
283          }
284       }
285
286       echo "<h1>Parameter " . $par->name . " of class " . $par->class . "</h1>\n";
287
288       echo "<form action='parameter.php?paramid=$paramid' method='post'>\n";
289       echo "Description : <input type='text' name='paramdescr' value='" . $par->description . "'>\n";
290       echo "<br>";
291       echo "<table>\n";
292       echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>\n";
293
294       $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='" . $par->class . "'");
295       for ($row = 0; $row < pg_numrows($class_res); $row++)
296       {
297          $prop = pg_fetch_object($class_res, $row);
298          $pname = $prop->property_name;
299          $property = pg_fetch_object(pg_exec($this->database,
300                          "SELECT value FROM property WHERE paramid='$paramid' AND name='$pname'"), 0);
301          $pvalue = $property->value;
302          echo "<tr>";
303          echo "<td>", $pname, "</td><td>", $prop->description, "</td>";
304          echo "<td><input type='text' name='$pname' value='$pvalue'></td>";
305          echo "</tr>\n";
306       }
307       echo "</table>\n";
308       echo "<input type='submit' name='action' value='Update Parameter'>\n";
309       echo "</form>\n";
310
311       echo "<h2>Change history for " . $par->class . " parameter " . $par->name . "</h2>";
312
313       $histres = pg_exec($this->database, "SELECT * FROM history WHERE paramid='$paramid' ORDER BY modified");
314       echo "<table>";
315       for ($row = 0; $row < pg_numrows($histres); $row++)
316       {
317          $hist = pg_fetch_object($histres, $row);
318          echo "<tr>";
319          echo "<td>" . $hist->changed_property . "</td>";
320          echo "<td>" . $hist->modified . "</td>";
321          echo "<td>" . $hist->change_nature . "</td>";
322          echo "<td>" . $hist->new_value . "</td>";
323          echo "</tr>\n";
324       }
325       echo "</table>";
326    }
327    }
328 }
329
330 $page = new param_page("Gnucomo Parameters");
331
332 $page->Showpage();
333
334 ?>