[interchange-cvs] interchange - heins modified 2 files

interchange-core@interchange.redhat.com interchange-core@interchange.redhat.com
Mon Feb 4 02:45:00 2002


User:      heins
Date:      2002-02-04 07:44:49 GMT
Modified:  dist/lib/UI icmenu.txt
Added:     dist/lib/UI/pages/admin direct_sql.html
Log:
	* Add cheesy little "Direct SQL" feature.

	* This can obviously be enhanced quite a bit (clickable resorting,
	  checkboxes for delete/edit, etc.) but I think this is enough for
	  now. It allows some delete/update/insert/view without shell
	  access.

	* Only allowed for superuser. No help, for anyone who needs it
	  probably shouldn't be using it. Famous last words, I know. 8-)

	* Anyone who wants to try and improve it should probably get
	  a copy of "roster.html" from Jon or myself.

Revision  Changes    Path
2.3       +1 -0      interchange/dist/lib/UI/icmenu.txt


rev 2.3, prev_rev 2.2
Index: icmenu.txt
===================================================================
RCS file: /anon_cvs/repository/interchange/dist/lib/UI/icmenu.txt,v
retrieving revision 2.2
retrieving revision 2.3
diff -u -r2.2 -r2.3
--- icmenu.txt	3 Feb 2002 04:27:55 -0000	2.2
+++ icmenu.txt	4 Feb 2002 07:44:49 -0000	2.3
@@ -22,6 +22,7 @@
 0021	Admin	12			no_dbmenu	mv_data_table	admin/export_table	mv_data_table=[cgi mv_data_table]	Export Data									
 0022	Admin	13			no_dbmenu	mv_data_table	admin/spread	mv_data_table=[cgi mv_data_table]	Spreadsheet									
 0022b	Admin	13b			no_dbmenu	mv_data_table	admin/search_replace	mv_data_table=[cgi mv_data_table]	Search/Replace									
+0022c	Admin	13c			no_dbmenu	mv_data_table	admin/direct_sql	mv_data_table=[cgi mv_data_table]	Direct SQL									
 0023	Admin	14			no_dbmenu	mv_data_table	admin/flex_editor	mv_data_table=[cgi mv_data_table]&ui_new_item=1	New Entry									
 0024	Admin	15			no_dbmenu	mv_data_table	admin/gentable		    Re-select Table									
 0025	Admin	16	1			access_menu	admin/access		Users									



1.1                  interchange/dist/lib/UI/pages/admin/direct_sql.html


rev 1.1, prev_rev 1.0
Index: direct_sql.html
===================================================================
[set page_title]Direct SQL Query[/set]
[set ui_class]Admin[/set]
[set page_banner]Direct SQL Query[/set]
[set page_perm]super[/set]
[set help_name]table.direct_sql[/set]
[set icon_name]icon_config.gif[/set]
[seti ui_body_extra][/seti]

@_UI_STD_HEAD_@
<!-- ----- BEGIN REAL STUFF ----- -->

[calc]
	delete $CGI->{list};
	delete $CGI->{html};
	$Scratch->{message} = '';
	delete $Scratch->{update_message};
	if ($CGI->{clear_query_buffer}) {
		delete $Session->{x_query_buffer};
		return;
	}
	unless ($sql = $CGI->{sql}) {
		$CGI->{sql} = "select * from $CGI->{mv_data_table}"
			if $CGI->{mv_data_table};
		return;
	}
	my $extra = '';
	$sql =~ s/^\s+//;
	$sql =~ s/\s+$//;
	if($sql =~ /^select\s+.*?\s+from\s+(\w+)/i) {
		$CGI->{mv_data_table} = $1;
		delete $CGI->{rc};
		delete $CGI->{list};
		$CGI->{html} = 1;
#		$Scratch->{message} = qq{
#			Rows selected by query:
#				<blockquote><b>$sql</b></blockquote>
#		};
	}
	else {
		if($sql =~ /^update\s+(\w+)/i) {
			$Scratch->{update_message} = 'UPDATED';
		}
		elsif($sql =~ /^delete\s+from\s+(\w+)/i) {
			$Scratch->{update_message} = 'DELETED';
		}
		elsif($sql =~ /^insert\s+into\s+(\w+)/i) {
			$Scratch->{update_message} = 'INSERTED';
		}
		else {
			$Scratch->{update_message} = 'UNKNOWN OPERATION';
		}
		my $flagtab = $1;
		if($Scratch->{is_super}) {
			$Tag->flag( { type => 'write', table => $flagtab });
		}
		else {
			$extra = "(May fail on write-controlled table, not admin superuser)";
		}
		$CGI->{rc} = 1;
		delete $CGI->{html};
		$CGI->{list} = 1;
#		$Scratch->{message} = qq{
#				Rows updated by query:
#				<blockquote><b>$sql</b></blockquote>
#		};
	}
	$Scratch->{message} =~ s/\r?\n/<br>/g;
	$Scratch->{message} =~ s/\r/<br>/g;
	$Scratch->{message} =~ s/<br>/<br>\n/g;
	$Scratch->{message} .= $extra;

	my $qb = $Session->{x_query_buffer} ||= [];
	my $prev = $qb->[0] ? $qb->[0][0] : '';
	unshift @$qb, [$sql] unless $sql eq $prev;
	return;
[/calc]

[if cgi mv_data_table]
[page 
	href=__UI_BASE__/flex_select
	form=auto
	mv_data_table="[cgi mv_data_table]"
]Return to [cgi mv_data_table] edit</a>
[/if]

<FORM ACTION="[area @@MV_PAGE@@]" name=query>

<table>
<tr>
<td>
<textarea name=sql rows=4 cols=80>[cgi sql]</textarea>
</td>
<td style="font-size: smaller">
[loop list=`
		my $tmp = $Session->{x_query_buffer};
		return [$tmp] if $tmp;
		return;
	` ml=10]
[list]
[loop-increment] <A HREF="javascript: document.query.sql.value='[loop-calc]
		my $thing = <<'EOF';
[loop-code]
EOF
		$thing =~ s/'/\\'/g;
		return $thing;[/loop-calc]'; void(0)">[loop-code]</A><br>
[/list]
[/loop]
</td>
<tr>
<td>
<input type=submit>
<select name=limit>
[loop list="250 10 25 50 100 500 1000 10000 50000" option=limit cgi=1]
	<OPTION value="[loop-code]"> Limit to [loop-code]
[/loop]
</select>
Base table <select name=mv_data_table>
[loop list="[list-databases]" option=mv_data_table cgi=1]
	<OPTION>[loop-code]
[/loop]
</select>
</td>
<td>
<input style="font-size: smaller"
		type=submit
		name=clear_query_buffer
		value="Clear buffer">
</td>
</form>
<P>
	<blockquote>
	[scratchd message]
	</blockquote>
	<table border=1>
[if cgi html]
	[query
		table="[cgi mv_data_table]"
		st=db
		row-count="[cgi row-count]"
		html="[cgi html]" 
		list="[cgi list]" 
		sql=`$sql`
		ml="[cgi limit]"
	]
	[/query]
[elsif cgi list]
	[query
		table="[cgi mv_data_table]"
		row-count="[cgi row-count]"
		st=db
		html="[cgi html]" 
		list="[cgi list]" 
		ml="[cgi limit]"
		sql=`$sql`
	]
	<tr>
	<td>[scratchd update_message]</td>
	<td>[sql-code]</td>
	</tr>
	[/query]
[/elsif]
[/if]
	</table>

<!-- ----- END REAL STUFF ----- -->
@_UI_STD_FOOTER_@
<!-- page: @@MV_PAGE@@ -->