From 7f4f95bd343372f26ceb4072258f43b2f49d11ff Mon Sep 17 00:00:00 2001 From: Robbie Hanson Date: Sat, 18 Jun 2016 15:31:08 -0700 Subject: [PATCH 1/5] Minor bug fix for YapDatabaseRelationship extension: rowids are signed, not unsigned. --- .../YapDatabaseRelationshipTransaction.m | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m index e715cc703..77a175e4b 100644 --- a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m +++ b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m @@ -1175,7 +1175,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name { if ((edge->state & YDB_EdgeState_HasSourceRowid) && srcRowid) { - if (edge->sourceRowid != srcRowid.unsignedLongLongValue) + if (edge->sourceRowid != srcRowid.longLongValue) { continue; } @@ -1228,7 +1228,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name // Shortcut: // We already know the sourceRowid. It was given to us as a parameter. - edge->sourceRowid = srcRowid.unsignedLongLongValue; + edge->sourceRowid = srcRowid.longLongValue; edge->flags |= YDB_EdgeState_HasSourceRowid; } else @@ -1286,7 +1286,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name } else if ((edge->state & YDB_EdgeState_HasDestinationRowid) && dstRowid) { - if (edge->destinationRowid != dstRowid.unsignedLongLongValue) + if (edge->destinationRowid != dstRowid.longLongValue) { continue; } @@ -1319,7 +1319,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name } else if ((edge->state & YDB_EdgeState_HasDestinationRowid) && dstRowid) { - if (edge->destinationRowid != dstRowid.unsignedLongLongValue) + if (edge->destinationRowid != dstRowid.longLongValue) { continue; } @@ -1376,7 +1376,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name // Shortcut: // We already know the sourceRowid. It was given to us as a parameter. - edge->destinationRowid = dstRowid.unsignedLongLongValue; + edge->destinationRowid = dstRowid.longLongValue; edge->state |= YDB_EdgeState_HasDestinationRowid; } else @@ -1534,7 +1534,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name } else if ((edge->state & YDB_EdgeState_HasDestinationRowid) && dstRowid) { - if (edge->destinationRowid != dstRowid.unsignedLongLongValue) + if (edge->destinationRowid != dstRowid.longLongValue) { continue; } @@ -1562,7 +1562,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name { if ((edge->state & YDB_EdgeState_HasSourceRowid) && srcRowid) { - if (edge->sourceRowid != srcRowid.unsignedLongLongValue) + if (edge->sourceRowid != srcRowid.longLongValue) { continue; } @@ -1582,7 +1582,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name } else if ((edge->state & YDB_EdgeState_HasDestinationRowid) && dstRowid) { - if (edge->destinationRowid != dstRowid.unsignedLongLongValue) + if (edge->destinationRowid != dstRowid.longLongValue) { continue; } @@ -1634,7 +1634,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name // Shortcut: // We already know the sourceRowid. It was given to us as a parameter. - edge->sourceRowid = srcRowid.unsignedLongLongValue; + edge->sourceRowid = srcRowid.longLongValue; edge->state |= YDB_EdgeState_HasSourceRowid; } else @@ -1650,7 +1650,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name // Shortcut: // We already know the destinationRowid. It was given to us as a parameter. - edge->destinationRowid = dstRowid.unsignedLongLongValue; + edge->destinationRowid = dstRowid.longLongValue; edge->state |= YDB_EdgeState_HasDestinationRowid; } else @@ -1722,7 +1722,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name { if ((edge->state & YDB_EdgeState_HasSourceRowid) && srcRowid) { - if (edge->sourceRowid != srcRowid.unsignedLongLongValue) + if (edge->sourceRowid != srcRowid.longLongValue) { continue; } @@ -1779,7 +1779,7 @@ - (NSMutableArray *)findChangesMatchingName:(NSString *)name // Shortcut: // We already know the sourceRowid. It was given to us as a parameter. - edge->sourceRowid = srcRowid.unsignedLongLongValue; + edge->sourceRowid = srcRowid.longLongValue; edge->state |= YDB_EdgeState_HasSourceRowid; } else From 3df0a1abe2c9c928a0d341b09f24e63ef4bf74c8 Mon Sep 17 00:00:00 2001 From: Jim Roepcke Date: Thu, 27 Apr 2017 11:46:13 -0700 Subject: [PATCH 2/5] fix: ensure EdgeNotInDatabase flag is set where appropriate to avoid assertion in -deleteEdge: (this only addresses manual edges, protocol edges were not audited) --- .../YapDatabaseRelationshipTransaction.m | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m index 77a175e4b..470a320fb 100644 --- a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m +++ b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m @@ -2204,7 +2204,7 @@ - (YapDatabaseRelationshipEdge *)findExistingManualEdgeMatching:(YapDatabaseRela sqlite3_stmt *statement = [parentConnection findManualEdgeWithDstFileURLStatement]; if (statement == NULL) return nil; - // SELECT "rowid", "rules" FROM "tableName" + // SELECT "rowid", "dst", "rules" FROM "tableName" // WHERE "src" = ? AND "name" = ? AND "dst" > INT64_MAX AND "manual" = 1; // // AKA: typeof(dst) IS BLOB @@ -2625,17 +2625,29 @@ - (void)preprocessManualEdges:(NSMutableArray *)manualEdges edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_SourceDeleted; edge->flags |= YDB_EdgeFlags_BadSource; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } else if (srcDeleted) { edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_SourceDeleted; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } } else if ([parentConnection->deletedInfo ydb_containsKey:@(edge->sourceRowid)]) { edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_SourceDeleted; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } @@ -2659,17 +2671,29 @@ - (void)preprocessManualEdges:(NSMutableArray *)manualEdges edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_DestinationDeleted; edge->flags |= YDB_EdgeFlags_BadDestination; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } else if (dstDeleted) { edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_DestinationDeleted; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } } else if ([parentConnection->deletedInfo ydb_containsKey:@(edge->destinationRowid)]) { edge->action = YDB_EdgeAction_Delete; edge->flags |= YDB_EdgeFlags_DestinationDeleted; + if (!(edge->state & YDB_EdgeState_HasEdgeRowid)) + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } } } } @@ -6795,6 +6819,10 @@ - (void)removeEdge:(YapDatabaseRelationshipEdge *)edge withProcessing:(YDB_Notif edge->edgeRowid = pendingEdge->edgeRowid; edge->state |= YDB_EdgeState_HasEdgeRowid; } + else + { + edge->flags |= YDB_EdgeFlags_EdgeNotInDatabase; + } [edges replaceObjectAtIndex:i withObject:edge]; return; From a9c46277ebe289e8e031d7ed8c17f49360fc6b0d Mon Sep 17 00:00:00 2001 From: Jim Roepcke Date: Thu, 27 Apr 2017 11:46:35 -0700 Subject: [PATCH 3/5] fix: add missing cache lookup --- .../Relationships/YapDatabaseRelationshipTransaction.m | 1 + 1 file changed, 1 insertion(+) diff --git a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m index 470a320fb..71c546183 100644 --- a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m +++ b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m @@ -5515,6 +5515,7 @@ - (void)_enumerateEdgesWithName:(NSString *)name int64_t edgeRowid = sqlite3_column_int64(statement, column_idx_rowid); + edge = [parentConnection->edgeCache objectForKey:@(edgeRowid)]; if (edge) { edge->sourceRowid = srcRowid; From 419d9f21573c576cee024bcd27378da8e7bff32c Mon Sep 17 00:00:00 2001 From: Jim Roepcke Date: Thu, 27 Apr 2017 11:56:51 -0700 Subject: [PATCH 4/5] Bumping podspec version. --- YapDatabase.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YapDatabase.podspec b/YapDatabase.podspec index a4f262e43..334c4a408 100644 --- a/YapDatabase.podspec +++ b/YapDatabase.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "YapDatabase" - s.version = "2.9.3" + s.version = "2.9.4" s.summary = "A key/value store built atop sqlite for iOS & Mac." s.homepage = "https://github.com/yapstudios/YapDatabase" s.license = 'MIT' From fbc688d620cf73c480666909543afc8684cd2804 Mon Sep 17 00:00:00 2001 From: Jim Roepcke Date: Thu, 27 Apr 2017 17:23:58 -0700 Subject: [PATCH 5/5] fix: column offsets were wrong --- .../Relationships/YapDatabaseRelationshipTransaction.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m index 71c546183..1853a57ee 100644 --- a/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m +++ b/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m @@ -2091,10 +2091,10 @@ - (int64_t)edgeCountWithDestinationFileURL:(NSURL *)dstFileURL // AKA: typeof(dst) IS BLOB int const column_idx_rowid = SQLITE_COLUMN_START + 0; - int const column_idx_src = SQLITE_COLUMN_START + 2; - int const column_idx_dst = SQLITE_COLUMN_START + 3; - int const column_idx_rules = SQLITE_COLUMN_START + 4; - int const column_idx_manual = SQLITE_COLUMN_START + 5; + int const column_idx_src = SQLITE_COLUMN_START + 1; + int const column_idx_dst = SQLITE_COLUMN_START + 2; + int const column_idx_rules = SQLITE_COLUMN_START + 3; + int const column_idx_manual = SQLITE_COLUMN_START + 4; int const bind_idx_src = SQLITE_BIND_START + 0; int const bind_idx_name = SQLITE_BIND_START + 1;