db.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098
  1. #include <stddef.h>
  2. #include <string.h>
  3. #include "db.h"
  4. #include "log.h"
  5. #include "sys.h"
  6. #include "lock.h"
  7. #include "paras.h"
  8. #include "sensor.h"
  9. #include "power.h"
  10. #include "breaker.h"
  11. #include "sqlite3.h"
  12. //#define USE_STMTS
  13. enum {
  14. DB_CFG=0,
  15. DB_REC,
  16. DB_MAX
  17. };
  18. enum {
  19. DB_READ=0,
  20. DB_WRITE,
  21. };
  22. enum {
  23. CMD_EXIST=0,
  24. CMD_COUNT,
  25. CMD_QUERY,
  26. CMD_OLDEST,
  27. CMD_NEWEST,
  28. CMD_CLEAR,
  29. CMD_REMOVE,
  30. CMD_CREATE,
  31. CMD_UPDATE,
  32. CMD_MAX,
  33. };
  34. enum {
  35. CMD_SPEC_CREATE=0,
  36. CMD_SPEC_UPDATE,
  37. CMD_SPEC_MAX,
  38. };
  39. typedef struct {
  40. char *tab;
  41. int max_cnt;
  42. const char *sql[CMD_SPEC_MAX];
  43. }tab_info_t;
  44. //PRAGMA auto_vacuum = 1;
  45. static const char *common_cmd[CMD_MAX]={
  46. "SELECT NAME FROM sqlite_master WHERE TYPE='TABLE' AND NAME='%s';",
  47. "SELECT COUNT(*) FROM %s;",
  48. "SELECT * FROM %s;",
  49. "SELECT MIN(time) FROM %s;",
  50. "SELECT MAX(time) FROM %s;",
  51. "DELETE FROM %s;",
  52. "DELETE FROM %s %s;",
  53. NULL,
  54. NULL,
  55. };
  56. static tab_info_t tab_info[DB_TAB_MAX]={
  57. {
  58. "tab_ntp", 1,
  59. {
  60. "CREATE TABLE IF NOT EXISTS %s ("
  61. "id INTEGER PRIMARY KEY,"
  62. "mode INTEGER,"
  63. "server TEXT,"
  64. "ip TEXT,"
  65. "port TEXT,"
  66. "cid TEXT,"
  67. "user TEXT,"
  68. "password TEXT,"
  69. "cert TEXT);",
  70. "INSERT OR REPLACE INTO %s (X,X,X,X,X,X) VALUES (?,?,?,?,?,?);",
  71. }
  72. },
  73. {
  74. "tab_user", 1,
  75. {
  76. "CREATE TABLE IF NOT EXISTS %s ("
  77. "id INTEGER PRIMARY KEY,"
  78. "userID INTEGER,"
  79. "userName TEXT,"
  80. "userPW TEXT,"
  81. "nickName TEXT,"
  82. "roleID TEXT,"
  83. "createTime TEXT);",
  84. "INSERT OR REPLACE INTO %s (id, userID, userName, userPW, nickName, roleID, createTime) VALUES (%d,%d,'%s','%s','%s',%d,'%s');",
  85. }
  86. },
  87. {
  88. "tab_shed", 1,
  89. {
  90. "CREATE TABLE IF NOT EXISTS %s ("
  91. "id INTEGER PRIMARY KEY,"
  92. "userID INTEGER,"
  93. "userName TEXT,"
  94. "userPW TEXT,"
  95. "nickName TEXT,"
  96. "roleID TEXT,"
  97. "createTime TEXT);",
  98. "INSERT OR REPLACE INTO %s (id, userID, userName, userPW, nickName, roleID, createTime) VALUES (%d,%d,'%s','%s','%s',%d,'%s');",
  99. }
  100. },
  101. {
  102. "tab_snmp", 1,
  103. {
  104. "CREATE TABLE IF NOT EXISTS %s ("
  105. "id INTEGER PRIMARY KEY,"
  106. "proto_type INTEGER,"
  107. "enable INTEGER,"
  108. "public TEXT,"
  109. "TrapEnable INTEGER,"
  110. "user TEXT,"
  111. "auth_alg TEXT,"
  112. "auth_passwd TEXT,"
  113. "priv_alg TEXT,"
  114. "priv_passwd TEXT,"
  115. "nmsIP TEXT);",
  116. "INSERT OR REPLACE INTO %s (id,proto_type,enable,public,TrapEnable,user,auth_alg,auth_passwd,priv_alg,priv_passwd,nmsIP) VALUES (%d,%d,%d,'%s',%d,'%s','%s','%s','%s','%s','%s');",
  117. }
  118. },
  119. {
  120. "tab_mail", 1,
  121. {
  122. "CREATE TABLE IF NOT EXISTS %s("
  123. "id INTEGER PRIMARY KEY,"
  124. "mode INTEGER,"
  125. "account TEXT,"
  126. "password TEXT,"
  127. "server TEXT,"
  128. "port TEXT,"
  129. "auth TEXT);",
  130. "INSERT OR REPLACE INTO %s (id,mode,account,password,server,port,auth) VALUES (?,?,?,?,?,?,?);",
  131. }
  132. },
  133. {
  134. "tab_mqtt", 1,
  135. {
  136. "CREATE TABLE IF NOT EXISTS %s ("
  137. "id INTEGER PRIMARY KEY,"
  138. "mode INTEGER,"
  139. "server TEXT,"
  140. "ip TEXT,"
  141. "port TEXT,"
  142. "cid TEXT,"
  143. "user TEXT,"
  144. "password TEXT,"
  145. "cert TEXT);",
  146. "INSERT OR REPLACE INTO %s (id,mode,name,server,port,cid,user,password,cert) VALUES (?,?,?,?,?,?,?,?,?);",
  147. }
  148. },
  149. {
  150. "tab_group", 1,
  151. {
  152. "CREATE TABLE IF NOT EXISTS %s ("
  153. "id INTEGER PRIMARY KEY,"
  154. "groupID INTEGER,"
  155. "groupName TEXT,"
  156. "groupChList TEXT);",
  157. "INSERT OR REPLACE INTO %s (id, groupID, groupName, groupChList) VALUES (%d,%d,'%s','%s');",
  158. }
  159. },
  160. {
  161. "tab_power", 1,
  162. {
  163. "CREATE TABLE IF NOT EXISTS %s ("
  164. "id INTEGER PRIMARY KEY,"
  165. "name TEXT,"
  166. "type INTEGER,"
  167. "addr INTEGER,"
  168. "ch INTEGER,"
  169. "sch INTEGER,"
  170. "ph_id INTEGER,"
  171. "ph_val INTEGER,"
  172. "open_delay INTEGER,"
  173. "close_delay INTEGER,"
  174. "v_upper.en INTEGER,"
  175. "v_upper.val INTEGER,"
  176. "v_upper.act INTEGER,"
  177. "v_upper.para TEXT,"
  178. "v_lower.en INTEGER,"
  179. "v_lower.val INTEGER,"
  180. "v_lower.act INTEGER,"
  181. "v_lower.para TEXT,"
  182. "c_upper.en INTEGER,"
  183. "c_upper.val INTEGER,"
  184. "c_upper.act INTEGER,"
  185. "c_upper.para TEXT,"
  186. "p_upper.en INTEGER,"
  187. "p_upper.val INTEGER,"
  188. "p_upper.act INTEGER,"
  189. "p_upper.para TEXT,"
  190. "w_upper.en INTEGER,"
  191. "w_upper.val INTEGER,"
  192. "w_upper.act INTEGER,"
  193. "w_upper.para TEXT,"
  194. "time INTEGER);",
  195. "INSERT OR REPLACE INTO %s (id,name,type,addr,ch,sch,ph_id,ph_val,open_delay,close_delay,"
  196. "v_upper.en,v_upper.val,v_upper.act,v_upper.para,"
  197. "v_lower.en,v_lower.val,v_lower.act,v_lower.para,"
  198. "c_upper.en,c_upper.val,c_upper.act,c_upper.para,"
  199. "p_upper.en,p_upper.val,p_upper.act,p_upper.para,"
  200. "w_upper.en,w_upper.val,w_upper.act,w_upper.para,"
  201. "time) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
  202. }
  203. },
  204. {
  205. "tab_sensor", 1,
  206. {
  207. "CREATE TABLE IF NOT EXISTS %s ("
  208. "id INTEGER PRIMARY KEY,"
  209. "name TEXT,"
  210. "type INTEGER,"
  211. "subtype INTEGER,"
  212. "addr INTEGER,"
  213. "subaddr INTEGER,"
  214. "val_cnt INTEGER,"
  215. "value1 REAL,"
  216. "thr1_en INTEGER,"
  217. "thr1_val REAL,"
  218. "thr1_act INTEGER,"
  219. "thr1_para TEXT,"
  220. "value2 REAL,"
  221. "thr2_en INTEGER,"
  222. "thr2_val REAL,"
  223. "thr2_act INTEGER,"
  224. "thr2_para TEXT,"
  225. "time INTEGER);",
  226. "INSERT OR REPLACE INTO tab_sensor (id,name,type,subtype,addr,subaddr,val_cnt,value1,thr1_en,thr1_val,thr1_act,thr1_para,"
  227. "value2,thr2_en,thr2_val,thr2_act,thr2_para,time) "
  228. "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
  229. }
  230. },
  231. {
  232. "tab_breaker", 1,
  233. {
  234. "CREATE TABLE IF NOT EXISTS %s ("
  235. "id INTEGER PRIMARY KEY,"
  236. "name TEXT,"
  237. "addr INTEGER,"
  238. "nid INTEGER,"
  239. "sw INTEGER,"
  240. "time TEXT);",
  241. "INSERT OR REPLACE INTO %s (id,name,addr,nid,sw,time) VALUES (?,?,?,?,?,?);",
  242. }
  243. },
  244. {
  245. "tab_log", 1,
  246. {
  247. "CREATE TABLE IF NOT EXISTS %s ("
  248. "id INTEGER PRIMARY KEY,"
  249. "type INTEGER,"
  250. "content TEXT,"
  251. "time INTEGER);",
  252. "INSERT OR REPLACE INTO %s (id,type,content,time) VALUES (?,?,?,?,?);",
  253. }
  254. },
  255. {
  256. "tab_power_rec", 400*10000,
  257. {
  258. "SELECT NAME FROM sqlite_master WHERE TYPE='TABLE' AND NAME='%s';",
  259. "CREATE TABLE %s ("
  260. "id INTEGER PRIMARY KEY,"
  261. "voltage REAL,"
  262. "current REAL,"
  263. "power REAL,"
  264. "freq REAL,"
  265. "factor REAL,"
  266. "consump REAL,"
  267. "active REAL,"
  268. "reactive REAL,"
  269. "ph_out INTEGER,"
  270. "status INTEGER,"
  271. "nwire INTEGER,"
  272. "time INTEGER);",
  273. "INSERT OR REPLACE INTO %s (id,voltage,current,power,freq,factor,consump,active,reactive,ph_out,status,nwire,time) "
  274. "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);",
  275. }
  276. },
  277. {
  278. "tab_alarm_rec", 50*10000,
  279. {
  280. "CREATE TABLE IF NOT EXISTS %s ("
  281. "id INTEGER PRIMARY KEY,"
  282. "ch INTEGER,"
  283. "v_upper INTEGER,"
  284. "v_lower INTEGER,"
  285. "c_upper INTEGER,"
  286. "p_upper INTEGER,"
  287. "w_upper INTEGER,"
  288. "time TEXT);",
  289. "INSERT OR REPLACE INTO %s (id,ch,v_upper,v_lower,c_upper,p_upper,w_upper,time) VALUES (?,?,?,?,?,?,?,?);",
  290. }
  291. },
  292. {
  293. "tab_log_rec", 50*10000,
  294. {
  295. "CREATE TABLE IF NOT EXISTS %s ("
  296. "id INTEGER PRIMARY KEY,"
  297. "type INTEGER,"
  298. "content TEXT,"
  299. "time INTEGER);",
  300. "INSERT OR REPLACE INTO %s (id,type,content,time) VALUES (?,?,?,?);",
  301. }
  302. },
  303. };
  304. typedef struct {
  305. sqlite3_stmt *stmt[CMD_MAX];
  306. }tab_stmt_t;
  307. typedef struct {
  308. sqlite3 *db[DB_MAX];
  309. lock_t lck[DB_MAX];
  310. #ifdef USE_STMTS
  311. tab_stmt_t stmts[DB_TAB_MAX];
  312. #endif
  313. uint8_t inited;
  314. }db_handle_t;
  315. static db_handle_t dbHandle={0};
  316. static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list, int max);
  317. /////////////////////////////////////////////////////////////
  318. static int ends_with(char *str, char *suffix)
  319. {
  320. size_t str_len = strlen(str);
  321. size_t suffix_len = strlen(suffix);
  322. if (suffix_len > str_len) {
  323. return 0;
  324. }
  325. return strcmp(str + str_len - suffix_len, suffix) == 0;
  326. }
  327. static sqlite3* get_db(db_handle_t *h, int tab_id)
  328. {
  329. return (tab_id>=DB_TAB_REC_POWER)?h->db[DB_REC]:h->db[DB_CFG];
  330. }
  331. static lock_t get_lck(db_handle_t *h, int tab_id)
  332. {
  333. return (tab_id>=DB_TAB_REC_POWER)?h->lck[DB_REC]:h->lck[DB_CFG];
  334. }
  335. static node_t get_node(db_handle_t *h, int tab_id)
  336. {
  337. node_t nd={0};
  338. paras_data_t *p=paras_get();
  339. switch(tab_id) {
  340. case DB_TAB_CFG_NTP:
  341. {
  342. }
  343. break;
  344. case DB_TAB_CFG_USER:
  345. {
  346. }
  347. break;
  348. case DB_TAB_CFG_SHED:
  349. {
  350. }
  351. break;
  352. case DB_TAB_CFG_SNMP:
  353. {
  354. }
  355. break;
  356. case DB_TAB_CFG_MAIL:
  357. {
  358. }
  359. break;
  360. case DB_TAB_CFG_MQTT:
  361. {
  362. }
  363. break;
  364. case DB_TAB_CFG_GROUP:
  365. {
  366. }
  367. break;
  368. case DB_TAB_CFG_POWER:
  369. case DB_TAB_REC_POWER:
  370. {
  371. power_all_t all;
  372. power_data_get(&all);
  373. nd.buf = all.pch;
  374. nd.blen = sizeof(power_ch_t)*all.chs;
  375. nd.dlen = nd.blen;
  376. nd.tp = 0;
  377. }
  378. break;
  379. case DB_TAB_CFG_SENSOR:
  380. {
  381. }
  382. break;
  383. case DB_TAB_CFG_BREAKER:
  384. {
  385. }
  386. break;
  387. case DB_TAB_CFG_LOG:
  388. {
  389. }
  390. break;
  391. case DB_TAB_REC_ALARM:
  392. {
  393. }
  394. break;
  395. case DB_TAB_REC_LOG:
  396. {
  397. }
  398. break;
  399. }
  400. return nd;
  401. }
  402. static sqlite3_stmt* get_stmt(db_handle_t *h, int tab_id, int cmd)
  403. {
  404. sqlite3_stmt *s=NULL;
  405. #ifdef USE_STMTS
  406. s = h->stmts[tab_id].stmt[cmd];
  407. #endif
  408. return s;
  409. }
  410. static int tab_cmd(db_handle_t *h, int tab_id, int cmd_id, handle_t list)
  411. {
  412. int r=-1;
  413. char sql[512];
  414. sqlite3_stmt *stmt;
  415. sqlite3 *db=get_db(h,tab_id);
  416. if(cmd_id>=CMD_CREATE) {
  417. snprintf(sql, sizeof(sql), tab_info[tab_id].sql[cmd_id], tab_info[tab_id].sql[cmd_id]);
  418. }
  419. else {
  420. snprintf(sql, sizeof(sql), common_cmd[cmd_id], tab_info[tab_id].tab);
  421. }
  422. r = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
  423. if (r == SQLITE_OK) {
  424. if(cmd_id>=CMD_CREATE) {
  425. stmt_bind(stmt, tab_id, cmd_id, list, 1);
  426. }
  427. while(1) {
  428. r = sqlite3_step(stmt);
  429. if (r == SQLITE_ROW) {
  430. r = 0;
  431. } else if (r == SQLITE_DONE) {
  432. break;
  433. } else {
  434. LOGE("Error: %s\n", sqlite3_errmsg(db));
  435. break;
  436. }
  437. }
  438. sqlite3_finalize(stmt);
  439. } else {
  440. LOGE("Error: %s\n", sqlite3_errmsg(db));
  441. }
  442. return r;
  443. }
  444. static int stmt_init(db_handle_t *h)
  445. {
  446. int i,j,r;
  447. char temp[512];
  448. sqlite3 *db=NULL;
  449. node_t node;
  450. list_cfg_t lc={0,0,10};
  451. handle_t list;
  452. list = list_init(&lc);
  453. for(i=0; i<DB_TAB_MAX; i++) {
  454. db = get_db(h, i);
  455. if(db) {
  456. #ifdef USE_STMTS
  457. for(j=0; j<CMD_MAX; j++) {
  458. if(j>=CMD_CREATE) {
  459. snprintf(temp, sizeof(temp), common_cmd[j-CMD_CREATE], tab_info[i].tab);
  460. }
  461. else {
  462. snprintf(temp, sizeof(temp), tab_info[i].sql[j], tab_info[i].tab);
  463. }
  464. r = sqlite3_prepare_v2(db, temp, -1, &h->stmts[i].stmt[j], 0);
  465. if (r != SQLITE_OK) {
  466. LOGE("sqlite3_prepare_v2 failed, sql: %s, %s\n", temp, sqlite3_errmsg(db));
  467. }
  468. }
  469. #endif
  470. if(tab_cmd(h, i, CMD_EXIST, NULL)!=0) {
  471. r = tab_cmd(h, i, CMD_CREATE, NULL);
  472. if(r==0) {
  473. if(i<DB_TAB_REC_POWER) {
  474. node = get_node(h, i);
  475. list_append(list, 0, node.buf, node.dlen);
  476. tab_cmd(h, i, CMD_UPDATE, list);
  477. list_clear(list);
  478. }
  479. }
  480. }
  481. }
  482. }
  483. list_free(list);
  484. return 0;
  485. }
  486. static int stmt_deinit(db_handle_t *h)
  487. {
  488. int i,j;
  489. #ifdef USE_STMTS
  490. for(i=0; i<DB_TAB_MAX; i++) {
  491. for(j=0; j<CMD_MAX; j++) {
  492. sqlite3_finalize(h->stmts[i].stmt[j]);
  493. h->stmts[i].stmt[j] = NULL;
  494. }
  495. }
  496. #endif
  497. return 0;
  498. }
  499. static int get_count(db_handle_t *h, int tab_id, int brk)
  500. {
  501. int r;
  502. sqlite3_stmt *stmt=get_stmt(h, tab_id, CMD_COUNT);
  503. int count = 0;
  504. while (sqlite3_step(stmt) == SQLITE_ROW) {
  505. count++;
  506. if(brk) break;
  507. }
  508. return count;
  509. }
  510. static void chr_to_u8(char *c, uint8_t *u)
  511. {
  512. if(*c>='0' && *c<='9') {
  513. *u = *c - '0';
  514. }
  515. else if(*c>='a' && *c<='f') {
  516. *u = *c - 'a';
  517. }
  518. }
  519. static void u8_to_chr(uint8_t *u, char *c)
  520. {
  521. uint8_t u1=(*u)>>4;
  522. uint8_t u2=(*u)&0x0f;
  523. if((*u)&0x80) {
  524. *c = *(c+1) = 0;
  525. }
  526. else {
  527. *c = (u1>9)?(u1+32):(u1+97);
  528. *(c+1) = (u2>9)?(u2+32):(u2+97);
  529. }
  530. }
  531. static void str_to_array(char *s, uint8_t *a, int alen)
  532. {
  533. int i=0;
  534. uint8_t c1,c2;
  535. while(s[i]) {
  536. chr_to_u8(s+i,&c1);
  537. chr_to_u8(s+i+1, &c2);
  538. a[i] = (c1<<4)+c2;
  539. i += 2;
  540. }
  541. }
  542. static void array_to_str(uint8_t *a, int alen, char *s)
  543. {
  544. int i;
  545. for(i=0; i<alen; i++) {
  546. u8_to_chr(a+i, s+i*2);
  547. }
  548. }
  549. static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list, int max)
  550. {
  551. int i,j,k,r=0,rc,idx;
  552. list_node_t *ln=NULL;
  553. if(cmd_id!=CMD_UPDATE && cmd_id!=CMD_QUERY) {
  554. return -1;
  555. }
  556. switch(tab_id) {
  557. case DB_TAB_CFG_NTP:
  558. {
  559. }
  560. break;
  561. case DB_TAB_CFG_USER:
  562. {
  563. }
  564. break;
  565. case DB_TAB_CFG_SHED:
  566. {
  567. }
  568. break;
  569. case DB_TAB_CFG_SNMP:
  570. {
  571. }
  572. break;
  573. case DB_TAB_CFG_MAIL:
  574. {
  575. }
  576. break;
  577. case DB_TAB_CFG_MQTT:
  578. {
  579. }
  580. break;
  581. case DB_TAB_CFG_GROUP:
  582. {
  583. }
  584. break;
  585. case DB_TAB_CFG_POWER:
  586. {
  587. char *p=NULL,para[30];
  588. if(cmd_id==CMD_UPDATE) {
  589. power_ch_t *pch=NULL;
  590. while(1) {
  591. rc = list_get_node(list, &ln, 0);
  592. if(rc) {
  593. break;
  594. }
  595. pch = (power_ch_t*)ln->data.buf;
  596. i = 1;
  597. i++;//sqlite3_bind_int(stmt, i++, p->id);
  598. sqlite3_bind_text(stmt, i++, pch->info.name, -1, NULL);
  599. sqlite3_bind_int(stmt, i++, pch->info.type);
  600. sqlite3_bind_int(stmt, i++, pch->info.addr);
  601. sqlite3_bind_int(stmt, i++, pch->info.ch);
  602. sqlite3_bind_int(stmt, i++, pch->info.sch);
  603. sqlite3_bind_int(stmt, i++, pch->info.ph_id);
  604. sqlite3_bind_int(stmt, i++, pch->info.ph_val);
  605. sqlite3_bind_int(stmt, i++, pch->info.open_delay);
  606. sqlite3_bind_int(stmt, i++, pch->info.close_delay);
  607. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.en);
  608. sqlite3_bind_double(stmt, i++, pch->thr.v_upper.val);
  609. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.act);
  610. array_to_str(pch->thr.v_upper.para,sizeof(pch->thr.v_upper.para),para);
  611. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  612. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.en);
  613. sqlite3_bind_double(stmt, i++, pch->thr.v_lower.val);
  614. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.act);
  615. array_to_str(pch->thr.v_lower.para,sizeof(pch->thr.v_lower.para),para);
  616. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  617. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.en);
  618. sqlite3_bind_double(stmt, i++, pch->thr.c_upper.val);
  619. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.act);
  620. array_to_str(pch->thr.c_upper.para,sizeof(pch->thr.c_upper.para),para);
  621. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  622. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.en);
  623. sqlite3_bind_double(stmt, i++, pch->thr.p_upper.val);
  624. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.act);
  625. array_to_str(pch->thr.p_upper.para,sizeof(pch->thr.p_upper.para),para);
  626. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  627. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.en);
  628. sqlite3_bind_double(stmt, i++, pch->thr.w_upper.val);
  629. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.act);
  630. array_to_str(pch->thr.w_upper.para,sizeof(pch->thr.w_upper.para),para);
  631. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  632. rc = sqlite3_step(stmt);
  633. if (rc != SQLITE_ROW) {
  634. if (rc != SQLITE_DONE) {
  635. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  636. r = -1;
  637. }
  638. break;
  639. }
  640. }
  641. }
  642. else {
  643. int cnt=0;
  644. power_ch_t tmp,*pch=NULL;
  645. pch = &tmp;
  646. while(1) {
  647. rc = sqlite3_step(stmt);
  648. if (rc != SQLITE_ROW) {
  649. if (rc != SQLITE_DONE) {
  650. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  651. r = -1;
  652. }
  653. break;
  654. }
  655. i = 0;
  656. i++;//p->id = sqlite3_column_int(stmt, i++);
  657. p = (char*)sqlite3_column_text(stmt, i++);
  658. if(p) strcpy(pch->info.name, p); else pch->info.name[0] = 0;
  659. pch->info.type = sqlite3_column_int(stmt, i++);
  660. pch->info.addr = sqlite3_column_int(stmt, i++);
  661. pch->info.ch = sqlite3_column_int(stmt, i++);
  662. pch->info.sch = sqlite3_column_int(stmt, i++);
  663. pch->info.ph_id = sqlite3_column_int(stmt, i++);
  664. pch->info.ph_val = sqlite3_column_int(stmt, i++);
  665. pch->info.open_delay = sqlite3_column_int(stmt, i++);
  666. pch->info.close_delay = sqlite3_column_int(stmt, i++);
  667. pch->thr.v_upper.en = sqlite3_column_int(stmt, i++);
  668. pch->thr.v_upper.val = sqlite3_column_double(stmt, i++);
  669. pch->thr.v_upper.act = sqlite3_column_int(stmt, i++);
  670. p = (char*)sqlite3_column_text(stmt, i++);
  671. str_to_array(p,pch->thr.v_upper.para, sizeof(pch->thr.v_upper.para));
  672. pch->thr.v_lower.en = sqlite3_column_int(stmt, i++);
  673. pch->thr.v_lower.val = sqlite3_column_double(stmt, i++);
  674. pch->thr.v_lower.act = sqlite3_column_int(stmt, i++);
  675. p = (char*)sqlite3_column_text(stmt, i++);
  676. str_to_array(p,pch->thr.v_lower.para, sizeof(pch->thr.v_lower.para));
  677. pch->thr.c_upper.en = sqlite3_column_int(stmt, i++);
  678. pch->thr.c_upper.val = sqlite3_column_double(stmt, i++);
  679. pch->thr.c_upper.act = sqlite3_column_int(stmt, i++);
  680. p = (char*)sqlite3_column_text(stmt, i++);
  681. str_to_array(p,pch->thr.c_upper.para, sizeof(pch->thr.c_upper.para));
  682. pch->thr.p_upper.en = sqlite3_column_int(stmt, i++);
  683. pch->thr.p_upper.val = sqlite3_column_double(stmt, i++);
  684. pch->thr.p_upper.act = sqlite3_column_int(stmt, i++);
  685. p = (char*)sqlite3_column_text(stmt, i++);
  686. str_to_array(p,pch->thr.p_upper.para, sizeof(pch->thr.p_upper.para));
  687. pch->thr.w_upper.en = sqlite3_column_int(stmt, i++);
  688. pch->thr.w_upper.val = sqlite3_column_double(stmt, i++);
  689. pch->thr.w_upper.act = sqlite3_column_int(stmt, i++);
  690. p = (char*)sqlite3_column_text(stmt, i++);
  691. str_to_array(p,pch->thr.w_upper.para, sizeof(pch->thr.w_upper.para));
  692. cnt++;
  693. if(cnt>max) {
  694. break;
  695. }
  696. r = list_append(list, 0, pch, sizeof(power_ch_t));
  697. if(r) {
  698. LOGE("___ list_append failed, tab_id: %d\n", tab_id);
  699. break;
  700. }
  701. }
  702. }
  703. }
  704. break;
  705. case DB_TAB_CFG_SENSOR:
  706. {
  707. if(cmd_id==CMD_UPDATE) {
  708. //sensor_data_t *p=(sensor_data_t*)data;
  709. }
  710. else {
  711. }
  712. }
  713. break;
  714. case DB_TAB_CFG_BREAKER:
  715. {
  716. }
  717. break;
  718. case DB_TAB_CFG_LOG:
  719. {
  720. }
  721. break;
  722. case DB_TAB_REC_POWER:
  723. {
  724. power_ch_t *p=NULL;
  725. uint8_t times=((p->info.type==PDU_AC_I3O3)?3:1);
  726. if(cmd_id==CMD_UPDATE) {
  727. while(1) {
  728. rc = list_get_node(list, &ln, 0);
  729. if(rc) {
  730. break;
  731. }
  732. i = 1;
  733. for(j=0; j<times; j++) {
  734. i++;//sqlite3_bind_int(stmt, i++, p->id);
  735. sqlite3_bind_double(stmt, i++, p->power[j].voltage);
  736. sqlite3_bind_double(stmt, i++, p->power[j].current);
  737. sqlite3_bind_double(stmt, i++, p->power[j].power);
  738. sqlite3_bind_double(stmt, i++, p->power[j].freq);
  739. sqlite3_bind_double(stmt, i++, p->power[j].factor);
  740. sqlite3_bind_double(stmt, i++, p->power[j].consump);
  741. sqlite3_bind_double(stmt, i++, p->power[j].active);
  742. sqlite3_bind_double(stmt, i++, p->power[j].reactive);
  743. sqlite3_bind_int(stmt, i++, p->power[j].ph_out);
  744. sqlite3_bind_int(stmt, i++, p->power[j].status);
  745. sqlite3_bind_int(stmt, i++, p->power[j].nwire);
  746. rc = sqlite3_step(stmt);
  747. if (rc != SQLITE_DONE) {
  748. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  749. r = -1; break;
  750. }
  751. }
  752. }
  753. }
  754. else {
  755. rc = sqlite3_step(stmt);
  756. if (rc != SQLITE_DONE) {
  757. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  758. r = -1; break;
  759. }
  760. i = 0;
  761. for(j=0; j<times; j++) {
  762. i++;//pch->id = sqlite3_column_int(stmt, i++);
  763. p->power[j].voltage = sqlite3_column_double(stmt, i++);
  764. p->power[j].current = sqlite3_column_double(stmt, i++);
  765. p->power[j].power = sqlite3_column_double(stmt, i++);
  766. p->power[j].freq = sqlite3_column_double(stmt, i++);
  767. p->power[j].factor = sqlite3_column_double(stmt, i++);
  768. p->power[j].consump = sqlite3_column_double(stmt, i++);
  769. p->power[j].active = sqlite3_column_double(stmt, i++);
  770. p->power[j].reactive = sqlite3_column_double(stmt, i++);
  771. p->power[j].ph_out = sqlite3_column_int(stmt, i++);
  772. p->power[j].status = sqlite3_column_int(stmt, i++);
  773. p->power[j].nwire = sqlite3_column_int(stmt, i++);
  774. }
  775. }
  776. }
  777. break;
  778. case DB_TAB_REC_ALARM:
  779. {
  780. }
  781. break;
  782. case DB_TAB_REC_LOG:
  783. {
  784. }
  785. break;
  786. default:
  787. r = -1;
  788. }
  789. if(r==0) {
  790. sqlite3_reset(stmt);
  791. }
  792. return r;
  793. }
  794. /////////////////////////////////////////////////////////////
  795. int db_init(void)
  796. {
  797. int i,r;
  798. sqlite3 *db=NULL;
  799. char path[100];
  800. db_handle_t *h=&dbHandle;
  801. char *errmsg=NULL;
  802. char *ext[DB_MAX]={"cfg","rec"};
  803. memset(h, 0, sizeof(db_handle_t));
  804. sqlite3_initialize();
  805. for(i=0; i<DB_MAX; i++) {
  806. sprintf(path, "%s/%s_%s.db", DB_PATH, DB_NAME, ext[i]);
  807. r = sqlite3_open(path, &h->db[i]);
  808. if(r != SQLITE_OK) {
  809. LOGE("___%s open failed\n", path);
  810. return -1 ;
  811. }
  812. sqlite3_exec(h->db[i], "PRAGMA cache_size=0;" , NULL, NULL, NULL);
  813. h->lck[i] = lock_init();
  814. }
  815. stmt_init(h);
  816. h->inited = 1;
  817. return 0;
  818. }
  819. int db_deinit(void)
  820. {
  821. int i;
  822. db_handle_t *h=&dbHandle;
  823. for(i=0; i<DB_MAX; i++) {
  824. lock_deinit(h->lck[i]);
  825. sqlite3_close(h->db[i]);
  826. }
  827. stmt_deinit(h);
  828. return 0;
  829. }
  830. int db_load(void)
  831. {
  832. int i;
  833. for(i=0; i<DB_MAX; i++) {
  834. //
  835. }
  836. return 0;
  837. }
  838. int db_reset_tab(int tab_id)
  839. {
  840. int r;
  841. db_handle_t *h=&dbHandle;
  842. lock_t lck=get_lck(h,tab_id);
  843. lock_on(lck);
  844. lock_off(lck);
  845. return 0;
  846. }
  847. int db_reset(void)
  848. {
  849. int i;
  850. for(i=0; i<DB_TAB_REC_POWER; i++) {
  851. db_reset_tab(i);
  852. }
  853. }
  854. int db_clear_tab(int tab_id)
  855. {
  856. int r;
  857. db_handle_t *h=&dbHandle;
  858. lock_t lck=get_lck(h,tab_id);
  859. lock_on(lck);
  860. lock_off(lck);
  861. return 0;
  862. }
  863. int db_clear(void)
  864. {
  865. int i;
  866. for(i=DB_TAB_REC_POWER; i<DB_TAB_MAX; i++) {
  867. db_clear_tab(i);
  868. }
  869. return 0;
  870. }
  871. int db_import(int tab_id, char *path)
  872. {
  873. int r;
  874. db_handle_t *h=&dbHandle;
  875. lock_t lck=get_lck(h,tab_id);
  876. lock_on(lck);
  877. lock_off(lck);
  878. return 0;
  879. }
  880. int db_export(int tab_id, char *path)
  881. {
  882. int r;
  883. db_handle_t *h=&dbHandle;
  884. lock_t lck=get_lck(h,tab_id);
  885. lock_on(lck);
  886. lock_off(lck);
  887. return 0;
  888. }
  889. int db_remove(int tab_id, char *contiion)
  890. {
  891. int r;
  892. db_handle_t *h=&dbHandle;
  893. lock_t lck=get_lck(h,tab_id);
  894. lock_on(lck);
  895. lock_off(lck);
  896. return 0;
  897. }
  898. int db_read(int tab_id, char *contiion, handle_t list)
  899. {
  900. int r;
  901. db_handle_t *h=&dbHandle;
  902. lock_t lck=get_lck(h,tab_id);
  903. lock_on(lck);
  904. lock_off(lck);
  905. return 0;
  906. }
  907. int db_write(int tab_id, char *contiion, handle_t list)
  908. {
  909. int r;
  910. db_handle_t *h=&dbHandle;
  911. lock_t lck=get_lck(h,tab_id);
  912. lock_on(lck);
  913. lock_off(lck);
  914. return 0;
  915. }