NCManageDatabase.swift 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465
  1. //
  2. // NCManageDatabase.swift
  3. // Crypto Cloud Technology Nextcloud
  4. //
  5. // Created by Marino Faggiana on 06/05/17.
  6. // Copyright © 2017 TWS. All rights reserved.
  7. //
  8. // Author Marino Faggiana <m.faggiana@twsweb.it>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. import RealmSwift
  24. class NCManageDatabase: NSObject {
  25. static let sharedInstance: NCManageDatabase = {
  26. let instance = NCManageDatabase()
  27. return instance
  28. }()
  29. override init() {
  30. let dirGroup = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: NCBrandOptions.sharedInstance.capabilitiesGroups)
  31. let config = Realm.Configuration(
  32. fileURL: dirGroup?.appendingPathComponent("\(appDatabaseNextcloud)/\(k_databaseDefault)"),
  33. schemaVersion: 1,
  34. migrationBlock: { migration, oldSchemaVersion in
  35. // We haven’t migrated anything yet, so oldSchemaVersion == 0
  36. if (oldSchemaVersion < 1) {
  37. // Nothing to do!
  38. // Realm will automatically detect new properties and removed properties
  39. // And will update the schema on disk automatically
  40. }
  41. })
  42. Realm.Configuration.defaultConfiguration = config
  43. _ = try! Realm()
  44. }
  45. //MARK: -
  46. //MARK: Utility Database
  47. func clearTable(_ table : Object.Type, account: String?) {
  48. let results : Results<Object>
  49. let realm = try! Realm()
  50. realm.beginWrite()
  51. if account != nil {
  52. results = realm.objects(table).filter("account = %@", account!)
  53. } else {
  54. results = realm.objects(table)
  55. }
  56. realm.delete(results)
  57. try! realm.commitWrite()
  58. }
  59. func removeDB() {
  60. let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
  61. let realmURLs = [
  62. realmURL,
  63. realmURL.appendingPathExtension("lock"),
  64. realmURL.appendingPathExtension("note"),
  65. realmURL.appendingPathExtension("management")
  66. ]
  67. for URL in realmURLs {
  68. do {
  69. try FileManager.default.removeItem(at: URL)
  70. } catch {
  71. // handle error
  72. }
  73. }
  74. }
  75. func getThreadConfined(_ table: Object) -> Any {
  76. return ThreadSafeReference(to: table)
  77. }
  78. func putThreadConfined(_ tableRef: Any) -> Object? {
  79. let realm = try! Realm()
  80. return realm.resolve(tableRef as! ThreadSafeReference<Object>)
  81. }
  82. //MARK: -
  83. //MARK: Table Account
  84. func addAccount(_ account: String, url: String, user: String, password: String) {
  85. let realm = try! Realm()
  86. realm.beginWrite()
  87. let addAccount = tableAccount()
  88. addAccount.account = account
  89. // Brand
  90. if NCBrandOptions.sharedInstance.use_default_automatic_upload {
  91. addAccount.cameraUpload = true
  92. addAccount.cameraUploadPhoto = true
  93. addAccount.cameraUploadVideo = true
  94. addAccount.cameraUploadWWAnVideo = true
  95. }
  96. addAccount.password = password
  97. addAccount.url = url
  98. addAccount.user = user
  99. realm.add(addAccount)
  100. try! realm.commitWrite()
  101. }
  102. func addTableAccountOldDB(_ table: TableAccount) {
  103. let realm = try! Realm()
  104. let results = realm.objects(tableAccount.self).filter("account = %@", table.account!)
  105. if (results.count == 0) {
  106. try! realm.write {
  107. let addAccount = tableAccount()
  108. addAccount.account = table.account!
  109. if table.active == 1 {
  110. addAccount.active = true
  111. }
  112. if table.cameraUpload == 1 {
  113. addAccount.cameraUpload = true
  114. }
  115. if table.cameraUploadBackground == 1 {
  116. addAccount.cameraUploadBackground = true
  117. }
  118. if table.cameraUploadCreateSubfolder == 1 {
  119. addAccount.cameraUploadCreateSubfolder = true
  120. }
  121. if table.cameraUploadDatePhoto != nil {
  122. addAccount.cameraUploadDatePhoto = table.cameraUploadDatePhoto! as NSDate
  123. }
  124. if table.cameraUploadDateVideo != nil {
  125. addAccount.cameraUploadDateVideo = table.cameraUploadDateVideo! as NSDate
  126. }
  127. if table.cameraUploadFolderName != nil {
  128. addAccount.cameraUploadFolderName = table.cameraUploadFolderName!
  129. }
  130. if table.cameraUploadFolderPath != nil {
  131. addAccount.cameraUploadFolderPath = table.cameraUploadFolderPath!
  132. }
  133. if table.cameraUploadFull == 1 {
  134. addAccount.cameraUploadFull = true
  135. }
  136. if table.cameraUploadPhoto == 1 {
  137. addAccount.cameraUploadPhoto = true
  138. }
  139. if table.cameraUploadVideo == 1 {
  140. addAccount.cameraUploadVideo = true
  141. }
  142. if table.cameraUploadWWAnPhoto == 1 {
  143. addAccount.cameraUploadWWAnPhoto = true
  144. }
  145. if table.cameraUploadWWAnVideo == 1 {
  146. addAccount.cameraUploadWWAnVideo = true
  147. }
  148. addAccount.password = table.password!
  149. addAccount.url = table.url!
  150. addAccount.user = table.user!
  151. realm.add(addAccount)
  152. }
  153. }
  154. }
  155. func setAccountPassword(_ account: String, password: String) {
  156. let realm = try! Realm()
  157. let results = realm.objects(tableAccount.self).filter("account = %@", account)
  158. if (results.count > 0) {
  159. try! realm.write {
  160. results[0].password = password
  161. }
  162. }
  163. }
  164. func deleteAccount(_ account: String) {
  165. let realm = try! Realm()
  166. let results = realm.objects(tableAccount.self).filter("account = %@", account)
  167. if (results.count > 0) {
  168. try! realm.write {
  169. realm.delete(results)
  170. }
  171. }
  172. }
  173. func getAccountActive() -> tableAccount? {
  174. let realm = try! Realm()
  175. let results = realm.objects(tableAccount.self).filter("active = true")
  176. if (results.count > 0) {
  177. return results[0]
  178. } else {
  179. return nil
  180. }
  181. }
  182. func getAccounts() -> [String] {
  183. let realm = try! Realm()
  184. let results : Results<tableAccount>
  185. var accounts = [String]()
  186. results = realm.objects(tableAccount.self).sorted(byKeyPath: "account", ascending: true)
  187. for result in results {
  188. accounts.append(result.account)
  189. }
  190. return Array(accounts)
  191. }
  192. func getAccountCameraUploadFolderName() -> String {
  193. let realm = try! Realm()
  194. let results = realm.objects(tableAccount.self).filter("active = true")
  195. if (results.count > 0) {
  196. if results[0].cameraUploadFolderName.characters.count > 0 {
  197. return results[0].cameraUploadFolderName
  198. } else {
  199. return k_folderDefaultCameraUpload
  200. }
  201. }
  202. return ""
  203. }
  204. func getAccountCameraUploadFolderPath(_ activeUrl : String) -> String {
  205. let realm = try! Realm()
  206. let results = realm.objects(tableAccount.self).filter("active = true")
  207. if (results.count > 0) {
  208. if results[0].cameraUploadFolderPath.characters.count > 0 {
  209. return results[0].cameraUploadFolderPath
  210. } else {
  211. return CCUtility.getHomeServerUrlActiveUrl(activeUrl)
  212. }
  213. }
  214. return ""
  215. }
  216. func getAccountCameraUploadFolderPathAndName(_ activeUrl : String) -> String {
  217. let cameraFolderName = self.getAccountCameraUploadFolderName()
  218. let cameraFolderPath = self.getAccountCameraUploadFolderPath(activeUrl)
  219. let folderPhotos = CCUtility.stringAppendServerUrl(cameraFolderPath, addFileName: cameraFolderName)!
  220. return folderPhotos
  221. }
  222. func setAccountActive(_ account: String) -> tableAccount {
  223. let realm = try! Realm()
  224. var activeAccount = tableAccount()
  225. let results = realm.objects(tableAccount.self)
  226. try! realm.write {
  227. for result in results {
  228. if result.account == account {
  229. result.active = true
  230. activeAccount = result
  231. } else {
  232. result.active = false
  233. }
  234. }
  235. }
  236. return activeAccount
  237. }
  238. func setAccountCameraStateFiled(_ field: String, state: Bool) {
  239. let realm = try! Realm()
  240. let results = realm.objects(tableAccount.self).filter("active = true")
  241. if (results.count > 0) {
  242. try! realm.write {
  243. switch field {
  244. case "cameraUpload":
  245. results[0].cameraUpload = state
  246. case "cameraUploadBackground":
  247. results[0].cameraUploadBackground = state
  248. case "cameraUploadCreateSubfolder":
  249. results[0].cameraUploadCreateSubfolder = state
  250. case "cameraUploadFull":
  251. results[0].cameraUploadFull = state
  252. case "cameraUploadPhoto":
  253. results[0].cameraUploadPhoto = state
  254. case "cameraUploadVideo":
  255. results[0].cameraUploadVideo = state
  256. case "cameraUploadWWAnPhoto":
  257. results[0].cameraUploadWWAnPhoto = state
  258. case "cameraUploadWWAnVideo":
  259. results[0].cameraUploadWWAnVideo = state
  260. default:
  261. print("No founfd field")
  262. }
  263. }
  264. }
  265. }
  266. func setAccountCameraUploadDateAssetType(_ assetMediaType: PHAssetMediaType, assetDate: NSDate?) {
  267. let realm = try! Realm()
  268. let results = realm.objects(tableAccount.self).filter("active = true")
  269. try! realm.write {
  270. if (assetMediaType == PHAssetMediaType.image && results.count > 0) {
  271. results[0].cameraUploadDatePhoto = assetDate
  272. }
  273. if (assetMediaType == PHAssetMediaType.video && results.count > 0) {
  274. results[0].cameraUploadDateVideo = assetDate
  275. }
  276. }
  277. }
  278. func setAccountCameraUploadFolderName(_ folderName: String?) {
  279. let realm = try! Realm()
  280. var folderName : String? = folderName
  281. if folderName == nil {
  282. folderName = self.getAccountCameraUploadFolderName()
  283. }
  284. let results = realm.objects(tableAccount.self).filter("active = true")
  285. if (results.count > 0) {
  286. try! realm.write {
  287. results[0].cameraUploadFolderName = folderName!
  288. }
  289. }
  290. }
  291. func setAccountCameraUploadFolderPath(_ pathName: String?, activeUrl: String) {
  292. let realm = try! Realm()
  293. var pathName : String? = pathName
  294. if pathName == nil {
  295. pathName = self.getAccountCameraUploadFolderPath(activeUrl)
  296. }
  297. let results = realm.objects(tableAccount.self).filter("active = true")
  298. if (results.count > 0) {
  299. try! realm.write {
  300. results[0].cameraUploadFolderPath = pathName!
  301. }
  302. }
  303. }
  304. func setAccountsUserProfile(_ userProfile: OCUserProfile) {
  305. let tblAccount = self.getAccountActive()
  306. if tblAccount == nil {
  307. return
  308. }
  309. let realm = try! Realm()
  310. let results = realm.objects(tableAccount.self).filter("account = %@", tblAccount!.account)
  311. if (results.count > 0) {
  312. try! realm.write {
  313. results[0].enabled = userProfile.enabled
  314. results[0].address = userProfile.address
  315. results[0].displayName = userProfile.displayName
  316. results[0].email = userProfile.email
  317. results[0].phone = userProfile.phone
  318. results[0].twitter = userProfile.twitter
  319. results[0].webpage = results[0].webpage
  320. results[0].quota = userProfile.quota
  321. results[0].quotaFree = userProfile.quotaFree
  322. results[0].quotaRelative = userProfile.quotaRelative
  323. results[0].quotaTotal = userProfile.quotaTotal
  324. results[0].quotaUsed = userProfile.quotaUsed
  325. }
  326. }
  327. }
  328. //MARK: -
  329. //MARK: Table Activity
  330. func getActivityWithPredicate(_ predicate: NSPredicate) -> [tableActivity] {
  331. let realm = try! Realm()
  332. let results = realm.objects(tableActivity.self).filter(predicate).sorted(byKeyPath: "date", ascending: false)
  333. return Array(results)
  334. }
  335. func addActivityServer(_ listOfActivity: [OCActivity]) {
  336. let tableAccount = self.getAccountActive()
  337. if tableAccount == nil {
  338. return
  339. }
  340. let realm = try! Realm()
  341. try! realm.write {
  342. for activity in listOfActivity {
  343. let results = realm.objects(tableActivity.self).filter("idActivity = %d", activity.idActivity)
  344. if (results.count > 0) {
  345. continue
  346. }
  347. // Add new Activity
  348. let addActivity = tableActivity()
  349. addActivity.account = tableAccount!.account
  350. if activity.date != nil {
  351. addActivity.date = activity.date! as NSDate
  352. }
  353. addActivity.idActivity = Double(activity.idActivity)
  354. addActivity.link = activity.link
  355. addActivity.note = activity.subject
  356. addActivity.type = k_activityTypeInfo
  357. realm.add(addActivity)
  358. }
  359. }
  360. }
  361. func addActivityClient(_ file: String, fileID: String, action: String, selector: String, note: String, type: String, verbose: Bool, activeUrl: String?) {
  362. let tableAccount = self.getAccountActive()
  363. if tableAccount == nil {
  364. return
  365. }
  366. var noteReplacing : String = ""
  367. if (activeUrl != nil) {
  368. noteReplacing = note.replacingOccurrences(of: "\(activeUrl!)\(webDAV)", with: "")
  369. }
  370. noteReplacing = note.replacingOccurrences(of: "\(k_domain_session_queue).", with: "")
  371. let realm = try! Realm()
  372. try! realm.write {
  373. // Add new Activity
  374. let addActivity = tableActivity()
  375. addActivity.account = tableAccount!.account
  376. addActivity.action = action
  377. addActivity.file = file
  378. addActivity.fileID = fileID
  379. addActivity.note = noteReplacing
  380. addActivity.selector = selector
  381. addActivity.type = type
  382. addActivity.verbose = verbose
  383. realm.add(addActivity)
  384. }
  385. }
  386. //MARK: -
  387. //MARK: Table Automatic Upload
  388. func addAutomaticUpload(_ metadataNet: CCMetadataNet) -> Bool {
  389. let tableAccount = self.getAccountActive()
  390. if tableAccount == nil {
  391. return false
  392. }
  393. let realm = try! Realm()
  394. let results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND assetLocalIdentifier = %@", tableAccount!.account, metadataNet.assetLocalIdentifier)
  395. if (results.count > 0) {
  396. return false
  397. }
  398. try! realm.write {
  399. // Add new AutomaticUpload
  400. let addAutomaticUpload = tableAutomaticUpload()
  401. addAutomaticUpload.account = tableAccount!.account
  402. addAutomaticUpload.assetLocalIdentifier = metadataNet.assetLocalIdentifier
  403. addAutomaticUpload.fileName = metadataNet.fileName
  404. addAutomaticUpload.selector = metadataNet.selector
  405. if (metadataNet.selectorPost != nil) {
  406. addAutomaticUpload.selectorPost = metadataNet.selectorPost
  407. }
  408. addAutomaticUpload.serverUrl = metadataNet.serverUrl
  409. addAutomaticUpload.session = metadataNet.session
  410. addAutomaticUpload.priority = metadataNet.priority
  411. realm.add(addAutomaticUpload)
  412. }
  413. return true
  414. }
  415. func getAutomaticUpload(_ selector: String) -> CCMetadataNet? {
  416. let tableAccount = self.getAccountActive()
  417. if tableAccount == nil {
  418. return nil
  419. }
  420. let realm = try! Realm()
  421. let results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND selector = %@ AND lock == false", tableAccount!.account, selector)
  422. if (results.count == 0) {
  423. return nil
  424. }
  425. let metadataNet = CCMetadataNet()
  426. metadataNet.action = actionUploadAsset
  427. metadataNet.assetLocalIdentifier = results[0].assetLocalIdentifier
  428. metadataNet.fileName = results[0].fileName
  429. metadataNet.priority = results[0].priority
  430. metadataNet.selector = results[0].selector
  431. metadataNet.selectorPost = results[0].selectorPost
  432. metadataNet.serverUrl = results[0].serverUrl
  433. metadataNet.session = results[0].session
  434. metadataNet.taskStatus = Int(k_taskStatusResume)
  435. // Lock
  436. try! realm.write {
  437. results[0].lock = true
  438. }
  439. return metadataNet
  440. }
  441. func getLockAutomaticUpload() -> [tableAutomaticUpload]? {
  442. let tableAccount = self.getAccountActive()
  443. if tableAccount == nil {
  444. return nil
  445. }
  446. let realm = try! Realm()
  447. let results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND lock = true", tableAccount!.account)
  448. return Array(results)
  449. }
  450. func unlockAutomaticUpload(_ assetLocalIdentifier: String) {
  451. let tableAccount = self.getAccountActive()
  452. if tableAccount == nil {
  453. return
  454. }
  455. let realm = try! Realm()
  456. let results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND assetLocalIdentifier = %@", tableAccount!.account, assetLocalIdentifier)
  457. if (results.count > 0) {
  458. // UnLock
  459. try! realm.write {
  460. results[0].lock = false
  461. }
  462. }
  463. }
  464. func deleteAutomaticUpload(_ assetLocalIdentifier: String) {
  465. let tableAccount = self.getAccountActive()
  466. if tableAccount == nil {
  467. return
  468. }
  469. let realm = try! Realm()
  470. let results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND assetLocalIdentifier = %@", tableAccount!.account, assetLocalIdentifier)
  471. if (results.count > 0) {
  472. try! realm.write {
  473. realm.delete(results)
  474. }
  475. }
  476. }
  477. func countAutomaticUpload(_ session: String?) -> Int {
  478. let tableAccount = self.getAccountActive()
  479. if tableAccount == nil {
  480. return 0
  481. }
  482. let realm = try! Realm()
  483. let results : Results<tableAutomaticUpload>
  484. if (session == nil) {
  485. results = realm.objects(tableAutomaticUpload.self).filter("account = %@", tableAccount!.account)
  486. } else {
  487. results = realm.objects(tableAutomaticUpload.self).filter("account = %@ AND session = %@", tableAccount!.account, session!)
  488. }
  489. return results.count
  490. }
  491. //MARK: -
  492. //MARK: Table Capabilities
  493. func addCapabilities(_ capabilities: OCCapabilities) {
  494. let tableAccount = self.getAccountActive()
  495. if tableAccount == nil {
  496. return
  497. }
  498. let realm = try! Realm()
  499. let results = realm.objects(tableCapabilities.self).filter("account = %@", tableAccount!.account)
  500. try! realm.write {
  501. var resultCapabilities = tableCapabilities()
  502. if (results.count > 0) {
  503. resultCapabilities = results[0]
  504. }
  505. resultCapabilities.account = tableAccount!.account
  506. resultCapabilities.themingBackground = capabilities.themingBackground
  507. resultCapabilities.themingColor = capabilities.themingColor
  508. resultCapabilities.themingLogo = capabilities.themingLogo
  509. resultCapabilities.themingName = capabilities.themingName
  510. resultCapabilities.themingSlogan = capabilities.themingSlogan
  511. resultCapabilities.themingUrl = capabilities.themingUrl
  512. resultCapabilities.versionMajor = capabilities.versionMajor
  513. resultCapabilities.versionMinor = capabilities.versionMinor
  514. resultCapabilities.versionMicro = capabilities.versionMicro
  515. resultCapabilities.versionString = capabilities.versionString
  516. if (results.count == 0) {
  517. realm.add(resultCapabilities)
  518. }
  519. }
  520. }
  521. func getCapabilites() -> tableCapabilities? {
  522. let tableAccount = self.getAccountActive()
  523. if tableAccount == nil {
  524. return nil
  525. }
  526. let realm = try! Realm()
  527. let results = realm.objects(tableCapabilities.self).filter("account = %@", tableAccount!.account)
  528. if (results.count > 0) {
  529. return results[0]
  530. } else {
  531. return nil
  532. }
  533. }
  534. func getServerVersion() -> Int {
  535. let tableAccount = self.getAccountActive()
  536. if tableAccount == nil {
  537. return 0
  538. }
  539. let realm = try! Realm()
  540. let results = realm.objects(tableCapabilities.self).filter("account = %@", tableAccount!.account)
  541. if (results.count > 0) {
  542. return results[0].versionMajor
  543. } else {
  544. return 0
  545. }
  546. }
  547. //MARK: -
  548. //MARK: Table Certificates
  549. func addCertificates(_ certificateLocation: String) {
  550. let realm = try! Realm()
  551. try! realm.write {
  552. let addCertificates = tableCertificates()
  553. addCertificates.certificateLocation = certificateLocation
  554. realm.add(addCertificates)
  555. }
  556. }
  557. func getCertificatesLocation(_ localCertificatesFolder: String) -> [String] {
  558. let realm = try! Realm()
  559. let results = realm.objects(tableCertificates.self)
  560. var arraycertificatePath = [String]()
  561. for result in results {
  562. arraycertificatePath.append("\(localCertificatesFolder)\(result.certificateLocation)")
  563. }
  564. return arraycertificatePath
  565. }
  566. //MARK: -
  567. //MARK: Table External Sites
  568. func addExternalSites(_ externalSites: OCExternalSites) {
  569. let tableAccount = self.getAccountActive()
  570. if tableAccount == nil {
  571. return
  572. }
  573. let realm = try! Realm()
  574. try! realm.write {
  575. let addExternalSite = tableExternalSites()
  576. addExternalSite.account = tableAccount!.account
  577. addExternalSite.idExternalSite = externalSites.idExternalSite
  578. addExternalSite.icon = externalSites.icon
  579. addExternalSite.lang = externalSites.lang
  580. addExternalSite.name = externalSites.name
  581. addExternalSite.url = externalSites.url
  582. addExternalSite.type = externalSites.type
  583. realm.add(addExternalSite)
  584. }
  585. }
  586. func deleteExternalSites() {
  587. let tableAccount = self.getAccountActive()
  588. if tableAccount == nil {
  589. return
  590. }
  591. let realm = try! Realm()
  592. let results = realm.objects(tableExternalSites.self).filter("account = %@", tableAccount!.account)
  593. try! realm.write {
  594. realm.delete(results)
  595. }
  596. }
  597. func getAllExternalSitesWithPredicate(_ predicate: NSPredicate) -> [tableExternalSites] {
  598. let realm = try! Realm()
  599. let results = realm.objects(tableExternalSites.self).filter(predicate).sorted(byKeyPath: "idExternalSite", ascending: true)
  600. return Array(results)
  601. }
  602. //MARK: -
  603. //MARK: Table GPS
  604. func addGeocoderLocation(_ location: String, placemarkAdministrativeArea: String, placemarkCountry: String, placemarkLocality: String, placemarkPostalCode: String, placemarkThoroughfare: String, latitude: String, longitude: String) {
  605. let realm = try! Realm()
  606. // Verify if exists
  607. let results = realm.objects(tableGPS.self).filter("latitude = %@ AND longitude = %@", latitude, longitude)
  608. if (results.count > 0) {
  609. return
  610. }
  611. try! realm.write {
  612. // Add new GPS
  613. let addGPS = tableGPS()
  614. addGPS.location = location
  615. addGPS.placemarkAdministrativeArea = placemarkAdministrativeArea
  616. addGPS.placemarkCountry = placemarkCountry
  617. addGPS.placemarkLocality = placemarkLocality
  618. addGPS.placemarkPostalCode = placemarkPostalCode
  619. addGPS.placemarkThoroughfare = placemarkThoroughfare
  620. addGPS.latitude = latitude
  621. addGPS.longitude = longitude
  622. realm.add(addGPS)
  623. }
  624. }
  625. func getLocationFromGeoLatitude(_ latitude: String, longitude: String) -> String? {
  626. let realm = try! Realm()
  627. let results = realm.objects(tableGPS.self).filter("latitude = %@ AND longitude = %@", latitude, longitude)
  628. if (results.count == 0) {
  629. return nil
  630. } else {
  631. return results[0].location
  632. }
  633. }
  634. //MARK: -
  635. //MARK: Table Share
  636. func addShareLink(_ share: String, fileName: String, serverUrl: String) -> [String:String]? {
  637. let tableAccount = self.getAccountActive()
  638. if tableAccount == nil {
  639. return nil
  640. }
  641. let realm = try! Realm()
  642. // Verify if exists
  643. let results = realm.objects(tableShare.self).filter("account = %@ AND fileName = %@ AND serverUrl = %@", tableAccount!.account, fileName, serverUrl)
  644. if (results.count > 0) {
  645. try! realm.write {
  646. results[0].shareLink = share;
  647. }
  648. } else {
  649. // Add new record
  650. try! realm.write {
  651. let addShare = tableShare()
  652. addShare.account = tableAccount!.account
  653. addShare.fileName = fileName
  654. addShare.serverUrl = serverUrl
  655. addShare.shareLink = share
  656. realm.add(addShare)
  657. }
  658. }
  659. return ["\(serverUrl)\(fileName)" : share]
  660. }
  661. func addShareUserAndGroup(_ share: String, fileName: String, serverUrl: String) -> [String:String]? {
  662. let tableAccount = self.getAccountActive()
  663. if tableAccount == nil {
  664. return nil
  665. }
  666. let realm = try! Realm()
  667. // Verify if exists
  668. let results = realm.objects(tableShare.self).filter("account = %@ AND fileName = %@ AND serverUrl = %@", tableAccount!.account, fileName, serverUrl)
  669. if (results.count > 0) {
  670. try! realm.write {
  671. results[0].shareUserAndGroup = share;
  672. }
  673. } else {
  674. // Add new record
  675. try! realm.write {
  676. let addShare = tableShare()
  677. addShare.account = tableAccount!.account
  678. addShare.fileName = fileName
  679. addShare.serverUrl = serverUrl
  680. addShare.shareUserAndGroup = share
  681. realm.add(addShare)
  682. }
  683. }
  684. return ["\(serverUrl)\(fileName)" : share]
  685. }
  686. func unShare(_ share: String, fileName: String, serverUrl: String, sharesLink: [String:String], sharesUserAndGroup: [String:String]) -> [Any]? {
  687. let tableAccount = self.getAccountActive()
  688. if tableAccount == nil {
  689. return nil
  690. }
  691. var sharesLink = sharesLink
  692. var sharesUserAndGroup = sharesUserAndGroup
  693. let realm = try! Realm()
  694. let results = realm.objects(tableShare.self).filter("account = %@ AND (shareLink CONTAINS %@ OR shareUserAndGroup CONTAINS %@)", tableAccount!.account, share, share)
  695. if (results.count > 0) {
  696. let result = results[0]
  697. realm.beginWrite()
  698. if (result.shareLink.contains(share)) {
  699. result.shareLink = ""
  700. }
  701. if (result.shareUserAndGroup.contains(share)) {
  702. var shares : [String] = result.shareUserAndGroup.components(separatedBy: ",")
  703. if let index = shares.index(of:share) {
  704. shares.remove(at: index)
  705. }
  706. result.shareUserAndGroup = shares.joined(separator: ",")
  707. }
  708. if (result.shareLink.characters.count > 0) {
  709. sharesLink.updateValue(result.shareLink, forKey:"\(serverUrl)\(fileName)")
  710. } else {
  711. sharesLink.removeValue(forKey: "\(serverUrl)\(fileName)")
  712. }
  713. if (result.shareUserAndGroup.characters.count > 0) {
  714. sharesUserAndGroup.updateValue(result.shareUserAndGroup, forKey:"\(serverUrl)\(fileName)")
  715. } else {
  716. sharesUserAndGroup.removeValue(forKey: "\(serverUrl)\(fileName)")
  717. }
  718. if (result.shareLink.characters.count == 0 && result.shareUserAndGroup.characters.count == 0) {
  719. realm.delete(result)
  720. }
  721. try! realm.commitWrite()
  722. }
  723. return [sharesLink, sharesUserAndGroup]
  724. }
  725. func removeShareActiveAccount() {
  726. let tableAccount = self.getAccountActive()
  727. if tableAccount == nil {
  728. return
  729. }
  730. let realm = try! Realm()
  731. let results = realm.objects(tableShare.self).filter("account = %@", tableAccount!.account)
  732. try! realm.write {
  733. realm.delete(results)
  734. }
  735. }
  736. func updateShare(_ items: [String:OCSharedDto], activeUrl: String) -> [Any]? {
  737. let tableAccount = self.getAccountActive()
  738. if tableAccount == nil {
  739. return nil
  740. }
  741. var sharesLink = [String:String]()
  742. var sharesUserAndGroup = [String:String]()
  743. self.removeShareActiveAccount()
  744. var itemsLink = [OCSharedDto]()
  745. var itemsUsersAndGroups = [OCSharedDto]()
  746. for (_, itemOCSharedDto) in items {
  747. if (itemOCSharedDto.shareType == Int(shareTypeLink.rawValue)) {
  748. itemsLink.append(itemOCSharedDto)
  749. }
  750. if (itemOCSharedDto.shareWith.characters.count > 0 && (itemOCSharedDto.shareType == Int(shareTypeUser.rawValue) || itemOCSharedDto.shareType == Int(shareTypeGroup.rawValue) || itemOCSharedDto.shareType == Int(shareTypeRemote.rawValue) )) {
  751. itemsUsersAndGroups.append(itemOCSharedDto)
  752. }
  753. }
  754. // Manage sharesLink
  755. for itemOCSharedDto in itemsLink {
  756. let fullPath = CCUtility.getHomeServerUrlActiveUrl(activeUrl) + "\(itemOCSharedDto.path!)"
  757. let fileName = NSString(string: fullPath).lastPathComponent
  758. var serverUrl = NSString(string: fullPath).substring(to: (fullPath.characters.count - fileName.characters.count - 1))
  759. if serverUrl.hasSuffix("/") {
  760. serverUrl = NSString(string: serverUrl).substring(to: (serverUrl.characters.count - 1))
  761. }
  762. if itemOCSharedDto.idRemoteShared > 0 {
  763. let sharesLinkReturn = self.addShareLink("\(itemOCSharedDto.idRemoteShared)", fileName: fileName, serverUrl: serverUrl)
  764. if sharesLinkReturn != nil {
  765. for (key,value) in sharesLinkReturn! {
  766. sharesLink.updateValue(value, forKey:key)
  767. }
  768. }
  769. }
  770. }
  771. // Manage sharesUserAndGroup
  772. var paths = [String:[String]]()
  773. for itemOCSharedDto in itemsUsersAndGroups {
  774. if paths[itemOCSharedDto.path] != nil {
  775. var share : [String] = paths[itemOCSharedDto.path]!
  776. share.append("\(itemOCSharedDto.idRemoteShared)")
  777. paths[itemOCSharedDto.path] = share
  778. } else {
  779. paths[itemOCSharedDto.path] = ["\(itemOCSharedDto.idRemoteShared)"]
  780. }
  781. }
  782. for (path, idsRemoteSharedArray) in paths {
  783. let idsRemoteShared = idsRemoteSharedArray.joined(separator: ",")
  784. print("[LOG] share \(String(describing: idsRemoteShared))")
  785. let fullPath = CCUtility.getHomeServerUrlActiveUrl(activeUrl) + "\(path)"
  786. let fileName = NSString(string: fullPath).lastPathComponent
  787. var serverUrl = NSString(string: fullPath).substring(to: (fullPath.characters.count - fileName.characters.count - 1))
  788. if serverUrl.hasSuffix("/") {
  789. serverUrl = NSString(string: serverUrl).substring(to: (serverUrl.characters.count - 1))
  790. }
  791. let sharesUserAndGroupReturn = self.addShareUserAndGroup(idsRemoteShared, fileName: fileName, serverUrl: serverUrl)
  792. if sharesUserAndGroupReturn != nil {
  793. for (key,value) in sharesUserAndGroupReturn! {
  794. sharesUserAndGroup.updateValue(value, forKey:key)
  795. }
  796. }
  797. }
  798. return [sharesLink, sharesUserAndGroup]
  799. }
  800. func getShares() -> [Any]? {
  801. let tableAccount = self.getAccountActive()
  802. if tableAccount == nil {
  803. return nil
  804. }
  805. var sharesLink = [String:String]()
  806. var sharesUserAndGroup = [String:String]()
  807. let realm = try! Realm()
  808. let results = realm.objects(tableShare.self).filter("account = %@", tableAccount!.account)
  809. for resultShare in results {
  810. if (resultShare.shareLink.characters.count > 0) {
  811. sharesLink = [resultShare.shareLink: "\(resultShare.serverUrl)\(resultShare.fileName)"]
  812. }
  813. if (resultShare.shareUserAndGroup.characters.count > 0) {
  814. sharesUserAndGroup = [resultShare.shareUserAndGroup: "\(resultShare.serverUrl)\(resultShare.fileName)"]
  815. }
  816. }
  817. return [sharesLink, sharesUserAndGroup]
  818. }
  819. //MARK: -
  820. //MARK: Table Metadata
  821. func addMetadata(_ metadata: tableMetadata, activeUrl: String) {
  822. let tableAccount = self.getAccountActive()
  823. if tableAccount == nil {
  824. return
  825. }
  826. let cameraFolderName = self.getAccountCameraUploadFolderName()
  827. let cameraFolderPath = self.getAccountCameraUploadFolderPath(activeUrl)
  828. let direcory = CCCoreData.getServerUrl(fromDirectoryID: metadata.directoryID, activeAccount: metadata.account)
  829. let metadataWithIcon = CCUtility.insertTypeFileIconName(metadata, directory: direcory, cameraFolderName: cameraFolderName, cameraFolderPath: cameraFolderPath)
  830. let realm = try! Realm()
  831. realm.beginWrite()
  832. realm.add(metadataWithIcon!, update: true)
  833. try! realm.commitWrite()
  834. }
  835. func deleteMetadata(_ predicate: NSPredicate) {
  836. let tableAccount = self.getAccountActive()
  837. if tableAccount == nil {
  838. return
  839. }
  840. let realm = try! Realm()
  841. realm.beginWrite()
  842. let results = realm.objects(tableMetadata.self).filter(predicate)
  843. realm.delete(results)
  844. try! realm.commitWrite()
  845. }
  846. func moveMetadata(_ fileName: String, directoryID: String, directoryIDTo: String) {
  847. let tableAccount = self.getAccountActive()
  848. if tableAccount == nil {
  849. return
  850. }
  851. let realm = try! Realm()
  852. let results = realm.objects(tableMetadata.self).filter("account = %@ AND fileName == %@ AND directoryID == %@", tableAccount!.account, fileName, directoryID)
  853. try! realm.write {
  854. for result in results {
  855. result.directoryID = directoryIDTo
  856. }
  857. }
  858. }
  859. func updateMetadata(_ metadata: tableMetadata, activeUrl: String) {
  860. let tableAccount = self.getAccountActive()
  861. if tableAccount == nil {
  862. return
  863. }
  864. let cameraFolderName = self.getAccountCameraUploadFolderName()
  865. let cameraFolderPath = self.getAccountCameraUploadFolderPath(activeUrl)
  866. let direcory = CCCoreData.getServerUrl(fromDirectoryID: metadata.directoryID, activeAccount: metadata.account)
  867. let metadataWithIcon = CCUtility.insertTypeFileIconName(metadata, directory: direcory, cameraFolderName: cameraFolderName, cameraFolderPath: cameraFolderPath)
  868. let realm = try! Realm()
  869. try! realm.write {
  870. realm.add(metadataWithIcon!, update: true)
  871. }
  872. }
  873. func setMetadataSession(_ session: String, sessionError: String, sessionSelector: String, sessionSelectorPost: String, sessionTaskIdentifier: Int, sessionTaskIdentifierPlist: Int, predicate: NSPredicate) {
  874. let tableAccount = self.getAccountActive()
  875. if tableAccount == nil {
  876. return
  877. }
  878. let realm = try! Realm()
  879. let results = realm.objects(tableMetadata.self).filter(predicate)
  880. try! realm.write {
  881. for result in results {
  882. result.session = session
  883. result.sessionError = sessionError
  884. result.sessionSelector = sessionSelector
  885. result.sessionSelectorPost = sessionSelectorPost
  886. if sessionTaskIdentifier != Int(k_taskIdentifierNULL) {
  887. result.sessionTaskIdentifier = sessionTaskIdentifier
  888. }
  889. if sessionTaskIdentifierPlist != Int(k_taskIdentifierNULL) {
  890. result.sessionTaskIdentifierPlist = sessionTaskIdentifierPlist
  891. }
  892. }
  893. }
  894. }
  895. func setMetadataFavorite(_ etag: String, favorite: Bool) {
  896. let tableAccount = self.getAccountActive()
  897. if tableAccount == nil {
  898. return
  899. }
  900. let realm = try! Realm()
  901. let results = realm.objects(tableMetadata.self).filter("account = %@ AND etag = %@", tableAccount!.account, etag)
  902. if (results.count > 0) {
  903. try! realm.write {
  904. results[0].favorite = favorite
  905. }
  906. }
  907. }
  908. func getMetadataWithPreficate(_ predicate: NSPredicate) -> tableMetadata? {
  909. let tableAccount = self.getAccountActive()
  910. if tableAccount == nil {
  911. return nil
  912. }
  913. let realm = try! Realm()
  914. let results = realm.objects(tableMetadata.self).filter(predicate)
  915. if (results.count > 0) {
  916. return results[0]
  917. } else {
  918. return nil
  919. }
  920. }
  921. func getMetadatasWithPreficate(_ predicate: NSPredicate, sorted: String?, ascending: Bool) -> [tableMetadata]? {
  922. let tableAccount = self.getAccountActive()
  923. if tableAccount == nil {
  924. return nil
  925. }
  926. let realm = try! Realm()
  927. let results : Results<tableMetadata>
  928. if sorted == nil {
  929. results = realm.objects(tableMetadata.self).filter(predicate)
  930. } else {
  931. results = realm.objects(tableMetadata.self).filter(predicate).sorted(byKeyPath: sorted!, ascending: ascending)
  932. }
  933. if (results.count > 0) {
  934. return Array(results)
  935. } else {
  936. return nil
  937. }
  938. }
  939. func getMetadataAtIndex(_ predicate: NSPredicate, sorted: String?, ascending: Bool, index: Int) -> tableMetadata? {
  940. let tableAccount = self.getAccountActive()
  941. if tableAccount == nil {
  942. return nil
  943. }
  944. let realm = try! Realm()
  945. let results = realm.objects(tableMetadata.self).filter(predicate).sorted(byKeyPath: sorted!, ascending: ascending)
  946. if (results.count > 0 && results.count > index) {
  947. return results[index]
  948. } else {
  949. return nil
  950. }
  951. }
  952. func getMetadataFromFileName(_ fileName: String, directoryID: String) -> tableMetadata? {
  953. let tableAccount = self.getAccountActive()
  954. if tableAccount == nil {
  955. return nil
  956. }
  957. let realm = try! Realm()
  958. let results = realm.objects(tableMetadata.self).filter("(account = %@) AND (directoryID = %@) AND ((fileName = %@) OR (fileNameData = %@))", tableAccount!.account, directoryID, fileName, fileName)
  959. if (results.count > 0) {
  960. return results[0]
  961. } else {
  962. return nil
  963. }
  964. }
  965. func getTableMetadataDownload() -> [tableMetadata]? {
  966. let tableAccount = self.getAccountActive()
  967. if tableAccount == nil {
  968. return nil
  969. }
  970. let predicate = NSPredicate(format: "(account == %@) AND ((session == %@) || (session == %@)) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", tableAccount!.account, k_download_session, k_download_session_foreground, k_taskIdentifierDone, k_taskIdentifierDone)
  971. return self.getMetadatasWithPreficate(predicate, sorted: nil, ascending: false)
  972. }
  973. func getTableMetadataDownloadWWan() -> [tableMetadata]? {
  974. let tableAccount = self.getAccountActive()
  975. if tableAccount == nil {
  976. return nil
  977. }
  978. let predicate = NSPredicate(format: "(account == %@) AND (session == %@) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", tableAccount!.account, k_download_session_wwan, k_taskIdentifierDone, k_taskIdentifierDone)
  979. return self.getMetadatasWithPreficate(predicate, sorted: nil, ascending: false)
  980. }
  981. func getTableMetadataUpload() -> [tableMetadata]? {
  982. let tableAccount = self.getAccountActive()
  983. if tableAccount == nil {
  984. return nil
  985. }
  986. let predicate = NSPredicate(format: "(account == %@) AND ((session == %@) || (session == %@)) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", tableAccount!.account, k_upload_session, k_upload_session_foreground, k_taskIdentifierDone, k_taskIdentifierDone)
  987. return self.getMetadatasWithPreficate(predicate, sorted: nil, ascending: false)
  988. }
  989. func getTableMetadataUploadWWan() -> [tableMetadata]? {
  990. let tableAccount = self.getAccountActive()
  991. if tableAccount == nil {
  992. return nil
  993. }
  994. let predicate = NSPredicate(format: "(account == %@) AND (session == %@) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", tableAccount!.account, k_upload_session_wwan, k_taskIdentifierDone, k_taskIdentifierDone)
  995. return self.getMetadatasWithPreficate(predicate, sorted: nil, ascending: false)
  996. }
  997. func getRecordsTableMetadataPhotosCameraUpload(_ serverUrl: String) -> [tableMetadata]? {
  998. let tableAccount = self.getAccountActive()
  999. if tableAccount == nil {
  1000. return nil
  1001. }
  1002. let realm = try! Realm()
  1003. /*
  1004. var recordsPhotosCameraUpload = [tableMetadata]()
  1005. let tableDirectoryes = CCCoreData.getDirectoryIDsFromBegins(withServerUrl: serverUrl, activeAccount: tableAccount!.account)
  1006. for result in tableDirectoryes! {
  1007. }
  1008. */
  1009. let directoryID = CCCoreData.getDirectoryID(fromServerUrl: serverUrl, activeAccount: tableAccount!.account)
  1010. let predicate = NSPredicate(format: "(account == %@) AND (directoryID == %@) AND (session == '')AND (type == 'file') AND ((typeFile == %@) OR (typeFile == %@))", tableAccount!.account, directoryID!, k_metadataTypeFile_image, k_metadataTypeFile_video)
  1011. let sorted = CCUtility.getOrderSettings()
  1012. let ascending = CCUtility.getAscendingSettings()
  1013. let results = realm.objects(tableMetadata.self).filter(predicate).sorted(byKeyPath: sorted!, ascending: ascending)
  1014. if results.count > 0 {
  1015. return Array(results)
  1016. } else {
  1017. return nil
  1018. }
  1019. }
  1020. func removeOfflineAllFileFromServerUrl(_ serverUrl: String) {
  1021. let tableAccount = self.getAccountActive()
  1022. if tableAccount == nil {
  1023. return
  1024. }
  1025. let realm = try! Realm()
  1026. let results = realm.objects(tableMetadata.self).filter("account = %@ AND directoryID = %@", tableAccount!.account, serverUrl)
  1027. try! realm.write {
  1028. realm.delete(results)
  1029. }
  1030. }
  1031. //MARK: -
  1032. }