diff --git a/webif/lib/settings.class b/webif/lib/settings.class index 05361dd..f5edda2 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -54,6 +54,28 @@ class settings { rtschedule 0 } +proc {settings _safer_query} { queryText args } { + global settingsdb + + # allow 4 tries from 0.5s delay, doubling, to get access + for {set lockCnt 4; set delay 0.5} {true} {sleep $delay; set delay $(2*$delay)} { + try { + return [$settingsdb query $queryText {*}$args] + } on error {msg opts} { + if {[string first "database is locked" $msg] >= 0} { + if {[incr lockCnt -1] > 0} { + continue + } else { + # raise error from caller + set msg "Persistently unable to access Settings: database locked" + incr opts(-level) + } + } + return {*}$opts $msg + } + } +} + settings method hostname {{name ""}} { if {$name == ""} { # Get @@ -104,11 +126,10 @@ settings method smtp_server {{server ""}} { } settings method _nval_setting {name {val -1}} { - global settingsdb if {$val == -1} { # Get - set res [$settingsdb query " + set res [settings _safer_query " select nval from settings where name = '$name' "] @@ -118,7 +139,7 @@ settings method _nval_setting {name {val -1}} { return 0 } else { # Set - $settingsdb query " + settings _safer_query " replace into settings(name,nval) values('$name', $val) " @@ -127,11 +148,10 @@ settings method _nval_setting {name {val -1}} { } settings method _tval_setting {name {val -1} {def 0}} { - global settingsdb if {$val eq "-1"} { # Get - set res [$settingsdb query " + set res [settings _safer_query " select tval from settings where name = '$name' "] @@ -141,7 +161,7 @@ settings method _tval_setting {name {val -1} {def 0}} { return $def } else { # Set - $settingsdb query " + settings _safer_query " replace into settings(name,tval) values('$name', '%s') " $val