diff options
Diffstat (limited to 'did-model.lua')
-rw-r--r-- | did-model.lua | 82 |
1 files changed, 70 insertions, 12 deletions
diff --git a/did-model.lua b/did-model.lua index 03f4e98..0bb88c2 100644 --- a/did-model.lua +++ b/did-model.lua @@ -358,6 +358,54 @@ local updaterules = function(did, rules) return res end +local testrules = function(rules) + local success = true + local errtxt + local entries = {} + local res, err = pcall(function() + local sql = "CREATE TEMP TABLE testing (did character varying(40) NOT NULL, extension character varying(40) NOT NULL, starttime time without time zone, endtime time without time zone, startdate date, enddate date, dayofweek bit(7))" + assert (con:execute(sql)) + for i,rule in ipairs(rules) do + sql = {} + sql[1] = "INSERT INTO testing (" + sql[3] = ") VALUES (" + sql[5] = ")" + names = {} + vals = {} + for name,val in pairs(rule) do + if val and val ~= "" then + names[#names+1] = escape(name) + vals[#vals+1] = "'"..escape(val).."'" + end + end + sql[2] = table.concat(names, ", ") + sql[4] = table.concat(vals, ", ") + sql = table.concat(sql, "") + res = assert (con:execute(sql)) + end + + sql = "SELECT * FROM testing ORDER BY did, startdate ASC NULLS FIRST, enddate DESC NULLS FIRST, dayofweek ASC, starttime ASC NULLS FIRST, endtime DESC NULLS FIRST" + local cur = assert (con:execute(sql)) + local row = cur:fetch ({}, "a") + while row do + entries[#entries+1] = {did=row.did, extension=row.extension, starttime=row.starttime, endtime=row.endtime, startdate=row.startdate, enddate=row.enddate, dayofweek=row.dayofweek} + row = cur:fetch (row, "a") + end + -- close everything + cur:close() + end) + if not res then + success = false + entries = rules + errtxt = string.gsub(err or "", "\n.*", "") + end + local res, err = pcall(function() + local sql = "DROP TABLE testing" + assert (con:execute(sql)) + end) + return success, errtxt, entries +end + -- Put the given rules into pubdid local publishrules = function(did, rules) -- mark all rules for this did as stale, add in new ones, and delete the stale ones @@ -513,30 +561,30 @@ local function validaterules(rules) local connected = databaseconnect(DatabaseUser) for i,rule in ipairs(rules) do if not validator.is_integer(rule.did) then - errtxt[#errtxt+1] = "Rule #"..i..": DID is not a valid number" + errtxt[#errtxt+1] = "Rule "..i..": DID is not a valid number" end if rule.extension == "" or string.find(rule.extension, "[^%d#%*]") then - errtxt[#errtxt+1] = "Rule #"..i..": Extension is not a valid number" + errtxt[#errtxt+1] = "Rule "..i..": Extension is not a valid number" end local res,err if rule.starttime ~= "" then res,err,rule.starttime = convertdatabaseentry("TIME", rule.starttime) - if not res then errtxt[#errtxt+1] = "Rule #"..i..": StartTime "..err end + if not res then errtxt[#errtxt+1] = "Rule "..i..": StartTime "..err end end if rule.endtime ~= "" then res,err,rule.endtime = convertdatabaseentry("TIME", rule.endtime) - if not res then errtxt[#errtxt+1] = "Rule #"..i..": EndTime "..err end + if not res then errtxt[#errtxt+1] = "Rule "..i..": EndTime "..err end end if rule.startdate ~= "" then res,err,rule.startdate = convertdatabaseentry("DATE", rule.startdate) - if not res then errtxt[#errtxt+1] = "Rule #"..i..": StartDate "..err end + if not res then errtxt[#errtxt+1] = "Rule "..i..": StartDate "..err end end if rule.enddate ~= "" then res,err,rule.enddate = convertdatabaseentry("DATE", rule.enddate) - if not res then errtxt[#errtxt+1] = "Rule #"..i..": EndDate "..err end + if not res then errtxt[#errtxt+1] = "Rule "..i..": EndDate "..err end end if #rule.dayofweek ~= 7 or string.find(rule.dayofweek, "[^01]") then - errtxt[#errtxt+1] = "Rule #"..i..": DayOfWeek invalid entry" + errtxt[#errtxt+1] = "Rule "..i..": DayOfWeek invalid entry" end end if connected then databasedisconnect() end @@ -751,7 +799,7 @@ function getdefinition(did) end -- If exists true, then make sure exists first, if false or undefined, make sure doesn't exist -function savedefinition(defin, exists) +function savedefinition(defin, test, exists) -- remove blank entries, if present defin.value.rules.value = string.gsub("\n"..format.dostounix(defin.value.rules.value), "\n%s*,%s*,%s*,%s*,%s*,%s*0000000", "") defin.value.rules.value = string.gsub(defin.value.rules.value, "$\n", "") @@ -763,7 +811,11 @@ function savedefinition(defin, exists) defin.value.rules.value = formatrules(rules) defin.value.rules.errtxt = errtxt success = validatedefinition(defin) and success - defin.errtxt = "Failed to save definition" + if test then + defin.errtxt = "Failed test for DID" + else + defin.errtxt = "Failed to save DID" + end if success then local definition = {} for name,val in pairs(defin.value) do @@ -772,7 +824,7 @@ function savedefinition(defin, exists) local res, err = pcall(function() local connected - if not exists then + if not test and not exists then databasedisconnect() local pw = format.parse_ini_file(fs.read_file(configfile) or "", "", "password") or "" connected = databaseconnect(DatabaseOwner, pw) @@ -784,6 +836,12 @@ function savedefinition(defin, exists) defin.value.did.errtxt = "DID Number already exists" elseif #def == 0 and exists then defin.value.did.errtxt = "DID Number does not exist" + elseif test then + success, defin.value.rules.errtxt, rules = testrules(rules) + defin.value.rules.value = formatrules(rules) + if success then + defin.errtxt = "Passed test for DID" + end else local descr = {} descr[#descr+1] = describechange(def[1], definition) @@ -817,8 +875,8 @@ function savedefinition(defin, exists) return defin end -function updatedefinition(defin) - return savedefinition(defin, true) +function updatedefinition(defin, test) + return savedefinition(defin, test, true) end function deletedefinition(did) |