Moment+Database.swift 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. //
  2. // Moment+Database.swift
  3. // bugu
  4. //
  5. // Created by Bugu on 2022/3/20.
  6. //
  7. import Foundation
  8. import SQLite
  9. import struct SQLite.Expression
  10. enum MomentDataHelperSource: Int, CaseIterable {
  11. case timeline = 1
  12. case my = 2
  13. case others = 3
  14. }
  15. struct MomentDataHelper: DataHelperProtocol {
  16. typealias T = Moment
  17. static let table = Table("hx_moment")
  18. static var id = Expression<Int>("moment_id")
  19. static let uid = Expression<Int>("moment_account_id")
  20. static let text = Expression<String>("moment_text")
  21. static let content = Expression<String?>("moment_content")
  22. static let type = Expression<String>("moment_type")
  23. static let metadata = Expression<String?>("moment_meta_data")
  24. static let timestamp = Expression<Int64>("moment_timestamp")
  25. static let source = Expression<Int>("moment_source")
  26. static func createTable() throws {
  27. guard let db = Database.shared.connection else {
  28. throw DBError.connectionErr
  29. }
  30. do {
  31. let _ = try db.run(table.create(ifNotExists: true) { t in
  32. t.column(id, defaultValue: nil)
  33. t.column(uid, defaultValue: 0)
  34. t.column(text, defaultValue: nil)
  35. t.column(content, defaultValue: nil)
  36. t.column(type, defaultValue: nil)
  37. t.column(metadata, defaultValue: nil)
  38. t.column(timestamp, defaultValue: 0)
  39. t.column(source, defaultValue: 0)
  40. t.primaryKey(id, source)
  41. })
  42. } catch {
  43. printLog("create hx_moment database error:\(error)")
  44. throw DBError.connectionErr
  45. }
  46. }
  47. static func insert(i: Moment, source: MomentDataHelperSource) throws -> Int64 {
  48. guard let db = Database.shared.connection else {
  49. throw DBError.connectionErr
  50. }
  51. let insert = table.insert(
  52. or: .replace,
  53. id <- i.id,
  54. uid <- i.uid,
  55. text <- i.text,
  56. content <- i.content,
  57. type <- i.type.rawValue,
  58. metadata <- i.metadata?.toJSONString(),
  59. timestamp <- i.createTime,
  60. self.source <- source.rawValue
  61. )
  62. do {
  63. // 使用事务来执行
  64. var rowId: Int64 = 0
  65. try db.transaction {
  66. rowId = try db.run(insert)
  67. for comment in i.commentList {
  68. let _ = try MomentCommentDataHelper.insert(i: comment)
  69. }
  70. }
  71. guard rowId > 0 else {
  72. throw DBError.insertErr
  73. }
  74. return rowId
  75. } catch {
  76. throw DBError.insertErr
  77. }
  78. }
  79. static func deleteAndReplace(i: Moment) throws {
  80. guard let db = Database.shared.connection else {
  81. throw DBError.connectionErr
  82. }
  83. do {
  84. for source in MomentDataHelperSource.allCases {
  85. // 生成查询条件
  86. let query = table.filter(id == i.id && source.rawValue == self.source)
  87. // 检查查询结果是否存在
  88. let exists = try db.scalar(query.exists)
  89. if exists {
  90. try deleteMoment(momentId: i.id, source: source)
  91. }
  92. let _ = try insert(i: i, source: source)
  93. }
  94. } catch {
  95. print("Error checking existence: \(error)")
  96. throw DBError.updateErr
  97. }
  98. }
  99. static func deleteAllMoments(source: MomentDataHelperSource, userId: Int?) throws {
  100. guard let db = Database.shared.connection else {
  101. throw DBError.connectionErr
  102. }
  103. var query = table.filter(self.source == source.rawValue)
  104. if source == .others, let userId = userId {
  105. query = query.filter(userId == self.uid)
  106. }
  107. do {
  108. // 开始事务,以确保删除操作是原子的
  109. try db.transaction {
  110. try db.run(query.delete())
  111. }
  112. } catch {
  113. throw DBError.deleteErr
  114. }
  115. }
  116. static func deleteMoment(momentId: Int, source: MomentDataHelperSource? = nil) throws {
  117. guard let db = Database.shared.connection else {
  118. throw DBError.connectionErr
  119. }
  120. var query = table.filter(self.id == momentId)
  121. if let source = source {
  122. query = query.filter(self.source == source.rawValue)
  123. }
  124. do {
  125. // 开始事务,以确保删除操作是原子的
  126. try db.transaction {
  127. try db.run(query.delete())
  128. }
  129. } catch {
  130. throw DBError.deleteErr
  131. }
  132. }
  133. // MARK: - timeline
  134. static func findTimeLineMomentList(lastMoment: Moment? = nil, count: Int = 20) throws -> [Moment] {
  135. guard let db = Database.shared.connection else {
  136. throw DBError.connectionErr
  137. }
  138. /// lastMoment 传入了
  139. if let lastMoment = lastMoment {
  140. var query = table
  141. .filter(self.source == MomentDataHelperSource.timeline.rawValue)
  142. .filter(timestamp < lastMoment.createTime)
  143. .order(timestamp.desc)
  144. if count > 0 {
  145. query = query.limit(count)
  146. }
  147. let items = try db.prepare(query)
  148. var arr = [Moment]()
  149. for i in items {
  150. arr.append(combineMoment(i: i))
  151. }
  152. return arr
  153. } else {
  154. var query = table
  155. .filter(self.source == MomentDataHelperSource.timeline.rawValue)
  156. .order(timestamp.desc)
  157. if count > 0 {
  158. query = query.limit(count)
  159. }
  160. let items = try db.prepare(query)
  161. var arr = [Moment]()
  162. for i in items {
  163. arr.append(combineMoment(i: i))
  164. }
  165. return arr
  166. }
  167. }
  168. static func findTimeLineLastMoment(desc: Bool) throws -> Moment? {
  169. guard let db = Database.shared.connection else {
  170. throw DBError.connectionErr
  171. }
  172. let query = table.filter(self.source == MomentDataHelperSource.timeline.rawValue)
  173. .order(desc ? timestamp.desc : timestamp.asc)
  174. .limit(1)
  175. let items = try db.prepare(query)
  176. for i in items {
  177. return combineMoment(i: i)
  178. }
  179. return nil
  180. }
  181. // MARK: - My
  182. static func findMyMomentList(lastMoment: Moment? = nil, count: Int = 20) throws -> [Moment] {
  183. guard let db = Database.shared.connection else {
  184. throw DBError.connectionErr
  185. }
  186. /// lastMoment 传入了
  187. if let lastMoment = lastMoment {
  188. var query = table
  189. .filter(self.source == MomentDataHelperSource.my.rawValue)
  190. .filter(timestamp < lastMoment.createTime)
  191. .order(timestamp.desc)
  192. if count > 0 {
  193. query = query.limit(count)
  194. }
  195. let items = try db.prepare(query)
  196. var arr = [Moment]()
  197. for i in items {
  198. arr.append(combineMoment(i: i))
  199. }
  200. return arr
  201. } else {
  202. var query = table
  203. .filter(self.source == MomentDataHelperSource.my.rawValue)
  204. .order(timestamp.desc)
  205. if count > 0 {
  206. query = query.limit(count)
  207. }
  208. let items = try db.prepare(query)
  209. var arr = [Moment]()
  210. for i in items {
  211. arr.append(combineMoment(i: i))
  212. }
  213. return arr
  214. }
  215. }
  216. static func findMyLastMoment(desc: Bool) throws -> Moment? {
  217. guard let db = Database.shared.connection else {
  218. throw DBError.connectionErr
  219. }
  220. let query = table.filter(self.source == MomentDataHelperSource.my.rawValue)
  221. .order(desc ? timestamp.desc : timestamp.asc)
  222. .limit(1)
  223. let items = try db.prepare(query)
  224. for i in items {
  225. return combineMoment(i: i)
  226. }
  227. return nil
  228. }
  229. // MARK: - others
  230. static func findOthersMomentList(userId: Int) throws -> [Moment] {
  231. guard let db = Database.shared.connection else {
  232. throw DBError.connectionErr
  233. }
  234. let query = table.filter(self.source == MomentDataHelperSource.others.rawValue && uid == userId)
  235. .order(timestamp.desc)
  236. .limit(20)
  237. var arr = [Moment]()
  238. let items = try db.prepare(query)
  239. for i in items {
  240. arr.append(combineMoment(i: i))
  241. }
  242. return arr
  243. }
  244. static func findOthersLastMoment(userId: Int, desc: Bool) throws -> Moment? {
  245. guard let db = Database.shared.connection else {
  246. throw DBError.connectionErr
  247. }
  248. let query = table.filter(self.source == MomentDataHelperSource.others.rawValue && uid == userId)
  249. .order(desc ? timestamp.desc : timestamp.asc)
  250. .limit(1)
  251. let items = try db.prepare(query)
  252. for i in items {
  253. return combineMoment(i: i)
  254. }
  255. return nil
  256. }
  257. static func findLastFiveMediaMoments(userId: Int) throws -> [Moment] {
  258. guard let db = Database.shared.connection else {
  259. throw DBError.connectionErr
  260. }
  261. var query: QueryType
  262. if userId == AppStorage.user.userId {
  263. query = table.filter(self.source == MomentDataHelperSource.my.rawValue)
  264. } else {
  265. query = table.filter(self.source == MomentDataHelperSource.others.rawValue && uid == userId)
  266. }
  267. query = query.filter(self.type == MomentTypeEnum.simplePicture.rawValue || self.type == MomentTypeEnum.multiPicture.rawValue || self.type == MomentTypeEnum.video.rawValue)
  268. .order(timestamp.desc)
  269. .limit(5)
  270. var arr = [Moment]()
  271. let items = try db.prepare(query)
  272. for i in items {
  273. arr.append(combineMoment(i: i))
  274. }
  275. return arr
  276. }
  277. static func findMoment(momentId: Int) throws -> Moment? {
  278. guard let db = Database.shared.connection else {
  279. throw DBError.connectionErr
  280. }
  281. let query = table.filter(id == momentId)
  282. .limit(1)
  283. do {
  284. let items = try db.prepare(query)
  285. for i in items {
  286. return combineMoment(i: i)
  287. }
  288. } catch {
  289. throw DBError.deleteErr
  290. }
  291. return nil
  292. }
  293. static func filterMoment(filter: String) throws -> [Moment] {
  294. guard let db = Database.shared.connection else {
  295. throw DBError.connectionErr
  296. }
  297. let query = table
  298. .filter(text.like("%\(filter)%"))
  299. .order(timestamp.desc)
  300. let items = try db.prepare(query)
  301. var array: [Moment] = []
  302. for i in items {
  303. let moment = combineMoment(i: i)
  304. array.append(moment)
  305. }
  306. return array
  307. }
  308. }
  309. extension MomentDataHelper {
  310. static func combineMoment(i: Row) -> Moment {
  311. let momentId = i[id]
  312. let comments = try? MomentCommentDataHelper.find(momentId: momentId)
  313. let moment = Moment(id: momentId,
  314. uid: i[uid],
  315. text: i[text],
  316. content: i[content],
  317. type: MomentTypeEnum(rawValue: i[type]) ?? .text,
  318. commentList: comments ?? [],
  319. metadata: MomentAddition.deserialize(from: i[metadata]),
  320. createTime: i[timestamp])
  321. return moment
  322. }
  323. }
  324. struct MomentCommentDataHelper: DataHelperProtocol {
  325. typealias T = MomentComment
  326. static let table = Table("hx_moment_comment")
  327. static var id = Expression<Int>("moment_comment_id")
  328. static let parentId = Expression<Int>("moment_parent_id")
  329. static let momentId = Expression<Int>("moment_id")
  330. static let uid = Expression<Int>("moment_account_id")
  331. static let type = Expression<Int>("moment_comment_type")
  332. static let content = Expression<String?>("moment_comment_content")
  333. static let deleted = Expression<Bool>("moment_comment_deleted")
  334. static let timestamp = Expression<Int>("moment_comment_timestamp")
  335. static func createTable() throws {
  336. guard let db = Database.shared.connection else {
  337. throw DBError.connectionErr
  338. }
  339. do {
  340. let _ = try db.run(table.create(ifNotExists: true) { t in
  341. t.column(id, primaryKey: true)
  342. t.column(parentId, defaultValue: 0)
  343. t.column(momentId, defaultValue: 0)
  344. t.column(uid, defaultValue: 0)
  345. t.column(type, defaultValue: 0)
  346. t.column(content, defaultValue: nil)
  347. t.column(deleted, defaultValue: false)
  348. t.column(timestamp, defaultValue: 0)
  349. })
  350. } catch {
  351. printLog("create hx_moment_comment database error:\(error)")
  352. throw DBError.connectionErr
  353. }
  354. }
  355. static func insert(i: MomentComment) throws -> Int64 {
  356. guard let db = Database.shared.connection else {
  357. throw DBError.connectionErr
  358. }
  359. let insert = table.insert(
  360. or: .replace,
  361. id <- i.id,
  362. parentId <- i.parentId,
  363. momentId <- i.momentId,
  364. uid <- i.uid,
  365. type <- i.type,
  366. content <- i.content,
  367. deleted <- i.deleted,
  368. timestamp <- i.createTime
  369. )
  370. do {
  371. let rowId = try db.run(insert)
  372. guard rowId > 0 else {
  373. throw DBError.insertErr
  374. }
  375. return rowId
  376. } catch {
  377. throw DBError.insertErr
  378. }
  379. }
  380. static func find(commentId: Int) throws -> MomentComment? {
  381. guard let db = Database.shared.connection else {
  382. throw DBError.connectionErr
  383. }
  384. let query = table.filter(id == commentId && deleted == false)
  385. .limit(1)
  386. do {
  387. let items = try db.prepare(query)
  388. for i in items {
  389. return combineMomentComment(i: i)
  390. }
  391. } catch {
  392. throw DBError.deleteErr
  393. }
  394. return nil
  395. }
  396. static func find(momentId: Int) throws -> [MomentComment] {
  397. guard let db = Database.shared.connection else {
  398. throw DBError.connectionErr
  399. }
  400. let query = table.filter(momentId == self.momentId && deleted == false)
  401. .order(timestamp.asc)
  402. var arr = [MomentComment]()
  403. let items = try db.prepare(query)
  404. for i in items {
  405. arr.append(combineMomentComment(i: i))
  406. }
  407. return arr
  408. }
  409. static func delete(commentId: Int) throws {
  410. guard let db = Database.shared.connection else {
  411. throw DBError.connectionErr
  412. }
  413. let query = table.filter(self.id == commentId).update(deleted <- true)
  414. try db.run(query)
  415. }
  416. }
  417. extension MomentCommentDataHelper {
  418. static func combineMomentComment(i: Row) -> MomentComment {
  419. let comment = MomentComment(id: i[id],
  420. parentId: i[parentId],
  421. momentId: i[momentId],
  422. uid: i[uid],
  423. type: i[type],
  424. content: i[content] ?? "",
  425. deleted: i[deleted],
  426. createTime: i[timestamp])
  427. return comment
  428. }
  429. }
  430. struct MomentRuleDataHelper: DataHelperProtocol {
  431. typealias T = MomentRule
  432. static let table = Table("hx_moment_rule")
  433. static var id = Expression<Int>("id")
  434. static let uid = Expression<Int>("account_id")
  435. static let targetId = Expression<Int>("target_id")
  436. static let type = Expression<Int>("type")
  437. static func createTable() throws {
  438. guard let db = Database.shared.connection else {
  439. throw DBError.connectionErr
  440. }
  441. do {
  442. let _ = try db.run(table.create(ifNotExists: true) { t in
  443. t.column(id, primaryKey: .autoincrement)
  444. t.column(uid, defaultValue: 0)
  445. t.column(targetId, defaultValue: 0)
  446. t.column(type, defaultValue: 0)
  447. })
  448. } catch {
  449. printLog("create hx_moment_rule database error:\(error)")
  450. throw DBError.connectionErr
  451. }
  452. } // end createTable
  453. static func rebuildTable() throws {
  454. guard let db = Database.shared.connection else {
  455. throw DBError.connectionErr
  456. }
  457. do {
  458. let _ = try db.run(table.drop(ifExists: true))
  459. try createTable()
  460. } catch {
  461. printLog("update hx_group_call database error:\(error)")
  462. throw DBError.updateTablesErr
  463. }
  464. }
  465. static func deleteAndInsert(list: [MomentRule], type: MomentRuleType) throws {
  466. do {
  467. try deleteAll(type: type)
  468. for i in list {
  469. let _ = try insert(i: i)
  470. }
  471. } catch {
  472. printLog("deleteAndInsertMomentRule error\(error)")
  473. throw error
  474. }
  475. }
  476. static func insert(i: MomentRule) throws -> Int64 {
  477. guard let db = Database.shared.connection else {
  478. throw DBError.connectionErr
  479. }
  480. let insert = table.insert(
  481. or: .replace,
  482. uid <- i.uid,
  483. type <- i.type.rawValue,
  484. targetId <- i.targetId
  485. )
  486. do {
  487. let rowId = try db.run(insert)
  488. guard rowId > 0 else {
  489. throw DBError.insertErr
  490. }
  491. return rowId
  492. } catch {
  493. throw DBError.insertErr
  494. }
  495. } // end insert
  496. static func delete(userId: Int, permission: MomentRuleType) throws {
  497. guard let db = Database.shared.connection else {
  498. throw DBError.connectionErr
  499. }
  500. let query = table.filter(uid == AppStorage.user.userId! && targetId == userId && type == permission.rawValue)
  501. do {
  502. try db.run(query.delete())
  503. } catch {
  504. throw DBError.deleteErr
  505. }
  506. } // end delete
  507. static func findAll() throws -> [MomentRule] {
  508. guard let db = Database.shared.connection else {
  509. throw DBError.connectionErr
  510. }
  511. var arr = [MomentRule]()
  512. let items = try db.prepare(table)
  513. for i in items {
  514. arr.append(MomentRule(
  515. id: i[id],
  516. uid: i[uid],
  517. targetId: i[targetId],
  518. type: MomentRuleType(rawValue: i[type]) ?? .noLookMe)
  519. )
  520. }
  521. return arr
  522. } // end find all
  523. static func find(targetUserId: Int) throws -> [MomentRule] {
  524. guard let db = Database.shared.connection else {
  525. throw DBError.connectionErr
  526. }
  527. var arr = [MomentRule]()
  528. let query = table.filter(targetId == targetUserId)
  529. let items = try db.prepare(query)
  530. for i in items {
  531. arr.append(MomentRule(
  532. id: i[id],
  533. uid: i[uid],
  534. targetId: i[targetId],
  535. type: MomentRuleType(rawValue: i[type]) ?? .noLookMe)
  536. )
  537. }
  538. return arr
  539. }
  540. static func deleteAll(type: MomentRuleType) throws {
  541. guard let db = Database.shared.connection else {
  542. throw DBError.connectionErr
  543. }
  544. do {
  545. // 开始事务,以确保删除操作是原子的
  546. let query = table.filter(self.type == type.rawValue)
  547. try db.transaction {
  548. try db.run(query.delete())
  549. }
  550. } catch {
  551. printLog("deleteAllMomentRules error\(error)")
  552. throw DBError.deleteErr
  553. }
  554. }
  555. }
  556. struct MomentMessageDataHelper: DataHelperProtocol {
  557. typealias T = MomentMessage
  558. static let table = Table("hx_moment_message")
  559. static var messageId = Expression<Int>("moment_message_id")
  560. static var momentId = Expression<Int>("moment_id")
  561. static let userId = Expression<Int>("moment_account_id")
  562. static let parentCommentUserId = Expression<Int?>("moment_parent_account_id")
  563. static let commentId = Expression<Int?>("moment_comment_id")
  564. static let messageType = Expression<String?>("moment_message_type")
  565. static let isRead = Expression<Bool>("moment_message_is_read")
  566. static let timestamp = Expression<Int64>("moment_timestamp")
  567. static func createTable() throws {
  568. guard let db = Database.shared.connection else {
  569. throw DBError.connectionErr
  570. }
  571. do {
  572. let _ = try db.run(table.create(ifNotExists: true) { t in
  573. t.column(messageId, primaryKey: true)
  574. t.column(momentId, defaultValue: 0)
  575. t.column(userId, defaultValue: 0)
  576. t.column(parentCommentUserId, defaultValue: 0)
  577. t.column(commentId, defaultValue: 0)
  578. t.column(messageType, defaultValue: nil)
  579. t.column(isRead, defaultValue: false)
  580. t.column(timestamp, defaultValue: 0)
  581. })
  582. } catch {
  583. printLog("create hx_moment_message database error:\(error)")
  584. throw DBError.connectionErr
  585. }
  586. }
  587. static func insert(i: MomentMessage, type: HXMessageAction.MomentLine) throws -> Int64 {
  588. guard let db = Database.shared.connection else {
  589. throw DBError.connectionErr
  590. }
  591. let insert = table.insert(
  592. or: .replace,
  593. messageId <- i.messageId,
  594. momentId <- i.momentId,
  595. userId <- i.userId,
  596. parentCommentUserId <- i.parentCommentUserId,
  597. commentId <- i.commentId,
  598. messageType <- type.rawValue,
  599. isRead <- false,
  600. timestamp <- i.createTime
  601. )
  602. do {
  603. let rowId = try db.run(insert)
  604. guard rowId > 0 else {
  605. throw DBError.insertErr
  606. }
  607. return rowId
  608. } catch {
  609. throw DBError.insertErr
  610. }
  611. }
  612. static func findNewMomentMessage() throws -> [MomentMessage] {
  613. guard let db = Database.shared.connection else {
  614. throw DBError.connectionErr
  615. }
  616. let query = table.filter(messageType == HXMessageAction.MomentLine.commented.rawValue)
  617. .filter(isRead == false)
  618. .order(timestamp.desc)
  619. var arr = [MomentMessage]()
  620. let items = try db.prepare(query)
  621. for i in items {
  622. arr.append(combineMomentMessage(i: i))
  623. }
  624. return arr
  625. }
  626. static func findMomentMessages() throws -> [MomentMessage] {
  627. guard let db = Database.shared.connection else {
  628. throw DBError.connectionErr
  629. }
  630. let query = table.filter(messageType == HXMessageAction.MomentLine.commented.rawValue)
  631. .order(timestamp.desc)
  632. var arr = [MomentMessage]()
  633. let items = try db.prepare(query)
  634. for i in items {
  635. arr.append(combineMomentMessage(i: i))
  636. }
  637. return arr
  638. }
  639. static func deleteMomentMessage(messageId: Int) throws {
  640. guard let db = Database.shared.connection else {
  641. throw DBError.connectionErr
  642. }
  643. let query = table.filter(self.messageId == messageId)
  644. do {
  645. // 开始事务,以确保删除操作是原子的
  646. try db.transaction {
  647. try db.run(query.delete())
  648. }
  649. } catch {
  650. throw DBError.deleteErr
  651. }
  652. }
  653. static func deleteMomentMessage(commentId: Int) throws {
  654. guard let db = Database.shared.connection else {
  655. throw DBError.connectionErr
  656. }
  657. let query = table.filter(self.commentId == commentId)
  658. try db.run(query.delete())
  659. }
  660. static func deleteAll() throws {
  661. guard let db = Database.shared.connection else {
  662. throw DBError.connectionErr
  663. }
  664. do {
  665. // 开始事务,以确保删除操作是原子的
  666. try db.transaction {
  667. try db.run(table.delete())
  668. }
  669. } catch {
  670. throw DBError.deleteErr
  671. }
  672. }
  673. static func readAll() throws {
  674. guard let db = Database.shared.connection else {
  675. throw DBError.connectionErr
  676. }
  677. try db.run(table.update(isRead <- true))
  678. }
  679. }
  680. extension MomentMessageDataHelper {
  681. static func combineMomentMessage(i: Row) -> MomentMessage {
  682. let message = MomentMessage(messageId: i[messageId],
  683. momentId: i[momentId],
  684. userId: i[userId],
  685. commentId: i[commentId],
  686. parentCommentUserId: i[parentCommentUserId],
  687. createTime: i[timestamp])
  688. return message
  689. }
  690. }