Update query should be an UPDATE, not a SELECT.
[asterisk/asterisk.git] / contrib / scripts / dbsep.cgi
index c274f93..d15390c 100755 (executable)
@@ -28,6 +28,7 @@ my ($cgi, $dbh, %cfg, $table, $mode);
 # dsn=<some valid dsn>
 # dbuser=<user>
 # dbpass=<passwd>
+# dbschema=<dbname>
 # backslash_is_escape={yes|no}
 #
 open CFG, "</etc/asterisk/dbsep.conf";
@@ -35,8 +36,8 @@ while (<CFG>) {
        chomp;
        next if (m/^[#;]/);
        next if (m/^\s*$/);
-       my ($name,$value) = split '=';
-       $cfg{lc($name)} = $value;
+       my ($name,@value) = split '=';
+       $cfg{lc($name)} = join('=', @value);
 }
 close CFG;
 
@@ -56,7 +57,9 @@ if ($mode eq 'single') {
        $sth->execute() || throw_error("Invalid query: $sql");
        $row = $sth->fetchrow_hashref();
        foreach (keys %$row) {
-               push @answer, encode($_) . "=" . encode($row->{$_});
+               foreach my $item (split /\;/, $row->{$_}) {
+                       push @answer, encode($_) . "=" . encode($item);
+               }
        }
        $sth->finish();
        $dbh->disconnect();
@@ -73,7 +76,9 @@ if ($mode eq 'single') {
        while (my $row = $sth->fetchrow_hashref()) {
                @answer = ();
                foreach (keys %$row) {
-                       push @answer, encode($_) . "=" . encode($row->{$_});
+                       foreach my $item (split /\;/, $row->{$_}) {
+                               push @answer, encode($_) . "=" . encode($item);
+                       }
                }
                print join("&", @answer) . "\n";
        }
@@ -94,7 +99,7 @@ if ($mode eq 'single') {
                }
                $get{$name}++;
        }
-       $sql = "SELECT " . join(",", cgi_to_where_clause($cgi, \%cfg, \%get)) . " FROM $table WHERE " . join(" AND ", @get);
+       $sql = "UPDATE $table SET " . join(",", cgi_to_where_clause($cgi, \%cfg, \%get)) . " WHERE " . join(" AND ", @get);
        $dbh = DBI->connect($cfg{dsn}, $cfg{dbuser}, $cfg{dbpass});
        $affected = $dbh->do($sql);
        $dbh->disconnect();
@@ -120,6 +125,43 @@ if ($mode eq 'single') {
        $affected = $dbh->do($sql);
        $dbh->disconnect();
        print "Content-type: text/html\n\n$affected\n";
+} elsif ($ENV{PATH_INFO} =~ m/require$/) {
+       my $result = 0;
+       my $dbh = DBI->connect($cfg{dsn}, $cfg{dbuser}, $cfg{dbpass});
+       my $sql = "SELECT data_type, character_maximum_length FROM information_schema.tables AS t " .
+                       "JOIN information_schema.columns AS c " .
+                       "ON t.table_catalog=c.table_catalog AND " .
+                       "t.table_schema=c.table_schema AND " .
+                       "t.table_name=c.table_name " .
+                       "WHERE c.table_schema='$cfg{dbschema}' AND " .
+                       "c.table_name=? AND c.column_name=?";
+       my $sth = $dbh->prepare($sql);
+       foreach my $param (cgi_to_where_clause($cgi, \%cfg)) {
+               my ($colname, $value) = split /=/, $param;
+               my ($type, $size) = split /:/, $value;
+               $sth->execute($table, $colname);
+               my ($dbtype, $dblen) = $sth->fetchrow_array();
+               $sth->finish();
+               if ($type eq 'char') {
+                       if ($dbtype !~ m#char#i) {
+                               print STDERR "REQUIRE: $table: Type of column $colname requires char($size), but column is of type $dbtype instead!\n";
+                               $result = -1;
+                       } elsif ($dblen < $size) {
+                               print STDERR "REQUIRE: $table: Size of column $colname requires $size, but column is only $dblen long!\n";
+                               $result = -1;
+                       }
+               } elsif ($type eq 'integer') {
+                       if ($dbtype =~ m#char#i and $dblen < $size) {
+                               print STDERR "REQUIRE: $table: Size of column $colname requires $size, but column is only $dblen long!\n";
+                               $result = -1;
+                       } elsif ($dbtype !~ m#int|float|double|dec|num#i) {
+                               print STDERR "REQUIRE: $table: Type of column $colname requires integer($size), but column is of type $dbtype instead!\n";
+                               $result = -1;
+                       }
+               } # TODO More type checks
+       }
+       $dbh->disconnect();
+       print "Content-type: text/html\n\n$result\n";
 } elsif ($ENV{PATH_INFO} =~ m/static$/) {
        # file parameter in GET, no POST
        my (@get, $filename, $sql, $sth);
@@ -197,7 +239,7 @@ sub cgi_to_where_clause {
                        push @param, "$name='$value'";
                }
        }
-       return join(" AND ", @param);
+       return @param;
 }
 
 sub throw_error {