aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPDataAdditions.h2
-rw-r--r--Source/SPDataAdditions.m79
-rw-r--r--Source/TableDocument.m43
-rw-r--r--sequel-pro.xcodeproj/project.pbxproj2
4 files changed, 118 insertions, 8 deletions
diff --git a/Source/SPDataAdditions.h b/Source/SPDataAdditions.h
index 1b787484..fcf2640c 100644
--- a/Source/SPDataAdditions.h
+++ b/Source/SPDataAdditions.h
@@ -29,5 +29,7 @@
- (NSString *) base64EncodingWithLineLength:(unsigned int)lineLength;
- (NSString *) dataToFormattedHexString;
- (NSString *) shortStringRepresentationUsingEncoding:(NSStringEncoding)encoding;
+- (NSData *)compress;
+- (NSData *)decompress;
@end
diff --git a/Source/SPDataAdditions.m b/Source/SPDataAdditions.m
index 8018de8a..edac9baa 100644
--- a/Source/SPDataAdditions.m
+++ b/Source/SPDataAdditions.m
@@ -23,6 +23,7 @@
// More info at <http://code.google.com/p/sequel-pro/>
#import "SPDataAdditions.h"
+#include <zlib.h>
static char base64encodingTable[64] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
@@ -100,6 +101,84 @@ static char base64encodingTable[64] = {
return base64;
}
+- (NSData *)decompress
+{
+ if ([self length] == 0) return self;
+
+ unsigned full_length = [self length];
+ unsigned half_length = [self length] / 2;
+
+ NSMutableData *unzipData = [NSMutableData dataWithLength: full_length + half_length];
+ BOOL done = NO;
+ int status;
+
+ z_stream zlibStream;
+ zlibStream.next_in = (Bytef *)[self bytes];
+ zlibStream.avail_in = [self length];
+ zlibStream.total_out = 0;
+ zlibStream.zalloc = Z_NULL;
+ zlibStream.zfree = Z_NULL;
+
+ if(inflateInit(&zlibStream) != Z_OK) return nil;
+
+ while(!done)
+ {
+ if (zlibStream.total_out >= [unzipData length])
+ [unzipData increaseLengthBy: half_length];
+ zlibStream.next_out = [unzipData mutableBytes] + zlibStream.total_out;
+ zlibStream.avail_out = [unzipData length] - zlibStream.total_out;
+
+ status = inflate (&zlibStream, Z_SYNC_FLUSH);
+ if (status == Z_STREAM_END) done = YES;
+ else if (status != Z_OK) break;
+ }
+ if(inflateEnd (&zlibStream) != Z_OK)
+ return nil;
+
+ if(done) {
+ [unzipData setLength: zlibStream.total_out];
+ return [NSData dataWithData: unzipData];
+ }
+ else
+ return nil;
+}
+
+- (NSData *)compress
+{
+ if ([self length] == 0) return self;
+
+ z_stream zlibStream;
+
+ zlibStream.zalloc = Z_NULL;
+ zlibStream.zfree = Z_NULL;
+ zlibStream.opaque = Z_NULL;
+ zlibStream.total_out = 0;
+ zlibStream.next_in=(Bytef *)[self bytes];
+ zlibStream.avail_in = [self length];
+
+ if (deflateInit(&zlibStream, Z_DEFAULT_COMPRESSION) != Z_OK) return nil;
+
+
+ NSMutableData *zipData = [NSMutableData dataWithLength:16384];
+
+ do{
+
+ if (zlibStream.total_out >= [zipData length])
+ [zipData increaseLengthBy: 16384];
+
+ zlibStream.next_out = [zipData mutableBytes] + zlibStream.total_out;
+ zlibStream.avail_out = [zipData length] - zlibStream.total_out;
+
+ deflate(&zlibStream, Z_FINISH);
+
+ } while(zlibStream.avail_out == 0);
+
+ deflateEnd(&zlibStream);
+
+ [zipData setLength: zlibStream.total_out];
+ return [NSData dataWithData: zipData];
+}
+
- (NSString *)dataToFormattedHexString
/*
returns the hex representation of the given data
diff --git a/Source/TableDocument.m b/Source/TableDocument.m
index 3abd32aa..52d3fe2c 100644
--- a/Source/TableDocument.m
+++ b/Source/TableDocument.m
@@ -40,6 +40,7 @@
#import "SPDatabaseData.h"
#import "SPStringAdditions.h"
#import "SPArrayAdditions.h"
+#import "SPDataAdditions.h"
#import "SPAppController.h"
#import "SPExtendedTableInfo.h"
#import "SPConnectionController.h"
@@ -1695,7 +1696,29 @@
break; // open only the first SQL file
}
else if([[[filename pathExtension] lowercaseString] isEqualToString:@"spf"]) {
- NSLog(@"open connection %@", filename);
+
+
+ NSError *readError = nil;
+ NSString *convError = nil;
+ NSPropertyListFormat format;
+ NSData *pData = [[NSData dataWithContentsOfFile:filename options:NSUncachedRead error:&readError] decompress];
+ NSDictionary *spfData = [NSPropertyListSerialization propertyListFromData:pData
+ mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError];
+
+ if(!spfData || readError != nil || [convError length] | format != NSPropertyListBinaryFormat_v1_0) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"Connection data file couldn't be read.", @"error while reading connection data file")];
+
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ return;
+ }
+
+ NSLog(@"s: %@", [spfData description]);
+
}
else {
NSLog(@"Only files with the extensions ‘spf’ or ‘sql’ are allowed.");
@@ -1810,7 +1833,6 @@
NSMutableDictionary *spf = [NSMutableDictionary dictionary];
NSIndexSet *contentSelectedIndexSet = [tableContentInstance selectedRowIndexes];
- NSIndexSet *customQuerySelectedIndexSet = [[customQueryInstance valueForKeyPath:@"customQueryView"] selectedRowIndexes];
[spf setObject:[NSNumber numberWithInt:1] forKey:@"version"];
@@ -1845,10 +1867,16 @@
if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length])
[spf setObject:[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] forKey:@"queries"];
- if (contentSelectedIndexSet && [contentSelectedIndexSet count])
- [spf setObject:contentSelectedIndexSet forKey:@"contentSelectedIndexSet"];
- if (customQuerySelectedIndexSet && [customQuerySelectedIndexSet count])
- [spf setObject:customQuerySelectedIndexSet forKey:@"customQuerySelectedIndexSet"];
+ if (contentSelectedIndexSet && [contentSelectedIndexSet count]) {
+ NSMutableArray *indices = [NSMutableArray array];
+ unsigned indexBuffer[[contentSelectedIndexSet count]];
+ unsigned limit = [contentSelectedIndexSet getIndexes:indexBuffer maxCount:[contentSelectedIndexSet count] inIndexRange:NULL];
+ unsigned idx;
+ for (idx = 0; idx < limit; idx++) {
+ [indices addObject:[NSNumber numberWithInt:indexBuffer[idx]]];
+ }
+ [spf setObject:indices forKey:@"contentSelectedIndexSet"];
+ }
NSString *err = nil;
NSData *plist = [NSPropertyListSerialization dataFromPropertyList:spf
@@ -1868,13 +1896,12 @@
}
NSError *error = nil;
- [plist writeToFile:fileName options:NSAtomicWrite error:&error];
+ [[plist compress] writeToFile:fileName options:NSAtomicWrite error:&error];
if(error != nil){
NSAlert *errorAlert = [NSAlert alertWithError:error];
[errorAlert runModal];
return;
}
-
return;
}
}
diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj
index 3ef0efb7..cbbea8bc 100644
--- a/sequel-pro.xcodeproj/project.pbxproj
+++ b/sequel-pro.xcodeproj/project.pbxproj
@@ -224,6 +224,7 @@
BC9F0881100FCF2C00A80D32 /* SPFieldEditorController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9F0880100FCF2C00A80D32 /* SPFieldEditorController.m */; };
BCA6271C1031B9D40047E5D5 /* SPTooltip.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA6271B1031B9D40047E5D5 /* SPTooltip.m */; };
BCA6F631100FA7D700E80253 /* FieldEditorSheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA6F62F100FA7D700E80253 /* FieldEditorSheet.xib */; };
+ BCC5CC3C103EEE49007CE557 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B593101602D200F057DE /* libz.dylib */; };
BCD0AD490FBBFC340066EA5C /* SPSQLTokenizer.l in Sources */ = {isa = PBXBuildFile; fileRef = BCD0AD480FBBFC340066EA5C /* SPSQLTokenizer.l */; };
/* End PBXBuildFile section */
@@ -644,6 +645,7 @@
4DECC3350EC2A170008D359E /* Sparkle.framework in Frameworks */,
296DC89F0F8FD336002A3258 /* WebKit.framework in Frameworks */,
17B7B5991016038400F057DE /* MCPKit.framework in Frameworks */,
+ BCC5CC3C103EEE49007CE557 /* libz.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};