Updates for YapDatabase 4.0

This commit is contained in:
Chris Ballinger 2020-02-28 13:02:01 -08:00
parent 4067e2632c
commit a626fbff56
21 changed files with 166 additions and 139 deletions

View File

@ -55,7 +55,7 @@ TODO: Add long description of the pod here.
s.dependency 'ChatSecure-Push-iOS'
s.dependency 'SQLCipher', '~> 4.2.0'
s.dependency 'YapDatabase/SQLCipher', '~> 3.1.3'
s.dependency 'YapDatabase/SQLCipher', '~> 4.0'
s.dependency 'libsqlfs/SQLCipher'
s.dependency 'IOCipher/GCDWebServer'

View File

@ -134,16 +134,13 @@
}
NSString *databasePath = [self.databaseDirectory stringByAppendingPathComponent:name];
self.database = [[YapDatabase alloc] initWithPath:databasePath
serializer:nil
deserializer:nil
options:options];
self.database = [[YapDatabase alloc] initWithURL:[NSURL fileURLWithPath:databasePath] options:options];
// Stop trying to setup up the database. Something went wrong. Most likely the password is incorrect.
if (self.database == nil) {
return NO;
}
self.database.connectionDefaults.objectPolicy = YapDatabasePolicyShare;
self.database.connectionDefaults.objectCacheLimit = 10000;
[self setupConnections];

View File

@ -232,7 +232,7 @@ open class OTRSignalStorageManager: NSObject {
}
let query = YapDatabaseQuery(string: "WHERE (OTRYapDatabaseSignalPreKeyAccountKeySecondaryIndexColumnName) = ?", parameters: ["\(self.accountKey)"])
secondaryIndexTransaction.enumerateKeysAndObjects(matching: query, using: { (collection, key, object, stop) in
let _ = secondaryIndexTransaction.iterateKeysAndObjects(matching: query, using: { (collection, key, object, stop) in
guard let preKey = object as? OTRSignalPreKey else {
return
}

View File

@ -7,8 +7,7 @@
//
import Foundation
import YapDatabase.YapDatabaseFullTextSearch
import YapDatabase.YapDatabaseSearchResultsView
import YapDatabase
open class OTRYapExtensions:NSObject {

View File

@ -7,7 +7,7 @@
//
import Foundation
import YapDatabase.YapDatabaseView
import YapDatabase
@objc public protocol OTRYapViewHandlerDelegateProtocol:NSObjectProtocol {

View File

@ -132,11 +132,9 @@ class PushStorage: NSObject, PushStorageProtocol {
func unusedToken() -> TokenContainer? {
var tokenContainer:TokenContainer? = nil
self.databaseConnection.read { (transaction) -> Void in
transaction.enumerateKeysAndObjects(inCollection: PushYapCollections.unusedTokenCollection.rawValue, using: { (key, object, stop) -> Void in
if let tc = object as? TokenContainer {
tokenContainer = tc
}
stop.initialize(to: true)
transaction.iterateKeysAndObjects(inCollection: PushYapCollections.unusedTokenCollection.rawValue, using: { (key, tc: TokenContainer, stop) -> Void in
tokenContainer = tc
stop = true
})
}
return tokenContainer
@ -236,18 +234,16 @@ class PushStorage: NSObject, PushStorageProtocol {
self.databaseConnection.asyncReadWrite({ (transaction) in
let collection = PushYapCollections.unusedTokenCollection.rawValue
var removeKeyArray:[String] = []
transaction.enumerateKeysAndObjects(inCollection: collection, using: { (key, object, stop) in
if let token = object as? TokenContainer {
//Check that there is an expires date otherwise remove
guard let expiresDate = token.pushToken?.expires else {
removeKeyArray.append(token.uniqueId)
return
}
// Check that the date is farther in the future than currentDate + timeBuffer
if (Date(timeIntervalSinceNow: timeBuffer).compare(expiresDate) == .orderedDescending ) {
removeKeyArray.append(token.uniqueId)
}
transaction.iterateKeysAndObjects(inCollection: collection, using: { (key, token: TokenContainer, stop) in
//Check that there is an expires date otherwise remove
guard let expiresDate = token.pushToken?.expires else {
removeKeyArray.append(token.uniqueId)
return
}
// Check that the date is farther in the future than currentDate + timeBuffer
if (Date(timeIntervalSinceNow: timeBuffer).compare(expiresDate) == .orderedDescending ) {
removeKeyArray.append(token.uniqueId)
}
})

View File

@ -924,13 +924,7 @@ typedef NS_ENUM(NSInteger, XMPPClientState) {
{
DDLogWarn(@"%@: %@ %@ %@", THIS_FILE, THIS_METHOD, message, error);
[self.databaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[transaction enumerateMessagesWithElementId:message.elementID originId:message.originId stanzaId:nil block:^(id<OTRMessageProtocol> _Nonnull databaseMessage, BOOL * _Null_unspecified stop) {
if ([databaseMessage isKindOfClass:[OTRBaseMessage class]]) {
((OTRBaseMessage *)databaseMessage).error = error;
[(OTRBaseMessage *)databaseMessage saveWithTransaction:transaction];
*stop = YES;
}
}];
[transaction setMessageErrorWithElementId:message.elementID originId:message.originId stanzaId:nil error:error];
}];
}
- (void)xmppStream:(XMPPStream *)sender didFailToSendPresence:(XMPPPresence *)presence error:(NSError *)error

View File

@ -111,7 +111,7 @@ import CocoaLumberjack
transaction.enumerateMessages(elementId: responseId, originId: responseId, stanzaId: nil) { (message, stop) in
if let message = message as? OTROutgoingMessage {
_deliveredMessage = message
stop.pointee = true
stop = true
}
}
if _deliveredMessage == nil {
@ -146,7 +146,7 @@ import CocoaLumberjack
transaction.enumerateMessages(elementId: oid, originId: oid, stanzaId: sid) { (foundMessage, stop) in
if foundMessage.threadId == buddyUniqueId {
result = true
stop.pointee = true
stop = true
}
}
return result
@ -475,6 +475,26 @@ extension String {
}
extension OTRBaseMessage {
@objc public static func message(forMessageId messageId: String, incoming: Bool, transaction: YapDatabaseReadTransaction) -> OTRMessageProtocol? {
var deliveredMessage: OTRMessageProtocol?
transaction.enumerateMessages(elementId: messageId, originId: nil, stanzaId: nil) { (message, stop) in
if message.isMessageIncoming == incoming {
deliveredMessage = message
stop = true
}
}
return deliveredMessage
}
@objc public static func message(forMessageId messageId: String, transaction: YapDatabaseReadTransaction) -> OTRMessageProtocol? {
if self is OTRIncomingMessage.Type {
return self.message(forMessageId: messageId, incoming: true, transaction: transaction)
} else {
return self.message(forMessageId: messageId, incoming: false, transaction: transaction)
}
}
/// You can override message body, for example if this is an encrypted message
convenience init(xmppMessage: XMPPMessage, body: String?, account: OTRXMPPAccount, buddy: OTRXMPPBuddy, capabilities: XMPPCapabilities) {
self.init()

View File

@ -220,7 +220,7 @@ import YapDatabase
if let roomMessage = message as? OTRXMPPRoomMessage,
roomMessage.senderJID == xmppMessage.from?.full {
result = roomMessage
stop.pointee = true
stop = true
} else {
DDLogWarn("Found matching MUC message but intended for different recipient \(message) \(xmppMessage)")
}

View File

@ -26,10 +26,21 @@ extension YapDatabaseConnection {
}
}
extension YapDatabaseReadWriteTransaction {
@objc public func setMessageError(elementId:String?, originId: String?, stanzaId:String?, error: Error) {
enumerateMessages(elementId: elementId, originId: originId, stanzaId: stanzaId) { (message, stop) in
if let databaseMessage = message as? OTRBaseMessage {
databaseMessage.error = error
databaseMessage.save(with: self)
}
}
}
}
extension YapDatabaseReadTransaction {
/// elementId is the XMPP elementId, originId and stanzaId are from XEP-0359
@objc public func enumerateMessages(elementId:String?, originId: String?, stanzaId:String?, block:@escaping (_ message:OTRMessageProtocol,_ stop:UnsafeMutablePointer<ObjCBool>) -> Void) {
public func enumerateMessages(elementId:String?, originId: String?, stanzaId:String?, block:@escaping (_ message:OTRMessageProtocol,_ stop: inout Bool) -> Void) {
guard let secondaryIndexTransaction = self.ext(SecondaryIndexName.messages) as? YapDatabaseSecondaryIndexTransaction else {
return
}
@ -53,22 +64,22 @@ extension YapDatabaseReadTransaction {
}
let query = YapDatabaseQuery(string: queryString, parameters: parameters)
secondaryIndexTransaction.enumerateKeys(matching: query) { (collection, key, stop) -> Void in
let _ = secondaryIndexTransaction.iterateKeys(matching: query) { (collection, key, stop) -> Void in
if let message = self.object(forKey: key, inCollection: collection) as? OTRMessageProtocol {
block(message, stop)
block(message, &stop)
}
}
}
@objc public func enumerateSessions(accountKey:String, signalAddressName:String, block:@escaping (_ session:OTRSignalSession,_ stop:UnsafeMutablePointer<ObjCBool>) -> Void) {
public func enumerateSessions(accountKey:String, signalAddressName:String, block:@escaping (_ session:OTRSignalSession,_ stop: inout Bool) -> Void) {
guard let secondaryIndexTransaction = self.ext(SecondaryIndexName.signal) as? YapDatabaseSecondaryIndexTransaction else {
return
}
let queryString = "Where \(SignalIndexColumnName.session) = ?"
let query = YapDatabaseQuery(string: queryString, parameters: [OTRSignalSession.sessionKey(accountKey: accountKey, name: signalAddressName)])
secondaryIndexTransaction.enumerateKeys(matching: query) { (collection, key, stop) -> Void in
let _ = secondaryIndexTransaction.iterateKeys(matching: query) { (collection, key, stop) -> Void in
if let session = self.object(forKey: key, inCollection: collection) as? OTRSignalSession {
block(session, stop)
block(session, &stop)
}
}
}
@ -97,12 +108,7 @@ extension YapDatabaseReadTransaction {
let queryString = "Where \(MessageIndexColumnName.isMessageRead) == 0"
let query = YapDatabaseQuery(string: queryString, parameters: [])
var count:UInt = 0
let success = secondaryIndexTransaction.getNumberOfRows(&count, matching: query)
if (!success) {
NSLog("Error with global numberOfUnreadMessages index")
}
return count
return secondaryIndexTransaction.numberOfRows(matching: query) ?? 0
}
@ -114,7 +120,7 @@ extension YapDatabaseReadTransaction {
let queryString = "Where \(MessageIndexColumnName.threadId) == ? AND \(MessageIndexColumnName.isMessageRead) == 0"
let query = YapDatabaseQuery(string: queryString, parameters: [thread.threadIdentifier])
var result = [OTRMessageProtocol]()
let success = indexTransaction.enumerateKeysAndObjects(matching: query) { (collection, key, object, stop) in
let success = indexTransaction.iterateKeysAndObjects(matching: query) { (collection, key, object, stop) in
if let message = object as? OTRMessageProtocol {
result.append(message)
}
@ -130,17 +136,17 @@ extension YapDatabaseReadTransaction {
extension YapDatabaseReadTransaction {
@objc public func enumerateUnreadMessages(_ block:@escaping (_ message:OTRMessageProtocol,_ stop:UnsafeMutablePointer<ObjCBool>) -> Void) {
public func enumerateUnreadMessages(_ block:@escaping (_ message:OTRMessageProtocol,_ stop: inout Bool) -> Void) {
guard let secondaryIndexTransaction = self.ext(SecondaryIndexName.messages) as? YapDatabaseSecondaryIndexTransaction else {
return
}
let queryString = "Where \(MessageIndexColumnName.isMessageRead) == 0"
let query = YapDatabaseQuery(string: queryString, parameters: [])
secondaryIndexTransaction.enumerateKeysAndObjects(matching: query) { (key, collection, object, stop) in
let _ = secondaryIndexTransaction.iterateKeysAndObjects(matching: query) { (key, collection, object, stop) in
if let message = object as? OTRMessageProtocol {
block(message, stop)
block(message, &stop)
} else {
DDLogError("Non-message object in messages index \(object)")
DDLogError("Non-message object in messages index \(String(describing: object))")
}
}
}

View File

@ -272,26 +272,6 @@
}];
}
+ (id<OTRMessageProtocol>)messageForMessageId:(NSString *)messageId incoming:(BOOL)incoming transaction:(YapDatabaseReadTransaction *)transaction {
__block id<OTRMessageProtocol> deliveredMessage = nil;
[transaction enumerateMessagesWithElementId:messageId originId:nil stanzaId:nil block:^(id<OTRMessageProtocol> _Nonnull message, BOOL * _Null_unspecified stop) {
if ([message isMessageIncoming] == incoming) {
//Media messages are not delivered until the transfer is complete. This is handled in the OTREncryptionManager.
deliveredMessage = message;
*stop = YES;
}
}];
return deliveredMessage;
}
+ (nullable id<OTRMessageProtocol>)messageForMessageId:(nonnull NSString *)messageId transaction:(nonnull YapDatabaseReadTransaction *)transaction
{
if ([self class] == [OTRIncomingMessage class]) {
return [self messageForMessageId:messageId incoming:YES transaction:transaction];
} else {
return [self messageForMessageId:messageId incoming:NO transaction:transaction];
}
}
- (id<OTRMessageProtocol>)duplicateMessage {
OTRBaseMessage *message = self;
OTRBaseMessage *newMessage = [[[self class] alloc] init];

View File

@ -7,7 +7,7 @@
//
import UIKit
import YapDatabase.YapDatabaseRelationship
import YapDatabase
@objc public enum RoomSecurity: Int {
/// will choose omemo if _any_ occupants have available keys
@ -264,12 +264,7 @@ extension OTRXMPPRoom:OTRThreadOwner {
}
let queryString = "Where \(MessageIndexColumnName.threadId) == ? AND \(MessageIndexColumnName.isMessageRead) == 0"
let query = YapDatabaseQuery(string: queryString, parameters: [self.uniqueId])
var count:UInt = 0
let success = indexTransaction.getNumberOfRows(&count, matching: query)
if (!success) {
NSLog("Query error for OTRXMPPRoom numberOfUnreadMessagesWithTransaction")
}
return count
return indexTransaction.numberOfRows(matching: query) ?? 0
}
public var isGroupThread: Bool {

View File

@ -479,7 +479,7 @@ extension OTRXMPPRoomMessage {
transaction.enumerateMessages(elementId: messageId, originId: message.originId, stanzaId: nil) { (messageProtocol, stop) in
if let message = messageProtocol as? OTRXMPPRoomMessage {
roomMessage = message
stop.pointee = true
stop = true
}
}
// Mark messages as delivered, that aren't previous incoming messages

View File

@ -251,7 +251,7 @@ extension OTRXMPPRoomOccupant {
queryString.append(")")
let query = YapDatabaseQuery(string: queryString, parameters: parameters)
let success = indexTransaction.enumerateKeysAndObjects(matching: query) { (collection, key, object, stop) in
let success = indexTransaction.iterateKeysAndObjects(matching: query) { (collection, key, object, stop) in
if let matchingOccupant = object as? OTRXMPPRoomOccupant,
matchingOccupant.jid != nil || matchingOccupant.realJID != nil {
matchingOccupants.append(matchingOccupant)

View File

@ -8,7 +8,7 @@
import Foundation
import ChatSecure_Push_iOS
import YapDatabase.YapDatabaseRelationship
import YapDatabase
let kDeviceAccountRelationshipEdgeName = "OTRPushDeviceAccountRelationshipEdgeName"
let kBuddyTokenRelationshipEdgeName = "OTRPushBuddyTokenRelationshipEdgeName"

View File

@ -190,11 +190,10 @@ extension OTRXMPPBuddy {
transaction: YapDatabaseReadTransaction) -> OTRXMPPBuddy? {
DDLogWarn("WARN: Using slow O(n) lookup for OTRXMPPBuddy: \(jid)")
var buddy: OTRXMPPBuddy? = nil
transaction.enumerateKeysAndObjects(inCollection: OTRXMPPBuddy.collection) { (key, object, stop) in
if let potentialMatch = object as? OTRXMPPBuddy,
potentialMatch.username == jid.bare {
transaction.iterateKeysAndObjects(inCollection: OTRXMPPBuddy.collection) { (key, potentialMatch: OTRXMPPBuddy, stop) in
if potentialMatch.username == jid.bare {
buddy = potentialMatch
stop.pointee = true
stop = true
}
}
return buddy
@ -213,7 +212,7 @@ extension OTRXMPPBuddy {
let query = YapDatabaseQuery(string: queryString, parameters: [accountUniqueId, jid.bare])
var matchingBuddies: [OTRXMPPBuddy] = []
let success = indexTransaction.enumerateKeysAndObjects(matching: query) { (collection, key, object, stop) in
let success = indexTransaction.iterateKeysAndObjects(matching: query) { (collection, key, object, stop) in
if let matchingBuddy = object as? OTRXMPPBuddy {
matchingBuddies.append(matchingBuddy)
}

View File

@ -7,7 +7,7 @@
//
import Foundation
import YapDatabase.YapDatabaseActionManager
import YapDatabase
import YapTaskQueue
@objc public enum BuddyActionType: Int {

View File

@ -109,8 +109,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)deleteAllMessagesWithTransaction:(nonnull YapDatabaseReadWriteTransaction*)transaction;
+ (void)deleteAllMessagesForBuddyId:(nonnull NSString *)uniqueBuddyId transaction:(nonnull YapDatabaseReadWriteTransaction*)transaction;
+ (void)deleteAllMessagesForAccountId:(nonnull NSString *)uniqueAccountId transaction:(nonnull YapDatabaseReadWriteTransaction*)transaction;
+ (nullable id<OTRMessageProtocol>)messageForMessageId:(nonnull NSString *)messageId incoming:(BOOL)incoming transaction:(nonnull YapDatabaseReadTransaction *)transaction;
+ (nullable id<OTRMessageProtocol>)messageForMessageId:(nonnull NSString *)messageId transaction:(nonnull YapDatabaseReadTransaction *)transaction;
- (nullable OTRXMPPBuddy*) buddyWithTransaction:(nonnull YapDatabaseReadTransaction*)transaction;

View File

@ -50,7 +50,7 @@ PODS:
- TTTAttributedLabel (~> 2.0)
- XLForm (~> 4.1)
- XMPPFramework/Swift
- YapDatabase/SQLCipher (~> 3.1.3)
- YapDatabase/SQLCipher (~> 4.0)
- YapTaskQueue/SQLCipher
- ZXingObjC/QRCode (~> 3.6)
- CocoaAsyncSocket (7.6.4)
@ -147,70 +147,113 @@ PODS:
- XMPPFramework/Swift (4.1.0):
- CocoaLumberjack/Swift
- XMPPFramework/default
- YapDatabase/SQLCipher (3.1.4):
- YapDatabase/SQLCipher/Core (= 3.1.4)
- YapDatabase/SQLCipher/Extensions (= 3.1.4)
- YapDatabase/SQLCipher/Core (3.1.4):
- CocoaLumberjack
- YapDatabase/SQLCipher (4.0):
- YapDatabase/SQLCipher/Core (= 4.0)
- YapDatabase/SQLCipher/Extensions (= 4.0)
- YapDatabase/SQLCipher-ObjC/Core (4.0):
- SQLCipher (>= 3.4.0)
- YapDatabase/SQLCipher/Extensions (3.1.4):
- YapDatabase/SQLCipher-ObjC/Extensions/ActionManager (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/AutoView
- YapDatabase/SQLCipher-ObjC/Extensions/AutoView (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/View
- YapDatabase/SQLCipher-ObjC/Extensions/CloudCore (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/CloudKit (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/CrossProcessNotification (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/FilteredView (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/View
- YapDatabase/SQLCipher-ObjC/Extensions/FullTextSearch (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/Hooks (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/ManualView (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/View
- YapDatabase/SQLCipher-ObjC/Extensions/Relationships (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/RTreeIndex (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/SearchResultsView (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/AutoView
- YapDatabase/SQLCipher-ObjC/Extensions/FullTextSearch
- YapDatabase/SQLCipher-ObjC/Extensions/SecondaryIndex (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher-ObjC/Extensions/View (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher/Core (4.0):
- YapDatabase/SQLCipher-ObjC/Core
- YapDatabase/SQLCipher/Extensions (4.0):
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/ActionManager (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/AutoView (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/CloudCore (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/CloudKit (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/ConnectionPool (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/ConnectionProxy (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/CrossProcessNotification (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/FilteredView (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/FullTextSearch (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/Hooks (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/ManualView (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/Relationships (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/RTreeIndex (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/SearchResultsView (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/SecondaryIndex (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/View (= 3.1.4)
- YapDatabase/SQLCipher/Extensions/ActionManager (3.1.4):
- YapDatabase/SQLCipher/Extensions/ActionManager (= 4.0)
- YapDatabase/SQLCipher/Extensions/AutoView (= 4.0)
- YapDatabase/SQLCipher/Extensions/CloudCore (= 4.0)
- YapDatabase/SQLCipher/Extensions/CloudKit (= 4.0)
- YapDatabase/SQLCipher/Extensions/CrossProcessNotification (= 4.0)
- YapDatabase/SQLCipher/Extensions/FilteredView (= 4.0)
- YapDatabase/SQLCipher/Extensions/FullTextSearch (= 4.0)
- YapDatabase/SQLCipher/Extensions/Hooks (= 4.0)
- YapDatabase/SQLCipher/Extensions/ManualView (= 4.0)
- YapDatabase/SQLCipher/Extensions/Relationships (= 4.0)
- YapDatabase/SQLCipher/Extensions/RTreeIndex (= 4.0)
- YapDatabase/SQLCipher/Extensions/SearchResultsView (= 4.0)
- YapDatabase/SQLCipher/Extensions/SecondaryIndex (= 4.0)
- YapDatabase/SQLCipher/Extensions/View (= 4.0)
- YapDatabase/SQLCipher/Extensions/ActionManager (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/ActionManager
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/AutoView
- YapDatabase/SQLCipher/Extensions/AutoView (3.1.4):
- YapDatabase/SQLCipher/Extensions/AutoView (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/AutoView
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/View
- YapDatabase/SQLCipher/Extensions/CloudCore (3.1.4):
- YapDatabase/SQLCipher/Extensions/CloudCore (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/CloudCore
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/CloudKit (3.1.4):
- YapDatabase/SQLCipher/Extensions/CloudKit (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/CloudKit
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/ConnectionPool (3.1.4):
- YapDatabase/SQLCipher/Extensions/CrossProcessNotification (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/CrossProcessNotification
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/ConnectionProxy (3.1.4):
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/CrossProcessNotification (3.1.4):
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/FilteredView (3.1.4):
- YapDatabase/SQLCipher/Extensions/FilteredView (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/FilteredView
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/View
- YapDatabase/SQLCipher/Extensions/FullTextSearch (3.1.4):
- YapDatabase/SQLCipher/Extensions/FullTextSearch (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/FullTextSearch
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/Hooks (3.1.4):
- YapDatabase/SQLCipher/Extensions/Hooks (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/Hooks
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/ManualView (3.1.4):
- YapDatabase/SQLCipher/Extensions/ManualView (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/ManualView
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/View
- YapDatabase/SQLCipher/Extensions/Relationships (3.1.4):
- YapDatabase/SQLCipher/Extensions/Relationships (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/Relationships
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/RTreeIndex (3.1.4):
- YapDatabase/SQLCipher/Extensions/RTreeIndex (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/RTreeIndex
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/SearchResultsView (3.1.4):
- YapDatabase/SQLCipher/Extensions/SearchResultsView (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/SearchResultsView
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/AutoView
- YapDatabase/SQLCipher/Extensions/FullTextSearch
- YapDatabase/SQLCipher/Extensions/SecondaryIndex (3.1.4):
- YapDatabase/SQLCipher/Extensions/SecondaryIndex (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/SecondaryIndex
- YapDatabase/SQLCipher/Core
- YapDatabase/SQLCipher/Extensions/View (3.1.4):
- YapDatabase/SQLCipher/Extensions/View (4.0):
- YapDatabase/SQLCipher-ObjC/Extensions/View
- YapDatabase/SQLCipher/Core
- YapTaskQueue/SQLCipher (0.3.0):
- YapDatabase/SQLCipher (~> 3.0)
- YapDatabase/SQLCipher (~> 4.0)
- ZXingObjC/Core (3.6.5)
- ZXingObjC/QRCode (3.6.5):
- ZXingObjC/Core
@ -325,7 +368,7 @@ SPEC CHECKSUMS:
BBlock: c56d7f72597ffe1634fcdc73836c5c0fed3271be
BButton: ab0f2ed3b998ae73c5188b57d270d81e4a1eeb27
ChatSecure-Push-iOS: b1e7f4133afb77a42464aa0be96b14e03edcef29
ChatSecureCore: 08d24a7ddfdff59bd9afaec3141e1e26d50271db
ChatSecureCore: 84d4ea5a09d07cdd2b64c13c9c06a2baa9c0b82b
CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845
CocoaLumberjack: b17ae15142558d08bbacf69775fa10c4abbebcc9
CPAProxy: fdb5600a16502e7c8176ab59e7e9c306fbe5dc59
@ -361,8 +404,8 @@ SPEC CHECKSUMS:
TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656
XLForm: 7ee02761be8a369d1ad1bbffe738b97083d94f3e
XMPPFramework: 8b7ce3a5d8f95d1f9e1389e20431ffa06f399d77
YapDatabase: e9cf10cbf11d91f7c6dc723b0ff54fa8a04e3c8d
YapTaskQueue: f3b23875bead71a7ee57b65637ce9c0e98b68c34
YapDatabase: 260b1b0b3e6ae6775383edc923e19813586615eb
YapTaskQueue: 390669f5ef248a515e2a0d955de9d2529e2c7fa5
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: 0581b06632eb5047847f0daf2042a99bbbed22ca

@ -1 +1 @@
Subproject commit 3a3958b8b78db1faa56a4d5622cdc3e17304dc0c
Subproject commit df26a1c91bf522db7607d0bb1d74fed9284fc3bb

@ -1 +1 @@
Subproject commit a18a8f1882d2d94a51cf1bf743d09734898387b1
Subproject commit 19bedc68983c43e2709719479059e78a72edb901