diff --git a/APIServer.exe b/APIServer.exe index cb919b5..37b4796 100644 Binary files a/APIServer.exe and b/APIServer.exe differ diff --git a/ews/ews.go b/ews/ews.go index 63c33d0..bb4a446 100644 --- a/ews/ews.go +++ b/ews/ews.go @@ -229,30 +229,6 @@ func (e *EWS) SetUutInfo(cfg cnf.Cfg, logger *log.Logger, host string, addr stri return rst } - // stmt, err = tx.Prepare("UPDATE uutinfo SET mac=?, ipaddr=?, relay=?, item=?, status=?, message=?, partno=?, mo=?, sku=?, line=?, stage=?, last_ack=NOW(), last_change=NOW() WHERE usn=?;") - // if err != nil { - // tx.Rollback() - // logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) - // rst["RESULT"] = "NG" - // rst["ErrMsg"] = err.Error() - // return rst - // } - // defer stmt.Close() - // _, err = stmt.Exec( - // params["MAC"], - // addr, - // host, - // params["ITEM"], - // params["STATUS"], - // params["MESSAGE"], - // params["PARTNO"], - // params["MO"], - // params["SKU"], - // params["LINE"], - // params["STAGE"], - // params["USN"], - // ) - stmt, err = tx.Prepare("DELETE FROM uutinfo WHERE usn=?;") if err != nil { tx.Rollback() @@ -320,16 +296,78 @@ func (e *EWS) SetUutInfo(cfg cnf.Cfg, logger *log.Logger, host string, addr stri return rst } - //如果此USN的记录存在与uutinfo表中, 且MAC/Item/Status/Message未变化, 则更新此USN记录的ipaddr,relay,stage, 并更新last_ack栏位为当前时间 - dmlUpdate := fmt.Sprintf("UPDATE uutinfo SET ipaddr='%s', relay='%s', stage='%s', last_ack=NOW() WHERE usn='%s'", - addr, host, params["STAGE"], params["USN"]) - _, err = dbo.Exec(dmlUpdate) + //如果此USN的记录存在与uutinfo表中, 且MAC/Item/Status/Message未变化, 则更新此USN记录的ipaddr,relay,line,stage, 并更新last_ack栏位为当前时间 + //dmlUpdate := fmt.Sprintf("UPDATE uutinfo SET ipaddr='%s', relay='%s', line='%s', stage='%s', last_ack=NOW() WHERE usn='%s';", + // addr, host, params["LINE"], params["STAGE"], params["USN"]) + //2024-01-26: 使用事务模式先删除再插入此USN的记录, 避免直接使用UPDATE导致自增键seqid不更新 + + txu, err := dbo.Begin() if err != nil { logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) rst["RESULT"] = "NG" rst["ErrMsg"] = err.Error() return rst } + + stmt, err := txu.Prepare("DELETE FROM uutinfo WHERE usn=?;") + if err != nil { + txu.Rollback() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) + rst["RESULT"] = "NG" + rst["ErrMsg"] = err.Error() + return rst + } + defer stmt.Close() + _, err = stmt.Exec(ui.USN) + if err != nil { + txu.Rollback() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) + rst["RESULT"] = "NG" + rst["ErrMsg"] = err.Error() + return rst + } + + stmt, err = txu.Prepare("INSERT INTO uutinfo (usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?);") + if err != nil { + txu.Rollback() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) + rst["RESULT"] = "NG" + rst["ErrMsg"] = err.Error() + return rst + } + _, err = stmt.Exec( + ui.USN, + ui.MAC, + addr, + host, + ui.Item, + ui.Status, + ui.Message, + ui.PartNO, + ui.MfgMO, + ui.MfgSKU, + params["LINE"], + params["STAGE"], + ui.FirstAck, + ui.LastChg, + ) + if err != nil { + txu.Rollback() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) + rst["RESULT"] = "NG" + rst["ErrMsg"] = err.Error() + return rst + } + + err = txu.Commit() + if err != nil { + txu.Rollback() + logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error()) + rst["RESULT"] = "NG" + rst["ErrMsg"] = err.Error() + return rst + } + rst["RESULT"] = "OK" rst["ErrMsg"] = "Updated 1 record." return rst