Kaynağa Gözat

Fix issue #192: All savepoints are called '?'

Graham Dennis 12 yıl önce
ebeveyn
işleme
62c9b751fa
1 değiştirilmiş dosya ile 12 ekleme ve 3 silme
  1. 12 3
      src/FMDatabase.m

+ 12 - 3
src/FMDatabase.m

@@ -1081,11 +1081,18 @@ - (BOOL)inTransaction {
 
 #if SQLITE_VERSION_NUMBER >= 3007000
 
+static NSString *FMEscapeSavePointName(NSString *savepointName)
+{
+    return [savepointName stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
+}
+
 - (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr {
     
     NSParameterAssert(name);
     
-    if (![self executeUpdate:@"savepoint '?';", name]) {
+    NSString *sql = [NSString stringWithFormat:@"savepoint '%@';", FMEscapeSavePointName(name)];
+    
+    if (![self executeUpdate:sql]) {
 
         if (outErr) {
             *outErr = [self lastError];
@@ -1101,7 +1108,8 @@ - (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr {
     
     NSParameterAssert(name);
     
-    BOOL worked = [self executeUpdate:@"release savepoint '?';", name];
+    NSString *sql = [NSString stringWithFormat:@"release savepoint '%@';", FMEscapeSavePointName(name)];
+    BOOL worked = [self executeUpdate:sql];
     
     if (!worked && outErr) {
         *outErr = [self lastError];
@@ -1114,7 +1122,8 @@ - (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr {
     
     NSParameterAssert(name);
     
-    BOOL worked = [self executeUpdate:@"rollback transaction to savepoint '?';", name];
+    NSString *sql = [NSString stringWithFormat:@"rollback transaction to savepoint '%@';", FMEscapeSavePointName(name)];
+    BOOL worked = [self executeUpdate:sql];
     
     if (!worked && outErr) {
         *outErr = [self lastError];