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