aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Interfaces/English.lproj/UserManagerView.xib112
-rw-r--r--Source/SPExtendedTableInfo.m3
-rw-r--r--Source/SPSSHTunnel.m4
-rw-r--r--Source/SPUserManager.m95
-rw-r--r--Source/SPUserManager.xcdatamodel/elementsbin127771 -> 131784 bytes
-rw-r--r--Source/SPUserManager.xcdatamodel/layoutbin9663 -> 9663 bytes
-rw-r--r--Source/TableContent.m18
-rw-r--r--Source/TableSource.m14
8 files changed, 172 insertions, 74 deletions
diff --git a/Interfaces/English.lproj/UserManagerView.xib b/Interfaces/English.lproj/UserManagerView.xib
index 36c8dd39..d28c0761 100644
--- a/Interfaces/English.lproj/UserManagerView.xib
+++ b/Interfaces/English.lproj/UserManagerView.xib
@@ -2,10 +2,10 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
- <string key="IBDocument.SystemVersion">10C540</string>
- <string key="IBDocument.InterfaceBuilderVersion">740</string>
- <string key="IBDocument.AppKitVersion">1038.25</string>
- <string key="IBDocument.HIToolboxVersion">458.00</string>
+ <string key="IBDocument.SystemVersion">10D2094</string>
+ <string key="IBDocument.InterfaceBuilderVersion">762</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">460.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
@@ -15,18 +15,17 @@
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>740</string>
- <string>1.2.2</string>
+ <string>762</string>
+ <string>1.2.5</string>
</object>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="31"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.brandonwalkin.BWToolkit</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.brandonwalkin.BWToolkit</string>
</object>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -56,10 +55,10 @@
<string key="NSWindowTitle">User Managment</string>
<string key="NSWindowClass">NSWindow</string>
<nil key="NSViewClass"/>
- <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
<string key="NSWindowContentMinSize">{752, 506}</string>
<object class="NSView" key="NSWindowView" id="846307432">
- <reference key="NSNextResponder"/>
+ <nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -148,7 +147,7 @@
<string key="NSColorName">controlBackgroundColor</string>
<object class="NSColor" key="NSColor" id="246134814">
<int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="315534074">
@@ -204,7 +203,6 @@
</object>
<string key="NSFrame">{{0, 17}, {194, 467}}</string>
<reference key="NSSuperview" ref="848314643"/>
- <reference key="NSNextKeyView" ref="265138544"/>
<reference key="NSDocView" ref="265138544"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -238,7 +236,6 @@
</object>
<string key="NSFrameSize">{194, 17}</string>
<reference key="NSSuperview" ref="848314643"/>
- <reference key="NSNextKeyView" ref="98886535"/>
<reference key="NSDocView" ref="98886535"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -247,7 +244,6 @@
</object>
<string key="NSFrame">{{0, 22}, {194, 484}}</string>
<reference key="NSSuperview" ref="490248567"/>
- <reference key="NSNextKeyView" ref="310332121"/>
<int key="NSsFlags">560</int>
<reference key="NSVScroller" ref="710626046"/>
<reference key="NSHScroller" ref="851800246"/>
@@ -400,6 +396,7 @@
</object>
</object>
</object>
+ <int key="NSSelectedIndex">4</int>
<bool key="NSPullDown">YES</bool>
<int key="NSPreferredEdge">1</int>
<bool key="NSUsesItemFromMenu">YES</bool>
@@ -435,7 +432,7 @@
<object class="NSTabViewItem" id="820796939">
<string key="NSIdentifier">General</string>
<object class="NSView" key="NSView" id="143215913">
- <reference key="NSNextResponder" ref="716372522"/>
+ <nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -564,7 +561,6 @@
</object>
</object>
<string key="NSFrame">{{10, 33}, {511, 414}}</string>
- <reference key="NSSuperview" ref="716372522"/>
</object>
<string key="NSLabel">General</string>
<reference key="NSColor" ref="409859189"/>
@@ -1398,7 +1394,7 @@
<object class="NSTabViewItem" id="487249930">
<string key="NSIdentifier">Schema Privileges</string>
<object class="NSView" key="NSView" id="601698335">
- <nil key="NSNextResponder"/>
+ <reference key="NSNextResponder" ref="716372522"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1480,7 +1476,6 @@
</object>
<string key="NSFrame">{{1, 17}, {130, 363}}</string>
<reference key="NSSuperview" ref="307214944"/>
- <reference key="NSNextKeyView" ref="280739950"/>
<reference key="NSDocView" ref="280739950"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1515,7 +1510,6 @@
</object>
<string key="NSFrame">{{1, 0}, {130, 17}}</string>
<reference key="NSSuperview" ref="307214944"/>
- <reference key="NSNextKeyView" ref="406943647"/>
<reference key="NSDocView" ref="406943647"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1524,7 +1518,6 @@
</object>
<string key="NSFrame">{{17, 17}, {132, 381}}</string>
<reference key="NSSuperview" ref="601698335"/>
- <reference key="NSNextKeyView" ref="380397569"/>
<int key="NSsFlags">562</int>
<reference key="NSVScroller" ref="304497597"/>
<reference key="NSHScroller" ref="1067950228"/>
@@ -1611,7 +1604,6 @@
</object>
<string key="NSFrame">{{1, 17}, {130, 363}}</string>
<reference key="NSSuperview" ref="728294866"/>
- <reference key="NSNextKeyView" ref="64638447"/>
<reference key="NSDocView" ref="64638447"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1645,7 +1637,6 @@
</object>
<string key="NSFrame">{{1, 0}, {130, 17}}</string>
<reference key="NSSuperview" ref="728294866"/>
- <reference key="NSNextKeyView" ref="599931188"/>
<reference key="NSDocView" ref="599931188"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1654,7 +1645,6 @@
</object>
<string key="NSFrame">{{157, 17}, {132, 381}}</string>
<reference key="NSSuperview" ref="601698335"/>
- <reference key="NSNextKeyView" ref="239762482"/>
<int key="NSsFlags">562</int>
<reference key="NSVScroller" ref="210192488"/>
<reference key="NSHScroller" ref="253008686"/>
@@ -1740,7 +1730,6 @@
</object>
<string key="NSFrame">{{1, 17}, {130, 363}}</string>
<reference key="NSSuperview" ref="898351365"/>
- <reference key="NSNextKeyView" ref="443904239"/>
<reference key="NSDocView" ref="443904239"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1775,7 +1764,6 @@
</object>
<string key="NSFrame">{{1, 0}, {130, 17}}</string>
<reference key="NSSuperview" ref="898351365"/>
- <reference key="NSNextKeyView" ref="120612996"/>
<reference key="NSDocView" ref="120612996"/>
<reference key="NSBGColor" ref="898983655"/>
<int key="NScvFlags">4</int>
@@ -1784,7 +1772,6 @@
</object>
<string key="NSFrame">{{362, 17}, {132, 381}}</string>
<reference key="NSSuperview" ref="601698335"/>
- <reference key="NSNextKeyView" ref="728383964"/>
<int key="NSsFlags">562</int>
<reference key="NSVScroller" ref="939829514"/>
<reference key="NSHScroller" ref="1063461866"/>
@@ -1843,6 +1830,7 @@
</object>
</object>
<string key="NSFrame">{{10, 33}, {511, 414}}</string>
+ <reference key="NSSuperview" ref="716372522"/>
</object>
<string key="NSLabel">Schema Privileges</string>
<reference key="NSColor" ref="409859189"/>
@@ -2119,13 +2107,13 @@
<reference key="NSTabView" ref="716372522"/>
</object>
</object>
- <reference key="NSSelectedTabViewItem" ref="820796939"/>
+ <reference key="NSSelectedTabViewItem" ref="487249930"/>
<reference key="NSFont" ref="746597359"/>
<int key="NSTvFlags">0</int>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="143215913"/>
+ <reference ref="601698335"/>
</object>
</object>
<object class="NSButton" id="445730006">
@@ -2183,11 +2171,10 @@
</object>
</object>
<string key="NSFrameSize">{752, 506}</string>
- <reference key="NSSuperview"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
<string key="NSMinSize">{752, 528}</string>
- <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
</object>
<object class="NSTreeController" id="889422316">
<object class="NSMutableArray" key="NSDeclaredKeys">
@@ -2509,14 +2496,6 @@
<int key="connectionID">436</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="716372522"/>
- <reference key="destination" ref="1001"/>
- </object>
- <int key="connectionID">447</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: selection.select_priv</string>
<reference key="source" ref="354897609"/>
@@ -4071,6 +4050,22 @@
</object>
<int key="connectionID">922</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="716372522"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">924</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">refresh:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="587450306"/>
+ </object>
+ <int key="connectionID">925</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -5483,11 +5478,11 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>{{240, 174}, {752, 506}}</string>
+ <string>{{152, 121}, {752, 506}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO"/>
<boolean value="NO"/>
- <string>{{240, 174}, {752, 506}}</string>
+ <string>{{152, 121}, {752, 506}}</string>
<boolean value="NO"/>
<boolean value="YES"/>
<string>{752, 506}</string>
@@ -5601,7 +5596,7 @@
<string>com.brandonwalkin.BWToolkit</string>
<string>com.brandonwalkin.BWToolkit</string>
<string>com.brandonwalkin.BWToolkit</string>
- <string>{{511, 95}, {130, 81}}</string>
+ <string>{{202, 63}, {130, 81}}</string>
<string>com.brandonwalkin.BWToolkit</string>
<string>com.brandonwalkin.BWToolkit</string>
<string>com.brandonwalkin.BWToolkit</string>
@@ -5666,7 +5661,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">923</int>
+ <int key="maxID">925</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -5717,6 +5712,13 @@
<string key="className">NSObject</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Source/SPMainThreadTrampoline.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
<string key="minorKey">Source/SPNotLoaded.h</string>
</object>
</object>
@@ -6626,6 +6628,7 @@
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
<integer value="1050" key="NS.object.0"/>
@@ -6641,5 +6644,30 @@
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<string key="IBDocument.LastKnownRelativeProjectPath">../../sequel-pro.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSActionTemplate</string>
+ <string>NSAddTemplate</string>
+ <string>NSLeftFacingTriangleTemplate</string>
+ <string>NSMenuCheckmark</string>
+ <string>NSMenuMixedState</string>
+ <string>NSRemoveTemplate</string>
+ <string>NSRightFacingTriangleTemplate</string>
+ <string>NSSwitch</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{10, 10}</string>
+ <string>{8, 8}</string>
+ <string>{9, 9}</string>
+ <string>{9, 8}</string>
+ <string>{7, 2}</string>
+ <string>{8, 8}</string>
+ <string>{9, 9}</string>
+ <string>{15, 15}</string>
+ </object>
+ </object>
</data>
</archive>
diff --git a/Source/SPExtendedTableInfo.m b/Source/SPExtendedTableInfo.m
index fe89d563..d58e731e 100644
--- a/Source/SPExtendedTableInfo.m
+++ b/Source/SPExtendedTableInfo.m
@@ -436,9 +436,10 @@
- (void)textDidEndEditing:(NSNotification *)notification
{
id object = [notification object];
+
if ((object == tableCommentsTextView) && ([object isEditable]) && ([selectedTable length] > 0)) {
- NSString *currentComment = [tableDataInstance statusValueForKey:@"Comment"];
+ NSString *currentComment = [[tableDataInstance statusValueForKey:@"Comment"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *newComment = [[tableCommentsTextView string] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// Check that the user actually changed the tables comment
diff --git a/Source/SPSSHTunnel.m b/Source/SPSSHTunnel.m
index eeef83d2..2b7c31fb 100644
--- a/Source/SPSSHTunnel.m
+++ b/Source/SPSSHTunnel.m
@@ -352,6 +352,10 @@
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"NSFileHandleDataAvailableNotification"
object:nil];
+
+ // Run the run loop for a short time to ensure all task/pipe callbacks are dealt with
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
+
[task release], task = nil;
[standardError release], standardError = nil;
[taskEnvironment release], taskEnvironment = nil;
diff --git a/Source/SPUserManager.m b/Source/SPUserManager.m
index cad74193..90cc426d 100644
--- a/Source/SPUserManager.m
+++ b/Source/SPUserManager.m
@@ -208,9 +208,12 @@
NSManagedObject *parent = [self _createNewSPUser];
NSManagedObject *child = [self _createNewSPUser];
- // We only care about setting the user and password keys on the parent
+ // We only care about setting the user and password keys on the parent, together with their
+ // original values for comparison purposes
[parent setValue:username forKey:@"user"];
+ [parent setValue:username forKey:@"originaluser"];
[parent setValue:[item objectForKey:@"Password"] forKey:@"password"];
+ [parent setValue:[item objectForKey:@"Password"] forKey:@"originalpassword"];
[self _initializeChild:child withItem:item];
@@ -265,6 +268,8 @@
- (void)_initializeSchemaPrivs
{
// Initialize Databases
+ [schemas removeAllObjects];
+
MCPResult *results = [self.mySqlConnection listDBs];
if ([results numOfRows]) {
@@ -328,8 +333,8 @@
// Assumes that the child has already been initialized with values from the
// global user table.
// Select rows from the db table that contains schema privs for each user/host
- NSString *queryString = [NSString stringWithFormat:@"SELECT * from `mysql`.`db` d WHERE d.user = '%@' and d.host = '%@'",
- [[child parent] valueForKey:@"user"], [child valueForKey:@"host"]];
+ NSString *queryString = [NSString stringWithFormat:@"SELECT * from `mysql`.`db` d WHERE d.user = %@ and d.host = %@",
+ [[[child parent] valueForKey:@"user"] tickQuotedString], [[child valueForKey:@"host"] tickQuotedString]];
MCPResult *queryResults = [self.mySqlConnection queryString:queryString];
if ([queryResults numOfRows] > 0)
{
@@ -634,14 +639,21 @@
- (IBAction)removeUser:(id)sender
{
NSString *username = [[[treeController selectedObjects] objectAtIndex:0]
- valueForKey:@"user"];
+ valueForKey:@"originaluser"];
NSArray *children = [[[treeController selectedObjects] objectAtIndex:0]
valueForKey:@"children"];
+
+
+ // On all the children - host entries - set the username to be deleted,
+ // for later query contruction.
for(NSManagedObject *child in children)
{
[child setPrimitiveValue:username forKey:@"user"];
}
+ // Unset the host on the user, so that only the host entries are dropped
+ [[[treeController selectedObjects] objectAtIndex:0] setPrimitiveValue:nil forKey:@"host"];
+
[treeController remove:sender];
}
@@ -748,6 +760,19 @@
[grantedTableView reloadData];
[self _initializeAvailablePrivs];
[treeController fetch:nil];
+
+ // After the reset, ensure all original password and user values are up-to-date.
+ NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"SPUser"
+ inManagedObjectContext:self.managedObjectContext];
+ NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
+ [request setEntity:entityDescription];
+ NSArray *userArray = [self.managedObjectContext executeFetchRequest:request error:nil];
+ for (NSManagedObject *user in userArray) {
+ if (![user parent]) {
+ [user setValue:[user valueForKey:@"user"] forKey:@"originaluser"];
+ [user setValue:[user valueForKey:@"password"] forKey:@"originalpassword"];
+ }
+ }
}
- (void)_setSchemaPrivValues:(NSArray *)objects enabled:(BOOL)enabled
@@ -864,6 +889,7 @@
- (void)contextDidSave:(NSNotification *)notification
{
NSManagedObjectContext *notificationContext = (NSManagedObjectContext *)[notification object];
+
// If there are multiple user manager windows open, it's possible to get this
// notification from foreign windows. Ignore those notifications.
if (notificationContext != self.managedObjectContext) return;
@@ -905,22 +931,39 @@
if ([[[user entity] name] isEqualToString:@"Privileges"])
{
[self grantDbPrivilegesWithPrivilege:user];
+
+
+ // If the parent user has changed, either the username or password have been edited.
}
- else if (![user host])
+ else if (![user parent])
{
- // Just the user password was changed.
- // Change password to be the same on all hosts.
NSArray *hosts = [user valueForKey:@"children"];
-
- for(NSManagedObject *child in hosts)
- {
- NSString *changePasswordStatement = [NSString stringWithFormat:
- @"SET PASSWORD FOR %@@%@ = PASSWORD('%@')",
- [[user valueForKey:@"user"] tickQuotedString],
- [[child host] tickQuotedString],
- [user valueForKey:@"password"]];
- [self.mySqlConnection queryString:changePasswordStatement];
- [self checkAndDisplayMySqlError];
+
+ // If the user has been changed, update the username on all hosts. Don't check for errors, as some
+ // hosts may be new.
+ if (![[user valueForKey:@"user"] isEqualToString:[user valueForKey:@"originaluser"]]) {
+ for (NSManagedObject *child in hosts) {
+ NSString *renameUserStatement = [NSString stringWithFormat:
+ @"RENAME USER %@@%@ TO %@@%@",
+ [[user valueForKey:@"originaluser"] tickQuotedString],
+ [[child host] tickQuotedString],
+ [[user valueForKey:@"user"] tickQuotedString],
+ [[child host] tickQuotedString]];
+ [self.mySqlConnection queryString:renameUserStatement];
+ }
+ }
+
+ // If the password has been changed, use the same password on all hosts
+ if (![[user valueForKey:@"password"] isEqualToString:[user valueForKey:@"originalpassword"]]) {
+ for (NSManagedObject *child in hosts) {
+ NSString *changePasswordStatement = [NSString stringWithFormat:
+ @"SET PASSWORD FOR %@@%@ = PASSWORD(%@)",
+ [[user valueForKey:@"user"] tickQuotedString],
+ [[child host] tickQuotedString],
+ [[user valueForKey:@"password"] tickQuotedString]];
+ [self.mySqlConnection queryString:changePasswordStatement];
+ [self checkAndDisplayMySqlError];
+ }
}
} else {
[self grantPrivilegesToUser:user];
@@ -939,8 +982,8 @@
if (![[[user entity] name] isEqualToString:@"Privileges"] && [user valueForKey:@"host"] != nil)
{
[droppedUsers appendString:[NSString stringWithFormat:@"%@@%@, ",
- [[user valueForKey:@"user"] backtickQuotedString],
- [[user valueForKey:@"host"] backtickQuotedString]]];
+ [[user valueForKey:@"user"] tickQuotedString],
+ [[user valueForKey:@"host"] tickQuotedString]]];
}
}
@@ -1025,7 +1068,7 @@
{
NSString *grantStatement = [NSString stringWithFormat:@"GRANT %@ ON %@.* TO %@@%@",
[[grantPrivileges componentsJoinedByCommas] uppercaseString],
- dbName,
+ [dbName backtickQuotedString],
[[schemaPriv valueForKeyPath:@"user.parent.user"] tickQuotedString],
[[schemaPriv valueForKeyPath:@"user.host"] tickQuotedString]];
DLog(@"%@", grantStatement);
@@ -1038,7 +1081,7 @@
{
NSString *revokeStatement = [NSString stringWithFormat:@"REVOKE %@ ON %@.* FROM %@@%@",
[[revokePrivileges componentsJoinedByCommas] uppercaseString],
- dbName,
+ [dbName backtickQuotedString],
[[schemaPriv valueForKeyPath:@"user.parent.user"] tickQuotedString],
[[schemaPriv valueForKeyPath:@"user.host"] tickQuotedString]];
DLog(@"%@", revokeStatement);
@@ -1305,6 +1348,16 @@
}
#pragma mark -
+#pragma mark Tab view delegate methods
+
+- (void)tabView:(NSTabView *)usersTabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ if ([[tabViewItem identifier] isEqualToString:@"Schema Privileges"]) {
+ [self _initializeSchemaPrivs];
+ }
+}
+
+#pragma mark -
/**
* Dealloc. Get rid of everything.
diff --git a/Source/SPUserManager.xcdatamodel/elements b/Source/SPUserManager.xcdatamodel/elements
index 33881efc..22c2c418 100644
--- a/Source/SPUserManager.xcdatamodel/elements
+++ b/Source/SPUserManager.xcdatamodel/elements
Binary files differ
diff --git a/Source/SPUserManager.xcdatamodel/layout b/Source/SPUserManager.xcdatamodel/layout
index 14b1545d..60630b61 100644
--- a/Source/SPUserManager.xcdatamodel/layout
+++ b/Source/SPUserManager.xcdatamodel/layout
Binary files differ
diff --git a/Source/TableContent.m b/Source/TableContent.m
index 4710abef..90fbe5d1 100644
--- a/Source/TableContent.m
+++ b/Source/TableContent.m
@@ -2188,7 +2188,7 @@
} else {
[self performSelector:@selector(showErrorSheetWith:)
withObject:[NSArray arrayWithObjects:NSLocalizedString(@"Error", @"error"),
- [NSString stringWithFormat:NSLocalizedString(@"Couldn't remove rows.\nMySQL said: %@", @"message of panel when field cannot be removed"),
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't remove rows.\n\nMySQL said: %@", @"message of panel when field cannot be removed"),
[mySQLConnection getLastErrorMessage]],
nil]
afterDelay:0.3];
@@ -2335,7 +2335,8 @@
// Remember affected rows for error checking
affectedRows += [mySQLConnection affectedRows];
}
- errors = [selectedRows count] - affectedRows;
+
+ errors = (affectedRows > 0) ? [selectedRows count] - affectedRows : [selectedRows count];
} else {
// if table has more than one PRIMARY KEY
// delete the row by using all PRIMARY KEYs in an OR clause
@@ -2390,21 +2391,23 @@
// Remember affected rows for error checking
affectedRows += [mySQLConnection affectedRows];
}
- errors = [selectedRows count] - affectedRows;
+
+ errors = (affectedRows > 0) ? [selectedRows count] - affectedRows : [selectedRows count];
}
// Restore Console Log window's updating bahaviour
[[SPQueryController sharedQueryController] setAllowConsoleUpdate:consoleUpdateStatus];
- if ( errors ) {
+ if (errors) {
NSArray *message;
//TODO: The following three messages are NOT localisable!
- if(errors < 0) {
+ if (errors < 0) {
message = [NSArray arrayWithObjects:NSLocalizedString(@"Warning", @"warning"),
[NSString stringWithFormat:NSLocalizedString(@"%ld row%@ more %@ removed! Please check the Console and inform the Sequel Pro team!", @"message of panel when more rows were deleted"), (long)(errors*-1), ((errors*-1)>1)?@"s":@"", (errors>1)?@"were":@"was"],
nil];
- } else {
- if(primaryKeyFieldNames == nil)
+ }
+ else {
+ if (primaryKeyFieldNames == nil)
message = [NSArray arrayWithObjects:NSLocalizedString(@"Warning", @"warning"),
[NSString stringWithFormat:NSLocalizedString(@"%ld row%@ ha%@ not been removed. Reload the table to be sure that the rows exist and use a primary key for your table.", @"message of panel when not all selected fields have been deleted"), (long)errors, (errors>1)?@"s":@"", (errors>1)?@"ve":@"s"],
nil];
@@ -2413,6 +2416,7 @@
[NSString stringWithFormat:NSLocalizedString(@"%ld row%@ ha%@ not been removed. Reload the table to be sure that the rows exist and check the Console for possible errors inside the primary key%@ for your table.", @"message of panel when not all selected fields have been deleted by using primary keys"), (long)errors, (errors>1)?@"s":@"", (errors>1)?@"ve":@"s", (errors>1)?@"s":@""],
nil];
}
+
[self performSelector:@selector(showErrorSheetWith:)
withObject:message
afterDelay:0.3];
diff --git a/Source/TableSource.m b/Source/TableSource.m
index 6ff0d971..1e3bee8f 100644
--- a/Source/TableSource.m
+++ b/Source/TableSource.m
@@ -347,6 +347,10 @@
// Check whether a save of the current row is required.
if (![self saveRowOnDeselect]) return;
+ NSInteger index = [tableSourceView selectedRow];
+
+ if ((index == -1) || (index > ([tableFields count] - 1))) return;
+
// Check if the user tries to delete the last defined field in table
// Note that because of better menu item validation, this check will now never evaluate to true.
if ([tableSourceView numberOfRows] < 2) {
@@ -362,7 +366,7 @@
}
- NSString *field = [[tableFields objectAtIndex:[tableSourceView selectedRow]] objectForKey:@"Field"];
+ NSString *field = [[tableFields objectAtIndex:index] objectForKey:@"Field"];
BOOL hasForeignKey = NO;
NSString *referencedTable = @"";
@@ -409,8 +413,12 @@
// Check whether a save of the current fields row is required.
if (![self saveRowOnDeselect]) return;
- NSString *keyName = [[indexes objectAtIndex:[indexView selectedRow]] objectForKey:@"Key_name"];
- NSString *columnName = [[indexes objectAtIndex:[indexView selectedRow]] objectForKey:@"Column_name"];
+ NSInteger index = [indexView selectedRow];
+
+ if ((index == -1) || (index > ([indexes count] - 1))) return;
+
+ NSString *keyName = [[indexes objectAtIndex:index] objectForKey:@"Key_name"];
+ NSString *columnName = [[indexes objectAtIndex:index] objectForKey:@"Column_name"];
BOOL hasForeignKey = NO;
NSString *constraintName = @"";