InquiryThread.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // InquiryThread.swift
  3. // DigiXLite
  4. //
  5. // Created by Akhmad Al Qindi Irsyam on 23/11/22.
  6. //
  7. import Foundation
  8. import FMDB
  9. class InquiryThread {
  10. static let `default` = InquiryThread()
  11. private var isRunning = false
  12. private var semaphore = DispatchSemaphore(value: 0)
  13. private var connection = DispatchSemaphore(value: 0)
  14. private var dispatchQueue = DispatchQueue(label: "InquiryThread")
  15. private var queue = [TMessage]()
  16. init() {
  17. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  18. if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select status, message, id from INQUIRY") {
  19. while cursor.next() {
  20. let status = cursor.int(forColumnIndex: 0)
  21. if status == 1 {
  22. continue
  23. }
  24. if let cursorMessage = Database.shared.getRecords(fmdb: fmdb, query: "select message_id from MESSAGE where message_id = '\(cursor.string(forColumnIndex: 2)!)'") {
  25. if cursorMessage.next() {
  26. if let message = cursor.string(forColumnIndex: 1) {
  27. addQueue(message: TMessage(data: message))
  28. }
  29. } else {
  30. _ = Database.shared.deleteRecord(fmdb: fmdb, table: "INQUIRY", _where: "id = '\(cursor.string(forColumnIndex: 2)!)'")
  31. }
  32. cursorMessage.close()
  33. }
  34. }
  35. cursor.close()
  36. }
  37. })
  38. }
  39. func addQueue(message: TMessage) {
  40. //print(("MASUK INQUIRY ADD")
  41. addInquiry(message: message)
  42. queue.append(message)
  43. semaphore.signal()
  44. }
  45. private func addQueue(_ message: TMessage, at: Int) {
  46. Thread.sleep(forTimeInterval: 1)
  47. queue.insert(message, at: at)
  48. semaphore.signal()
  49. }
  50. private func addInquiry(message: TMessage) {
  51. DispatchQueue.global().async {
  52. let messageId = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
  53. if !messageId.isEmpty {
  54. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  55. do {
  56. //print(("SIMPAN MESSAGE TO INQUIRY TABLE")
  57. _ = try Database.shared.insertRecord(fmdb: fmdb, table: "INQUIRY", cvalues: [
  58. "id" : messageId,
  59. "status" : 0,
  60. "message" : message.pack(),
  61. ], replace: true)
  62. } catch {
  63. rollback.pointee = true
  64. //print(error)
  65. }
  66. })
  67. }
  68. }
  69. }
  70. private var isWait = false
  71. func set(wait: Bool) {
  72. isWait = wait
  73. if !isWait {
  74. connection.signal()
  75. }
  76. }
  77. func getQueue() -> TMessage {
  78. while queue.isEmpty || queue.count == 0 {
  79. //print(("QUEUE INQUIRY.wait")
  80. semaphore.wait()
  81. }
  82. return queue.remove(at: 0)
  83. }
  84. func run() {
  85. if (isRunning) {
  86. return
  87. }
  88. isRunning = true
  89. dispatchQueue.async {
  90. while self.isRunning {
  91. if self.isWait {
  92. //print(("CONNECTION INQUIRY.wait")
  93. self.connection.wait()
  94. }
  95. self.process(message: self.getQueue())
  96. }
  97. }
  98. }
  99. private func process(message: TMessage) {
  100. //print(("inquiry process", message.toLogString())
  101. mobileInquiry(message: message)
  102. }
  103. /**
  104. *
  105. */
  106. private func mobileInquiry(message: TMessage) {
  107. DigiX.saveMessage(message: message)
  108. //print(("save message sendChat")
  109. _ = DigiX.write(message: CoreMessage_TMessageBank.getMobileInquiry(message_id: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)))
  110. }
  111. }