1 # vim: ft=tcl foldmarker=<<<,>>>
3 # some examples of how to use the settings on the datasource_sql:
4 # variable lookup_query <<<
5 # variable lookup_query "select
15 # tablename='%table%';"
17 # variable insert_query <<<
18 # variable insert_query "insert into foo (
34 # variable update_query <<<
35 # variable update_query "update foo set
36 # schema = '%schema%',
37 # tableowner = '%owner%',
38 # hasindexes = '%indexed%',
39 # hasrules = '%ruled%',
40 # hastriggers = '%hastriggers%'
42 # tablename = '%%table%%';"
44 # variable delete_query <<<
45 # variable delete_query "delete from foo
47 # tablename = '%tablename%'"
49 # variable full_row_query <<<
50 # variable full_row_query "select *
53 # where tablename=%id%"
56 class tlc
::Datasource_sql {
57 inherit tlc
::Datasource
59 constructor
{args
} {} {}
62 # overridden inherited Datasource class interface
66 variable lookup_query
"" {check_and_allow
"lookup"}
67 variable insert_query
"" {check_and_allow
"insert"}
68 variable update_query
"" {check_and_allow
"update"}
69 variable delete_query
"" {check_and_allow
"delete"}
70 variable full_row_query
""
72 method get_list
{{new_criteria_values
""} {headersvar
{}}}
73 method add_item
{row
{col_list
""}}
74 method update_item
{oldrow newrow
{old_col_list
""}
76 method remove_item
{row
{rowmap
""}}
78 method get_full_row
{id
}
80 # specific Datasource_sql interface
87 method check_and_allow
{action
}
91 body tlc
::Datasource_sql::constructor {args
} { #<<<1
92 package require Pg_sql
94 set valid_queries
{lookup insert
update delete
}
98 if {![info exists sql_obj
]} {
99 error "Must give -sql_obj"
106 body tlc
::Datasource_sql::get_list {{new_criteria_values
""} {headersvar
{}}} { #<<<1
107 # inputs: optional new_criteria_values to replace the existing criteria list
108 # the penalty of just getting the headers and caching them for later use is only 100 microseconds, on
109 # a time loop -- so we might as well, for convenience sake, just cache the headers
111 if {$new_criteria_values != ""} {
112 set criteria_values
$new_criteria_values
113 array set acriteria_values
$new_criteria_values
116 foreach {idx val
} [array get criteria_values
] {
117 set criteria_values
($idx) [$sql quote
$val]
120 set sql_string
[replace_criteria
$lookup_query $criteria_values]
121 if {$headersvar=={}} {
122 set ret
[$sql getlist_headers
$sql_string last_headers
]
124 upvar $headersvar lheaders
125 set ret
[$sql getlist_headers
$sql_string lheaders
]
126 set last_headers
$lheaders
131 body tlc
::Datasource_sql::add_item {row
{col_list
""}} { #<<<1
132 # inputs: an array-style list of columns to update -- should be the full set specified in the insert_query token list
133 # optionally, the row data may be specified as a list, with the columns specified afterward
134 # returns: 1 on success, 0 on fail
136 set row
[resolve_row
$row $col_list]
138 set sql_string
[replace_criteria
$insert_query $row]
139 return [$sql getlist
$sql_string]
142 body tlc
::Datasource_sql::update_item {oldrow newrow
{old_col_list
""} {new_col_list
""}} { #<<<1
143 # inputs: two array-style lists: 1) the old row and 2) the new version. Both lists should contain all
144 # tokens and values that would need to be used in update_sql
145 if {$old_col_list!=""} {
146 set oldrow
[resolve_row
$oldrow $old_col_list]
148 if {$new_col_list!=""} {
149 set newrow
[resolve_row
$newrow $new_col_list]
153 foreach {idx val
} $oldrow {
154 lappend loldrow
"!${idx}!" "$val"
156 set sql_string
[replace_criteria
$update_query [concat $loldrow $newrow]]
157 return [$sql getlist
$sql_string]
160 body tlc
::Datasource_sql::remove_item {row
{col_list
""}} { #<<<1
161 # inputs: array-style list that defines the row to be removed adequately to make the delete_query complete
163 set row
[resolve_row
$row $col_list]
165 set sql_string
[replace_criteria
$delete_query $row]
166 return [$sql getlist
$sql_string]
169 body tlc
::Datasource_sql::get_headers {} { #<<<1
173 body tlc
::Datasource_sql::get_full_row {id
} { #<<<1
174 set query
[replace_criteria
$full_row_query [list "id" "$id"]]
176 set row
[lindex [$sql getlist_headers
$query lheaders
] 0]
178 foreach col
$lheaders field
$row {
179 lappend ret
$col $field
184 body tlc
::Datasource_sql::check_and_allow {action
} { #<<<1
185 can_do
$action [info exists
${action
}_query
]
186 if {[string trim
${action
}_query
] == ""} {
187 invoke_handlers debug
"WARNING: $action query is empty."