Транзакционность при коротких сессиях с БД не требуется, все в одну операцию.
[weathermon.git] / bin / weathermon
index ade5bfaa3f4cd80a468daaea58cecd6b3e75558a..c789bea38b9fe09aed645bcfc8a69d6d49829e88 100755 (executable)
@@ -89,6 +89,14 @@ function printLog(str)
   end 
 end
 
   end 
 end
 
+function unlock_db(file)
+
+  print("Unlocking DB "..file)
+  os.execute("sqlite3 -readonly \""..file.."\" \".backup /tmp/weathermon.db\"")
+  os.execute("mv /tmp/weathermon.db \""..file.."\"")
+
+end
+
 function submitValue(type,id,param,val)
 
   val = tonumber(val)
 function submitValue(type,id,param,val)
 
   val = tonumber(val)
@@ -103,15 +111,30 @@ function submitValue(type,id,param,val)
 
     local result,code = http.request (url)
 
 
     local result,code = http.request (url)
 
-    if code ~= 200 and backlog_con then
+    if code ~= 200 and backlogdb then
       printLog("writing record to backlog...")
       printLog("writing record to backlog...")
-      backlog_con:execute(string.format("INSERT INTO queue(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+      local backlog_con = assert(env:connect(backlogdb))
+      local n,err = backlog_con:execute(string.format("INSERT INTO queue(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+      backlog_con:close()
+      
+      if err == "LuaSQL: database is locked" then
+        unlock_db(backlogdb);
+      end
+      
     end
 
   end
   
   if logdb then
     end
 
   end
   
   if logdb then
-    log_con:execute(string.format("INSERT INTO log(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+    print(logdb)
+    local log_con = assert(env:connect(logdb))
+    local n,err = log_con:execute(string.format("INSERT INTO log(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val))
+    log_con:close()
+
+    if err == "LuaSQL: database is locked" then
+      unlock_db(logdb);
+    end
+
   end
 
 end
   end
 
 end
@@ -157,9 +180,6 @@ function processJson(str)
   end
 
   if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then
   end
 
   if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then
-    if next(sensor)==nil then
-      sensor["command"]="alarm"
-    end
     local record = {}
     for k,v in pairs(sensor) do
       storeRecord(sensor_id,sensor_type,k,v)
     local record = {}
     for k,v in pairs(sensor) do
       storeRecord(sensor_id,sensor_type,k,v)
@@ -248,6 +268,9 @@ function processLine(str)
                 return '{'..name..'}'
               end      
             end)
                 return '{'..name..'}'
               end      
             end)
+          if not mqtt_client:socket() then
+            mqtt_client:reconnect()
+          end  
           mqtt_client:publish(mqtt_path,v,0,false)
           mqtt_client:loop()
         end  
           mqtt_client:publish(mqtt_path,v,0,false)
           mqtt_client:loop()
         end  
@@ -289,6 +312,9 @@ function processLine(str)
               return '{'..name..'}'
             end      
           end)
               return '{'..name..'}'
             end      
           end)
+        if not mqtt_client:socket() then
+          mqtt_client:reconnect()
+        end  
         mqtt_client:publish(mqtt_path,msg_body,0,false)
         mqtt_client:loop()
       end
         mqtt_client:publish(mqtt_path,msg_body,0,false)
         mqtt_client:loop()
       end
@@ -330,17 +356,19 @@ if backlogdb then
   if not file_exists(backlogdb) then
     touch(backlogdb)
   end  
   if not file_exists(backlogdb) then
     touch(backlogdb)
   end  
-  backlog_con = assert(env:connect(backlogdb))
+  local backlog_con = assert(env:connect(backlogdb))
   backlog_con:execute("CREATE TABLE queue(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
   backlog_con:execute("CREATE TABLE queue(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
+  backlog_con:close()
 end
 
 if logdb then
   if not file_exists(logdb) then
     touch(logdb)
   end  
 end
 
 if logdb then
   if not file_exists(logdb) then
     touch(logdb)
   end  
-  log_con = assert(env:connect(logdb))
+  local log_con = assert(env:connect(logdb))
   log_con:execute("CREATE TABLE log(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
   log_con:execute("CREATE INDEX log_idx ON log(sensor_id,sensor,param,time_stamp)")
   log_con:execute("CREATE TABLE log(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)")
   log_con:execute("CREATE INDEX log_idx ON log(sensor_id,sensor,param,time_stamp)")
+  log_con:close()
 end
 
 if web_url then
 end
 
 if web_url then
@@ -382,7 +410,7 @@ while 1 do
     break
   end
 
     break
   end
 
-  pcall(function ()
+--  pcall(function ()
   
     printLog("Received: "..line)
     if startswith(line,'{') then
   
     printLog("Received: "..line)
     if startswith(line,'{') then
@@ -405,6 +433,6 @@ while 1 do
         io.close(f)
       end)  
     end
         io.close(f)
       end)  
     end
-  end)
+--  end)
     
 end
     
 end