DataBase.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. #include <stdio.h> /*標準輸入輸出定義*/
  2. #include <stdlib.h> /*標準函數庫定義*/
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <time.h>
  6. #include "../Config.h"
  7. #include "../Log/log.h"
  8. #include "../Define/define.h"
  9. #include "../ShareMemory/shmMem.h"
  10. //------------------------------------------------------------------------------
  11. #define DB_FILE "/Storage/ChargeLog/localCgargingRecord.db"
  12. //------------------------------------------------------------------------------
  13. static sqlite3 *localDb;
  14. static DcCommonInfo* ShmDcCommonData = NULL;
  15. //------------------------------------------------------------------------------
  16. //===============================================
  17. // SQLite3 related routine
  18. //===============================================
  19. int DB_Open(void)
  20. {
  21. int result = PASS;
  22. char *errMsg = NULL;
  23. char *createRecordSql = "CREATE TABLE IF NOT EXISTS charging_record("
  24. "idx integer primary key AUTOINCREMENT, "
  25. "reservationId text, "
  26. "transactionId text, "
  27. "startMethod text, "
  28. "userId text, "
  29. "dateTimeStart text, "
  30. "dateTimeStop text,"
  31. "socStart text, "
  32. "socStop text, "
  33. "chargeEnergy text, "
  34. "stopReason text"
  35. ");";
  36. /*char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  37. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  38. "`IsAvailable` TEXT NOT NULL, "
  39. "`connector` INTEGER NOT NULL, "
  40. "`val` TEXT NOT NULL, unique(IsAvailable,connector) on conflict replace);";
  41. */
  42. //DS60-120 add
  43. char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  44. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  45. "`item` TEXT NOT NULL, "
  46. "`connector` INTEGER NOT NULL, "
  47. "`val` TEXT NOT NULL, unique(item,connector) on conflict replace);";
  48. char *createrecordSql = "CREATE TABLE IF NOT EXISTS `event_record` ( "
  49. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  50. "`occurDatetime` TEXT NOT NULL, "
  51. "`statusCode` TEXT NOT NULL, unique(occurDatetime,statusCode) on conflict replace);";
  52. char *createrebootSql = "CREATE TABLE IF NOT EXISTS `reboot_record` ( "
  53. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  54. "`rebootDatetime` TEXT NOT NULL, unique(rebootDatetime) on conflict replace);";
  55. char *createPowerConsumption = "CREATE TABLE IF NOT EXISTS power_consumption( "
  56. "idx INTEGER PRIMARY KEY AUTOINCREMENT, "
  57. "connector TEXT, "
  58. "val TEXT);";
  59. if (sqlite3_open(DB_FILE, &localDb)) {
  60. result = FAIL;
  61. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  62. sqlite3_close(localDb);
  63. } else {
  64. log_info( "Local charging record database open successfully.");
  65. if (sqlite3_exec(localDb, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  66. result = FAIL;
  67. log_info( "Create local charging record table error message: %s", errMsg);
  68. } else {
  69. log_info( "Opened local charging record table successfully");
  70. }
  71. if (sqlite3_exec(localDb, createCfgSql, 0, 0, &errMsg) != SQLITE_OK) {
  72. result = FAIL;
  73. log_info( "Create local config table error message: %s", errMsg);
  74. } else {
  75. log_info( "Opened local config table successfully");
  76. }
  77. //DS60-120
  78. if (sqlite3_exec(localDb, createrecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  79. result = FAIL;
  80. log_info( "Create local record table error message: %s", errMsg);
  81. } else {
  82. log_info( "Opened local record table successfully");
  83. }
  84. //DS60-120
  85. if (sqlite3_exec(localDb, createPowerConsumption, 0, 0, &errMsg) != SQLITE_OK) {
  86. result = FAIL;
  87. log_info("Create power consumption record table error message: %s", errMsg);
  88. } else {
  89. log_info("Opened power consumption record table successfully");
  90. }
  91. if (sqlite3_exec(localDb, createrebootSql, 0, 0, &errMsg) != SQLITE_OK) {
  92. result = FAIL;
  93. log_info( "Create reboot record table error message: %s", errMsg);
  94. } else {
  95. log_info( "Opened reboot record table successfully");
  96. }
  97. //-----
  98. sqlite3_close(localDb);
  99. }
  100. ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData();
  101. return result;
  102. }
  103. int DB_Insert_Record(int gunIndex)
  104. {
  105. int result = PASS;
  106. char *errMsg = NULL;
  107. char insertSql[1024];
  108. struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
  109. struct OCPP16Data *ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
  110. sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
  111. "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
  112. pDcChargingInfo->ReservationId, //DS60-120 add
  113. ShmOCPP16Data->StartTransaction[gunIndex].ResponseTransactionId,
  114. pDcChargingInfo->StartMethod,
  115. pDcChargingInfo->StartUserId,
  116. pDcChargingInfo->StartDateTime,
  117. pDcChargingInfo->StopDateTime,
  118. pDcChargingInfo->EvBatteryStartSoc,
  119. pDcChargingInfo->EvBatterySoc,
  120. pDcChargingInfo->PresentChargedEnergy,
  121. ShmOCPP16Data->StopTransaction[gunIndex].StopReason);
  122. //if (sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db)) {
  123. if (sqlite3_open(DB_FILE, &localDb)) { //DS60-120 add
  124. result = FAIL;
  125. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  126. sqlite3_close(localDb);
  127. } else {
  128. //log_info( "Local charging record database open successfully.");
  129. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  130. result = FAIL;
  131. log_info( "Insert local charging record error message: %s", errMsg);
  132. } else {
  133. //log_info( "Insert local charging record successfully");
  134. }
  135. //DS60-120 add
  136. sprintf(insertSql, "delete from charging_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  137. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  138. result = FAIL;
  139. log_info( "delete local charging error message: %s", errMsg);
  140. } else {
  141. //log_info( "delete local charging record successfully");
  142. }
  143. sqlite3_close(localDb);
  144. }
  145. return result;
  146. }
  147. int DB_Update_Operactive(uint8_t gunIndex, uint8_t IsAvailable)
  148. {
  149. uint8_t result = false;
  150. char *errMsg = NULL;
  151. char sqlStr[1024];
  152. srand(time(NULL));
  153. if (sqlite3_open(DB_FILE, &localDb)) {
  154. result = FAIL;
  155. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  156. sqlite3_close(localDb);
  157. } else {
  158. log_info( "Local charging record database open successfully (%d).", IsAvailable);
  159. //sprintf(sqlStr, "insert or replace into config (IsAvailable, connector, val) values('IsAvailable', %d, %d);", gunIndex, IsAvailable);
  160. sprintf(sqlStr,
  161. "insert or replace into config (item, connector, val) values('IsAvailable', %d, %d);",
  162. gunIndex,
  163. IsAvailable); //DS60-120 add
  164. log_info("sqlStr= %s", sqlStr);
  165. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  166. result = FAIL;
  167. log_info( "update config error message: %s", errMsg);
  168. } else {
  169. log_info("update connector-%d config item isOperactive to %d", gunIndex, IsAvailable);
  170. }
  171. sqlite3_close(localDb);
  172. }
  173. return result;
  174. }
  175. int DB_Get_Operactive(uint8_t gunIndex)
  176. {
  177. uint8_t result = true;
  178. char *errMsg = NULL;
  179. char sqlStr[1024];
  180. char **rs;
  181. int rows, cols;
  182. //sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gunIndex);
  183. sprintf(sqlStr, "select * from config where item='IsAvailable' and connector=%d;", gunIndex); //DS60-120 add
  184. //DEBUG_INFO("sqlStr= %s", sqlStr);
  185. if (sqlite3_open(DB_FILE, &localDb)) {
  186. result = FAIL;
  187. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  188. sqlite3_close(localDb);
  189. } else {
  190. log_info( "Local config query database open successfully.");
  191. sqlite3_get_table(localDb, sqlStr, &rs, &rows, &cols, &errMsg);
  192. if (rows > 0) {
  193. for (int idxRow = 1; idxRow <= rows; idxRow++) {
  194. if (strcmp(rs[(idxRow * cols) + 3], "0") == 0) {
  195. result = false;
  196. }
  197. log_info("Query connector-%d isOperactive: %s", gunIndex, rs[(idxRow * cols) + 3]);
  198. }
  199. } else {
  200. log_info("Query connector-%d fail, set default value to operactive.", gunIndex);
  201. }
  202. sqlite3_free_table(rs);
  203. sqlite3_close(localDb);
  204. }
  205. return result;
  206. }
  207. int DB_Insert_PowerConsumption(uint8_t gunIndex, float energy)
  208. {
  209. uint8_t result = false;
  210. char* errMsg = NULL;
  211. char sqlStr[1024];
  212. srand(time(NULL));
  213. if (sqlite3_open(DB_FILE, &localDb)) {
  214. result = FAIL;
  215. log_info("Can't open database: %s", sqlite3_errmsg(localDb));
  216. sqlite3_close(localDb);
  217. } else {
  218. //log_info("Local charging record database open successfully (%f).", energy);
  219. sprintf(sqlStr,"insert into power_consumption (connector, val) values (%d, %f);",
  220. gunIndex,
  221. energy); //DS60-120 add
  222. //log_info("sqlStr= %s", sqlStr);
  223. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  224. result = FAIL;
  225. log_info("Insert power consumption error message: %s", errMsg);
  226. } else {
  227. log_info("Insert connector-%d config item PowerComsumption to %f", gunIndex, energy);
  228. }
  229. sqlite3_close(localDb);
  230. }
  231. return result;
  232. }
  233. int DB_Update_PowerConsumption(uint8_t gunIndex, float energy)
  234. {
  235. uint8_t result = false;
  236. char* errMsg = NULL;
  237. char sqlStr[1024];
  238. srand(time(NULL));
  239. if (sqlite3_open(DB_FILE, &localDb)) {
  240. result = FAIL;
  241. log_info("Can't open database: %s", sqlite3_errmsg(localDb));
  242. sqlite3_close(localDb);
  243. } else {
  244. //log_info("Local charging record database open successfully.");
  245. sprintf(sqlStr,"update power_consumption set val = %f where connector = %d; ",
  246. energy,
  247. gunIndex); //DS60-120 add
  248. //log_info("sqlStr= %s", sqlStr);
  249. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  250. result = FAIL;
  251. log_info("update config error message: %s", errMsg);
  252. } else {
  253. //log_info("update connector-%d config item PowerComsumption to %f", gunIndex, energy);
  254. }
  255. sqlite3_close(localDb);
  256. }
  257. return result;
  258. }
  259. int DB_Get_PowerConsumption(uint8_t gunIndex)
  260. {
  261. uint8_t result = true;
  262. char* errMsg = NULL;
  263. char sqlStr[1024];
  264. char** rs;
  265. int rows, cols;
  266. //sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gunIndex);
  267. sprintf(sqlStr, "select * from power_consumption where connector=%d;", gunIndex); //DS60-120 add
  268. //DEBUG_INFO("sqlStr= %s", sqlStr);
  269. if (sqlite3_open(DB_FILE, &localDb)) {
  270. result = FAIL;
  271. log_info("Can't open database: %s", sqlite3_errmsg(localDb));
  272. sqlite3_close(localDb);
  273. } else {
  274. log_info("Local config query database open successfully.");
  275. sqlite3_get_table(localDb, sqlStr, &rs, &rows, &cols, &errMsg);
  276. if (rows > 0) {
  277. for (int idxRow = 1; idxRow <= rows; idxRow++) {
  278. ShmDcCommonData->pGunInfo[gunIndex].PowerConsumption = atof(rs[(idxRow * cols) + 2]);
  279. log_info("Query connector-%d PowerConsumption: %s", gunIndex, rs[(idxRow * cols) + 2]);
  280. }
  281. } else {
  282. log_info("Query connector-%d fail, set default value to operactive.", gunIndex);
  283. result = false;
  284. }
  285. sqlite3_free_table(rs);
  286. sqlite3_close(localDb);
  287. }
  288. return result;
  289. }
  290. int DB_Reboot_Record(void)
  291. {
  292. int result = PASS;
  293. char *errMsg = NULL;
  294. char insertSql[256];
  295. sprintf(insertSql, "insert into reboot_record(rebootDatetime) values(CURRENT_TIMESTAMP);");
  296. if (sqlite3_open(DB_FILE, &localDb)) {
  297. result = FAIL;
  298. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  299. sqlite3_close(localDb);
  300. } else {
  301. log_info( "Local charging record database open successfully.");
  302. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  303. result = FAIL;
  304. log_info( "Insert reboot record error message: %s", errMsg);
  305. } else {
  306. log_info( "Insert reboot record successfully");
  307. }
  308. sprintf(insertSql, "delete from reboot_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  309. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  310. result = FAIL;
  311. log_info( "delete reboot record error message: %s", errMsg);
  312. } else {
  313. log_info( "delete reboot record successfully");
  314. }
  315. sqlite3_close(localDb);
  316. }
  317. return result;
  318. }
  319. //------------------------------------------------------------------------------
  320. //for Module_EventLog
  321. //------------------------------------------------------------------------------
  322. int CreateEventRecord(void)
  323. {
  324. int result = PASS;
  325. char *errMsg = NULL;
  326. char *createRecordSql = "CREATE TABLE IF NOT EXISTS event_record("
  327. "idx integer primary key AUTOINCREMENT, "
  328. "occurDatetime text NOT NULL, "
  329. "statusCode text NOT NULL"
  330. ");";
  331. if (sqlite3_open(DB_FILE, &localDb)) {
  332. result = FAIL;
  333. log_error( "Can't open database: %s", sqlite3_errmsg(localDb));
  334. sqlite3_close(localDb);
  335. } else {
  336. log_info( "Local event record database open successfully.");
  337. if (sqlite3_exec(localDb, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  338. result = FAIL;
  339. log_error( "Create local event record table error message: %s", errMsg);
  340. } else {
  341. log_info( "Opened local event record table successfully");
  342. }
  343. sqlite3_close(localDb);
  344. }
  345. return result;
  346. }
  347. int InsertEventRecord(uint8_t *statusCode)
  348. {
  349. int result = PASS;
  350. char *errMsg = NULL;
  351. char sqlStr[1024] = {0};
  352. sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
  353. if (sqlite3_open(DB_FILE, &localDb)) {
  354. result = FAIL;
  355. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  356. sqlite3_close(localDb);
  357. } else {
  358. //log_info( "Local event record database open successfully.");
  359. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  360. result = FAIL;
  361. log_info( "Insert local event record error message: %s", errMsg);
  362. } else {
  363. //log_info( "Insert local event record successfully");
  364. }
  365. sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
  366. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  367. result = FAIL;
  368. log_info( "delete local event_record error message: %s", errMsg);
  369. } else {
  370. //log_info( "delete local event record successfully");
  371. }
  372. sqlite3_close(localDb);
  373. }
  374. return result;
  375. }