db.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  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. }
  374. break;
  375. case DB_TAB_CFG_SENSOR:
  376. {
  377. }
  378. break;
  379. case DB_TAB_CFG_BREAKER:
  380. {
  381. }
  382. break;
  383. case DB_TAB_CFG_LOG:
  384. {
  385. }
  386. break;
  387. case DB_TAB_REC_ALARM:
  388. {
  389. }
  390. break;
  391. case DB_TAB_REC_LOG:
  392. {
  393. }
  394. break;
  395. }
  396. return nd;
  397. }
  398. static sqlite3_stmt* get_stmt(db_handle_t *h, int tab_id, int cmd)
  399. {
  400. sqlite3_stmt *s=NULL;
  401. #ifdef USE_STMTS
  402. s = h->stmts[tab_id].stmt[cmd];
  403. #endif
  404. return s;
  405. }
  406. static int tab_cmd(db_handle_t *h, int tab_id, int cmd_id, handle_t list)
  407. {
  408. int r=-1;
  409. sqlite3_stmt *stmt;
  410. sqlite3 *db=get_db(h,tab_id);
  411. if(cmd_id>=CMD_CREATE) {
  412. snprintf(h->buf, h->buflen, tab_info[tab_id].sql[cmd_id-CMD_CREATE], tab_info[tab_id].tab);
  413. }
  414. else {
  415. snprintf(h->buf, h->buflen, common_cmd[cmd_id], tab_info[tab_id].tab);
  416. }
  417. r = sqlite3_prepare_v2(db, h->buf, -1, &stmt, NULL);
  418. if (r == SQLITE_OK) {
  419. if(cmd_id>=CMD_CREATE) {
  420. stmt_bind(stmt, tab_id, cmd_id, list, 1);
  421. }
  422. while(1) {
  423. r = sqlite3_step(stmt);
  424. if (r == SQLITE_ROW) {
  425. r = 0;
  426. } else if (r == SQLITE_DONE) {
  427. break;
  428. } else {
  429. LOGE("Error: %s\n", sqlite3_errmsg(db));
  430. break;
  431. }
  432. }
  433. sqlite3_finalize(stmt);
  434. } else {
  435. LOGE("Error: %s\n", sqlite3_errmsg(db));
  436. }
  437. return r;
  438. }
  439. static int stmt_init(db_handle_t *h)
  440. {
  441. int i,j,r;
  442. sqlite3 *db=NULL;
  443. node_t node;
  444. list_cfg_t lc={0,0,10};
  445. handle_t list;
  446. list = list_init(&lc);
  447. for(i=0; i<DB_TAB_MAX; i++) {
  448. db = get_db(h, i);
  449. if(db) {
  450. #ifdef USE_STMTS
  451. for(j=0; j<CMD_MAX; j++) {
  452. if(j>=CMD_CREATE) {
  453. snprintf(h->buf, h->buflen, common_cmd[j-CMD_CREATE], tab_info[i].tab);
  454. }
  455. else {
  456. snprintf(h->buf, h->buflen, tab_info[i].sql[j], tab_info[i].tab);
  457. }
  458. r = sqlite3_prepare_v2(db, h->buf, -1, &h->stmts[i].stmt[j], 0);
  459. if (r != SQLITE_OK) {
  460. LOGE("sqlite3_prepare_v2 failed, sql: %s, %s\n", h->buf, sqlite3_errmsg(db));
  461. }
  462. }
  463. #endif
  464. if(tab_cmd(h, i, CMD_EXIST, NULL)!=0) {
  465. r = tab_cmd(h, i, CMD_CREATE, NULL);
  466. if(r==0) {
  467. if(i<DB_TAB_REC_POWER) {
  468. node = get_node(h, i);
  469. list_append(list, 0, node.buf, node.dlen);
  470. tab_cmd(h, i, CMD_UPDATE, list);
  471. list_clear(list);
  472. }
  473. }
  474. }
  475. }
  476. }
  477. list_free(list);
  478. return 0;
  479. }
  480. static int stmt_deinit(db_handle_t *h)
  481. {
  482. int i,j;
  483. #ifdef USE_STMTS
  484. for(i=0; i<DB_TAB_MAX; i++) {
  485. for(j=0; j<CMD_MAX; j++) {
  486. sqlite3_finalize(h->stmts[i].stmt[j]);
  487. h->stmts[i].stmt[j] = NULL;
  488. }
  489. }
  490. #endif
  491. return 0;
  492. }
  493. static int get_count(db_handle_t *h, int tab_id, int brk)
  494. {
  495. int r;
  496. sqlite3_stmt *stmt=get_stmt(h, tab_id, CMD_COUNT);
  497. int count = 0;
  498. while (sqlite3_step(stmt) == SQLITE_ROW) {
  499. count++;
  500. if(brk) break;
  501. }
  502. return count;
  503. }
  504. static void chr_to_u8(char *c, uint8_t *u)
  505. {
  506. if(*c>='0' && *c<='9') {
  507. *u = *c - '0';
  508. }
  509. else if(*c>='a' && *c<='f') {
  510. *u = *c - 'a';
  511. }
  512. }
  513. static void u8_to_chr(uint8_t *u, char *c)
  514. {
  515. uint8_t u1=(*u)>>4;
  516. uint8_t u2=(*u)&0x0f;
  517. if((*u)&0x80) {
  518. *c = *(c+1) = 0;
  519. }
  520. else {
  521. *c = (u1>9)?(u1+32):(u1+97);
  522. *(c+1) = (u2>9)?(u2+32):(u2+97);
  523. }
  524. }
  525. static void str_to_array(char *s, uint8_t *a, int alen)
  526. {
  527. int i=0;
  528. uint8_t c1,c2;
  529. while(s[i]) {
  530. chr_to_u8(s+i,&c1);
  531. chr_to_u8(s+i+1, &c2);
  532. a[i] = (c1<<4)+c2;
  533. i += 2;
  534. }
  535. }
  536. static void array_to_str(uint8_t *a, int alen, char *s)
  537. {
  538. int i;
  539. for(i=0; i<alen; i++) {
  540. u8_to_chr(a+i, s+i*2);
  541. }
  542. }
  543. static int stmt_bind(sqlite3_stmt *stmt, int tab_id, int cmd_id, handle_t list, int max)
  544. {
  545. int i,j,k,r=0,rc,idx;
  546. list_node_t *ln=NULL;
  547. if(cmd_id!=CMD_UPDATE && cmd_id!=CMD_QUERY) {
  548. return -1;
  549. }
  550. switch(tab_id) {
  551. case DB_TAB_CFG_NTP:
  552. {
  553. }
  554. break;
  555. case DB_TAB_CFG_USER:
  556. {
  557. }
  558. break;
  559. case DB_TAB_CFG_SHED:
  560. {
  561. }
  562. break;
  563. case DB_TAB_CFG_SNMP:
  564. {
  565. }
  566. break;
  567. case DB_TAB_CFG_MAIL:
  568. {
  569. }
  570. break;
  571. case DB_TAB_CFG_MQTT:
  572. {
  573. }
  574. break;
  575. case DB_TAB_CFG_GROUP:
  576. {
  577. }
  578. break;
  579. case DB_TAB_CFG_POWER:
  580. {
  581. char *p=NULL,para[30];
  582. if(cmd_id==CMD_UPDATE) {
  583. power_ch_t *pch=NULL;
  584. while(1) {
  585. rc = list_get_node(list, &ln, 0);
  586. if(rc) {
  587. break;
  588. }
  589. pch = (power_ch_t*)ln->data.buf;
  590. i = 1;
  591. i++;//sqlite3_bind_int(stmt, i++, p->id);
  592. sqlite3_bind_text(stmt, i++, pch->info.name, -1, NULL);
  593. sqlite3_bind_int(stmt, i++, pch->info.type);
  594. sqlite3_bind_int(stmt, i++, pch->info.addr);
  595. sqlite3_bind_int(stmt, i++, pch->info.ch);
  596. sqlite3_bind_int(stmt, i++, pch->info.sch);
  597. sqlite3_bind_int(stmt, i++, pch->info.ph_id);
  598. sqlite3_bind_int(stmt, i++, pch->info.ph_val);
  599. sqlite3_bind_int(stmt, i++, pch->info.open_delay);
  600. sqlite3_bind_int(stmt, i++, pch->info.close_delay);
  601. #if 0
  602. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.en);
  603. sqlite3_bind_double(stmt, i++, pch->thr.v_upper.val);
  604. sqlite3_bind_int(stmt, i++, pch->thr.v_upper.act);
  605. array_to_str(pch->thr.v_upper.para,sizeof(pch->thr.v_upper.para),para);
  606. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  607. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.en);
  608. sqlite3_bind_double(stmt, i++, pch->thr.v_lower.val);
  609. sqlite3_bind_int(stmt, i++, pch->thr.v_lower.act);
  610. array_to_str(pch->thr.v_lower.para,sizeof(pch->thr.v_lower.para),para);
  611. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  612. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.en);
  613. sqlite3_bind_double(stmt, i++, pch->thr.c_upper.val);
  614. sqlite3_bind_int(stmt, i++, pch->thr.c_upper.act);
  615. array_to_str(pch->thr.c_upper.para,sizeof(pch->thr.c_upper.para),para);
  616. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  617. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.en);
  618. sqlite3_bind_double(stmt, i++, pch->thr.p_upper.val);
  619. sqlite3_bind_int(stmt, i++, pch->thr.p_upper.act);
  620. array_to_str(pch->thr.p_upper.para,sizeof(pch->thr.p_upper.para),para);
  621. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  622. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.en);
  623. sqlite3_bind_double(stmt, i++, pch->thr.w_upper.val);
  624. sqlite3_bind_int(stmt, i++, pch->thr.w_upper.act);
  625. array_to_str(pch->thr.w_upper.para,sizeof(pch->thr.w_upper.para),para);
  626. sqlite3_bind_text(stmt, i++, para, -1, NULL);
  627. #endif
  628. rc = sqlite3_step(stmt);
  629. if (rc != SQLITE_ROW) {
  630. if (rc != SQLITE_DONE) {
  631. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  632. r = -1;
  633. }
  634. break;
  635. }
  636. }
  637. }
  638. else {
  639. int cnt=0;
  640. power_ch_t tmp,*pch=NULL;
  641. pch = &tmp;
  642. while(1) {
  643. rc = sqlite3_step(stmt);
  644. if (rc != SQLITE_ROW) {
  645. if (rc != SQLITE_DONE) {
  646. LOGE("___data_bind, sqlite3_step port failed, tab_id: %d\n", tab_id);
  647. r = -1;
  648. }
  649. break;
  650. }
  651. i = 0;
  652. i++;//p->id = sqlite3_column_int(stmt, i++);
  653. p = (char*)sqlite3_column_text(stmt, i++);
  654. if(p) strcpy(pch->info.name, p); else pch->info.name[0] = 0;
  655. pch->info.type = sqlite3_column_int(stmt, i++);
  656. pch->info.addr = sqlite3_column_int(stmt, i++);
  657. pch->info.ch = sqlite3_column_int(stmt, i++);
  658. pch->info.sch = sqlite3_column_int(stmt, i++);
  659. pch->info.ph_id = sqlite3_column_int(stmt, i++);
  660. pch->info.ph_val = sqlite3_column_int(stmt, i++);
  661. pch->info.open_delay = sqlite3_column_int(stmt, i++);
  662. pch->info.close_delay = sqlite3_column_int(stmt, i++);
  663. #if 0
  664. pch->thr.v_upper.en = sqlite3_column_int(stmt, i++);
  665. pch->thr.v_upper.val = sqlite3_column_double(stmt, i++);
  666. pch->thr.v_upper.act = sqlite3_column_int(stmt, i++);
  667. p = (char*)sqlite3_column_text(stmt, i++);
  668. str_to_array(p,pch->thr.v_upper.para, sizeof(pch->thr.v_upper.para));
  669. pch->thr.v_lower.en = sqlite3_column_int(stmt, i++);
  670. pch->thr.v_lower.val = sqlite3_column_double(stmt, i++);
  671. pch->thr.v_lower.act = sqlite3_column_int(stmt, i++);
  672. p = (char*)sqlite3_column_text(stmt, i++);
  673. str_to_array(p,pch->thr.v_lower.para, sizeof(pch->thr.v_lower.para));
  674. pch->thr.c_upper.en = sqlite3_column_int(stmt, i++);
  675. pch->thr.c_upper.val = sqlite3_column_double(stmt, i++);
  676. pch->thr.c_upper.act = sqlite3_column_int(stmt, i++);
  677. p = (char*)sqlite3_column_text(stmt, i++);
  678. str_to_array(p,pch->thr.c_upper.para, sizeof(pch->thr.c_upper.para));
  679. pch->thr.p_upper.en = sqlite3_column_int(stmt, i++);
  680. pch->thr.p_upper.val = sqlite3_column_double(stmt, i++);
  681. pch->thr.p_upper.act = sqlite3_column_int(stmt, i++);
  682. p = (char*)sqlite3_column_text(stmt, i++);
  683. str_to_array(p,pch->thr.p_upper.para, sizeof(pch->thr.p_upper.para));
  684. pch->thr.w_upper.en = sqlite3_column_int(stmt, i++);
  685. pch->thr.w_upper.val = sqlite3_column_double(stmt, i++);
  686. pch->thr.w_upper.act = sqlite3_column_int(stmt, i++);
  687. p = (char*)sqlite3_column_text(stmt, i++);
  688. str_to_array(p,pch->thr.w_upper.para, sizeof(pch->thr.w_upper.para));
  689. #endif
  690. cnt++;
  691. if(cnt>max) {
  692. break;
  693. }
  694. r = list_append(list, 0, pch, sizeof(power_ch_t));
  695. if(r) {
  696. LOGE("___ list_append failed, tab_id: %d\n", tab_id);
  697. break;
  698. }
  699. }
  700. }
  701. }
  702. break;
  703. case DB_TAB_CFG_SENSOR:
  704. {
  705. if(cmd_id==CMD_UPDATE) {
  706. //sensor_data_t *p=(sensor_data_t*)data;
  707. }
  708. else {
  709. }
  710. }
  711. break;
  712. case DB_TAB_CFG_BREAKER:
  713. {
  714. }
  715. break;
  716. case DB_TAB_CFG_LOG:
  717. {
  718. }
  719. break;
  720. case DB_TAB_REC_POWER:
  721. {
  722. power_ch_t *p=NULL;
  723. uint8_t times=((p->info.type==PDU_AC_I3O3)?3:1);
  724. if(cmd_id==CMD_UPDATE) {
  725. while(1) {
  726. rc = list_get_node(list, &ln, 0);
  727. if(rc) {
  728. break;
  729. }
  730. i = 1;
  731. for(j=0; j<times; j++) {
  732. i++;//sqlite3_bind_int(stmt, i++, p->id);
  733. sqlite3_bind_double(stmt, i++, p->power[j].voltage);
  734. sqlite3_bind_double(stmt, i++, p->power[j].current);
  735. sqlite3_bind_double(stmt, i++, p->power[j].power);
  736. sqlite3_bind_double(stmt, i++, p->power[j].freq);
  737. sqlite3_bind_double(stmt, i++, p->power[j].factor);
  738. sqlite3_bind_double(stmt, i++, p->power[j].consump);
  739. #if 0
  740. sqlite3_bind_double(stmt, i++, p->power[j].active);
  741. sqlite3_bind_double(stmt, i++, p->power[j].reactive);
  742. sqlite3_bind_int(stmt, i++, p->power[j].ph_out);
  743. sqlite3_bind_int(stmt, i++, p->power[j].status);
  744. #endif
  745. sqlite3_bind_int(stmt, i++, p->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. #if 0
  770. p->power[j].active = sqlite3_column_double(stmt, i++);
  771. p->power[j].reactive = sqlite3_column_double(stmt, i++);
  772. p->power[j].ph_out = sqlite3_column_int(stmt, i++);
  773. p->power[j].status = sqlite3_column_int(stmt, i++);
  774. #endif
  775. p->nwire = sqlite3_column_int(stmt, i++);
  776. }
  777. }
  778. }
  779. break;
  780. case DB_TAB_REC_ALARM:
  781. {
  782. }
  783. break;
  784. case DB_TAB_REC_LOG:
  785. {
  786. }
  787. break;
  788. default:
  789. r = -1;
  790. }
  791. if(r==0) {
  792. sqlite3_reset(stmt);
  793. }
  794. return r;
  795. }
  796. /////////////////////////////////////////////////////////////
  797. int db_init(void)
  798. {
  799. int i,r;
  800. sqlite3 *db=NULL;
  801. char path[100];
  802. db_handle_t *h=&dbHandle;
  803. char *errmsg=NULL;
  804. char *ext[DB_MAX]={"cfg","rec"};
  805. memset(h, 0, sizeof(db_handle_t));
  806. h->buflen = (1024*2);
  807. h->buf = (char*)malloc(h->buflen);
  808. if(!h->buf) {
  809. LOGE("___db buf malloc failed!\n");
  810. return -1;
  811. }
  812. sqlite3_initialize();
  813. for(i=0; i<DB_MAX; i++) {
  814. sprintf(path, "%s/%s_%s.db", DB_PATH, DB_NAME, ext[i]);
  815. r = sqlite3_open(path, &h->db[i]);
  816. if(r != SQLITE_OK) {
  817. LOGE("___%s open failed, %s\n", path, sqlite3_errstr(r));
  818. return -1 ;
  819. }
  820. sqlite3_exec(h->db[i], "PRAGMA cache_size=0;" , NULL, NULL, NULL);
  821. h->lck[i] = lock_init();
  822. }
  823. stmt_init(h);
  824. h->inited = 1;
  825. return 0;
  826. }
  827. int db_deinit(void)
  828. {
  829. int i;
  830. db_handle_t *h=&dbHandle;
  831. for(i=0; i<DB_MAX; i++) {
  832. lock_deinit(h->lck[i]);
  833. sqlite3_close(h->db[i]);
  834. }
  835. stmt_deinit(h);
  836. return 0;
  837. }
  838. int db_load(void)
  839. {
  840. int i;
  841. for(i=0; i<DB_MAX; i++) {
  842. //
  843. }
  844. return 0;
  845. }
  846. int db_reset_tab(int tab_id)
  847. {
  848. int r;
  849. db_handle_t *h=&dbHandle;
  850. lock_t lck=get_lck(h,tab_id);
  851. lock_on(lck);
  852. lock_off(lck);
  853. return 0;
  854. }
  855. int db_reset(void)
  856. {
  857. int i;
  858. for(i=0; i<DB_TAB_REC_POWER; i++) {
  859. db_reset_tab(i);
  860. }
  861. }
  862. int db_clear_tab(int tab_id)
  863. {
  864. int r;
  865. db_handle_t *h=&dbHandle;
  866. lock_t lck=get_lck(h,tab_id);
  867. lock_on(lck);
  868. lock_off(lck);
  869. return 0;
  870. }
  871. int db_clear(void)
  872. {
  873. int i;
  874. for(i=DB_TAB_REC_POWER; i<DB_TAB_MAX; i++) {
  875. db_clear_tab(i);
  876. }
  877. return 0;
  878. }
  879. int db_import(int tab_id, char *path)
  880. {
  881. int r;
  882. db_handle_t *h=&dbHandle;
  883. lock_t lck=get_lck(h,tab_id);
  884. lock_on(lck);
  885. lock_off(lck);
  886. return 0;
  887. }
  888. int db_export(int tab_id, char *path)
  889. {
  890. int r;
  891. db_handle_t *h=&dbHandle;
  892. lock_t lck=get_lck(h,tab_id);
  893. lock_on(lck);
  894. lock_off(lck);
  895. return 0;
  896. }
  897. int db_remove(int tab_id, char *contiion)
  898. {
  899. int r;
  900. db_handle_t *h=&dbHandle;
  901. lock_t lck=get_lck(h,tab_id);
  902. lock_on(lck);
  903. lock_off(lck);
  904. return 0;
  905. }
  906. int db_read(int tab_id, char *contiion, handle_t list)
  907. {
  908. int r;
  909. db_handle_t *h=&dbHandle;
  910. lock_t lck=get_lck(h,tab_id);
  911. lock_on(lck);
  912. lock_off(lck);
  913. return 0;
  914. }
  915. int db_write(int tab_id, char *contiion, handle_t list)
  916. {
  917. int r;
  918. db_handle_t *h=&dbHandle;
  919. lock_t lck=get_lck(h,tab_id);
  920. lock_on(lck);
  921. lock_off(lck);
  922. return 0;
  923. }