db.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  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. #if 0
  608. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.en);
  609. sqlite3_bind_double(stmt, i++, pch->thr.v_upper.val);
  610. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.act);
  611. array_to_str(pch->thr.v_upper.para,sizeof(pch->thr.v_upper.para),para);
  612. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  613. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.en);
  614. sqlite3_bind_double(stmt, i++, pch->thr.v_lower.val);
  615. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.act);
  616. array_to_str(pch->thr.v_lower.para,sizeof(pch->thr.v_lower.para),para);
  617. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  618. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.en);
  619. sqlite3_bind_double(stmt, i++, pch->thr.c_upper.val);
  620. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.act);
  621. array_to_str(pch->thr.c_upper.para,sizeof(pch->thr.c_upper.para),para);
  622. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  623. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.en);
  624. sqlite3_bind_double(stmt, i++, pch->thr.p_upper.val);
  625. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.act);
  626. array_to_str(pch->thr.p_upper.para,sizeof(pch->thr.p_upper.para),para);
  627. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  628. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.en);
  629. sqlite3_bind_double(stmt, i++, pch->thr.w_upper.val);
  630. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.act);
  631. array_to_str(pch->thr.w_upper.para,sizeof(pch->thr.w_upper.para),para);
  632. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  633. #endif
  634. rc = sqlite3_step(stmt);
  635. if (rc != SQLITE_ROW) {
  636. if (rc != SQLITE_DONE) {
  637. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  638. r = -1;
  639. }
  640. break;
  641. }
  642. }
  643. }
  644. else {
  645. int cnt=0;
  646. power_ch_t tmp,*pch=NULL;
  647. pch = &tmp;
  648. while(1) {
  649. rc = sqlite3_step(stmt);
  650. if (rc != SQLITE_ROW) {
  651. if (rc != SQLITE_DONE) {
  652. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  653. r = -1;
  654. }
  655. break;
  656. }
  657. i = 0;
  658. i++;//p->id = sqlite3_column_int(stmt, i++);
  659. p = (char*)sqlite3_column_text(stmt, i++);
  660. if(p) strcpy(pch->info.name, p); else pch->info.name[0] = 0;
  661. pch->info.type = sqlite3_column_int(stmt, i++);
  662. pch->info.addr = sqlite3_column_int(stmt, i++);
  663. pch->info.ch = sqlite3_column_int(stmt, i++);
  664. pch->info.sch = sqlite3_column_int(stmt, i++);
  665. pch->info.ph_id = sqlite3_column_int(stmt, i++);
  666. pch->info.ph_val = sqlite3_column_int(stmt, i++);
  667. pch->info.open_delay = sqlite3_column_int(stmt, i++);
  668. pch->info.close_delay = sqlite3_column_int(stmt, i++);
  669. #if 0
  670. pch->thr.v_upper.en = sqlite3_column_int(stmt, i++);
  671. pch->thr.v_upper.val = sqlite3_column_double(stmt, i++);
  672. pch->thr.v_upper.act = sqlite3_column_int(stmt, i++);
  673. p = (char*)sqlite3_column_text(stmt, i++);
  674. str_to_array(p,pch->thr.v_upper.para, sizeof(pch->thr.v_upper.para));
  675. pch->thr.v_lower.en = sqlite3_column_int(stmt, i++);
  676. pch->thr.v_lower.val = sqlite3_column_double(stmt, i++);
  677. pch->thr.v_lower.act = sqlite3_column_int(stmt, i++);
  678. p = (char*)sqlite3_column_text(stmt, i++);
  679. str_to_array(p,pch->thr.v_lower.para, sizeof(pch->thr.v_lower.para));
  680. pch->thr.c_upper.en = sqlite3_column_int(stmt, i++);
  681. pch->thr.c_upper.val = sqlite3_column_double(stmt, i++);
  682. pch->thr.c_upper.act = sqlite3_column_int(stmt, i++);
  683. p = (char*)sqlite3_column_text(stmt, i++);
  684. str_to_array(p,pch->thr.c_upper.para, sizeof(pch->thr.c_upper.para));
  685. pch->thr.p_upper.en = sqlite3_column_int(stmt, i++);
  686. pch->thr.p_upper.val = sqlite3_column_double(stmt, i++);
  687. pch->thr.p_upper.act = sqlite3_column_int(stmt, i++);
  688. p = (char*)sqlite3_column_text(stmt, i++);
  689. str_to_array(p,pch->thr.p_upper.para, sizeof(pch->thr.p_upper.para));
  690. pch->thr.w_upper.en = sqlite3_column_int(stmt, i++);
  691. pch->thr.w_upper.val = sqlite3_column_double(stmt, i++);
  692. pch->thr.w_upper.act = sqlite3_column_int(stmt, i++);
  693. p = (char*)sqlite3_column_text(stmt, i++);
  694. str_to_array(p,pch->thr.w_upper.para, sizeof(pch->thr.w_upper.para));
  695. #endif
  696. cnt++;
  697. if(cnt>max) {
  698. break;
  699. }
  700. r = list_append(list, 0, pch, sizeof(power_ch_t));
  701. if(r) {
  702. LOGE("___ list_append failed, tab_id: %d\n", tab_id);
  703. break;
  704. }
  705. }
  706. }
  707. }
  708. break;
  709. case DB_TAB_CFG_SENSOR:
  710. {
  711. if(cmd_id==CMD_UPDATE) {
  712. //sensor_data_t *p=(sensor_data_t*)data;
  713. }
  714. else {
  715. }
  716. }
  717. break;
  718. case DB_TAB_CFG_BREAKER:
  719. {
  720. }
  721. break;
  722. case DB_TAB_CFG_LOG:
  723. {
  724. }
  725. break;
  726. case DB_TAB_REC_POWER:
  727. {
  728. power_ch_t *p=NULL;
  729. uint8_t times=((p->info.type==PDU_AC_I3O3)?3:1);
  730. if(cmd_id==CMD_UPDATE) {
  731. while(1) {
  732. rc = list_get_node(list, &ln, 0);
  733. if(rc) {
  734. break;
  735. }
  736. i = 1;
  737. for(j=0; j<times; j++) {
  738. i++;//sqlite3_bind_int(stmt, i++, p->id);
  739. sqlite3_bind_double(stmt, i++, p->power[j].voltage);
  740. sqlite3_bind_double(stmt, i++, p->power[j].current);
  741. sqlite3_bind_double(stmt, i++, p->power[j].power);
  742. sqlite3_bind_double(stmt, i++, p->power[j].freq);
  743. sqlite3_bind_double(stmt, i++, p->power[j].factor);
  744. sqlite3_bind_double(stmt, i++, p->power[j].consump);
  745. #if 0
  746. sqlite3_bind_double(stmt, i++, p->power[j].active);
  747. sqlite3_bind_double(stmt, i++, p->power[j].reactive);
  748. sqlite3_bind_int(stmt, i++, p->power[j].ph_out);
  749. sqlite3_bind_int(stmt, i++, p->power[j].status);
  750. #endif
  751. sqlite3_bind_int(stmt, i++, p->nwire);
  752. rc = sqlite3_step(stmt);
  753. if (rc != SQLITE_DONE) {
  754. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  755. r = -1; break;
  756. }
  757. }
  758. }
  759. }
  760. else {
  761. rc = sqlite3_step(stmt);
  762. if (rc != SQLITE_DONE) {
  763. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  764. r = -1; break;
  765. }
  766. i = 0;
  767. for(j=0; j<times; j++) {
  768. i++;//pch->id = sqlite3_column_int(stmt, i++);
  769. p->power[j].voltage = sqlite3_column_double(stmt, i++);
  770. p->power[j].current = sqlite3_column_double(stmt, i++);
  771. p->power[j].power = sqlite3_column_double(stmt, i++);
  772. p->power[j].freq = sqlite3_column_double(stmt, i++);
  773. p->power[j].factor = sqlite3_column_double(stmt, i++);
  774. p->power[j].consump = sqlite3_column_double(stmt, i++);
  775. #if 0
  776. p->power[j].active = sqlite3_column_double(stmt, i++);
  777. p->power[j].reactive = sqlite3_column_double(stmt, i++);
  778. p->power[j].ph_out = sqlite3_column_int(stmt, i++);
  779. p->power[j].status = sqlite3_column_int(stmt, i++);
  780. #endif
  781. p->nwire = sqlite3_column_int(stmt, i++);
  782. }
  783. }
  784. }
  785. break;
  786. case DB_TAB_REC_ALARM:
  787. {
  788. }
  789. break;
  790. case DB_TAB_REC_LOG:
  791. {
  792. }
  793. break;
  794. default:
  795. r = -1;
  796. }
  797. if(r==0) {
  798. sqlite3_reset(stmt);
  799. }
  800. return r;
  801. }
  802. /////////////////////////////////////////////////////////////
  803. int db_init(void)
  804. {
  805. int i,r;
  806. sqlite3 *db=NULL;
  807. char path[100];
  808. db_handle_t *h=&dbHandle;
  809. char *errmsg=NULL;
  810. char *ext[DB_MAX]={"cfg","rec"};
  811. memset(h, 0, sizeof(db_handle_t));
  812. h->buflen = (1024*2);
  813. h->buf = (char*)malloc(h->buflen);
  814. if(!h->buf) {
  815. LOGE("___db buf malloc failed!\n");
  816. return -1;
  817. }
  818. sqlite3_initialize();
  819. for(i=0; i<DB_MAX; i++) {
  820. sprintf(path, "%s/%s_%s.db", DB_PATH, DB_NAME, ext[i]);
  821. r = sqlite3_open(path, &h->db[i]);
  822. if(r != SQLITE_OK) {
  823. LOGE("___%s open failed, %s\n", path, sqlite3_errstr(r));
  824. return -1 ;
  825. }
  826. sqlite3_exec(h->db[i], "PRAGMA cache_size=0;" , NULL, NULL, NULL);
  827. h->lck[i] = lock_init();
  828. }
  829. stmt_init(h);
  830. h->inited = 1;
  831. return 0;
  832. }
  833. int db_deinit(void)
  834. {
  835. int i;
  836. db_handle_t *h=&dbHandle;
  837. for(i=0; i<DB_MAX; i++) {
  838. lock_deinit(h->lck[i]);
  839. sqlite3_close(h->db[i]);
  840. }
  841. stmt_deinit(h);
  842. return 0;
  843. }
  844. int db_load(void)
  845. {
  846. int i;
  847. for(i=0; i<DB_MAX; i++) {
  848. //
  849. }
  850. return 0;
  851. }
  852. int db_reset_tab(int tab_id)
  853. {
  854. int r;
  855. db_handle_t *h=&dbHandle;
  856. lock_t lck=get_lck(h,tab_id);
  857. lock_on(lck);
  858. lock_off(lck);
  859. return 0;
  860. }
  861. int db_reset(void)
  862. {
  863. int i;
  864. for(i=0; i<DB_TAB_REC_POWER; i++) {
  865. db_reset_tab(i);
  866. }
  867. }
  868. int db_clear_tab(int tab_id)
  869. {
  870. int r;
  871. db_handle_t *h=&dbHandle;
  872. lock_t lck=get_lck(h,tab_id);
  873. lock_on(lck);
  874. lock_off(lck);
  875. return 0;
  876. }
  877. int db_clear(void)
  878. {
  879. int i;
  880. for(i=DB_TAB_REC_POWER; i<DB_TAB_MAX; i++) {
  881. db_clear_tab(i);
  882. }
  883. return 0;
  884. }
  885. int db_import(int tab_id, char *path)
  886. {
  887. int r;
  888. db_handle_t *h=&dbHandle;
  889. lock_t lck=get_lck(h,tab_id);
  890. lock_on(lck);
  891. lock_off(lck);
  892. return 0;
  893. }
  894. int db_export(int tab_id, char *path)
  895. {
  896. int r;
  897. db_handle_t *h=&dbHandle;
  898. lock_t lck=get_lck(h,tab_id);
  899. lock_on(lck);
  900. lock_off(lck);
  901. return 0;
  902. }
  903. int db_remove(int tab_id, char *contiion)
  904. {
  905. int r;
  906. db_handle_t *h=&dbHandle;
  907. lock_t lck=get_lck(h,tab_id);
  908. lock_on(lck);
  909. lock_off(lck);
  910. return 0;
  911. }
  912. int db_read(int tab_id, char *contiion, handle_t list)
  913. {
  914. int r;
  915. db_handle_t *h=&dbHandle;
  916. lock_t lck=get_lck(h,tab_id);
  917. lock_on(lck);
  918. lock_off(lck);
  919. return 0;
  920. }
  921. int db_write(int tab_id, char *contiion, handle_t list)
  922. {
  923. int r;
  924. db_handle_t *h=&dbHandle;
  925. lock_t lck=get_lck(h,tab_id);
  926. lock_on(lck);
  927. lock_off(lck);
  928. return 0;
  929. }