db.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  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. char *buf;
  314. int buflen;
  315. uint8_t inited;
  316. }db_handle_t;
  317. static db_handle_t dbHandle={0};
  318. static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list, int max);
  319. /////////////////////////////////////////////////////////////
  320. static int ends_with(char *str, char *suffix)
  321. {
  322. size_t str_len = strlen(str);
  323. size_t suffix_len = strlen(suffix);
  324. if (suffix_len > str_len) {
  325. return 0;
  326. }
  327. return strcmp(str + str_len - suffix_len, suffix) == 0;
  328. }
  329. static sqlite3* get_db(db_handle_t *h, int tab_id)
  330. {
  331. return (tab_id>=DB_TAB_REC_POWER)?h->db[DB_REC]:h->db[DB_CFG];
  332. }
  333. static lock_t get_lck(db_handle_t *h, int tab_id)
  334. {
  335. return (tab_id>=DB_TAB_REC_POWER)?h->lck[DB_REC]:h->lck[DB_CFG];
  336. }
  337. static node_t get_node(db_handle_t *h, int tab_id)
  338. {
  339. node_t nd={0};
  340. paras_data_t *p=paras_get();
  341. switch(tab_id) {
  342. case DB_TAB_CFG_NTP:
  343. {
  344. }
  345. break;
  346. case DB_TAB_CFG_USER:
  347. {
  348. }
  349. break;
  350. case DB_TAB_CFG_SHED:
  351. {
  352. }
  353. break;
  354. case DB_TAB_CFG_SNMP:
  355. {
  356. }
  357. break;
  358. case DB_TAB_CFG_MAIL:
  359. {
  360. }
  361. break;
  362. case DB_TAB_CFG_MQTT:
  363. {
  364. }
  365. break;
  366. case DB_TAB_CFG_GROUP:
  367. {
  368. }
  369. break;
  370. case DB_TAB_CFG_POWER:
  371. case DB_TAB_REC_POWER:
  372. {
  373. power_all_t all;
  374. power_data_get(&all);
  375. nd.buf = all.pch;
  376. nd.blen = sizeof(power_ch_t)*all.chs;
  377. nd.dlen = nd.blen;
  378. nd.tp = 0;
  379. }
  380. break;
  381. case DB_TAB_CFG_SENSOR:
  382. {
  383. }
  384. break;
  385. case DB_TAB_CFG_BREAKER:
  386. {
  387. }
  388. break;
  389. case DB_TAB_CFG_LOG:
  390. {
  391. }
  392. break;
  393. case DB_TAB_REC_ALARM:
  394. {
  395. }
  396. break;
  397. case DB_TAB_REC_LOG:
  398. {
  399. }
  400. break;
  401. }
  402. return nd;
  403. }
  404. static sqlite3_stmt* get_stmt(db_handle_t *h, int tab_id, int cmd)
  405. {
  406. sqlite3_stmt *s=NULL;
  407. #ifdef USE_STMTS
  408. s = h->stmts[tab_id].stmt[cmd];
  409. #endif
  410. return s;
  411. }
  412. static int tab_cmd(db_handle_t *h, int tab_id, int cmd_id, handle_t list)
  413. {
  414. int r=-1;
  415. sqlite3_stmt *stmt;
  416. sqlite3 *db=get_db(h,tab_id);
  417. if(cmd_id>=CMD_CREATE) {
  418. snprintf(h->buf, h->buflen, tab_info[tab_id].sql[cmd_id-CMD_CREATE], tab_info[tab_id].tab);
  419. }
  420. else {
  421. snprintf(h->buf, h->buflen, common_cmd[cmd_id], tab_info[tab_id].tab);
  422. }
  423. r = sqlite3_prepare_v2(db, h->buf, -1, &stmt, NULL);
  424. if (r == SQLITE_OK) {
  425. if(cmd_id>=CMD_CREATE) {
  426. stmt_bind(stmt, tab_id, cmd_id, list, 1);
  427. }
  428. while(1) {
  429. r = sqlite3_step(stmt);
  430. if (r == SQLITE_ROW) {
  431. r = 0;
  432. } else if (r == SQLITE_DONE) {
  433. break;
  434. } else {
  435. LOGE("Error: %s\n", sqlite3_errmsg(db));
  436. break;
  437. }
  438. }
  439. sqlite3_finalize(stmt);
  440. } else {
  441. LOGE("Error: %s\n", sqlite3_errmsg(db));
  442. }
  443. return r;
  444. }
  445. static int stmt_init(db_handle_t *h)
  446. {
  447. int i,j,r;
  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(h->buf, h->buflen, common_cmd[j-CMD_CREATE], tab_info[i].tab);
  460. }
  461. else {
  462. snprintf(h->buf, h->buflen, tab_info[i].sql[j], tab_info[i].tab);
  463. }
  464. r = sqlite3_prepare_v2(db, h->buf, -1, &h->stmts[i].stmt[j], 0);
  465. if (r != SQLITE_OK) {
  466. LOGE("sqlite3_prepare_v2 failed, sql: %s, %s\n", h->buf, 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. h->buflen = (1024*2);
  805. h->buf = (char*)malloc(h->buflen);
  806. if(!h->buf) {
  807. LOGE("___db buf malloc failed!\n");
  808. return -1;
  809. }
  810. sqlite3_initialize();
  811. for(i=0; i<DB_MAX; i++) {
  812. sprintf(path, "%s/%s_%s.db", DB_PATH, DB_NAME, ext[i]);
  813. r = sqlite3_open(path, &h->db[i]);
  814. if(r != SQLITE_OK) {
  815. LOGE("___%s open failed, %s\n", path, sqlite3_errstr(r));
  816. return -1 ;
  817. }
  818. sqlite3_exec(h->db[i], "PRAGMA cache_size=0;" , NULL, NULL, NULL);
  819. h->lck[i] = lock_init();
  820. }
  821. stmt_init(h);
  822. h->inited = 1;
  823. return 0;
  824. }
  825. int db_deinit(void)
  826. {
  827. int i;
  828. db_handle_t *h=&dbHandle;
  829. for(i=0; i<DB_MAX; i++) {
  830. lock_deinit(h->lck[i]);
  831. sqlite3_close(h->db[i]);
  832. }
  833. stmt_deinit(h);
  834. return 0;
  835. }
  836. int db_load(void)
  837. {
  838. int i;
  839. for(i=0; i<DB_MAX; i++) {
  840. //
  841. }
  842. return 0;
  843. }
  844. int db_reset_tab(int tab_id)
  845. {
  846. int r;
  847. db_handle_t *h=&dbHandle;
  848. lock_t lck=get_lck(h,tab_id);
  849. lock_on(lck);
  850. lock_off(lck);
  851. return 0;
  852. }
  853. int db_reset(void)
  854. {
  855. int i;
  856. for(i=0; i<DB_TAB_REC_POWER; i++) {
  857. db_reset_tab(i);
  858. }
  859. }
  860. int db_clear_tab(int tab_id)
  861. {
  862. int r;
  863. db_handle_t *h=&dbHandle;
  864. lock_t lck=get_lck(h,tab_id);
  865. lock_on(lck);
  866. lock_off(lck);
  867. return 0;
  868. }
  869. int db_clear(void)
  870. {
  871. int i;
  872. for(i=DB_TAB_REC_POWER; i<DB_TAB_MAX; i++) {
  873. db_clear_tab(i);
  874. }
  875. return 0;
  876. }
  877. int db_import(int tab_id, char *path)
  878. {
  879. int r;
  880. db_handle_t *h=&dbHandle;
  881. lock_t lck=get_lck(h,tab_id);
  882. lock_on(lck);
  883. lock_off(lck);
  884. return 0;
  885. }
  886. int db_export(int tab_id, char *path)
  887. {
  888. int r;
  889. db_handle_t *h=&dbHandle;
  890. lock_t lck=get_lck(h,tab_id);
  891. lock_on(lck);
  892. lock_off(lck);
  893. return 0;
  894. }
  895. int db_remove(int tab_id, char *contiion)
  896. {
  897. int r;
  898. db_handle_t *h=&dbHandle;
  899. lock_t lck=get_lck(h,tab_id);
  900. lock_on(lck);
  901. lock_off(lck);
  902. return 0;
  903. }
  904. int db_read(int tab_id, char *contiion, handle_t list)
  905. {
  906. int r;
  907. db_handle_t *h=&dbHandle;
  908. lock_t lck=get_lck(h,tab_id);
  909. lock_on(lck);
  910. lock_off(lck);
  911. return 0;
  912. }
  913. int db_write(int tab_id, char *contiion, handle_t list)
  914. {
  915. int r;
  916. db_handle_t *h=&dbHandle;
  917. lock_t lck=get_lck(h,tab_id);
  918. lock_on(lck);
  919. lock_off(lck);
  920. return 0;
  921. }