summaryrefslogtreecommitdiffstats
path: root/kexi/tools/delete_column
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
commit8362bf63dea22bbf6736609b0f49c152f975eb63 (patch)
tree0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/tools/delete_column
downloadkoffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz
koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/tools/delete_column')
-rw-r--r--kexi/tools/delete_column/Makefile.am5
-rw-r--r--kexi/tools/delete_column/README17
-rwxr-xr-xkexi/tools/delete_column/kexi_delete_column136
-rwxr-xr-xkexi/tools/delete_column/kexi_delete_column_gui82
-rw-r--r--kexi/tools/delete_column/kexi_delete_column_gui_transl_pl.sh10
5 files changed, 250 insertions, 0 deletions
diff --git a/kexi/tools/delete_column/Makefile.am b/kexi/tools/delete_column/Makefile.am
new file mode 100644
index 00000000..1f019ae8
--- /dev/null
+++ b/kexi/tools/delete_column/Makefile.am
@@ -0,0 +1,5 @@
+
+bin_SCRIPTS = kexi_delete_column kexi_delete_column_gui
+
+message_pldir = $(kde_locale)/pl/LC_MESSAGES
+message_pl_DATA = kexi_delete_column_gui_transl_pl.sh
diff --git a/kexi/tools/delete_column/README b/kexi/tools/delete_column/README
new file mode 100644
index 00000000..3e263591
--- /dev/null
+++ b/kexi/tools/delete_column/README
@@ -0,0 +1,17 @@
+== "Delete column" utility for Kexi ==
+
+This script deletes a single table column from a .kexi (SQLite 3)
+database file without removing data from the table.
+
+Rationale:
+Kexi 1.x does not offer deleting columns from a table
+without removing its data. The kexi_delete_column script does exactly this.
+
+Usage:
+Type kexi_delete_column for list of arguments.
+
+GUI tool:
+There is also a GUI tool 'kexi_delete_column_gui' that is basically
+a wrapper running on top of kexi_delete_column
+The tool works without arguments - it uses KDE dialogs instead ('kdialog').
+
diff --git a/kexi/tools/delete_column/kexi_delete_column b/kexi/tools/delete_column/kexi_delete_column
new file mode 100755
index 00000000..22566c61
--- /dev/null
+++ b/kexi/tools/delete_column/kexi_delete_column
@@ -0,0 +1,136 @@
+#!/bin/sh
+#
+# Copyright (C) 2006-2007 Jaroslaw Staniek <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+
+usage {
+ echo "This script deletes a single table column from a .kexi (SQLite 3)
+database file without removing data from the table.
+
+Usage:
+ $0 database_name table_name column_name
+
+- {database_name}.old backup file is created before proceeding
+- database_name, table_name, column_name must exist
+- note that queries, forms and other objects referencing
+ to the altered table can become invalid and have to be
+ fixed by hand
+
+Example: to delete 'price' column from table 'products', type
+ $0 db.kexi products price"
+}
+
+exit_with_error {
+ rm -f "$temp_db"
+ echo $*
+ echo "Error."
+ exit 1
+}
+
+check {
+ [ -n "$*" ] && exit_with_error "$*"
+}
+
+ksqlite="ksqlite -noheader"
+ksqlite_header="ksqlite -header"
+
+if [ $# -lt 3 ] ; then
+ usage
+ exit 0
+fi
+database_name=$1
+table_name=$2
+column_name=$3
+
+temp_db=`mktemp "$database_name"XXXXXXXX` || exit_with_error
+cp "$database_name" "$temp_db" || exit_with_error
+
+# 1. alter the table physically
+
+prepare_new_create_table_statement {
+ # possible problems: typename ( number , number ) may contain ","
+
+ schema=`echo ".schema '$table_name';" | $ksqlite "$database_name" | \
+ grep "^CREATE TABLE $table_name " | \
+ sed -e "s/[^(]*(\(.*\));/\1/" || exit_with_error`
+
+ IFS=","
+ for coldef in $schema ; do
+ col=`echo $coldef | sed "s/^[ ]*\([^ ]*\) .*$/\1/"`
+ if [ "$col" != "$column_name" ] ; then
+ echo -n ,$coldef
+ fi
+ done | cut -c2-
+ IFS=" "
+}
+
+get_sql_column_names {
+ names=`$ksqlite_header "$temp_db" "SELECT * FROM '$temp_table_name' LIMIT 1;" | \
+ head -n 1 || exit_with_error`
+ IFS="|"
+ for col in $names ; do
+ if [ "$col" != "$column_name" ] ; then
+ echo -n ", $col"
+ fi
+ done | cut -c3-
+ IFS=" "
+}
+
+# 1.1. rename the original table to a temp name
+temp_table_name=`mktemp "$table_name"XXXXXXXX`
+msg=`$ksqlite "$temp_db" "ALTER TABLE '$table_name' RENAME TO '$temp_table_name';"`
+check "$msg"
+
+# 1.2. create a new table without the removed column and copy the data
+new_create_table_statement=`prepare_new_create_table_statement`
+msg=`$ksqlite "$temp_db" "CREATE TABLE '$table_name' ($new_create_table_statement);"`
+check "$msg"
+
+sql_column_names=`get_sql_column_names`
+msg=`$ksqlite "$temp_db" "INSERT INTO '$table_name' SELECT $sql_column_names FROM '$temp_table_name';"`
+check "$msg"
+
+# 1.3. drop the temporary table
+msg=`$ksqlite "$temp_db" "DROP TABLE '$temp_table_name';"`
+check "$msg"
+
+
+# 2. alter information in the kexi__fields system table (schema)
+
+# 2.1. Get table's ID
+table_id=`$ksqlite "$temp_db" "SELECT o_id FROM kexi__objects WHERE o_type=1 AND o_name='$table_name';" || exit_with_error`
+
+# 2.1. Get column's number
+column_order=`$ksqlite "$temp_db" "SELECT f_order FROM kexi__fields WHERE t_id=$table_id AND f_name='$column_name';" || exit_with_error`
+
+$ksqlite "$temp_db" "DELETE FROM kexi__fields WHERE t_id=$table_id AND f_name='$column_name';"
+
+for fname in `$ksqlite "$temp_db" \
+ "SELECT f_name FROM kexi__fields WHERE t_id=$table_id AND f_order>=$column_order ORDER BY f_order DESC;"` ; do
+ msg=`$ksqlite "$temp_db" "UPDATE kexi__fields SET f_order=$column_order WHERE t_id=$table_id AND f_name='$fname';"`
+ check "$msg"
+ column_order=`expr $column_order + 1`
+done
+
+# 3. Copy the original database file to .old file and replace
+# the original with the new one
+cp "$database_name" "$database_name.old" || exit_with_error
+mv "$temp_db" "$database_name" || exit_with_error
+
+exit 1
+
diff --git a/kexi/tools/delete_column/kexi_delete_column_gui b/kexi/tools/delete_column/kexi_delete_column_gui
new file mode 100755
index 00000000..0a87091c
--- /dev/null
+++ b/kexi/tools/delete_column/kexi_delete_column_gui
@@ -0,0 +1,82 @@
+#!/bin/sh
+#
+# Copyright (C) 2006-2007 Jaroslaw Staniek <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+
+basedir=`dirname "$0"`
+
+setup_messages {
+ lang=`grep Language= ~/.kde/share/config/kdeglobals | head -n 1 | \
+ sed -e 's/Language=\(.*\):.*/\1/'`
+ if [ -z "$lang" ] ; then lang="en" ; fi
+
+ IFS=:
+ for dir in `kde-config --expandvars --path locale` ; do
+ transl_file="$dir"$lang"/LC_MESSAGES/kexi_delete_column_gui_transl_$lang.sh";
+ if [ -f "$transl_file" ] ; then
+ source "$transl_file"
+ break
+ else
+ transl_file=;
+ fi
+ done
+ IFS=" "
+ if [ -z "$transl_file" ] ; then
+ transl_file="$basedir/kexi_delete_column_gui_transl_$lang.sh";
+ if [ -f "$transl_file" ] ; then source "$transl_file"; else transl_file=; fi
+ fi
+echo $transl_file
+ if [ -z "$transl_file" ] ; then
+ # default: english messages:
+ msg_filters="*.kexi|Kexi Project stored in a file
+*.*|All files"
+ msg_select_db_file="Select database file"
+ msg_enter_table_name="Table name (not caption):"
+ msg_enter_column_name="Column name (not caption):"
+ fi
+} # /setup_messages
+
+setup_messages
+
+ksqlite="ksqlite -noheader"
+
+database_name=`kdialog --title "$msg_select_db_file" --getopenfilename . "$msg_filters"` || exit 1
+
+table_name=`kdialog --inputbox "$msg_enter_table_name"` || exit 1
+
+# show list of columns and ask for one
+
+msg=`$ksqlite "$database_name" "SELECT f_name FROM kexi__objects o, kexi__fields f WHERE o.o_id=f.t_id AND o.o_name='$table_name' AND o_type=1 ORDER BY f_order;" || exit 1`
+
+command_file=`mktemp "$database_name"XXXXXXXX`".sh"
+echo -n "kdialog --radiolist \"$msg_enter_column_name\"" > $command_file
+echo $msg | while read f ; do
+ echo -n " $f $f off" >> $command_file
+done
+
+column_name=`. $command_file || exit 1`
+rm -f $command_file
+
+# call the command line tool
+
+msg=`sh kexi_delete_column "$database_name" "$table_name" "$column_name" 2>&1`
+
+[ -z "$msg" ] && exit 0
+
+kdialog --error "$msg"
+exit 1
diff --git a/kexi/tools/delete_column/kexi_delete_column_gui_transl_pl.sh b/kexi/tools/delete_column/kexi_delete_column_gui_transl_pl.sh
new file mode 100644
index 00000000..ba46b949
--- /dev/null
+++ b/kexi/tools/delete_column/kexi_delete_column_gui_transl_pl.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Translation file for kexi_delete_column_gui
+
+msg_filters="*.kexi|Projekt Kexi zapisany w pliku
+*.*|Wszystkie pliki"
+
+msg_select_db_file="Wybierz plik bazy danych"
+msg_enter_table_name="Nazwa tabeli (nie tytuł):"
+msg_enter_column_name="Nazwa kolumny (nie tytuł):"