ApexMobileDB.m 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. //
  2. // ApexMobileDB.m
  3. // Apex Mobile
  4. //
  5. // Created by Ray on 14-2-28.
  6. // Copyright (c) 2014年 United Software Applications, Inc. All rights reserved.
  7. //
  8. #import "ApexMobileDB.h"
  9. #import "config.h"
  10. @implementation ApexMobileDB
  11. + (int) get_recordid:(sqlite3*)db table:(NSString*) tablename where:(NSString*) whereclause
  12. {
  13. // [ApexMobileDB execSql: [NSString stringWithFormat: @"update fields_info set abandon = 1 where user ='%@'",user] db:db];
  14. return [self get_recordid:db table:tablename where:whereclause order:@"_id"];
  15. }
  16. + (int) get_recordid:(sqlite3*)db table:(NSString*) tablename where:(NSString*) whereclause order:(NSString*) orderby
  17. {
  18. int ret = -1;
  19. NSString *sqlQuery = [NSString stringWithFormat:@"select _id from %@ where %@ order by %@",tablename,whereclause,orderby];
  20. sqlite3_stmt * statement;
  21. if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK)
  22. {
  23. if (sqlite3_step(statement) == SQLITE_ROW)
  24. {
  25. // char *name = (char*)sqlite3_column_text(statement, 1);
  26. // NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];
  27. ret = sqlite3_column_int(statement, 0);
  28. // char *address = (char*)sqlite3_column_text(statement, 3);
  29. // NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];
  30. }
  31. sqlite3_finalize(statement);
  32. }
  33. return ret;
  34. }
  35. + (sqlite3*) get_db
  36. {
  37. sqlite3* db = nil;
  38. // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  39. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  40. NSString *documents = [paths objectAtIndex:0];
  41. NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];
  42. DebugLog(@"home path %@",documents);
  43. if (sqlite3_open([database_path UTF8String], &db) != SQLITE_OK) {
  44. DebugLog(@"sqlite3_open failed. msg:%s",sqlite3_errmsg(db));
  45. sqlite3_close(db);
  46. }
  47. //#ifdef DEBUG_DB
  48. // NSFileManager *manager = [NSFileManager defaultManager];
  49. //
  50. // NSString *copyPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
  51. // copyPath = [copyPath stringByAppendingPathComponent:DBNAME];
  52. // [manager removeItemAtPath:copyPath error:nil];
  53. // BOOL isCopy = [manager copyItemAtPath:database_path toPath:copyPath error:nil];
  54. // if (isCopy) {
  55. // NSLog(@"拷贝成功");
  56. // } else {
  57. // NSLog(@"拷贝失败");
  58. // }
  59. //#endif
  60. return db;
  61. }
  62. +(void)execSql:(NSString *)sql db:(sqlite3 *)db
  63. {
  64. char *err;
  65. if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
  66. DebugLog(@"sqlite3_exec failed msg:%s",sqlite3_errmsg(db));
  67. DebugLog(@"sqlite3_exec failed sql:%@",sql);
  68. sqlite3_close(db);
  69. }
  70. }
  71. +(BOOL)checkForField:(NSString *)table field:(NSString *)field db:(sqlite3 *)db
  72. {
  73. sqlite3_stmt *stmt;
  74. NSString *sql = [NSString stringWithFormat:@"PRAGMA table_info(%@)",table];
  75. if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL) == SQLITE_OK)
  76. {
  77. while(sqlite3_step(stmt) == SQLITE_ROW)
  78. {
  79. NSString *fieldName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
  80. if([field isEqualToString:fieldName])
  81. {
  82. sqlite3_finalize(stmt);
  83. return YES;
  84. }
  85. }
  86. }
  87. return NO;
  88. }
  89. +(NSArray*) get_Location
  90. {
  91. sqlite3* db = [self get_db ];
  92. NSMutableArray* ret = [[NSMutableArray alloc] init];
  93. NSString *sqlQuery = @"select area,company,city,longitude,latitude,address,telephone,fax,contact,email from locations";
  94. sqlite3_stmt * statement;
  95. NSMutableDictionary* map = [[NSMutableDictionary alloc] init];
  96. if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK)
  97. {
  98. while (sqlite3_step(statement) == SQLITE_ROW)
  99. {
  100. NSString* area =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
  101. NSString* company =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
  102. NSString* city =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
  103. NSString* longitude =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
  104. NSString* latitude =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];
  105. NSString* address =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];
  106. NSString* telephone =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];
  107. NSString* fax =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 7)];
  108. NSString* contact =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 8)];
  109. NSString* email =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 9)];
  110. [map setValue:area forKey:@"area"];
  111. [map setValue:company forKey:@"company"];
  112. [map setValue:city forKey:@"city"];
  113. [map setValue:longitude forKey:@"longitude"];
  114. [map setValue:latitude forKey:@"latitude"];
  115. [map setValue:address forKey:@"address"];
  116. [map setValue:telephone forKey:@"telephone"];
  117. [map setValue:fax forKey:@"fax"];
  118. [map setValue:contact forKey:@"contact"];
  119. [map setValue:email forKey:@"email"];
  120. [ret addObject:map.copy];
  121. }
  122. sqlite3_finalize(statement);
  123. }
  124. sqlite3_close(db);
  125. return ret;
  126. }
  127. +(NSArray*) get_searchhistory:(NSString*) field
  128. {
  129. sqlite3* db = [self get_db ];
  130. NSMutableArray* ret = [[NSMutableArray alloc] init];
  131. AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  132. NSString* user = appDelegate.user;
  133. NSString *sqlQuery = [NSString stringWithFormat:@"select h_val from search_history where h_field='%@' and user='%@' order by h_time desc",field,user];
  134. sqlite3_stmt * statement;
  135. if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK)
  136. {
  137. while (sqlite3_step(statement) == SQLITE_ROW)
  138. {
  139. // char *name = (char*)sqlite3_column_text(statement, 1);
  140. // NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];
  141. NSString *val = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
  142. [ret addObject:val];
  143. // char *address = (char*)sqlite3_column_text(statement, 3);
  144. // NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];
  145. }
  146. sqlite3_finalize(statement);
  147. }
  148. sqlite3_close(db);
  149. return ret;
  150. }
  151. +(void) savehistory:(NSString*) field value:(NSString*) value
  152. {
  153. sqlite3* db = [self get_db ];
  154. AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  155. NSString* user = appDelegate.user;
  156. int _id = [self get_recordid:db table:@"search_history" where:[NSString stringWithFormat:@"user='%@' and h_field='%@' and h_val ='%@'",user,field,value]];
  157. if(_id>=0)
  158. {
  159. NSString* sql = [NSString stringWithFormat:@"update search_history set h_time = datetime('now', 'localtime') where _id =%d",_id];
  160. [self execSql:sql db:db];
  161. }
  162. else
  163. {
  164. NSString* sql = [NSString stringWithFormat:@"insert into search_history(user,h_field,h_val) values('%@','%@','%@')",user,field,value];
  165. [self execSql:sql db:db];
  166. }
  167. sqlite3_close(db);
  168. }
  169. + (BOOL) initializeDb {
  170. DebugLog (@"initializeDB");
  171. // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  172. // NSString *documents = [paths objectAtIndex:0];
  173. // NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];
  174. //
  175. //
  176. // // move db file from document to cache ;
  177. // NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  178. // NSString *documentFolderPath = [searchPaths objectAtIndex: 0];
  179. // NSString* dbFilePath = [documentFolderPath stringByAppendingPathComponent:DBNAME];
  180. // if ([[NSFileManager defaultManager] fileExistsAtPath: dbFilePath])
  181. // {
  182. // [[NSFileManager defaultManager] moveItemAtPath:dbFilePath toPath:database_path error:nil];
  183. //
  184. // }
  185. // end move;
  186. // 2019.1.11 move db from cache to document
  187. NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
  188. NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
  189. NSString *db_cache = [cacheDir stringByAppendingPathComponent:DBNAME];
  190. NSString *db_doc = [docDir stringByAppendingPathComponent:DBNAME];
  191. if ([[NSFileManager defaultManager] fileExistsAtPath:db_cache]) {
  192. NSError *err;
  193. [[NSFileManager defaultManager] moveItemAtPath:db_cache toPath:db_doc error:&err];
  194. if (err) {
  195. NSLog(@"move database error: %@",err);
  196. }
  197. }
  198. if (true)//! [[NSFileManager defaultManager] fileExistsAtPath: database_path])
  199. {
  200. sqlite3 *db = [self get_db];
  201. // int ret = sqlite3_close(db);
  202. //db = [self get_db];
  203. //
  204. // ret = sqlite3_close(db);
  205. NSString *create_actions_info = @"CREATE TABLE IF NOT EXISTS actions_info (_id integer PRIMARY KEY,name varchar(20),function_name varchar(20),priority integer,abandon boolean,user varchar(20));";
  206. NSString *create_fields_info = @"CREATE TABLE IF NOT EXISTS fields_info (_id integer PRIMARY KEY,name varchar(20),aname varchar(20),field_type integer,function_name varchar(20),behavior integer,priority integer,show boolean,abandon boolean,user varchar(20));";
  207. NSString *create_search_history = @"CREATE TABLE IF NOT EXISTS search_history (_id INTEGER PRIMARY KEY,h_val VARCHAR(20),h_field VARCHAR(20),level INTEGER,h_time TIMESTAMP default (datetime('now', 'localtime')),user VARCHAR(20));";
  208. NSString* create_push_message =@"CREATE TABLE IF NOT EXISTS push_message (_id INTEGER PRIMARY KEY, s_id VARCHAR(20), e_id VARCHAR(20), msgcount INTEGER, message VARCHAR(20), h_time timestamp default (datetime('now', 'localtime')), create_time timestamp default (datetime('now', 'localtime')), user VARCHAR(20), read BOOLEAN);";
  209. NSString* create_favorites =@"CREATE TABLE IF NOT EXISTS favorites (_id INTEGER PRIMARY KEY, name VARCHAR(20), params VARCHAR(20), action VARCHAR(20), module_name VARCHAR(20), create_time timestamp default (datetime('now', 'localtime')), user VARCHAR(20));";
  210. NSString* create_history=@"CREATE TABLE IF NOT EXISTS history ( _id INTEGER PRIMARY KEY, name VARCHAR(20), params VARCHAR(20), action VARCHAR(20), module_name VARCHAR(20), create_time timestamp default (datetime('now', 'localtime')), user VARCHAR(20));";
  211. NSString* create_location=@"CREATE TABLE IF NOT EXISTS locations ( _id INTEGER PRIMARY KEY, area VARCHAR(20), company VARCHAR(20), city VARCHAR(20), longitude VARCHAR(20), latitude VARCHAR(20) ,address VARCHAR(20), telephone VARCHAR(20) , fax VARCHAR(20), contact VARCHAR(20), email VARCHAR(20));";
  212. NSString *create_auth_ver = @"create table if not exists auth_ver (_id integer primary key autoincrement, ver integer);";
  213. // CREATE TABLE users (_id integer PRIMARY KEY,name varchar(20),pass varchar(20));
  214. [self execSql:create_actions_info db:db];
  215. [self execSql:create_fields_info db:db];
  216. [self execSql:create_search_history db:db];
  217. [self execSql:create_push_message db:db];
  218. [self execSql:create_favorites db:db];
  219. [self execSql:create_history db:db];
  220. [self execSql:create_location db:db];
  221. [self execSql:create_auth_ver db:db];
  222. if( ![self checkForField:@"search_history" field:@"level" db:db])
  223. {
  224. NSString* alter_search_history = @"ALTER TABLE search_history ADD level INTEGER";
  225. [self execSql:alter_search_history db:db];
  226. }
  227. // NSTimeInterval time=[[NSDate date] timeIntervalSince1970];
  228. // double t = time-2592000; //NSTimeInterval返回的是double类型
  229. // NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  230. // [formatter setDateFormat:@"yyyy-MM-dd"];
  231. //
  232. // NSString*timestr=[formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:t]];
  233. //
  234. // [self execSql:[NSString stringWithFormat:@"delete from search_history where h_time<%@",timestr ] db:db];
  235. [self execSql:@"delete from search_history where julianday('now', 'localtime')-julianday(h_time, 'localtime')>30" db:db];
  236. sqlite3_close(db);
  237. // int aaa = 0;
  238. }
  239. [self deleteResultFields];
  240. [self updateResultDisplayFields];
  241. return YES;
  242. DebugLog (@"bottom of initializeDb");
  243. }
  244. + (void)jk_query:(NSString *)sql completion:(void (^)(sqlite3_stmt *, long *))query failure:(void (^)(NSString *))failure {
  245. if (sql.length == 0) {
  246. return;
  247. }
  248. dispatch_async(dispatch_get_main_queue(), ^{
  249. NSString *sqlQuery = sql;
  250. sqlite3_stmt * statement;
  251. sqlite3 *db = [self get_db];
  252. if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
  253. if (query) {
  254. long count = 0;
  255. while (sqlite3_step(statement) == SQLITE_ROW) {
  256. query(statement,&count);
  257. count++;
  258. }
  259. }
  260. sqlite3_finalize(statement);
  261. } else {
  262. DebugLog(@"excute sql:%@ error: %s",sql,sqlite3_errmsg(db));
  263. if (failure) {
  264. failure(@"error");
  265. }
  266. }
  267. sqlite3_close(db);
  268. });
  269. }
  270. + (void)jk_excute:(NSString *)sql completion:(void (^)(BOOL))completion {
  271. if (sql.length == 0) {
  272. return;
  273. }
  274. dispatch_async(dispatch_get_main_queue(), ^{
  275. sqlite3 *db = [self get_db];
  276. char *err;
  277. if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
  278. if (completion) {
  279. completion(YES);
  280. }
  281. } else {
  282. DebugLog(@"excute sql:%@ error: %s",sql,sqlite3_errmsg(db));
  283. if (completion) {
  284. completion(NO);
  285. }
  286. }
  287. sqlite3_close(db);
  288. });
  289. }
  290. + (void)jk_sync_query:(NSString *)sql completion:(void (^)(sqlite3_stmt *, long *))query failure:(void (^)(NSString *))failure {
  291. if (!sql) {
  292. if (failure) {
  293. failure(@"sql is nil");
  294. }
  295. return;
  296. }
  297. NSString *sqlQuery = sql;
  298. sqlite3_stmt * statement;
  299. sqlite3 *db = [self get_db];
  300. if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
  301. if (query) {
  302. long count = 0;
  303. while (sqlite3_step(statement) == SQLITE_ROW) {
  304. query(statement,&count);
  305. count++;
  306. }
  307. }
  308. sqlite3_finalize(statement);
  309. } else {
  310. DebugLog(@"excute sql:%@ error: %s",sql,sqlite3_errmsg(db));
  311. if (failure) {
  312. failure(@"error");
  313. }
  314. }
  315. sqlite3_close(db);
  316. }
  317. + (void)jk_sync_excute:(NSString *)sql completion:(void (^)(BOOL))completion {
  318. if (sql.length == 0) {
  319. if (completion) {
  320. completion(NO);
  321. }
  322. return;
  323. }
  324. sqlite3 *db = [self get_db];
  325. char *err;
  326. if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
  327. if (completion) {
  328. completion(YES);
  329. }
  330. } else {
  331. DebugLog(@"excute sql:%@ error: %s",sql,sqlite3_errmsg(db));
  332. if (completion) {
  333. completion(NO);
  334. }
  335. }
  336. sqlite3_close(db);
  337. }
  338. + (NSString *)prepareUploadSQLOfUser:(NSString *)user withDiviceID:(NSString *)deviceID {
  339. NSMutableString *sqlStr = [NSMutableString string];
  340. sqlite3 *db = [self get_db];
  341. // favorites
  342. NSString *favorites_sql = [NSString stringWithFormat:@"select ifnull(name,''), ifnull(params, ''), ifnull(action, ''), ifnull(module_name, ''), ifnull(user, ''), ifnull(create_time, '') from favorites where user = '%@';", user];
  343. sqlite3_stmt *favorites_statment;
  344. if (sqlite3_prepare_v2(db, favorites_sql.UTF8String, -1, &favorites_statment, NULL) == SQLITE_OK) {
  345. while (sqlite3_step(favorites_statment) == SQLITE_ROW) {
  346. char *ch_name = (char *)sqlite3_column_text(favorites_statment, 0);
  347. char *ch_params = (char *)sqlite3_column_text(favorites_statment, 1);
  348. char *ch_action = (char *)sqlite3_column_text(favorites_statment, 2);
  349. char *ch_module_name = (char *)sqlite3_column_text(favorites_statment, 3);
  350. char *ch_user = (char *)sqlite3_column_text(favorites_statment, 4);
  351. char *ch_create_time = (char *)sqlite3_column_text(favorites_statment, 5);
  352. NSString *str_name = [NSString stringWithUTF8String:ch_name];
  353. NSString *str_params = [NSString stringWithUTF8String:ch_params];
  354. NSString *str_action = [NSString stringWithUTF8String:ch_action];
  355. NSString *str_module_name = [NSString stringWithUTF8String:ch_module_name];
  356. NSString *str_user = [NSString stringWithUTF8String:ch_user];
  357. NSString *str_create_time = [NSString stringWithUTF8String:ch_create_time];
  358. NSString *insert_sql = [NSString stringWithFormat:@"insert into favorites (name, params, action, module_name, user_name, device_id, create_time) values ('%@', '%@', '%@', '%@', '%@', '%@', '%@');", str_name, str_params, str_action, str_module_name, str_user, deviceID, str_create_time];
  359. [sqlStr appendString:insert_sql];
  360. [sqlStr appendString:@"\r\n"];
  361. }
  362. sqlite3_finalize(favorites_statment);
  363. }
  364. // fields_info
  365. NSString *fieldsSql = [NSString stringWithFormat:@"select ifnull(name, ''), ifnull(aname, ''), ifnull(field_type, 0), ifnull(function_name, ''), ifnull(behavior, 0), ifnull(priority, 0), ifnull(show, 0), ifnull(user, '') from fields_info where user = '%@';",user];
  366. sqlite3_stmt *fields_statment;
  367. if (sqlite3_prepare_v2(db, fieldsSql.UTF8String, -1, &fields_statment, NULL) == SQLITE_OK) {
  368. while (sqlite3_step(fields_statment) == SQLITE_ROW) {
  369. char *ch_name = (char *)sqlite3_column_text(fields_statment, 0);
  370. char *ch_aname = (char *)sqlite3_column_text(fields_statment, 1);
  371. int field_type = sqlite3_column_int(fields_statment, 2);
  372. char *ch_function_name = (char *)sqlite3_column_text(fields_statment, 3);
  373. int behavior = sqlite3_column_int(fields_statment, 4);
  374. int priority = sqlite3_column_int(fields_statment, 5);
  375. int show = sqlite3_column_int(fields_statment, 6);
  376. char *ch_user = (char *)sqlite3_column_text(fields_statment, 7);
  377. NSString *str_name = [NSString stringWithUTF8String:ch_name];
  378. NSString *str_aname = [NSString stringWithUTF8String:ch_aname];
  379. NSString *str_function_name = [NSString stringWithUTF8String:ch_function_name];
  380. NSString *str_user = [NSString stringWithUTF8String:ch_user];
  381. NSString *insert_sql = [NSString stringWithFormat:@"insert into fields_info (name, aname, field_type, function_name, behavior, priority, show, user_name, device_id) values ('%@', '%@', %d, '%@', %d, %d, %d, '%@', '%@');", str_name, str_aname, field_type, str_function_name, behavior, priority, show, str_user, deviceID];
  382. [sqlStr appendString:insert_sql];
  383. [sqlStr appendString:@"\r\n"];
  384. }
  385. sqlite3_finalize(fields_statment);
  386. }
  387. // history
  388. NSString *historySql = [NSString stringWithFormat:@"select ifnull(name, ''), ifnull(params, ''), ifnull(action, ''), ifnull(module_name, ''), ifnull(user, ''), ifnull(create_time, '') from history where user = '%@';",user];
  389. sqlite3_stmt *history_statment;
  390. if (sqlite3_prepare_v2(db, historySql.UTF8String, -1, &history_statment, NULL) == SQLITE_OK) {
  391. while (sqlite3_step(history_statment) == SQLITE_ROW) {
  392. char *ch_name = (char *)sqlite3_column_text(history_statment, 0);
  393. char *ch_params = (char *)sqlite3_column_text(history_statment, 1);
  394. char *ch_action = (char *)sqlite3_column_text(history_statment, 2);
  395. char *ch_module_name = (char *)sqlite3_column_text(history_statment, 3);
  396. char *ch_user = (char *)sqlite3_column_text(history_statment, 4);
  397. char *ch_create_time = (char *)sqlite3_column_text(history_statment, 5);
  398. NSString *str_name = [NSString stringWithUTF8String:ch_name];
  399. NSString *str_params = [NSString stringWithUTF8String:ch_params];
  400. NSString *str_action = [NSString stringWithUTF8String:ch_action];
  401. NSString *str_module_name = [NSString stringWithUTF8String:ch_module_name];
  402. NSString *str_user = [NSString stringWithUTF8String:ch_user];
  403. NSString *str_create_time = [NSString stringWithUTF8String:ch_create_time];
  404. NSString *insert_sql = [NSString stringWithFormat:@"insert into history (name, params, action, module_name, user_name, device_id, create_time) values ('%@', '%@', '%@', '%@', '%@', '%@', '%@');", str_name, str_params, str_action, str_module_name, str_user, deviceID, str_create_time];
  405. [sqlStr appendString:insert_sql];
  406. [sqlStr appendString:@"\r\n"];
  407. }
  408. sqlite3_finalize(history_statment);
  409. }
  410. // search history
  411. NSString *searchHistorySql = [NSString stringWithFormat:@"select ifnull(h_val, ''), ifnull(h_field, ''), ifnull(level, 0), ifnull(user, ''), ifnull(h_time, '') from search_history where user = '%@';",user];
  412. sqlite3_stmt *search_history_statment;
  413. if (sqlite3_prepare_v2(db, searchHistorySql.UTF8String, -1, &search_history_statment, NULL) == SQLITE_OK) {
  414. while (sqlite3_step(search_history_statment) == SQLITE_ROW) {
  415. char *ch_val = (char *)sqlite3_column_text(search_history_statment, 0);
  416. char *ch_field = (char *)sqlite3_column_text(search_history_statment, 1);
  417. int level = sqlite3_column_int(search_history_statment, 2);
  418. char *ch_user = (char *)sqlite3_column_text(search_history_statment, 3);
  419. char *ch_time = (char *)sqlite3_column_text(search_history_statment, 4);
  420. NSString *str_val = [NSString stringWithUTF8String:ch_val];
  421. NSString *str_field = [NSString stringWithUTF8String:ch_field];
  422. NSString *str_user = [NSString stringWithUTF8String:ch_user];
  423. NSString *str_time = [NSString stringWithUTF8String:ch_time];
  424. NSString *insert_sql = [NSString stringWithFormat:@"insert into search_history (h_val, h_field, level, user_name, device_id, h_time) values ('%@', '%@', %d, '%@', '%@', '%@');",str_val, str_field, level, str_user, deviceID, str_time];
  425. [sqlStr appendString:insert_sql];
  426. [sqlStr appendString:@"\r\n"];
  427. }
  428. sqlite3_finalize(search_history_statment);
  429. }
  430. sqlite3_close(db);
  431. return sqlStr.copy;
  432. }
  433. + (BOOL)hasDatabaseFile {
  434. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  435. NSString *documents = [paths objectAtIndex:0];
  436. NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];
  437. if ([[NSFileManager defaultManager] fileExistsAtPath:database_path]) {
  438. return YES;
  439. }
  440. return NO;
  441. }
  442. + (BOOL)isCachedDataForUser:(NSString *)user {
  443. BOOL hasDatabase = [self hasDatabaseFile];
  444. if (!hasDatabase) {
  445. return NO;
  446. }
  447. __block BOOL result = NO;
  448. NSString *has_sql = [NSString stringWithFormat:@"select count(0) from (select user from favorites union all select user from fields_info union all select user from history union all select user from search_history) where user = '%@';", user];
  449. sqlite3_stmt * statement;
  450. sqlite3 *db = [self get_db];
  451. if (sqlite3_prepare_v2(db, [has_sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
  452. while (sqlite3_step(statement) == SQLITE_ROW) {
  453. int c = sqlite3_column_int(statement, 0);
  454. result = c > 0;
  455. }
  456. sqlite3_finalize(statement);
  457. }
  458. sqlite3_close(db);
  459. return result;
  460. }
  461. + (void)cleanCacheDataForUser:(NSString *)user {
  462. NSString *sql = [NSString stringWithFormat:@"delete from favorites where user = '%@';delete from fields_info where user = '%@';delete from history where user = '%@';delete from search_history where user = '%@';",user,user,user,user];
  463. [self jk_excute:sql completion:^(BOOL success) {
  464. }];
  465. }
  466. #pragma mark - Actions
  467. + (NSArray *)getActionsForFunction:(NSString *)function withUser:(NSString *)user {
  468. if (!function || !user) {
  469. return @[];
  470. }
  471. NSString *sql = [NSString stringWithFormat:@"select name from actions_info where function_name='%@' and user='%@'order by priority",function, user];
  472. __block NSMutableArray *actionArr = [NSMutableArray array];
  473. [self jk_sync_query:sql completion:^(sqlite3_stmt *stmt, long *count) {
  474. char *ch_name = (char *)sqlite3_column_text(stmt, 0);
  475. if (ch_name == NULL) {
  476. ch_name = "";
  477. }
  478. NSString *str_name = [NSString stringWithUTF8String:ch_name];
  479. [actionArr addObject:str_name];
  480. } failure:^(NSString *err_msg) {
  481. }];
  482. return [actionArr copy];
  483. }
  484. + (NSString *)getDisplayFieldsForFunction:(NSString *)function withUser:(NSString *)user {
  485. if (!function || !user) {
  486. return @"";
  487. }
  488. NSString *sql = [NSString stringWithFormat:@"select name from fields_info where function_name='%@' and user='%@' and behavior=%d and show=1 order by priority,aname",function, user,BEHAVIOR_RESULT];
  489. __block NSString* fields = @"";
  490. [self jk_sync_query:sql completion:^(sqlite3_stmt *stmt, long *count) {
  491. NSString *name = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(stmt, 0)];
  492. fields = [fields stringByAppendingFormat:@"%@,",name];
  493. } failure:^(NSString *err_msg) {
  494. }];
  495. if (fields.length > 0) {
  496. fields=[fields substringToIndex: fields.length-1];
  497. }
  498. return fields;
  499. }
  500. + (NSString *)getDisplayFieldsForFunction:(NSString *)function withUser:(NSString *)user limit:(NSUInteger)limit {
  501. if (!function || !user) {
  502. return @"";
  503. }
  504. NSString *sql = [NSString stringWithFormat:@"select name from fields_info where function_name='%@' and user='%@' and behavior=%d and show=1 order by priority,aname limit %lu",function, user,BEHAVIOR_RESULT, limit];
  505. __block NSString* fields = @"";
  506. [self jk_sync_query:sql completion:^(sqlite3_stmt *stmt, long *count) {
  507. NSString *name = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(stmt, 0)];
  508. fields = [fields stringByAppendingFormat:@"%@,",name];
  509. } failure:^(NSString *err_msg) {
  510. }];
  511. if (fields.length > 0) {
  512. fields=[fields substringToIndex: fields.length-1];
  513. }
  514. return fields;
  515. }
  516. // 数据库更新之后 和 数据库初始化完成 删除
  517. + (void)deleteResultFields {
  518. NSString *booking_sql = @"delete from fields_info where behavior = 1 and function_name = 'Ocean Booking' and name in ('booking_no','shipper','consignee','po_no','f_etd','m_eta','place_of_receipt_uncode','place_of_delivery_uncode');";
  519. NSString *bl_sql = @"delete from fields_info where behavior = 1 and function_name = 'Ocean B/L info.' and name in ('last_status_315_code','shipper','consignee','h_bol','etd','eta','po_no','place_of_receipt_un','place_of_delivery_un');";
  520. NSString *cn_sql = @"delete from fields_info where behavior = 1 and function_name = 'Container detail' and name in ('shipper','consignee','ctnr','file_no','po_no','etd','eta','fport_of_loading_un','mport_of_discharge_un');";
  521. sqlite3 *db = [self get_db];
  522. [self execSql:booking_sql db:db];
  523. [self execSql:bl_sql db:db];
  524. [self execSql:cn_sql db:db];
  525. sqlite3_close(db);
  526. }
  527. + (void)updateResultDisplayFields {
  528. __block NSMutableArray *users = [NSMutableArray array];
  529. NSString *user_sql = @"select distinct user from fields_info;";
  530. [self jk_sync_query:user_sql completion:^(sqlite3_stmt *stmt, long *count) {
  531. char *user_ch = (char *)sqlite3_column_text(stmt, 0);
  532. NSString *user = [NSString stringWithUTF8String:user_ch];
  533. [users addObject:user];
  534. } failure:^(NSString *error) {
  535. }];
  536. NSArray *functions = @[@"Ocean Booking", @"Ocean B/L info.", @"Container detail"];
  537. NSUInteger maxDisplay = 3;
  538. sqlite3 *db = [self get_db];
  539. for (NSString *user in users) {
  540. for (NSString *function in functions) {
  541. NSString *sql = [NSString stringWithFormat:@"update fields_info set show = 0 where behavior = 1 and show = 1 and user = '%@' and function_name = '%@' and name in (select name from fields_info where function_name='%@' and user = '%@' and behavior=1 and show=1 order by priority,aname limit %d offset %lu);", user, function, function, user, INT_MAX, maxDisplay];
  542. [self execSql:sql db:db];
  543. }
  544. }
  545. sqlite3_close(db);
  546. }
  547. @end