diff options
author | stuconnolly <stuart02@gmail.com> | 2012-05-04 14:36:30 +0000 |
---|---|---|
committer | stuconnolly <stuart02@gmail.com> | 2012-05-04 14:36:30 +0000 |
commit | 5544489096885e4e4be1ab6e54160caaa44c03dc (patch) | |
tree | 52b2201bf491d1e3495d506e7c282b3509e33808 /Source/SPViewCopy.m | |
parent | 830790b9251a36f3d1290a3f9ead62195d61f00a (diff) | |
download | sequelpro-5544489096885e4e4be1ab6e54160caaa44c03dc.tar.gz sequelpro-5544489096885e4e4be1ab6e54160caaa44c03dc.tar.bz2 sequelpro-5544489096885e4e4be1ab6e54160caaa44c03dc.zip |
Add initial support of moving views when renaming a database. Currently not hooked up yet. Part of issue #1235.
Diffstat (limited to 'Source/SPViewCopy.m')
-rw-r--r-- | Source/SPViewCopy.m | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Source/SPViewCopy.m b/Source/SPViewCopy.m new file mode 100644 index 00000000..b7fde195 --- /dev/null +++ b/Source/SPViewCopy.m @@ -0,0 +1,90 @@ +// +// $Id$ +// +// SPViewCopy.m +// Sequel Pro +// +// Created by Stuart Connolly (stuconnolly.com) on May 3, 2012 +// Copyright (c) 2012 Stuart Connolly. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPDBActionCommons.h" +#import "SPViewCopy.h" + +#import <SPMySQL/SPMySQL.h> + +@interface SPViewCopy () + +- (NSString *)_createViewStatementFor:(NSString *)view inDatabase:(NSString *)sourceDatabase; + +@end + +@implementation SPViewCopy + +- (BOOL)moveView:(NSString *)view from:(NSString *)sourceDatabase to:(NSString *)targetDatabase +{ + NSMutableString *createStatement = [[NSMutableString alloc] initWithString:[self _createViewStatementFor:view inDatabase:sourceDatabase]]; + + NSString *search = [NSString stringWithFormat:@"VIEW %@", [view backtickQuotedString]]; + + NSRange range = [createStatement rangeOfString:search]; + + if (range.location != NSNotFound) { + + NSUInteger replaced = [createStatement replaceOccurrencesOfString:search withString:[NSString stringWithFormat:@"VIEW %@.%@", [targetDatabase backtickQuotedString], [view backtickQuotedString]] options:0 range:range]; + + if (replaced != 1) return NO; + + // Replace all occurrences of the old database name + [createStatement replaceOccurrencesOfString:[sourceDatabase backtickQuotedString] + withString:[targetDatabase backtickQuotedString] + options:0 + range:NSMakeRange(0, [createStatement length])]; + + [connection queryString:createStatement]; + + [createStatement release]; + + return ![connection queryErrored]; + } + + [createStatement release]; + + return NO; +} + +#pragma mark - +#pragma mark Private API + +- (NSString *)_createViewStatementFor:(NSString *)view inDatabase:(NSString *)sourceDatabase +{ + NSString *createStatement = [NSString stringWithFormat:@"SHOW CREATE VIEW %@.%@", [sourceDatabase backtickQuotedString], [view backtickQuotedString]]; + + SPMySQLResult *theResult = [connection queryString:createStatement]; + + return [theResult numberOfRows] > 0 ? [[theResult getRowAsArray] objectAtIndex:1] : @""; +} + +@end |