DataBase.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  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. #define DEDUCT_FILE "/Storage/ChargeLog/CreditCardRecord.db"
  13. #define POWER_FILE "/Storage/ChargeLog/PowerConsumption.db"
  14. //------------------------------------------------------------------------------
  15. static sqlite3 *localDb;
  16. static sqlite3 *deductDb;
  17. static sqlite3* powerDb;
  18. static DcCommonInfo* ShmDcCommonData = NULL;
  19. //------------------------------------------------------------------------------
  20. //===============================================
  21. // SQLite3 related routine
  22. //===============================================
  23. int DB_Open(void)
  24. {
  25. int result = PASS;
  26. char *errMsg = NULL;
  27. char *createRecordSql = "CREATE TABLE IF NOT EXISTS charging_record("
  28. "idx integer primary key AUTOINCREMENT, "
  29. "reservationId text, "
  30. "transactionId text, "
  31. "startMethod text, "
  32. "userId text, "
  33. "dateTimeStart text, "
  34. "dateTimeStop text,"
  35. "socStart text, "
  36. "socStop text, "
  37. "chargeEnergy text, "
  38. "stopReason text"
  39. ");";
  40. /*char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  41. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  42. "`IsAvailable` TEXT NOT NULL, "
  43. "`connector` INTEGER NOT NULL, "
  44. "`val` TEXT NOT NULL, unique(IsAvailable,connector) on conflict replace);";
  45. */
  46. //DS60-120 add
  47. char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  48. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  49. "`item` TEXT NOT NULL, "
  50. "`connector` INTEGER NOT NULL, "
  51. "`val` TEXT NOT NULL, unique(item,connector) on conflict replace);";
  52. char *createrecordSql = "CREATE TABLE IF NOT EXISTS `event_record` ( "
  53. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  54. "`occurDatetime` TEXT NOT NULL, "
  55. "`statusCode` TEXT NOT NULL, unique(occurDatetime,statusCode) on conflict replace);";
  56. char *createrebootSql = "CREATE TABLE IF NOT EXISTS `reboot_record` ( "
  57. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  58. "`rebootDatetime` TEXT NOT NULL, unique(rebootDatetime) on conflict replace);";
  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. if (sqlite3_exec(localDb, createrebootSql, 0, 0, &errMsg) != SQLITE_OK) {
  85. result = FAIL;
  86. log_info( "Create reboot record table error message: %s", errMsg);
  87. } else {
  88. log_info( "Opened reboot record table successfully");
  89. }
  90. //-----
  91. sqlite3_close(localDb);
  92. }
  93. ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData();
  94. return result;
  95. }
  96. int DB_Insert_Record(int gunIndex)
  97. {
  98. int result = PASS;
  99. char *errMsg = NULL;
  100. char insertSql[1024];
  101. struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
  102. struct OCPP16Data *ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
  103. sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
  104. "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
  105. pDcChargingInfo->ReservationId, //DS60-120 add
  106. ShmOCPP16Data->StartTransaction[gunIndex].ResponseTransactionId,
  107. pDcChargingInfo->StartMethod,
  108. pDcChargingInfo->StartUserId,
  109. pDcChargingInfo->StartDateTime,
  110. pDcChargingInfo->StopDateTime,
  111. pDcChargingInfo->EvBatteryStartSoc,
  112. pDcChargingInfo->EvBatterySoc,
  113. pDcChargingInfo->PresentChargedEnergy,
  114. ShmOCPP16Data->StopTransaction[gunIndex].StopReason);
  115. //if (sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db)) {
  116. if (sqlite3_open(DB_FILE, &localDb)) { //DS60-120 add
  117. result = FAIL;
  118. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  119. sqlite3_close(localDb);
  120. } else {
  121. //log_info( "Local charging record database open successfully.");
  122. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  123. result = FAIL;
  124. log_info( "Insert local charging record error message: %s", errMsg);
  125. } else {
  126. //log_info( "Insert local charging record successfully");
  127. }
  128. //DS60-120 add
  129. sprintf(insertSql, "delete from charging_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  130. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  131. result = FAIL;
  132. log_info( "delete local charging error message: %s", errMsg);
  133. } else {
  134. //log_info( "delete local charging record successfully");
  135. }
  136. sqlite3_close(localDb);
  137. }
  138. return result;
  139. }
  140. int DB_Update_Operactive(uint8_t gunIndex, uint8_t IsAvailable)
  141. {
  142. uint8_t result = false;
  143. char *errMsg = NULL;
  144. char sqlStr[1024];
  145. srand(time(NULL));
  146. if (sqlite3_open(DB_FILE, &localDb)) {
  147. result = FAIL;
  148. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  149. sqlite3_close(localDb);
  150. } else {
  151. log_info( "Local charging record database open successfully (%d).", IsAvailable);
  152. //sprintf(sqlStr, "insert or replace into config (IsAvailable, connector, val) values('IsAvailable', %d, %d);", gunIndex, IsAvailable);
  153. sprintf(sqlStr,
  154. "insert or replace into config (item, connector, val) values('IsAvailable', %d, %d);",
  155. gunIndex,
  156. IsAvailable); //DS60-120 add
  157. log_info("sqlStr= %s", sqlStr);
  158. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  159. result = FAIL;
  160. log_info( "update config error message: %s", errMsg);
  161. } else {
  162. log_info("update connector-%d config item isOperactive to %d", gunIndex, IsAvailable);
  163. }
  164. sqlite3_close(localDb);
  165. }
  166. return result;
  167. }
  168. int DB_Get_Operactive(uint8_t gunIndex)
  169. {
  170. uint8_t result = true;
  171. char *errMsg = NULL;
  172. char sqlStr[1024];
  173. char **rs;
  174. int rows, cols;
  175. //sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gunIndex);
  176. sprintf(sqlStr, "select * from config where item='IsAvailable' and connector=%d;", gunIndex); //DS60-120 add
  177. //DEBUG_INFO("sqlStr= %s", sqlStr);
  178. if (sqlite3_open(DB_FILE, &localDb)) {
  179. result = FAIL;
  180. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  181. sqlite3_close(localDb);
  182. } else {
  183. log_info( "Local config query database open successfully.");
  184. sqlite3_get_table(localDb, sqlStr, &rs, &rows, &cols, &errMsg);
  185. if (rows > 0) {
  186. for (int idxRow = 1; idxRow <= rows; idxRow++) {
  187. if (strcmp(rs[(idxRow * cols) + 3], "0") == 0) {
  188. result = false;
  189. }
  190. log_info("Query connector-%d isOperactive: %s", gunIndex, rs[(idxRow * cols) + 3]);
  191. }
  192. } else {
  193. log_info("Query connector-%d fail, set default value to operactive.", gunIndex);
  194. }
  195. sqlite3_free_table(rs);
  196. sqlite3_close(localDb);
  197. }
  198. return result;
  199. }
  200. int DB_Reboot_Record(void)
  201. {
  202. int result = PASS;
  203. char *errMsg = NULL;
  204. char insertSql[256];
  205. sprintf(insertSql, "insert into reboot_record(rebootDatetime) values(CURRENT_TIMESTAMP);");
  206. if (sqlite3_open(DB_FILE, &localDb)) {
  207. result = FAIL;
  208. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  209. sqlite3_close(localDb);
  210. } else {
  211. log_info( "Local charging record database open successfully.");
  212. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  213. result = FAIL;
  214. log_info( "Insert reboot record error message: %s", errMsg);
  215. } else {
  216. log_info( "Insert reboot record successfully");
  217. }
  218. sprintf(insertSql, "delete from reboot_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  219. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  220. result = FAIL;
  221. log_info( "delete reboot record error message: %s", errMsg);
  222. } else {
  223. log_info( "delete reboot record successfully");
  224. }
  225. sqlite3_close(localDb);
  226. }
  227. return result;
  228. }
  229. //------------------------------------------------------------------------------
  230. //for Module_EventLog
  231. //------------------------------------------------------------------------------
  232. int CreateEventRecord(void)
  233. {
  234. int result = PASS;
  235. char *errMsg = NULL;
  236. char *createRecordSql = "CREATE TABLE IF NOT EXISTS event_record("
  237. "idx integer primary key AUTOINCREMENT, "
  238. "occurDatetime text NOT NULL, "
  239. "statusCode text NOT NULL"
  240. ");";
  241. if (sqlite3_open(DB_FILE, &localDb)) {
  242. result = FAIL;
  243. log_error( "Can't open database: %s", sqlite3_errmsg(localDb));
  244. sqlite3_close(localDb);
  245. } else {
  246. log_info( "Local event record database open successfully.");
  247. if (sqlite3_exec(localDb, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  248. result = FAIL;
  249. log_error( "Create local event record table error message: %s", errMsg);
  250. } else {
  251. log_info( "Opened local event record table successfully");
  252. }
  253. sqlite3_close(localDb);
  254. }
  255. return result;
  256. }
  257. int InsertEventRecord(uint8_t *statusCode)
  258. {
  259. int result = PASS;
  260. char *errMsg = NULL;
  261. char sqlStr[1024] = {0};
  262. sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
  263. if (sqlite3_open(DB_FILE, &localDb)) {
  264. result = FAIL;
  265. log_info( "Can't open database: %s", sqlite3_errmsg(localDb));
  266. sqlite3_close(localDb);
  267. } else {
  268. //log_info( "Local event record database open successfully.");
  269. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  270. result = FAIL;
  271. log_info( "Insert local event record error message: %s", errMsg);
  272. } else {
  273. //log_info( "Insert local event record successfully");
  274. }
  275. sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
  276. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  277. result = FAIL;
  278. log_info( "delete local event_record error message: %s", errMsg);
  279. } else {
  280. //log_info( "delete local event record successfully");
  281. }
  282. sqlite3_close(localDb);
  283. }
  284. return result;
  285. }
  286. void CreditCardTimeSet(char *_time, RecordTransactionInfo* deductInfo)
  287. {
  288. _time[0] = '2';
  289. _time[1] = '0';
  290. _time[2] = (char)deductInfo->pCreditCard.TransDate[0];
  291. _time[3] = (char)deductInfo->pCreditCard.TransDate[1];
  292. _time[4] = '-';
  293. _time[5] = (char)deductInfo->pCreditCard.TransDate[2];
  294. _time[6] = (char)deductInfo->pCreditCard.TransDate[3];
  295. _time[7] = '-';
  296. _time[8] = (char)deductInfo->pCreditCard.TransDate[4];
  297. _time[9] = (char)deductInfo->pCreditCard.TransDate[5];
  298. _time[10] = ' ';
  299. _time[11] = (char)deductInfo->pCreditCard.TransTime[0];
  300. _time[12] = (char)deductInfo->pCreditCard.TransTime[1];
  301. _time[13] = ':';
  302. _time[14] = (char)deductInfo->pCreditCard.TransTime[2];
  303. _time[15] = (char)deductInfo->pCreditCard.TransTime[3];
  304. _time[16] = ':';
  305. _time[17] = (char)deductInfo->pCreditCard.TransTime[4];
  306. _time[18] = (char)deductInfo->pCreditCard.TransTime[5];
  307. _time[19] = '\0';
  308. }
  309. int DeductDB_Open(void)
  310. {
  311. int result = PASS;
  312. char* errMsg = NULL;
  313. char* createDeductInfoSql="CREATE TABLE IF NOT EXISTS report_credit_deduct("
  314. "idx integer primary key AUTOINCREMENT, "
  315. "gun_index text, "
  316. "reportDate text, "
  317. "vemData text, "
  318. "txId text, "
  319. "creditNo text, "
  320. "amount text, "
  321. "storeId text, "
  322. "approvalNo text, "
  323. "RRN text, "
  324. "ROC text, "
  325. "isDonateInvoice text, "
  326. "isDeductResult text, "
  327. "isIntoCharge text, "
  328. "isUpload text, "
  329. "lineSn text, "
  330. "Energy text, "
  331. "RedeductTime "
  332. ");";
  333. if(sqlite3_open(DEDUCT_FILE, &deductDb))
  334. {
  335. result = FAIL;
  336. log_info("Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  337. sqlite3_close(deductDb);
  338. }
  339. else
  340. {
  341. //log_info("Deduct database open successfully.");
  342. if (sqlite3_exec(deductDb, createDeductInfoSql, 0, 0, &errMsg) != SQLITE_OK)
  343. {
  344. result = FAIL;
  345. log_info("Create deduct info table error message: %s", errMsg);
  346. }
  347. else
  348. {
  349. log_info("Opened deduct info table successfully");
  350. }
  351. sqlite3_close(deductDb);
  352. }
  353. return result;
  354. }
  355. int InsertDeductInfo(int gunIndex, RecordTransactionInfo *deductInfo)
  356. {
  357. int result = PASS;
  358. char *errMsg = NULL;
  359. char sqlStr[1024] = {0};
  360. char approNo[13];
  361. char carNo[21];
  362. char vemData[65];
  363. char storeId[18];
  364. char RRN[12];
  365. char ROC[12];
  366. char lineSn[20];
  367. char _time[20];
  368. memset(approNo, '\0', sizeof(approNo));
  369. memset(carNo, '\0', sizeof(carNo));
  370. memset(vemData, '\0', sizeof(vemData));
  371. memset(storeId, '\0', sizeof(storeId));
  372. memset(RRN, '\0', sizeof(RRN));
  373. memset(ROC, '\0', sizeof(ROC));
  374. memset(lineSn, '\0', sizeof(lineSn));
  375. strncpy(approNo, (char *)&deductInfo->pCreditCard.ApprovalNo,9);
  376. strncpy(carNo, (char *)&deductInfo->pCreditCard.CardNo,20);
  377. strncpy(vemData, (char *)&deductInfo->pCreditCard.VemData,64);
  378. strncpy(storeId, (char *)&deductInfo->pCreditCard.StoreId,18 );
  379. strncpy(RRN,(char *)&deductInfo->pCreditCard.RRN,12);
  380. strncpy(ROC,(char *)&deductInfo->pCreditCard.ROC,12);
  381. CreditCardTimeSet(&_time[0], deductInfo);
  382. //sprintf(reportDate, "%s%s", deductInfo->pCreditCard.TransDate, deductInfo->pCreditCard.TransTime);
  383. sprintf(sqlStr, "insert into report_credit_deduct(gun_index, reportDate, vemData, txId, creditNo, amount, storeId, approvalNo, RRN, ROC, isDonateInvoice, isDeductResult, isIntoCharge, isUpload, lineSn, Energy, RedeductTime) "
  384. "values('%d', '%s', '%s', '%d', '%s', '%.1f', '%s', '%s', '%s', '%s', '%d', '%d', '%d' , '%d', '%d', '%.4f', '%d');",
  385. gunIndex,
  386. _time,
  387. vemData,
  388. deductInfo->TransactionId,
  389. carNo,
  390. deductInfo->Amount,
  391. storeId,
  392. approNo,
  393. RRN,
  394. ROC,
  395. (int)deductInfo->IsDonateInvoice,
  396. (int)deductInfo->DeductResult,
  397. (int)deductInfo->isIntoCharge,
  398. (int)deductInfo->IsUpload,
  399. deductInfo->LineStatus,
  400. deductInfo->Energy,
  401. deductInfo->RedeductTime);
  402. //log_info("%s",sqlStr);
  403. if (sqlite3_open(DEDUCT_FILE, &deductDb))
  404. {
  405. result = FAIL;
  406. log_info( "Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  407. sqlite3_close(deductDb);
  408. }
  409. else
  410. {
  411. //log_info( "Local event record database open successfully.");
  412. if (sqlite3_exec(deductDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  413. {
  414. result = FAIL;
  415. log_info( "Insert deduct record error message: %s", errMsg);
  416. }
  417. else
  418. {
  419. //log_info( "Insert local event record successfully");
  420. }
  421. sprintf(sqlStr, "delete from report_credit_deduct where idx < (select idx from report_credit_deduct order by idx desc limit 1)-10000;");
  422. if (sqlite3_exec(deductDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  423. {
  424. result = FAIL;
  425. log_info("delete deduct record error message: %s", errMsg);
  426. }
  427. else
  428. {
  429. //log_info("delete local charging record successfully");
  430. }
  431. sqlite3_close(deductDb);
  432. }
  433. return result;
  434. }
  435. int UpdateDeductInfoStatus(int gunIndex, RecordTransactionInfo *deductInfo)
  436. {
  437. int result = PASS;
  438. char *errMsg = NULL;
  439. char sqlStr[1024] = {0};
  440. char vemData[65] = {0};
  441. memset(vemData, '\0', 65);
  442. strncpy(vemData, (char*)&deductInfo->pCreditCard.VemData,64);
  443. sprintf(sqlStr, "update report_credit_deduct set isUpload = %d , isIntoCharge = %d, amount = %.1f, txId = %d, isDeductResult = %d, Energy = %.4f, lineSn = %d, RedeductTime = %d where vemData = '%s'; ",
  444. (int)deductInfo->IsUpload,
  445. (int)deductInfo->isIntoCharge,
  446. deductInfo->Amount,
  447. deductInfo->TransactionId,
  448. (int)deductInfo->DeductResult,
  449. deductInfo->Energy,
  450. deductInfo->LineStatus,
  451. deductInfo->RedeductTime,
  452. vemData);
  453. //log_info("%s",sqlStr);
  454. if (sqlite3_open(DEDUCT_FILE, &deductDb))
  455. {
  456. result = FAIL;
  457. log_info( "Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  458. sqlite3_close(deductDb);
  459. }
  460. else
  461. {
  462. //log_info( "Local event record database open successfully.");
  463. if (sqlite3_exec(deductDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  464. {
  465. result = FAIL;
  466. log_info( "update deduct record error message: %s!", errMsg);
  467. }
  468. else
  469. {
  470. //log_info( "update deduct record successfully");
  471. }
  472. sqlite3_close(deductDb);
  473. }
  474. return result;
  475. }
  476. int UpdateRedeuctBill(int Txid,float amount)
  477. {
  478. int result = PASS;
  479. char* errMsg = NULL;
  480. char sqlStr[1024] = { 0 };
  481. sprintf(sqlStr, "update report_credit_deduct set amount = %.1f where txId = '%d'; ",
  482. amount,
  483. Txid);
  484. //log_info("%s",sqlStr);
  485. if (sqlite3_open(DEDUCT_FILE, &deductDb))
  486. {
  487. result = FAIL;
  488. log_info("Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  489. sqlite3_close(deductDb);
  490. } else
  491. {
  492. //log_info( "Local event record database open successfully.");
  493. if (sqlite3_exec(deductDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  494. {
  495. result = FAIL;
  496. log_info("update deduct record error message: %s!", errMsg);
  497. } else
  498. {
  499. //log_info( "update deduct record successfully");
  500. }
  501. sqlite3_close(deductDb);
  502. }
  503. return result;
  504. }
  505. int DB_GetDeductInfo(int deductResult, int uploadState, int *gunIndex, RecordTransactionInfo *deductInfo)
  506. {
  507. int result = PASS;
  508. char *errMsg = NULL;
  509. char sqlStr[1024];
  510. char **rs;
  511. int rows, cols;
  512. if(deductResult >= 0 && uploadState >= 0)
  513. {
  514. sprintf(sqlStr, "select * from report_credit_deduct where isDeductResult = %d and isUpload = %d;", deductResult > 0 ? 1 : 0, uploadState > 0 ? 1 : 0);
  515. }
  516. else if(deductResult >= 0 && uploadState < 0)
  517. {
  518. sprintf(sqlStr, "select * from report_credit_deduct where isDeductResult = 0 OR isDeductResult = 3;");
  519. }
  520. else if(deductResult < 0 && uploadState >= 0)
  521. {
  522. sprintf(sqlStr, "select * from report_credit_deduct where isUpload = %d;", uploadState > 0 ? 1 : 0);
  523. }
  524. else
  525. {
  526. sprintf(sqlStr, "select * from report_credit_deduct;");
  527. }
  528. if (sqlite3_open(DEDUCT_FILE, &deductDb))
  529. {
  530. result = FAIL;
  531. log_info("Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  532. sqlite3_close(deductDb);
  533. }
  534. else
  535. {
  536. sqlite3_get_table(deductDb, sqlStr, &rs, &rows, &cols, &errMsg);
  537. if (rows > 0)
  538. {
  539. for (int idxRow = 1; idxRow <= rows; idxRow++)
  540. {
  541. *gunIndex = atoi(rs[(idxRow * cols) + 1]);
  542. deductInfo->TransactionId = atoi(rs[(idxRow * cols) + 2]);
  543. deductInfo->DeductResult = atoi(rs[(idxRow * cols) + 3]);
  544. deductInfo->IsDonateInvoice = atoi(rs[(idxRow * cols) + 4]);
  545. strcpy((char *)&deductInfo->pCreditCard.ApprovalNo, rs[(idxRow * cols) + 5]);
  546. strcpy((char *)&deductInfo->pCreditCard.CardNo, rs[(idxRow * cols) + 6]);
  547. strcpy((char *)&deductInfo->pCreditCard.VemData, rs[(idxRow * cols) + 7]);
  548. deductInfo->Amount = atoi(rs[(idxRow * cols) + 8]);
  549. deductInfo->IsUpload = atoi(rs[(idxRow * cols) + 9]);
  550. break;
  551. }
  552. }
  553. else
  554. {
  555. result = FAIL;
  556. }
  557. sqlite3_free_table(rs);
  558. sqlite3_close(deductDb);
  559. }
  560. return result;
  561. }
  562. int DB_GetReDeductInfo(int *gunIndex, RecordTransactionInfo *deductInfo)
  563. {
  564. int result = PASS;
  565. if(DB_GetDeductInfo(0, -1, gunIndex, deductInfo) == PASS)
  566. {
  567. //log_info("GetReDeductInfo OK");
  568. }
  569. else
  570. {
  571. result = FAIL;
  572. //log_info("GetReDeductInfo NG");
  573. }
  574. return result;
  575. }
  576. int DB_GetReUploadDeduct(int *gunIndex, RecordTransactionInfo *deductInfo)
  577. {
  578. int result = PASS;
  579. if(DB_GetDeductInfo(-1, 0, gunIndex, deductInfo) == PASS)
  580. {
  581. //log_info("GetReUploadDeduct OK");
  582. }
  583. else
  584. {
  585. result = FAIL;
  586. //log_info("GetReUploadDeduct NG");
  587. }
  588. return result;
  589. }
  590. void GetDeductTime(char* _time,RecordTransactionInfo* deductInfo)
  591. {
  592. deductInfo->pCreditCard.TransDate[0] = (unsigned char)_time[2];
  593. deductInfo->pCreditCard.TransDate[1] = (unsigned char)_time[3];
  594. deductInfo->pCreditCard.TransDate[2] = (unsigned char)_time[5];
  595. deductInfo->pCreditCard.TransDate[3] = (unsigned char)_time[6];
  596. deductInfo->pCreditCard.TransDate[4] = (unsigned char)_time[8];
  597. deductInfo->pCreditCard.TransDate[5] = (unsigned char)_time[9];
  598. deductInfo->pCreditCard.TransTime[0] = (unsigned char)_time[11];
  599. deductInfo->pCreditCard.TransTime[1] = (unsigned char)_time[12];
  600. deductInfo->pCreditCard.TransTime[2] = (unsigned char)_time[14];
  601. deductInfo->pCreditCard.TransTime[3] = (unsigned char)_time[15];
  602. deductInfo->pCreditCard.TransTime[4] = (unsigned char)_time[17];
  603. deductInfo->pCreditCard.TransTime[5] = (unsigned char)_time[18];
  604. }
  605. // return quantity of DeductInfo
  606. int DB_GetMultiDeductInfo(int deductResult, int uploadState, int *gunIndex, RecordTransactionInfo *deductInfo)
  607. {
  608. char *errMsg = NULL;
  609. char sqlStr[1024];
  610. char **rs;
  611. int rows = 0, cols = 0;
  612. if(deductResult >= 0 && uploadState >= 0)
  613. {
  614. sprintf(sqlStr, "select * from report_credit_deduct where isDeductResult = %d and isUpload = %d;", deductResult > 0 ? 1 : 0, uploadState > 0 ? 1 : 0);
  615. }
  616. else if(deductResult >= 0 && uploadState < 0)
  617. {
  618. sprintf(sqlStr, "select * from report_credit_deduct where isDeductResult IN (0,3) AND RedeductTime < 10;");
  619. }
  620. else if(deductResult < 0 && uploadState >= 0)
  621. {
  622. sprintf(sqlStr, "select * from report_credit_deduct where isUpload = %d;", uploadState > 0 ? 1 : 0);
  623. }
  624. else
  625. {
  626. sprintf(sqlStr, "select * from report_credit_deduct;");
  627. }
  628. if (sqlite3_open(DEDUCT_FILE, &deductDb))
  629. {
  630. log_info("Can't open deduct database: %s", sqlite3_errmsg(deductDb));
  631. sqlite3_close(deductDb);
  632. }
  633. else
  634. {
  635. sqlite3_get_table(deductDb, sqlStr, &rs, &rows, &cols, &errMsg);
  636. if (rows > 0)
  637. {
  638. for (int idxRow = 1; idxRow <= rows; idxRow++)
  639. {
  640. //gunIndex[idxRow - 1] = atoi(rs[(idxRow * cols) + 1]);
  641. deductInfo[idxRow - 1].ConnectorID = atoi(rs[(idxRow * cols) + 1]);
  642. // GetDeductTime(rs[(idxRow * cols) + 1], deductInfo);
  643. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.VemData, rs[(idxRow * cols) + 3],64);
  644. deductInfo[idxRow - 1].TransactionId = atoi(rs[(idxRow * cols) + 4]);
  645. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.CardNo, rs[(idxRow * cols) + 5],20);
  646. deductInfo[idxRow - 1].Amount = atoi(rs[(idxRow * cols) + 6]);
  647. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.StoreId, rs[(idxRow * cols) + 7],18);
  648. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.ApprovalNo, rs[(idxRow * cols) + 8],9);
  649. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.RRN, rs[(idxRow * cols) + 9],12);
  650. memcpy((char*)&deductInfo[idxRow - 1].pCreditCard.ROC, rs[(idxRow * cols) + 10],12);
  651. deductInfo[idxRow - 1].IsDonateInvoice = atoi(rs[(idxRow * cols) + 11]);
  652. deductInfo[idxRow - 1].DeductResult = atoi(rs[(idxRow * cols) + 12]);
  653. deductInfo[idxRow - 1].isIntoCharge = atoi(rs[(idxRow * cols) + 13]);
  654. deductInfo[idxRow - 1].IsUpload = atoi(rs[(idxRow * cols) + 14]);
  655. deductInfo[idxRow - 1].LineStatus = atoi(rs[(idxRow * cols) + 15]);
  656. deductInfo[idxRow - 1].Energy = atof(rs[(idxRow * cols) + 16]);
  657. deductInfo[idxRow - 1].RedeductTime = atoi(rs[(idxRow * cols) + 17]);
  658. if(idxRow >= 128)
  659. {
  660. rows = 128;
  661. break;
  662. }
  663. }
  664. }
  665. sqlite3_free_table(rs);
  666. sqlite3_close(deductDb);
  667. }
  668. return rows;
  669. }
  670. int DB_GetMultiReDeductInfo(int *gunIndex, RecordTransactionInfo *deductInfo)
  671. {
  672. int quantity = 0;
  673. quantity = DB_GetMultiDeductInfo(0, -1, gunIndex, deductInfo);
  674. return quantity;
  675. }
  676. int DB_GetMultiReUploadDeduct(int *gunIndex, RecordTransactionInfo *deductInfo)
  677. {
  678. int quantity = 0;
  679. quantity = DB_GetMultiDeductInfo(-1, 0, gunIndex, deductInfo);
  680. return quantity;
  681. }
  682. void ReDeductTest()
  683. {
  684. int quantity = 0;
  685. int gunList[128];
  686. RecordTransactionInfo deductInfo[128];
  687. quantity = DB_GetMultiReDeductInfo(gunList, deductInfo);
  688. if(quantity > 0)
  689. {
  690. for(int i = 0; i < quantity; i++)
  691. {
  692. printf("Gun %d Rededuct CardNo: %s", gunList[i], deductInfo[i].pCreditCard.VemData);
  693. }
  694. }
  695. }
  696. int PowerDB_Open(void)
  697. {
  698. int result = PASS;
  699. char* errMsg = NULL;
  700. char* createPowerConsumption = "CREATE TABLE IF NOT EXISTS power_consumption( "
  701. "idx INTEGER PRIMARY KEY AUTOINCREMENT, "
  702. "connector TEXT, "
  703. "val TEXT);";
  704. if (sqlite3_open(POWER_FILE, &powerDb))
  705. {
  706. result = FAIL;
  707. log_info("Can't open deduct database: %s", sqlite3_errmsg(powerDb));
  708. sqlite3_close(powerDb);
  709. } else
  710. {
  711. if (sqlite3_exec(powerDb, createPowerConsumption, 0, 0, &errMsg) != SQLITE_OK) {
  712. result = FAIL;
  713. log_info("Create power consumption record table error message: %s", errMsg);
  714. } else {
  715. log_info("Opened power consumption record table successfully");
  716. }
  717. sqlite3_close(powerDb);
  718. }
  719. return result;
  720. }
  721. int DB_Insert_PowerConsumption(uint8_t gunIndex, float energy)
  722. {
  723. uint8_t result = false;
  724. char* errMsg = NULL;
  725. char sqlStr[1024];
  726. srand(time(NULL));
  727. if (sqlite3_open(POWER_FILE, &powerDb)) {
  728. result = FAIL;
  729. log_info("Can't open database: %s", sqlite3_errmsg(powerDb));
  730. sqlite3_close(powerDb);
  731. } else {
  732. //log_info("Local charging record database open successfully (%f).", energy);
  733. sprintf(sqlStr, "insert into power_consumption (connector, val) values (%d, %f);",
  734. gunIndex,
  735. energy); //DS60-120 add
  736. //log_info("sqlStr= %s", sqlStr);
  737. if (sqlite3_exec(powerDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  738. result = FAIL;
  739. log_info("Insert power consumption error message: %s", errMsg);
  740. } else {
  741. log_info("Insert connector-%d config item PowerComsumption to %f", gunIndex, energy);
  742. }
  743. sqlite3_close(powerDb);
  744. }
  745. return result;
  746. }
  747. int DB_Update_PowerConsumption(uint8_t gunIndex, float energy)
  748. {
  749. uint8_t result = false;
  750. char* errMsg = NULL;
  751. char sqlStr[1024];
  752. srand(time(NULL));
  753. if (sqlite3_open(POWER_FILE, &powerDb)) {
  754. result = FAIL;
  755. log_info("Can't open database: %s", sqlite3_errmsg(powerDb));
  756. sqlite3_close(powerDb);
  757. } else {
  758. //log_info("Local charging record database open successfully.");
  759. sprintf(sqlStr, "update power_consumption set val = %f where connector = %d; ",
  760. energy,
  761. gunIndex); //DS60-120 add
  762. //log_info("sqlStr= %s", sqlStr);
  763. if (sqlite3_exec(powerDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  764. result = FAIL;
  765. log_info("update config error message: %s", errMsg);
  766. } else {
  767. //log_info("update connector-%d config item PowerComsumption to %f", gunIndex, energy);
  768. }
  769. sqlite3_close(powerDb);
  770. }
  771. return result;
  772. }
  773. int DB_Get_PowerConsumption(uint8_t gunIndex)
  774. {
  775. uint8_t result = true;
  776. char* errMsg = NULL;
  777. char sqlStr[1024];
  778. char** rs;
  779. int rows, cols;
  780. //sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gunIndex);
  781. sprintf(sqlStr, "select * from power_consumption where connector=%d;", gunIndex); //DS60-120 add
  782. //DEBUG_INFO("sqlStr= %s", sqlStr);
  783. if (sqlite3_open(POWER_FILE, &powerDb)) {
  784. result = FAIL;
  785. log_info("Can't open database: %s", sqlite3_errmsg(powerDb));
  786. sqlite3_close(powerDb);
  787. } else {
  788. log_info("Local config query database open successfully.");
  789. sqlite3_get_table(powerDb, sqlStr, &rs, &rows, &cols, &errMsg);
  790. if (rows > 0) {
  791. for (int idxRow = 1; idxRow <= rows; idxRow++) {
  792. ShmDcCommonData->pGunInfo[gunIndex].PowerConsumption = atof(rs[(idxRow * cols) + 2]);
  793. log_info("Query connector-%d PowerConsumption: %s", gunIndex, rs[(idxRow * cols) + 2]);
  794. }
  795. } else {
  796. log_info("Query connector-%d fail, set default value to operactive.", gunIndex);
  797. result = false;
  798. }
  799. sqlite3_free_table(rs);
  800. sqlite3_close(powerDb);
  801. }
  802. return result;
  803. }