sql_api.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include "sqlite3.h"
  5. #include "sql_api.h"
  6. int callback_db(void *ptr, int count)
  7. {
  8. usleep(500000);
  9. return -1;
  10. }
  11. int do_cmd_str(char* sql)
  12. {
  13. int rc;
  14. sqlite3* db;
  15. char *errmsg = NULL;
  16. rc = sqlite3_open(SQL_NAME, &db);
  17. if ( rc != SQLITE_OK )
  18. {
  19. printf("ERROR: open sqlite %s \r\n",sqlite3_errmsg(db));
  20. sqlite3_close(db);
  21. return -1;
  22. }
  23. sqlite3_busy_handler(db, callback_db, (void*)db);
  24. rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
  25. if (rc != SQLITE_OK )
  26. {
  27. printf("ERROR: %s-%s \r\n", sql, errmsg);
  28. sqlite3_close(db);
  29. return -1;
  30. }
  31. sqlite3_close(db);
  32. return 0;
  33. }
  34. //初始化设备数据库
  35. int init_device_db(void)
  36. {
  37. char cmd[MAX_TXET_LEN];
  38. sprintf(cmd,"%s","create table if not exists device_db(device_id text primary key , device_name text, device_addr integer unique, application_id text);");
  39. if(do_cmd_str(cmd) != 0)
  40. return -1;
  41. return 0;
  42. }
  43. //插入设备到数据库
  44. int insert_device_item(char*device_id,char*device_name,uint8_t device_addr, char* application_id)
  45. {
  46. char cmd[MAX_TXET_LEN];
  47. sprintf(cmd,"insert into device_db(device_id,device_name,device_addr,application_id) values('%s','%s',%d,'%s');", device_id,device_name,device_addr,application_id);
  48. if(do_cmd_str(cmd)!=0)
  49. return -1;
  50. return 0;
  51. }
  52. //更新设备到数据库
  53. int update_device_by_device_id(char*device_id,char*device_name,uint8_t device_addr,char *application_id)
  54. {
  55. char cmd[MAX_TXET_LEN];
  56. sprintf(cmd,"update device_db set device_id = '%s',device_name = '%s', device_addr = %d, application_id = '%s' where device_id = '%s';", device_id,device_name,device_addr,application_id,device_id);
  57. if(do_cmd_str(cmd)!=0)
  58. return -1;
  59. return 0;
  60. }
  61. //删除设备通过设备id
  62. int delete_device_by_device_id( char*device_id )
  63. {
  64. char cmd[MAX_TXET_LEN];
  65. sprintf(cmd,"delete from device_db where device_id = '%s';", device_id);
  66. if(do_cmd_str(cmd)!=0)
  67. return -1;
  68. return 0;
  69. }
  70. int update_attrtab_item_by_device_id(char*device_id, char*attr_id, char*attr_value)
  71. {
  72. char cmd[MAX_TXET_LEN];
  73. int rc,nRow,nColumn,i=0;
  74. sqlite3* db;
  75. char **result=NULL, *errmsg = NULL;
  76. rc = sqlite3_open(SQL_NAME, &db);
  77. if ( rc != SQLITE_OK )
  78. {
  79. printf("ERROR:open sqlite %s \r\n",sqlite3_errmsg(db));
  80. sqlite3_close(db);
  81. return -1;
  82. }
  83. sprintf(cmd,"select * from device_db limit 0;");
  84. rc = sqlite3_get_table(db,cmd,&result,&nRow,&nColumn,&errmsg);
  85. if (rc != SQLITE_OK)
  86. {
  87. printf("ERROR: get table %s \r\n", errmsg);
  88. sqlite3_close(db);
  89. return -1;
  90. }
  91. for(i=0; i<nColumn ;i++)
  92. {
  93. if(strcmp(attr_id, result[i])==0)
  94. break;
  95. }
  96. if( i == nColumn)
  97. {
  98. sprintf(cmd, "alter table device_db add column %s text", attr_id);
  99. sqlite3_busy_handler(db, callback_db, (void*)db);
  100. sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
  101. sprintf(cmd, "update device_db set %s = '%s' where device_id = '%s';", attr_id,attr_value,device_id);
  102. sqlite3_busy_handler(db, callback_db, (void*)db);
  103. sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
  104. }
  105. else
  106. {
  107. sprintf(cmd, "update device_db set %s = '%s' where device_id = '%s';", attr_id,attr_value,device_id);
  108. sqlite3_busy_handler(db, callback_db, (void*)db);
  109. sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
  110. }
  111. sqlite3_free_table(result);
  112. sqlite3_close(db);
  113. return 1;
  114. }
  115. //更新数据到数据库通过设备id
  116. int update_tab_item_by_device_id(char*device_id,char *attr_id, char *attr_value)
  117. {
  118. char cmd[MAX_TXET_LEN];
  119. sprintf(cmd,"update device_db set %s = '%s' where device_id = '%s';", attr_id,attr_value,device_id);
  120. if(do_cmd_str(cmd)!=0)
  121. return -1;
  122. return 0;
  123. }
  124. //更新数据到数据库通过设备地址
  125. int update_tab_item_by_device_addr(uint8_t device_addr,char *attr_id, char *attr_value, uint8_t application_id)
  126. {
  127. char cmd[MAX_TXET_LEN];
  128. sprintf(cmd,"update device_db set %s = '%s' where device_addr = %d and application_id = %d;", attr_id,attr_value,device_addr,application_id);
  129. if(do_cmd_str(cmd)!=0)
  130. return -1;
  131. return 0;
  132. }
  133. //查询设备列表
  134. int select_all_device(struct json_object **rsp_obj)
  135. {
  136. int rc,nRow,nColumn,i=0;
  137. sqlite3* db;
  138. char **result=NULL, *errmsg = NULL, cmd[MAX_TXET_LEN]={0};
  139. struct json_object *device_obj =NULL, *device_array=NULL;
  140. rc = sqlite3_open(SQL_NAME, &db);
  141. if ( rc != SQLITE_OK )
  142. {
  143. printf("ERROR:open sqlite %s \r\n",sqlite3_errmsg(db));
  144. sqlite3_close(db);
  145. return -1;
  146. }
  147. sprintf(cmd,"select device_id, device_name, device_addr, application_id from device_db;");
  148. rc = sqlite3_get_table(db,cmd,&result,&nRow,&nColumn,&errmsg);
  149. if (rc != SQLITE_OK)
  150. {
  151. printf("ERROR: get table %s \r\n", errmsg);
  152. sqlite3_close(db);
  153. return -1;
  154. }
  155. *rsp_obj = json_object_new_object();
  156. if(*rsp_obj == NULL)
  157. {
  158. sqlite3_free_table(result);
  159. sqlite3_close(db);
  160. return -1;
  161. }
  162. device_array = json_object_new_array();
  163. if(device_array == NULL)
  164. {
  165. sqlite3_free_table(result);
  166. sqlite3_close(db);
  167. json_object_put(*rsp_obj);
  168. return -1;
  169. }
  170. for(i=1; i<=nRow ;i++)
  171. {
  172. device_obj = json_object_new_object();
  173. json_object_object_add(device_obj, "device_id", json_object_new_string(result[i*nColumn+0]));
  174. json_object_object_add(device_obj, "device_name", json_object_new_string(result[i*nColumn+1]));
  175. json_object_object_add(device_obj, "device_addr", json_object_new_string(result[i*nColumn+2]));
  176. json_object_object_add(device_obj, "application_id", json_object_new_string(result[i*nColumn+3]));
  177. json_object_array_add(device_array, device_obj);
  178. }
  179. json_object_object_add(*rsp_obj, "devices", device_array);
  180. json_object_object_add(*rsp_obj, "state", json_object_new_string("success"));
  181. sqlite3_free_table(result);
  182. sqlite3_close(db);
  183. return nRow;
  184. }
  185. int select_device_id_by_device_addr(uint8_t device_addr,uint8_t *device_id, uint8_t application_id)
  186. {
  187. int rc,nRow,nColumn,i=0;
  188. sqlite3* db;
  189. char **result=NULL, *errmsg = NULL, cmd[MAX_TXET_LEN]={0};
  190. rc = sqlite3_open(SQL_NAME, &db);
  191. if ( rc != SQLITE_OK )
  192. {
  193. printf("ERROR:open sqlite %s \r\n",sqlite3_errmsg(db));
  194. sqlite3_close(db);
  195. return -1;
  196. }
  197. sprintf(cmd,"select device_id from device_db where device_addr = %d and application_id = %d;", device_addr,application_id);
  198. rc = sqlite3_get_table(db,cmd,&result,&nRow,&nColumn,&errmsg);
  199. if (rc != SQLITE_OK)
  200. {
  201. printf("ERROR: get table %s \r\n", errmsg);
  202. sqlite3_close(db);
  203. return -1;
  204. }
  205. if(nRow == 0)
  206. {
  207. memset(device_id,'\0', 17);
  208. }
  209. else
  210. {
  211. memset(device_id,'\0', 17);
  212. memcpy(device_id,result[1*nColumn+0],16);
  213. }
  214. sqlite3_free_table(result);
  215. sqlite3_close(db);
  216. return nRow;
  217. }
  218. //通过设备地址查询设备数据
  219. int select_attr_by_device_addr(uint16_t *buffer, uint8_t device_addr, char*attr_id, uint8_t application_id)
  220. {
  221. int rc,nRow,nColumn,i=0;
  222. sqlite3* db;
  223. char **result=NULL, *errmsg = NULL, cmd[MAX_TXET_LEN]={0};
  224. uint16_t value =0 ;
  225. rc = sqlite3_open(SQL_NAME, &db);
  226. if ( rc != SQLITE_OK )
  227. {
  228. printf("ERROR:open sqlite %s \r\n",sqlite3_errmsg(db));
  229. sqlite3_close(db);
  230. return -1;
  231. }
  232. sprintf(cmd,"select %s from device_db where device_addr = %d and application_id = %d;", attr_id,device_addr,application_id);
  233. rc = sqlite3_get_table(db,cmd,&result,&nRow,&nColumn,&errmsg);
  234. if (rc != SQLITE_OK)
  235. {
  236. *buffer =0;
  237. sqlite3_close(db);
  238. return -1;
  239. }
  240. if(nRow == 0)
  241. {
  242. *buffer =0;
  243. }
  244. else
  245. {
  246. *buffer = atoi(result[1*nColumn+0]);
  247. }
  248. //sscanf(result[1*nColumn+0],"%04d",&value);
  249. //*buffer = value;
  250. //strtol(result[1*nColumn+0], buffer, 16);
  251. sqlite3_free_table(result);
  252. sqlite3_close(db);
  253. return nRow;
  254. }
  255. #if 0
  256. //读取数据库
  257. int get_tab_item(int numofday)
  258. {
  259. int rc,nRow,nColumn,i=0;
  260. sqlite3* db;
  261. char **result;
  262. char *errmsg = NULL;
  263. char cmd[512];
  264. rc = sqlite3_open(SQL_NAME, &db);
  265. if ( rc != SQLITE_OK )
  266. {
  267. printf("ERROR:open sqlite %s \r\n",sqlite3_errmsg(db));
  268. sqlite3_close(db);
  269. return -1;
  270. }
  271. sprintf(cmd,"select * from log_db where date(logtime) between date('now','-%d day','localtime') and date('now','localtime');", numofday);
  272. rc = sqlite3_get_table(db,cmd,&result,&nRow,&nColumn,&errmsg);
  273. if (rc != SQLITE_OK)
  274. {
  275. printf("ERROR: get table %s \r\n", errmsg);
  276. sqlite3_close(db);
  277. return -1;
  278. }
  279. for(i=0;i<nRow;i++)
  280. {
  281. printf("%s %s %s %s %s\r\n",result[i*nColumn],result[i*nColumn+1],result[i*nColumn+2],result[i*nColumn+3],result[i*nColumn+4]);
  282. }
  283. sqlite3_free_table(result);
  284. sqlite3_close(db);
  285. return 0;
  286. }
  287. #endif
  288. #if 0
  289. //删除30天前的日志
  290. int del_30d_item()
  291. {
  292. char cmd[512];
  293. sprintf(cmd,"%s","delete from log_db where date('now', '-30 day') >= date(logtime);");
  294. if(do_cmd_str(cmd)!=0)
  295. return -1;
  296. return 0;
  297. }
  298. //用户写日志
  299. int log_write(char*type,char*level,char *log)
  300. {
  301. insert_tab_item(type,level,log);
  302. }
  303. //用户读日志
  304. void log_read(struct json_object *root)
  305. {
  306. get_tab_item(root);
  307. }
  308. #endif
  309. #if 0
  310. int main(void)
  311. {
  312. uint16_t buffer16;
  313. uint8_t tmp[5];
  314. uint16_t attr_value;
  315. uint8_t j=0;
  316. uint8_t device_id[17];
  317. init_device_db();
  318. //insert_device_item("0102030405060708","test0",1, "lora");
  319. //insert_device_item("0102030405060709","test1",2, "lora");
  320. //insert_device_item("010203040506070a","test2",3, "lora");
  321. update_tab_item_by_device_id("0102030405060709","0000", "0");
  322. update_tab_item_by_device_id("0102030405060709","0001", "1");
  323. update_tab_item_by_device_id("0102030405060709","0002", "2");
  324. update_tab_item_by_device_id("0102030405060709","0003", "3");
  325. update_tab_item_by_device_addr(2, "0000", "8");
  326. update_tab_item_by_device_addr(2, "0001", "8");
  327. update_tab_item_by_device_addr(2, "0002", "8");
  328. update_tab_item_by_device_addr(2, "0003", "8");
  329. update_tab_item_by_device_addr(3, "0000", "8");
  330. update_tab_item_by_device_addr(4, "0000", "8");
  331. select_device_id_by_device_addr(4,device_id);
  332. printf("addr:%d ---id:0x%s\r\n",4,device_id);
  333. select_device_id_by_device_addr(2,device_id);
  334. printf("addr:%d ---id:0x%s\r\n",2,device_id);
  335. for(j=1; j<4; j++)
  336. {
  337. sprintf(tmp, "%04x",j);
  338. tmp[4]='\0';
  339. printf("%s----",tmp);
  340. printf("nrow=%d\r\n",select_attr_by_device_addr(&attr_value, 2, tmp));
  341. printf("maddr:%d, attrid:%s, buffer16:%d \r\n",2, tmp, attr_value);
  342. }
  343. for(j=1; j<4; j++)
  344. {
  345. sprintf(tmp, "%04x",j);
  346. tmp[4]='\0';
  347. printf("%s----",tmp);
  348. printf("nrow=%d\r\n",select_attr_by_device_addr(&attr_value, 3, tmp));
  349. printf("maddr:%d, attrid:%s, buffer16:%d \r\n",3, tmp, attr_value);
  350. }
  351. }
  352. #endif