aboutsummaryrefslogtreecommitdiff
path: root/libBasicTableOperations.tcl
blob: 81f85b36af65cbd30c8fd96218347789e86a52c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/sh
# (C) 2011 by Eugeniy Mikhailov, <evgmik@gmail.com>
# vim:set ft=tcl: \
exec tclsh "$0" "$@"

# #######################################################
# everywhere below db must be initialized with command
#	sqlite3 db $dbfile
# #######################################################

proc getColListFromTable {table} {
	set eval_str [concat SELECT * FROM \'$table\']
	set err [catch {
		db eval $eval_str v {
			set all_column_names $v(*)
			}
		} errStat ]
		if { $err } {
			dbg "we should never be here if GradesTable exists" msg_level_critical
			dbg $errStat msg_level_critical
			htmlErrorMsg $errStat
		}
	return $all_column_names	
}

proc colList2sqlColStr { col_list } {
	set sqlStr {}
	foreach col $col_list {
		if {$sqlStr ne ""} {
			set sqlStr $sqlStr,\"$col\"
		} else {
			set sqlStr \"$col\"
		}
	} 
	return $sqlStr
}
	
proc SelectColvalueFromTable { table  column_of_interest col row_value } {
	# select value of 'column_of_interest' from 'table' where 'col'='row_value'
	set value {}
	set eval_str "SELECT \"$column_of_interest\"  FROM \'$table\'  WHERE $col=:row_value"
	set err [catch {
		db eval $eval_str v {
			set value $v($column_of_interest)
		}
	} errStat ]
	if { $err } {
		set msg_text "the following error happen in proc SelectColvalueFromTable while selecting from table $table $errStat"
		htmlErrorMsg  $msg_text
		dbg  $msg_text msg_level_critical
		set $value {}
	} 
	return $value
}

proc existsColumnWithRowvalueInTable { table column row_value } {
	set sql_str [concat SELECT 1 FROM \'$table\'  WHERE \"$column\"=\"$row_value\"]
	if {![db exists $sql_str]} {
		dbg  "Column \'$column\' does not have row with value \'$row_value\' in table \'$table\'" msg_level_info
		return false
	} else {
		return true
	}
}

proc UpdateColumnWithValueInTableWhere { table column val where_column row_value } {
	set eval_str [concat UPDATE \'$table\' SET \"$column\"='$val' WHERE \"$where_column\"=\'$row_value\']
	set err [catch {db eval $eval_str  } errStat]
	if { $err } {
		set msg_str  "Unable to update column $column in the table $table where $where_column=$row_value. The following error happen: $errStat" 
		htmlErrorMsg  $msg_str
		dbg  $msg_str msg_level_critical
	} 
}

proc doesColumnExists {col  table} {
	if { $col in [getColListFromTable $table] } { 
		return true;
	} else {
		return false;
	}
}

proc DeleteColumnFromTable { table columnname } {
	if { $columnname eq "" } {
		htmlErrorMsg  "empty column names are not permitted"
	}

	if { [doesColumnExists $columnname $table] } {
		# removing the column name to be deleted from total list

		set old_column_list [getColListFromTable $table]
		set new_column_list [removeElementFromList $columnname $old_column_list]
		set sql_new_column_str [colList2sqlColStr $new_column_list]
		set eval_str "BEGIN TRANSACTION;
			CREATE TEMPORARY TABLE \'${table}_backup\'($sql_new_column_str);
			INSERT INTO \'${table}_backup\' SELECT $sql_new_column_str FROM \'${table}\';
			DROP TABLE \'${table}\';
			CREATE TABLE \'${table}\'($sql_new_column_str);
			INSERT INTO \'${table}\' SELECT $sql_new_column_str FROM \'${table}_backup\';
			DROP TABLE \'${table}_backup\';
			COMMIT;"
		set err [catch {db eval $eval_str  } errStat]
		if { $err } {
			htmlErrorMsg  $errStat 
			dbg  "the following error happen: $errStat" msg_level_critical
		} 
	} else {
		htmlErrorMsg  "No column $columnname in the table $table"
	}
}