CloudStorageDB.m 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. //
  2. // CloudStorageDB.m
  3. // zhuxun
  4. //
  5. // Created by winsoft on 17/6/22.
  6. //
  7. //
  8. #import "CloudStorageDB.h"
  9. #import "DBOperation.h"
  10. #import <MagicalRecord/MagicalRecord.h>
  11. #import <MJExtension/MJExtension.h>
  12. #import "DBConfigureCenter.h"
  13. #import <objc/runtime.h>
  14. @interface CloudStorageDB()
  15. @property (nonatomic , strong) DBOperation *dbOperation;
  16. @end
  17. @implementation CloudStorageDB
  18. static CloudStorageDB *cloudStorageDB;
  19. + (instancetype)shareInstance
  20. {
  21. static dispatch_once_t onceToken;
  22. dispatch_once(&onceToken, ^{
  23. cloudStorageDB = [[self alloc] init];
  24. });
  25. return cloudStorageDB;
  26. }
  27. - (instancetype)init
  28. {
  29. if (self = [super init]) {
  30. NSString *localPath = [NSPersistentStore MR_defaultLocalStoreUrl].absoluteString.stringByDeletingLastPathComponent;
  31. NSString *path = [NSString stringWithFormat:@"%@/%@_cloudStorageDisk.sqlite",localPath,Login_Name];
  32. //创建表
  33. self.dbOperation = [DBOperation dbOperationWithPath:path];
  34. [self.dbOperation creatDBWithTableName:cacheFileList dbModelClass:[CSFileModel class] Path:path autoUpgrade:YES];
  35. [self.dbOperation creatDBWithTableName:downTransFileList dbModelClass:[CSFileDownUpModel class] Path:path autoUpgrade:YES];
  36. [self.dbOperation creatDBWithTableName:upTransFileList dbModelClass:[CSFileDownUpModel class] Path:path autoUpgrade:YES];
  37. }
  38. return self;
  39. }
  40. //建立索引
  41. - (void)createIndexForTableName:(NSString *)name indexCloums:(NSArray<NSArray*> *)indexCloums
  42. {
  43. for (NSString *cloum in indexCloums) {
  44. NSString *sql = [NSString stringWithFormat:@"create index %@_%@ on %@(%@)",name,cloum,name,cloum];
  45. [self.dbOperation addDataToDBWithSQL:sql];
  46. }
  47. }
  48. - (void)addcsFilestoDB:(NSArray *)csFilesArray
  49. {
  50. for (CSFileModel *csFileModel in csFilesArray) {
  51. [self addcsFiletoDB:csFileModel];
  52. }
  53. }
  54. //增加一条数据到数据库中
  55. - (void)addcsFiletoDB:(CSFileModel *)csFile
  56. {
  57. if (csFile.isdir) {
  58. [self getFileModelWithFileID:csFile.sid resultBlock:^(CSFileModel *csFileModel) {
  59. if (!csFileModel) {
  60. [self addDataDBWithTableName:@"cacheFileList" model:csFile];
  61. }
  62. }];
  63. }else{
  64. //根据pid,md5,name或者sid即可.
  65. [self getFileModelWithFileMD5:csFile.md5 resultBlock:^(CSFileModel *csFileModel) {
  66. if (!csFileModel) {
  67. [self addDataDBWithTableName:@"cacheFileList" model:csFile];
  68. }
  69. }];
  70. }
  71. }
  72. - (void)addCSDownUpFileToDB:(CSFileDownUpModel *)csDownUpFile
  73. {
  74. if (!csDownUpFile.pid) {
  75. csDownUpFile.pid = @"0";
  76. }
  77. //外部调用前请自身判断是否由相同的数据存在.
  78. if (csDownUpFile.downUpType == DownUpModelDown) {
  79. [self addDataDBWithTableName:downTransFileList model:csDownUpFile];
  80. }else [self addDataDBWithTableName:upTransFileList model:csDownUpFile];
  81. //先通过md5和updownmodel判断文件是否在数据库内,如果是则更新数据,否则add.
  82. //
  83. // if (csDownUpFile.downUpType == DownUpModelDown) {
  84. // [self addDataDBWithTableName:downTransFileList model:csDownUpFile];
  85. // }else [self addDataDBWithTableName:upTransFileList model:csDownUpFile];
  86. }
  87. - (void)updateCloudFileToDB:(CSFileModel *)csFile
  88. {
  89. }
  90. #pragma mark -- 2017-07-26 文件迁移 serverFullPath未处理 --sql
  91. - (void)updateCSFilestoDB:(NSArray *)csFileSids targetid:(NSString *)pid{
  92. NSMutableString * pidsstring = [NSMutableString string];
  93. NSUInteger idx = 0;
  94. NSUInteger arraycount = csFileSids.count;
  95. for (NSString *str in csFileSids) {
  96. [pidsstring appendString:[NSString stringWithFormat:@"'%@'",str]];
  97. idx++;
  98. if (idx<arraycount) {
  99. [pidsstring appendString:@","];
  100. }
  101. }
  102. //未处理 serverFullPath
  103. NSString *sql = [NSString stringWithFormat:@"UPDATE cacheFileList set pid = %@ where sid in (%@)",pid,pidsstring];
  104. [self.dbOperation addDataToDBWithSQL:sql];
  105. }
  106. - (void)getAllCloudFilesWithPid:(NSString *)pid resultBlock:(void(^)(NSArray *result))resultBlock
  107. {
  108. NSString *sql = [NSString stringWithFormat:@"select * from cacheFileList where pid = '%@'",pid];
  109. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  110. //dict array;
  111. NSArray *modelArray = [CSFileModel mj_objectArrayWithKeyValuesArray:array];
  112. resultBlock(modelArray);
  113. }];
  114. }
  115. //isFile
  116. - (void)getFileModelWithFileMD5:(NSString *)md5 resultBlock:(void(^)(CSFileModel *csFileModel))resultBlock
  117. {
  118. NSString *sql = [NSString stringWithFormat:@"select * from cacheFileList where md5 = '%@'",md5];
  119. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  120. //dict array;
  121. NSArray *modelArray = [CSFileModel mj_objectArrayWithKeyValuesArray:array];
  122. if (modelArray.count) {
  123. resultBlock(modelArray[0]);
  124. }else resultBlock(nil);
  125. }];
  126. }
  127. //isDir
  128. - (void)getFileModelWithFileID:(NSString *)ID resultBlock:(void(^)(CSFileModel *csFileModel))resultBlock
  129. {
  130. NSString *sql = [NSString stringWithFormat:@"select * from cacheFileList where sid = '%@'",ID];
  131. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  132. //dict array;
  133. NSArray *modelArray = [CSFileModel mj_objectArrayWithKeyValuesArray:array];
  134. if (modelArray.count) {
  135. resultBlock(modelArray[0]);
  136. }else resultBlock(nil);
  137. }];
  138. }
  139. - (void)getCSDownUpFileWithMD5:(NSString *)md5 downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(NSArray *csFileModels))resultBlock
  140. {
  141. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where md5 = '%@'",md5]:[NSString stringWithFormat:@"select * from upTransFileList where md5 = '%@'",md5];
  142. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  143. //dict array;
  144. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  145. if (modelArray.count) {
  146. resultBlock(modelArray);
  147. }else resultBlock(nil);
  148. }];
  149. }
  150. - (void)getCSDownUpFileWithMD5:(NSString *)md5 pid:(NSString *)pid name:(NSString *)name downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(CSFileDownUpModel *csFileModel))resultBlock
  151. {
  152. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where md5 = '%@' and pid = '%@' and name = '%@'",md5,pid,name]:[NSString stringWithFormat:@"select * from upTransFileList where md5 = '%@' and pid = '%@' and name = '%@'",md5,pid,name];
  153. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  154. //dict array;
  155. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  156. if (modelArray.count) {
  157. resultBlock(modelArray[0]);
  158. }else resultBlock(nil);
  159. }];
  160. }
  161. - (void)getCSDownUpFileSameNameDifMd5WithMD5:(NSString *)md5 name:(NSString *)name downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(CSFileDownUpModel *csFileDownUpModel))resultBlock
  162. {
  163. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where md5 != '%@' and name = '%@'",md5,name]:[NSString stringWithFormat:@"select * from upTransFileList where md5 != '%@' and name = '%@'",md5,name];
  164. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  165. //dict array;
  166. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  167. if (modelArray.count) {
  168. resultBlock(modelArray[0]);
  169. }else resultBlock(nil);
  170. }];
  171. }
  172. - (void)getProcessCSDownUpFileWithMD5:(NSString *)md5 name:(NSString *)name downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(NSArray *downUpModels))resultBlock
  173. {
  174. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where md5 != '%@' and name = '%@' and (downUpStatus = %d OR downUpStatus = %d)",md5,name,DownUpStatusWait,DownUpStatusDoing]:[NSString stringWithFormat:@"select * from upTransFileList where md5 != '%@' and name = '%@' and (downUpStatus = %d OR downUpStatus = %d)",md5,name,DownUpStatusWait,DownUpStatusDoing];
  175. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  176. //dict array;
  177. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  178. if (modelArray.count) {
  179. resultBlock(modelArray);
  180. }else resultBlock(nil);
  181. }];
  182. }
  183. - (void)getAllProcessOrWaitFileWithResultBlock:(void(^)(NSArray *downModels,NSArray *upModels))resultBlock;
  184. {
  185. NSString *sql = [NSString stringWithFormat:@"select * from %@ where downUpStatus <= %d and isdir = 0 order by downUpStatus desc",upTransFileList,DownUpStatusDoing];
  186. NSString *sql2 = [NSString stringWithFormat:@"select * from %@ where downUpStatus <= %d and isdir = 0 order by downUpStatus desc",downTransFileList,DownUpStatusDoing];
  187. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  188. //dict array;
  189. NSArray *upModels = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  190. [self.dbOperation quaryDBbySQL:sql2 result:^(NSMutableArray *array) {
  191. //dict array;
  192. NSArray *downModels = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  193. if (resultBlock) {
  194. resultBlock(downModels, upModels);
  195. }
  196. }];
  197. }];
  198. }
  199. - (void)getAllCSDownUpFilesFoldersWithPid:(NSString *)pid isdir:(NSInteger)isDir downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(NSArray *downUpModels))resultBlock
  200. {
  201. /*
  202. select * from downTransFileList where pid= 'pid'
  203. union all
  204. select a.sid,a.pid,a.downUpUUID as Level from downTransFileList a
  205. inner join downTransFileList b on a.sid=b.pid
  206. inner join
  207. (
  208. select ParentID from tblCity group by ParentID
  209. ) c on a.ParentID=c.ParentID
  210. */
  211. //@"WITH RECURSIVE result(pid,sid) AS(SELECT * FROM %@ WHERE pid='%@' UNION SELECT a.sid,a.pid FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result"//[DBConfigureCenter getKeysArrayStrWithClassName:[CSFileDownUpModel class]]
  212. NSString *tableName = (downUpModel == DownUpModelDown?downTransFileList:upTransFileList);
  213. NSString *sql = [NSString stringWithFormat:@"WITH RECURSIVE result(%@) AS(SELECT * FROM %@ WHERE pid='%@' UNION SELECT a.* FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result",[DBConfigureCenter getKeysArrayStrWithClassName:[CSFileDownUpModel class]],tableName,pid,tableName];
  214. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  215. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  216. NSMutableArray *tempArray = [NSMutableArray array];
  217. for (CSFileDownUpModel *csFileDownUpModel in modelArray) {
  218. if (isDir == 0 && !csFileDownUpModel.isdir) {
  219. [tempArray addObject:csFileDownUpModel];
  220. }else if (isDir == 1 && csFileDownUpModel.isdir)
  221. {
  222. [tempArray addObject:csFileDownUpModel];
  223. }else if(isDir == 2)
  224. {
  225. [tempArray addObject:csFileDownUpModel];
  226. }
  227. }
  228. if (tempArray.count) {
  229. resultBlock(tempArray);
  230. }else resultBlock(nil);
  231. }];
  232. }
  233. - (void)judgeFileFolderDownUpResultWithWithPid:(NSString *)pid downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(bool result, NSArray *totalDownUpFileModels))resultBlock
  234. {
  235. NSString *tableName = (downUpModel == DownUpModelDown?downTransFileList:upTransFileList);
  236. NSString *sql = [NSString stringWithFormat:@"WITH RECURSIVE result(%@) AS(SELECT * FROM %@ WHERE pid='%@' UNION SELECT a.* FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result",[DBConfigureCenter getKeysArrayStrWithClassName:[CSFileDownUpModel class]],tableName,pid,tableName];
  237. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  238. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  239. BOOL result = YES;
  240. NSArray *tempArray = [modelArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isdir = 0"]];
  241. for (CSFileDownUpModel *csFileDownUpModel in modelArray) {
  242. if (csFileDownUpModel.downUpStatus != DownUpStatusSuccess && !csFileDownUpModel.isdir) {
  243. result = NO;
  244. break;
  245. }
  246. }
  247. resultBlock(result,tempArray);
  248. }];
  249. }
  250. - (void)getFolderFilesDownUpStatusWithPid:(NSString *)pid downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(DownUpStatus downUpStatus))resultBlock
  251. {
  252. NSString *tableName = (downUpModel == DownUpModelDown?downTransFileList:upTransFileList);
  253. NSString *sql = sql = [NSString stringWithFormat:@"WITH RECURSIVE result(%@) AS(SELECT * FROM %@ WHERE pid='%@' and isdir = 0 UNION SELECT a.* FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result",[DBConfigureCenter getKeysArrayStrWithClassName:[CSFileDownUpModel class]],tableName,pid,tableName];
  254. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  255. #warning 2017-07-06
  256. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  257. BOOL result = YES;
  258. for (CSFileDownUpModel *csFileDownUpModel in modelArray) {
  259. if (csFileDownUpModel.downUpStatus != DownUpStatusSuccess) {
  260. result = NO;
  261. }
  262. }
  263. if (result) {
  264. resultBlock(DownUpStatusSuccess);
  265. }else resultBlock(DownUpStatusDoing);
  266. }];
  267. }
  268. - (void)getCSDownUpFolderWithID:(NSString *)sid isdir:(BOOL)isdir name:(NSString *)name category:(NSInteger)category downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(CSFileDownUpModel *csFileModel))resultBlock
  269. {
  270. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where sid = '%@' and name = '%@' and isdir = %d and file_category = %ld",sid,name,isdir,category]:[NSString stringWithFormat:@"select * from upTransFileList where sid != '%@' and name = '%@' and isdir = %d and file_category = %ld",sid,name,isdir,category];
  271. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  272. //dict array;
  273. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  274. if (modelArray.count) {
  275. resultBlock(modelArray[0]);
  276. }else resultBlock(nil);
  277. }];
  278. }
  279. - (void)getCSDownUpFolderAndSetSameStatusWithID:(NSString *)sid downUpModel:(DownUpModel)downUpModel
  280. {
  281. NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where sid = '%@' and downUpStatus = %d",sid,DownUpStatusSuccess]:[NSString stringWithFormat:@"select * from upTransFileList where sid != '%@' and downUpStatus = %d",sid,DownUpStatusSuccess];
  282. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  283. //dict array;
  284. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  285. if (modelArray.count) {
  286. CSFileDownUpModel *csFileDownUpModel = modelArray[0];
  287. NSString *sql = [NSString stringWithFormat:@"update %@ set downUpStatus = %d where sid = '%@'",csFileDownUpModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,csFileDownUpModel.downUpStatus,csFileDownUpModel.sid];
  288. [self.dbOperation addDataToDBWithSQL:sql];
  289. }
  290. }];
  291. }
  292. //+ (void)getCSDownUpFileWithMD5:(NSString *)md5 filename:(NSString *)filename downUpModel:(DownUpModel)downUpModel resultBlock:(void(^)(CSFileDownUpModel *csFileModel))resultBlock
  293. //{
  294. // NSString *sql = downUpModel == DownUpModelDown?[NSString stringWithFormat:@"select * from downTransFileList where md5 = '%@' and name = '%@'",md5,filename]:[NSString stringWithFormat:@"select * from upTransFileList where md5 = '%@' and name = '%@'",md5,filename];
  295. // [DBOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  296. //
  297. // //dict array;
  298. // NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  299. //
  300. // if (modelArray.count) {
  301. // resultBlock(modelArray[0]);
  302. // }else resultBlock(nil);
  303. //
  304. // }];
  305. //}
  306. - (void)getSubFileFolderDownFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  307. {
  308. NSString *sql = nil;
  309. if (!pid || [pid isEqualToString:@"0"]) {
  310. sql = [NSString stringWithFormat:@"select * from %@ where file_category = 0",downTransFileList];
  311. }else sql = [NSString stringWithFormat:@"select * from %@ where pid = '%@' and file_category != 0",downTransFileList,pid];
  312. #warning 是否加入file_category != 0
  313. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  314. //dict array;
  315. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  316. if (modelArray.count) {
  317. resultBlock(modelArray);
  318. }else resultBlock(nil);
  319. }];
  320. }
  321. - (void)getSubFileFolderDownSuccessFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  322. {
  323. //文件and 子文件都成功的文件夹
  324. //先获取所有目标的文件和文件夹,再进行文件夹的判断.
  325. NSString *sql = nil;
  326. if (!pid || [pid isEqualToString:@"0"]) {
  327. sql = [NSString stringWithFormat:@"select * from %@ where (downUpStatus = %d and file_category = 0) or (file_category = 0 and isdir = 1)",downTransFileList,DownUpStatusSuccess];
  328. }else sql = [NSString stringWithFormat:@"select * from %@ where (downUpStatus = %d and pid = '%@' and file_category != 0) or (pid = '%@' and file_category != 0 and isdir = 1)",downTransFileList,DownUpStatusSuccess,pid,pid];
  329. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  330. //dict array;
  331. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  332. NSMutableArray *tempArray = [NSMutableArray array];
  333. for (CSFileDownUpModel *csFileDownUpModel in modelArray) {
  334. if (!csFileDownUpModel.isdir) {
  335. [tempArray addObject:csFileDownUpModel];
  336. }else{
  337. [self judgeFileFolderDownUpResultWithWithPid:csFileDownUpModel.sid downUpModel:csFileDownUpModel.downUpType resultBlock:^(bool result, NSArray *totalSubFileModels) {
  338. if (result) {
  339. csFileDownUpModel.subFileDownUpModels = totalSubFileModels;
  340. //success 动态调整.
  341. csFileDownUpModel.downUpStatus = DownUpStatusSuccess;
  342. [tempArray addObject:csFileDownUpModel];
  343. }
  344. }];
  345. }
  346. }
  347. if (tempArray.count) {
  348. resultBlock(tempArray);
  349. }else resultBlock(nil);
  350. }];
  351. }
  352. - (void)getSubFileFolderDownUnFinishedFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  353. {
  354. NSString *sql = nil;
  355. if (!pid || [pid isEqualToString:@"0"]) {
  356. sql = [NSString stringWithFormat:@"select * from %@ where (downUpStatus != %d and file_category = 0 and isdir = 0) or (file_category = 0 and isdir = 1)",downTransFileList,DownUpStatusSuccess];
  357. }else sql = [NSString stringWithFormat:@"select * from %@ where (downUpStatus != %d and pid = '%@' and file_category != 0 and isdir = 0) or (pid = '%@' and file_category != 0 and isdir = 1)",downTransFileList,DownUpStatusSuccess,pid,pid];
  358. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  359. //dict array;
  360. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  361. NSMutableArray *tempArray = [NSMutableArray array];
  362. for (CSFileDownUpModel *csFileDownUpModel in modelArray) {
  363. if (!csFileDownUpModel.isdir) {
  364. [tempArray addObject:csFileDownUpModel];
  365. }else{
  366. [self judgeFileFolderDownUpResultWithWithPid:csFileDownUpModel.sid downUpModel:csFileDownUpModel.downUpType resultBlock:^(bool result,NSArray *totalSubFileModels) {
  367. if (!result) {
  368. csFileDownUpModel.subFileDownUpModels = totalSubFileModels;
  369. [tempArray addObject:csFileDownUpModel];
  370. }
  371. }];
  372. }
  373. }
  374. if (tempArray.count) {
  375. resultBlock(tempArray);
  376. }else resultBlock(nil);
  377. }];
  378. }
  379. - (void)getSubFileFolderUpFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  380. {
  381. NSString *sql = nil;
  382. if (!pid || [pid isEqualToString:@"0"]) {
  383. sql = [NSString stringWithFormat:@"select * from %@ where file_category = 0",upTransFileList];
  384. }else sql = [NSString stringWithFormat:@"select * from %@ where pid = '%@'",upTransFileList,pid];
  385. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  386. //dict array;
  387. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  388. if (modelArray.count) {
  389. resultBlock(modelArray);
  390. }else resultBlock(nil);
  391. }];
  392. }
  393. - (void)getSubFileFolderUpSuccessFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  394. {
  395. NSString *sql = nil;
  396. if (!pid || [pid isEqualToString:@"0"]) {
  397. sql = [NSString stringWithFormat:@"select * from %@ where downUpStatus = %d and file_category = 0",upTransFileList,DownUpStatusSuccess];
  398. }else sql = [NSString stringWithFormat:@"select * from %@ where downUpStatus = %d and pid = '%@'",upTransFileList,DownUpStatusSuccess,pid];
  399. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  400. //dict array;
  401. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  402. if (modelArray.count) {
  403. resultBlock(modelArray);
  404. }else resultBlock(nil);
  405. }];
  406. }
  407. - (void)getSubFileFolderUpUnFinishedFileWithPid:(NSString *)pid ResultBlock:(void(^)(NSArray *result))resultBlock
  408. {
  409. NSString *sql = nil;
  410. if (!pid || [pid isEqualToString:@"0"]) {
  411. sql = [NSString stringWithFormat:@"select * from %@ where downUpStatus != %d and file_category = 0",upTransFileList,DownUpStatusSuccess];
  412. }else sql = [NSString stringWithFormat:@"select * from %@ where downUpStatus != %d and pid = '%@'",upTransFileList,DownUpStatusSuccess,pid];
  413. [self.dbOperation quaryDBbySQL:sql result:^(NSMutableArray *array) {
  414. // 排序doing的在前.
  415. //dict array;
  416. NSArray *modelArray = [CSFileDownUpModel mj_objectArrayWithKeyValuesArray:array];
  417. if (modelArray.count) {
  418. resultBlock(modelArray);
  419. }else resultBlock(nil);
  420. }];
  421. }
  422. - (void)deleteCSFileToDB:(CSFileModel *)csFile
  423. {
  424. }
  425. - (void)deleteCSDownUpFiles:(NSArray *)csFiles ResultBlock:(void(^)(NSArray *fileResult))resultBlock;
  426. {
  427. NSString *tableName = nil;
  428. NSMutableArray *tempAllFilesArray = [NSMutableArray array];
  429. int i = 0;
  430. for (CSFileDownUpModel *downUpFileModel in csFiles) {
  431. // NSString *sql = [NSString stringWithFormat:@"delete from %@ where downUpUUID = '%@'",downUpFileModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,downUpFileModel.downUpUUID];
  432. //
  433. // [DBOperation addDataToDBWithSQL:sql];
  434. //待优化.//@"WITH RECURSIVE result(%@) AS(SELECT * FROM %@ WHERE pid='%@' UNION SELECT a.* FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result"
  435. if (downUpFileModel.isdir) {
  436. //删除本身.
  437. NSString *sql = [NSString stringWithFormat:@"delete from %@ where downUpUUID = '%@'",downUpFileModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,downUpFileModel.downUpUUID];
  438. [self.dbOperation addDataToDBWithSQL:sql];
  439. [self getAllCSDownUpFilesFoldersWithPid:downUpFileModel.sid isdir:2 downUpModel:downUpFileModel.downUpType resultBlock:^(NSArray *downUpModels) {
  440. int j = 0;
  441. for (CSFileDownUpModel *subdownUpFileModel in downUpModels) {
  442. //@"WITH RECURSIVE result(%@) AS(SELECT * FROM %@ WHERE pid='%@' UNION SELECT a.* FROM %@ a,result b WHERE b.sid = a.pid)SELECT * from result"
  443. if (subdownUpFileModel.isdir) {
  444. NSString *subsql = [NSString stringWithFormat:@"delete from %@ where downUpUUID = '%@'",subdownUpFileModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,subdownUpFileModel.downUpUUID];
  445. [self.dbOperation addDataToDBWithSQL:subsql];
  446. }else{
  447. //删除同name和md5的文件
  448. NSString *subsql = [NSString stringWithFormat:@"delete from %@ where md5 = '%@' and name = '%@'",subdownUpFileModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,subdownUpFileModel.md5,subdownUpFileModel.name];
  449. [self.dbOperation addDataToDBWithSQL:subsql];
  450. [tempAllFilesArray addObject:subdownUpFileModel];
  451. if (i >= csFiles.count - 1 && j >= downUpModels.count - 1) {
  452. if (resultBlock) {
  453. resultBlock(tempAllFilesArray);
  454. }
  455. }
  456. }
  457. j++;
  458. }
  459. }];
  460. }else{
  461. //删除同name和md5的文件
  462. NSString *sql = [NSString stringWithFormat:@"delete from %@ where md5 = '%@' and name = '%@'",downUpFileModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,downUpFileModel.md5,downUpFileModel.name];
  463. [self.dbOperation addDataToDBWithSQL:sql];
  464. [tempAllFilesArray addObject:downUpFileModel];
  465. if (i >= csFiles.count - 1) {
  466. if (resultBlock) {
  467. resultBlock(tempAllFilesArray);
  468. }
  469. }
  470. }
  471. i++;
  472. }
  473. }
  474. - (void)updateCSFiletoDB:(CSFileModel *)csFile
  475. {
  476. }
  477. - (void)updateCSDownUpFileStatusWithCSFileDownUpModel:(CSFileDownUpModel *)csFileDownUpModel
  478. {
  479. #warning md5 和name相同的文件,则会全部更新
  480. NSString *sql = nil;
  481. if (!csFileDownUpModel.isdir) {
  482. if (csFileDownUpModel.localRootPath) {
  483. sql = [NSString stringWithFormat:@"update %@ set downUpStatus = %d,downUpSize = %ld, localRootPath = '%@' where md5 = '%@' and name = '%@';",csFileDownUpModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,csFileDownUpModel.downUpStatus,csFileDownUpModel.downUpSize,csFileDownUpModel.localRootPath,csFileDownUpModel.md5,csFileDownUpModel.name];
  484. }else sql = [NSString stringWithFormat:@"update %@ set downUpStatus = %d,downUpSize = %ld where md5 = '%@' and name = '%@';",csFileDownUpModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,csFileDownUpModel.downUpStatus,csFileDownUpModel.downUpSize,csFileDownUpModel.md5,csFileDownUpModel.name];
  485. }else{
  486. sql = [NSString stringWithFormat:@"update %@ set downUpStatus = %d where sid = '%@'",csFileDownUpModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,csFileDownUpModel.downUpStatus,csFileDownUpModel.sid];
  487. }
  488. [self.dbOperation addDataToDBWithSQL:sql];
  489. //同时更新relationlist,如果downupsize不断累加=size-> 累加到父节点上.
  490. //获取父节点,如果父节点
  491. }
  492. - (void)updateCSDownUpFileIDWithCSFileDownUpModel:(CSFileDownUpModel *)csFileDownUpModel sid:(NSString *)sid
  493. {
  494. NSString *sql = [NSString stringWithFormat:@"update %@ set sid = '%@' where downUpUUID = '%@';",csFileDownUpModel.downUpType == DownUpModelDown?downTransFileList:upTransFileList,sid,csFileDownUpModel.downUpUUID];
  495. [self.dbOperation addDataToDBWithSQL:sql];
  496. }
  497. #warning 待封装到自定义底层数据库.
  498. - (void)addDataDBWithTableName:(NSString *)tableName model:(id)model
  499. {
  500. Class cls = [model class];
  501. unsigned int ivarsCnt = 0;
  502. // 获取类成员变量列表,ivarsCnt为类成员数量
  503. Ivar *ivars = class_copyIvarList(cls, &ivarsCnt);
  504. // 遍历成员变量列表,其中每个变量都是Ivar类型的结构体
  505. int i = 0;
  506. NSMutableArray *keys = [NSMutableArray array];
  507. NSMutableArray *values = [NSMutableArray array];
  508. // NSMutableArray *valueSqlSymbol = [NSMutableArray array];
  509. for (const Ivar *p = ivars; p < ivars + ivarsCnt; ++p)
  510. {
  511. Ivar const ivar = *p;
  512. // 获取变量名
  513. NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
  514. // 若此变量未在类结构体中声明而只声明为Property,则变量名加前缀 '_'下划线
  515. // 比如 @property(retain) NSString *abc;则 key == _abc;
  516. // 获取变量值
  517. id value = [model valueForKey:key];
  518. // id value = [self valueForKey:key];
  519. // 取得变量类型
  520. // 通过 type[0]可以判断其具体的内置类型
  521. // const char *type = ivar_getTypeEncoding(ivar);
  522. if(value)
  523. {
  524. BOOL strValue = NO;
  525. if ([value isKindOfClass:[NSString class]]) {
  526. strValue = YES;
  527. NSString *strValue = value;
  528. if (!strValue.length) {
  529. continue;
  530. }
  531. }
  532. [keys addObject:[key substringFromIndex:1]];
  533. //字符串需要新增一个'',如果是字典对象呢?
  534. if (strValue) {
  535. [values addObject:[NSString stringWithFormat:@"'%@'",value]];
  536. }else [values addObject:value];
  537. // [valueSqlSymbol addObject:@"?"];
  538. }
  539. i++;
  540. }
  541. free(ivars);
  542. NSString *fileKeyListStr = [keys componentsJoinedByString:@","];
  543. NSString *fileValueListStr = [values componentsJoinedByString:@","];
  544. // NSString *sqlValueListStr = [valueSqlSymbol componentsJoinedByString:@","];
  545. #warning 2017-06-23...
  546. NSString *SQL = [NSString stringWithFormat:@"insert into %@ (%@) values(%@)",tableName,fileKeyListStr,fileValueListStr];
  547. [self.dbOperation addDataToDBWithSQL:SQL];
  548. }
  549. - (void)updateDataDBWithTableName:(NSString *)tableName model:(id)model whereSql:(NSString *)whereSql
  550. {
  551. /*
  552. UPDATE table_name
  553. SET column1 = value1, column2 = value2...., columnN = valueN
  554. WHERE [condition];
  555. */
  556. // sqlite> UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
  557. }
  558. - (void)deleteDataDBWIthTableName:(NSString *)tableName whereSql:(NSString *)whereSql
  559. {
  560. //if wheresql = nil, clear all table
  561. // sqlite> DELETE FROM COMPANY WHERE SQL;
  562. }
  563. @end