@@ -19,14 +19,21 @@ class OstBaseDbQueries {
1919 static let STATUS = " status "
2020 static let UTS = " uts "
2121
22- static let queue = DispatchQueue ( label: " db " , qos: . background, attributes: . concurrent)
22+ static let dbUpdateQueue = DispatchQueue ( label: " com.ost.sdk.db " , qos: . background, attributes: . concurrent)
23+ static let dbSelectQueue = DispatchQueue ( label: " com.ost.sdk.db.select " , qos: . userInitiated, attributes: . concurrent)
2324 weak var dbQueue : FMDatabaseQueue ?
2425 weak var db : FMDatabase ?
25-
26+
27+ static let _writeQueue : OperationQueue = OperationQueue ( )
28+ static let _writeQueueLock : NSRecursiveLock = NSRecursiveLock ( )
29+
30+ private let maxConcurrentOperationCount = 1
31+ private var selectQueryCount = 0
2632 /// Initializer
2733 init ( ) {
2834 db = getDb ( )
2935 dbQueue = getDbQueue ( )
36+ OstBaseDbQueries . _writeQueue. maxConcurrentOperationCount = 1
3037 }
3138
3239 /// Get DB instance
@@ -99,15 +106,31 @@ class OstBaseDbQueries {
99106 /// - Returns: Array<[String: Any?]>, Array of dictionary
100107 /// - Throws: OstError
101108 func executeQuery( _ query: String ) throws -> Array < [ String : Any ? ] > ? {
102- do {
103- if let resultSet: FMResultSet = try db? . executeQuery ( query, values: nil ) ?? nil {
104- let result = getEntityDataFromResultSet ( resultSet)
105- return result
109+ var result : Array < [ String : Any ? ] > ? = nil ;
110+ var err : OstError ? = nil ;
111+ selectQueryCount += 1
112+ if selectQueryCount == 1 {
113+ OstBaseDbQueries . _writeQueueLock. lock ( )
114+ }
115+ OstBaseDbQueries . dbSelectQueue. sync {
116+ do {
117+ if let resultSet: FMResultSet = try db? . executeQuery ( query, values: nil ) ?? nil {
118+ result = self . getEntityDataFromResultSet ( resultSet)
119+ }
120+ } catch {
121+ err = OstError ( " d_dbq_bdq_eq_1 " , . dbExecutionFailed)
106122 }
107- return nil
108- } catch {
109- throw OstError ( " d_dbq_bdq_eq_1 " , . dbExecutionFailed)
110123 }
124+
125+ if nil != err {
126+ throw err!
127+ }
128+
129+ selectQueryCount -= 1
130+ if selectQueryCount == 0 {
131+ OstBaseDbQueries . _writeQueueLock. unlock ( )
132+ }
133+ return result;
111134 }
112135
113136 /// Execute batch statements
@@ -125,10 +148,21 @@ class OstBaseDbQueries {
125148 /// - values: Value that needs to be updated
126149 /// - Returns: `true` if succcessful otherwise `false`
127150 func executeUpdate( _ query: String , values: [ String : Any ] , onUpdate: @escaping ( ( Bool ) -> Void ) ) {
128- dbQueue? . inTransaction ( { ( fmdb, nil) in
151+ // OstBaseDbQueries.dbUpdateQueue.sync {
152+ OstBaseDbQueries . _writeQueue. addOperation {
153+ OstBaseDbQueries . _writeQueueLock. lock ( )
154+ // self.dbQueue?.inDatabase({ (fmdb) in
155+ self . dbQueue? . inTransaction ( { ( fmdb, nil) in
156+
129157 let updateResult : Bool = fmdb. executeUpdate ( query, withParameterDictionary: values)
158+ if !updateResult {
159+
160+ }
130161 onUpdate ( updateResult)
131- } )
162+ OstBaseDbQueries . _writeQueueLock. unlock ( )
163+ } )
164+ }
165+ // }
132166 }
133167
134168 // MARK: - Database Structure
0 commit comments