Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

export to mysql window

  • Loading branch information...
commit 63eb185d3be6e360005b19a0bf11ca45df0d06b5 1 parent 21e2071
@bububa authored
Showing with 2,638 additions and 0 deletions.
  1. +2,286 −0 Export.xib
  2. +60 −0 ExportWindowController.h
  3. +292 −0 ExportWindowController.mm
View
2,286 Export.xib
2,286 additions, 0 deletions not shown
View
60 ExportWindowController.h
@@ -0,0 +1,60 @@
+//
+// ExportWindowController.h
+// MongoHub
+//
+// Created by Syd on 10-6-22.
+// Copyright 2010 ThePeppersStudio.COM. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <mongo/client/dbclient.h>
+@class Connection;
+@class DatabasesArrayController;
+@class MCPConnection;
+@class MongoDB;
+@class FieldMapTableController;
+
+@interface ExportWindowController : NSWindowController {
+ NSManagedObjectContext *managedObjectContext;
+ DatabasesArrayController *databasesArrayController;
+ NSString *dbname;
+ Connection *conn;
+ MongoDB *mongoDB;
+ MCPConnection *db;
+ IBOutlet NSArrayController *dbsArrayController;
+ IBOutlet NSArrayController *tablesArrayController;
+ IBOutlet NSTextField *hostTextField;
+ IBOutlet NSTextField *portTextField;
+ IBOutlet NSTextField *userTextField;
+ IBOutlet NSSecureTextField *passwdTextField;
+ IBOutlet NSTextField *collectionTextField;
+ IBOutlet NSProgressIndicator *progressIndicator;
+ IBOutlet NSPopUpButton *tablesPopUpButton;
+ IBOutlet FieldMapTableController *fieldMapTableController;
+}
+
+@property (nonatomic, retain) Connection *conn;
+@property (nonatomic, retain) MCPConnection *db;
+@property (nonatomic, retain) MongoDB *mongoDB;
+@property (nonatomic, retain) DatabasesArrayController *databasesArrayController;
+@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
+@property (nonatomic, retain) NSString *dbname;
+@property (nonatomic, retain) NSArrayController *dbsArrayController;
+@property (nonatomic, retain) NSArrayController *tablesArrayController;
+@property (nonatomic, retain) NSTextField *hostTextField;
+@property (nonatomic, retain) NSTextField *portTextField;
+@property (nonatomic, retain) NSTextField *userTextField;
+@property (nonatomic, retain) NSSecureTextField *passwdTextField;
+@property (nonatomic, retain) NSTextField *collectionTextField;
+@property (nonatomic, retain) NSProgressIndicator *progressIndicator;
+@property (nonatomic, retain) NSPopUpButton *tablesPopUpButton;
+@property (nonatomic, retain) FieldMapTableController *fieldMapTableController;
+
+- (void)initInterface;
+- (IBAction)connect:(id)sender;
+- (IBAction)export:(id)sender;
+- (IBAction)showTables:(id)sender;
+- (IBAction)showFields:(id)sender;
+- (long long int)exportCount:(NSString *)collection user:(NSString *)user password:(NSString *)password;
+- (void)doExportToTable:(NSString *)tableName data:(mongo::BSONObj) bsonObj fieldTypes:(NSDictionary *)fieldTypes;
+@end
View
292 ExportWindowController.mm
@@ -0,0 +1,292 @@
+//
+// ExportWindowController.m
+// MongoHub
+//
+// Created by Syd on 10-6-22.
+// Copyright 2010 ThePeppersStudio.COM. All rights reserved.
+//
+
+#import "ExportWindowController.h"
+#import "Configure.h"
+#import "DatabasesArrayController.h"
+#import "Database.h"
+#import "Connection.h"
+#import "NSString+Extras.h"
+#import "MongoDB.h"
+#import <MCPKit_bundled/MCPKit_bundled.h>
+#import "FieldMapTableController.h"
+#import "FieldMapDataObject.h"
+
+@implementation ExportWindowController
+
+@synthesize dbname;
+@synthesize conn;
+@synthesize db;
+@synthesize mongoDB;
+@synthesize databasesArrayController;
+@synthesize managedObjectContext;
+@synthesize dbsArrayController;
+@synthesize tablesArrayController;
+@synthesize hostTextField;
+@synthesize portTextField;
+@synthesize userTextField;
+@synthesize passwdTextField;
+@synthesize collectionTextField;
+@synthesize progressIndicator;
+@synthesize tablesPopUpButton;
+@synthesize fieldMapTableController;
+
+- (id)init {
+ if (![super initWithWindowNibName:@"Export"]) return nil;
+ return self;
+}
+
+- (void)dealloc {
+ [dbname release];
+ [managedObjectContext release];
+ [databasesArrayController release];
+ [conn release];
+ [db release];
+ [mongoDB release];
+ [dbsArrayController release];
+ [tablesArrayController release];
+ [hostTextField release];
+ [portTextField release];
+ [userTextField release];
+ [passwdTextField release];
+ [collectionTextField release];
+ [progressIndicator release];
+ [tablesPopUpButton release];
+ [fieldMapTableController release];
+ [super dealloc];
+}
+
+- (void)windowDidLoad {
+ //NSLog(@"New Connection Window Loaded");
+ [super windowDidLoad];
+}
+
+- (void)windowWillClose:(NSNotification *)notification {
+ [[NSNotificationCenter defaultCenter] postNotificationName:kExportWindowWillClose object:dbname];
+ dbname = nil;
+ db = nil;
+ [self initInterface];
+}
+
+- (IBAction)export:(id)sender {
+ [progressIndicator setUsesThreadedAnimation:YES];
+ [progressIndicator startAnimation: self];
+ [progressIndicator setDoubleValue:0];
+ NSString *collection = [[NSString alloc] initWithString:[collectionTextField stringValue]];
+ if (![collection isPresent]) {
+ NSRunAlertPanel(@"Error", @"Collection name could not be empty!", @"OK", nil, nil);
+ return;
+ }
+ NSString *tablename = [[NSString alloc] initWithString:[tablesPopUpButton titleOfSelectedItem]];
+
+ NSString *user=nil;
+ NSString *password=nil;
+ Database *mongodb = [databasesArrayController dbInfo:conn name:dbname];
+ if (mongodb) {
+ user = mongodb.user;
+ password = mongodb.password;
+ }
+ [mongodb release];
+ long long int total = [self exportCount:collection user:user password:password];
+ if (total == 0) {
+ return;
+ }
+ NSString *query = [[NSString alloc] initWithFormat:@"select * from %@ limit 1", tablename];
+ MCPResult *theResult = [db queryString:query];
+ [query release];
+ NSDictionary *fieldTypes = [theResult fetchTypesAsDictionary];
+
+ mongo::BSONObjBuilder fieldsBSONBuilder;
+ for(FieldMapDataObject *field in fieldMapTableController.nsMutaryDataObj)
+ {
+ fieldsBSONBuilder.append([field.mongoKey UTF8String], 1);
+ }
+ mongo::BSONObj fieldsBSONObj = fieldsBSONBuilder.obj();
+ std::auto_ptr<mongo::DBClientCursor> cursor = [mongoDB findAllCursorInDB:dbname collection:collection user:user password:password fields:fieldsBSONObj];
+ int i = 1;
+ while( cursor->more() )
+ {
+ mongo::BSONObj b = cursor->next();
+ [self doExportToTable:tablename data:b fieldTypes:fieldTypes];
+ [progressIndicator setDoubleValue:(double)i/total];
+ i ++;
+ }
+ [progressIndicator stopAnimation: self];
+ [tablename release];
+ [collection release];
+}
+
+- (long long int)exportCount:(NSString *)collection user:(NSString *)user password:(NSString *)password
+{
+ long long int result = [mongoDB countInDB:dbname collection:collection user:user password:password critical:nil];
+ return result;
+}
+
+- (void)doExportToTable:(NSString *)tableName data:(mongo::BSONObj) bsonObj fieldTypes:(NSDictionary *)fieldTypes
+{
+ int fieldsCount = [fieldMapTableController.nsMutaryDataObj count];
+ NSMutableArray *fields = [[NSMutableArray alloc] initWithCapacity:fieldsCount];
+ NSMutableArray *values = [[NSMutableArray alloc] initWithCapacity:fieldsCount];
+ for(FieldMapDataObject *field in fieldMapTableController.nsMutaryDataObj)
+ {
+ id value;
+ mongo::BSONElement e = bsonObj.getFieldDotted([field.mongoKey UTF8String]);
+ if (e.eoo() == true) {
+ continue;
+ }
+ if (e.type() == mongo::jstNULL) {
+ continue;
+ }else if (e.type() == mongo::Array) {
+ continue;
+ }else if (e.type() == mongo::Object) {
+ continue;
+ }else if (e.type() == mongo::Bool) {
+ if (e.boolean()) {
+ value = [[NSString alloc] initWithString:@"1" ];
+ }else {
+ value = [[NSString alloc] initWithString:@"0"];
+ }
+ }else if (e.type() == mongo::NumberDouble) {
+ value = [[NSNumber alloc] initWithDouble: e.numberDouble()];
+ }else if (e.type() == mongo::NumberInt) {
+ NSString *ft = [fieldTypes objectForKey:field.sqlKey];
+ if ([ft isEqualToString:@"date"] || [ft isEqualToString:@"datetime"]) {
+ value = [[NSDate alloc] initWithTimeIntervalSince1970:e.numberInt()];
+ }else {
+ value = [[NSNumber alloc] initWithInt: e.numberInt()];
+ }
+ }else if (e.type() == mongo::Date) {
+ mongo::Date_t dt = (time_t)e.date();
+ time_t timestamp = dt / 1000;
+ value = [[NSDate alloc] initWithTimeIntervalSince1970:timestamp];
+ }else if (e.type() == mongo::Timestamp) {
+ time_t timestamp = (time_t)e.timestampTime();
+ value = [[NSDate alloc] initWithTimeIntervalSince1970:timestamp];
+ }else if (e.type() == mongo::BinData) {
+ int binlen;
+ const char* data = e.binData(binlen);
+ value = [[NSData alloc] initWithBytes:data length:binlen];
+ }else if (e.type() == mongo::NumberLong) {
+ NSString *ft = [fieldTypes objectForKey:field.sqlKey];
+ if ([ft isEqualToString:@"date"] || [ft isEqualToString:@"datetime"]) {
+ value = [[NSDate alloc] initWithTimeIntervalSince1970:e.numberLong()];
+ }else {
+ value = [[NSNumber alloc] initWithLong: e.numberLong()];
+ }
+ }else if ([field.mongoKey isEqualToString:@"_id" ]) {
+ if (e.type() == mongo::jstOID)
+ {
+ value = [[NSString alloc] initWithUTF8String: e.__oid().str().c_str()];
+ }else {
+ value = [[NSString alloc] initWithUTF8String: e.str().c_str()];
+ }
+ }else {
+ value = [[NSString alloc] initWithUTF8String:e.str().c_str()];
+ }
+ NSString *sqlKey = [[NSString alloc] initWithString:field.sqlKey];
+ NSString *quotedValue = [[NSString alloc] initWithString:[db quoteObject:value]];
+ [value release];
+ [fields addObject:sqlKey];
+ [values addObject:quotedValue];
+ [quotedValue release];
+ [sqlKey release];
+ }
+ if ([fields count] > 0) {
+ NSString *query = [[NSString alloc] initWithFormat:@"INSERT INTO %@ (%@) values (%@)", tableName, [fields componentsJoinedByString:@","], [values componentsJoinedByString:@","]];
+ //NSLog(@"query: %@", query);
+ [db queryString:query];
+ [query release];
+ }
+ [fields release];
+ [values release];
+}
+
+- (IBAction)connect:(id)sender {
+ if (db) {
+ [self initInterface];
+ [db release];
+ }
+ db = [[MCPConnection alloc] initToHost:[hostTextField stringValue] withLogin:[userTextField stringValue] password:[passwdTextField stringValue] usingPort:[portTextField intValue] ];
+ NSLog(@"Connect: %d", [db isConnected]);
+ if (![db isConnected])
+ {
+ NSRunAlertPanel(@"Error", @"Could not connect to the mysql server!", @"OK", nil, nil);
+ }
+ [db queryString:@"SET NAMES utf8"];
+ [db queryString:@"SET CHARACTER SET utf8"];
+ [db queryString:@"SET COLLATION_CONNECTION='utf8_general_ci'"];
+ [db setEncoding:NSUTF8StringEncoding];
+ MCPResult *dbs = [db listDBs];
+ NSArray *row;
+ NSMutableArray *databases = [[NSMutableArray alloc] initWithCapacity:[dbs numOfRows]];
+ while (row = [dbs fetchRowAsArray]) {
+ NSDictionary *database = [[NSDictionary alloc] initWithObjectsAndKeys:[row objectAtIndex:0], @"name", nil];
+ [databases addObject:database];
+ [database release];
+ }
+ [dbsArrayController setContent:databases];
+ [databases release];
+ //[self showTables:nil];
+}
+
+- (IBAction)showTables:(id)sender
+{
+ NSString *dbn;
+ if (sender == nil && [[dbsArrayController arrangedObjects] count] > 0) {
+ dbn = [[[dbsArrayController arrangedObjects] objectAtIndex:0] objectForKey:@"name"];
+ }else {
+ NSPopUpButton *pb = sender;
+ dbn = [[NSString alloc] initWithString:[pb titleOfSelectedItem]];
+ }
+ if (![dbn isPresent]) {
+ [dbn release];
+ return;
+ }
+ [db selectDB:dbn];
+ [dbn release];
+ MCPResult *tbs = [db listTables];
+ NSArray *row;
+ NSMutableArray *tables = [[NSMutableArray alloc] initWithCapacity:[tbs numOfRows]];
+ while (row = [tbs fetchRowAsArray]) {
+ NSDictionary *table = [[NSDictionary alloc] initWithObjectsAndKeys:[row objectAtIndex:0], @"name", nil];
+ [tables addObject:table];
+ [table release];
+ }
+ [tablesArrayController setContent:tables];
+ [tables release];
+ [self showFields:nil];
+}
+
+- (IBAction)showFields:(id)sender
+{
+ NSString *tablename = [[NSString alloc] initWithString:[tablesPopUpButton titleOfSelectedItem]];
+ MCPResult *theResult = [db queryString:[NSString stringWithFormat:@"select * from %@ limit 1", tablename]];
+ [tablename release];
+ NSArray *theFields = [theResult fetchFieldNames];
+ NSMutableArray *fields = [[NSMutableArray alloc] initWithCapacity:[theFields count] ];
+ for (int i=0; i<[theFields count]; i++) {
+ NSString *fieldName = [theFields objectAtIndex:i];
+ FieldMapDataObject *fd = [[FieldMapDataObject alloc] initWithSqlKey:fieldName andMongoKey:fieldName];
+ [fields addObject:fd];
+ [fd release];
+ }
+ [fieldMapTableController setNsMutaryDataObj:fields];
+ [fieldMapTableController.idTableView reloadData];
+ [fields release];
+}
+
+- (void)initInterface
+{
+ [dbsArrayController setContent:nil];
+ [tablesArrayController setContent:nil];
+ [progressIndicator setDoubleValue:0.0];
+ [fieldMapTableController.nsMutaryDataObj removeAllObjects];
+ [fieldMapTableController.idTableView reloadData];
+}
+
+@end
Please sign in to comment.
Something went wrong with that request. Please try again.