Annotation of Examples/EnterpriseObjects/SQLExecutor/Evaluator.m, revision 1.1

1.1     ! root        1: /* Evaluator.m:
        !             2:  * You may freely copy, distribute, and reuse the code in this example.
        !             3:  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
        !             4:  * fitness for any particular use.
        !             5:  *
        !             6:  *  
        !             7:  *
        !             8:  */
        !             9: 
        !            10: #import <foundation/NSString.h>
        !            11: #import <foundation/NSUtilities.h>
        !            12: 
        !            13: #import        "ScrollViewExtras.h"
        !            14: #import "Evaluator.h"
        !            15: #import "EOFDelegateAdaptorCategory.h"
        !            16:  
        !            17: 
        !            18: #define FAILURE NXLocalizedString("Failure:", NULL, \
        !            19:        "Message given to user when an operation has failed.")
        !            20: 
        !            21: #define CANNOT_CONNECT NXLocalizedString("Cannot connect to database", NULL, \
        !            22:        "Message given to user to explain what fails. ")
        !            23: 
        !            24: #define OK NXLocalizedString("OK", NULL, "Okay to continue ")
        !            25: 
        !            26: @implementation Evaluator
        !            27: 
        !            28: - initWithModelFile:(NSString *)filePath
        !            29: {
        !            30:     char path[MAXPATHLEN];
        !            31:        BOOL            result=NO;
        !            32:     
        !            33:     [super init];
        !            34:                
        !            35:        // open the model file and connect to the database  
        !            36:     model = [[[EOModel alloc]  
        !            37:                                initWithContentsOfFile: filePath] autorelease];
        !            38:                                 
        !            39:     if (!model)
        !            40:                return nil;
        !            41:   
        !            42:     
        !            43:     adaptor = [EOAdaptor adaptorWithModel:model];
        !            44:     if (!adaptor) 
        !            45:                return nil;
        !            46:    
        !            47:     context = [adaptor createAdaptorContext];
        !            48:        if (!context)   
        !            49:                return nil;
        !            50:     
        !            51:         
        !            52:     channel = [context createAdaptorChannel];
        !            53:        
        !            54:        if (!channel)           
        !            55:                return nil;
        !            56:    
        !            57:     if (![channel isOpen])
        !            58:                 result = [channel openChannel];
        !            59:        if (result)
        !            60:                [resultsView sprintf:"Connection successful\n"];
        !            61:        else
        !            62:                [resultsView sprintf:"Connection failed\n"];
        !            63:        
        !            64:     [[NXBundle mainBundle] getPath:path forResource:"SQLWindow" ofType:"nib"];
        !            65:        [NXApp loadNibFile:path owner:self withNames:NO];
        !            66:        [(Window *)[resultsView window] setDelegate:self];
        !            67:        [[resultsView window] setTitleAsFilename:[filePath cString]];
        !            68:        [[queryView docView] selectAll:self];
        !            69:        [[resultsView window] makeKeyAndOrderFront:self];
        !            70:        
        !            71:        /*----------------------------------------------------------------------
        !            72:         *      set up the channel delegate to SybaseDelegate for Sybase model files
        !            73:         *      use EOFDelegateCategory for Oracle model files
        !            74:         *--------------------------------------------------------------------*/
        !            75: 
        !            76:        if ([[adaptor name] isEqualToString:@"Sybase"]) {
        !            77:                sybaseDelegate = [[SybaseDelegate alloc] init];
        !            78:            [channel setDelegate:sybaseDelegate];
        !            79:        }
        !            80:        else {
        !            81:                sybaseDelegate = nil;
        !            82:            [channel setDelegate:[[EOFDelegateAdaptorCategory alloc] init]];
        !            83:        }
        !            84:         
        !            85:         return self;
        !            86: }
        !            87: 
        !            88: - free
        !            89: {
        !            90:        [model release];
        !            91:        [adaptor release];
        !            92:        [context release];
        !            93:        [channel release];
        !            94:        if (sybaseDelegate)
        !            95:                [sybaseDelegate release];
        !            96:        
        !            97:        return [super free];
        !            98: }
        !            99: 
        !           100: - evaluate:sender
        !           101: {
        !           102:        BOOL    result = NO;
        !           103:        int     charCount;
        !           104:     char *buffer = NULL;
        !           105:        NSDictionary *row;
        !           106: 
        !           107:        /*----------------------------------------------------------------------
        !           108:         *      get the SQL statement
        !           109:         *--------------------------------------------------------------------*/
        !           110: 
        !           111:        if ((charCount = [[queryView docView] textLength]) > 0) {
        !           112:        buffer = malloc((charCount+1) * sizeof(char));
        !           113:        [[queryView docView] getSubstring:buffer start:0 length:charCount];
        !           114:        buffer[charCount] = 0;
        !           115:        while (charCount > 0 && buffer[--charCount] == '\n')
        !           116:            buffer[charCount] = 0;
        !           117:        [resultsView sprintf:"%s\n", buffer];
        !           118:        
        !           119:        }
        !           120:        else {
        !           121:        [resultsView sprintf:"Can't execute an empty string!\n"];
        !           122:        return self;
        !           123:        }
        !           124:        
        !           125:        /*----------------------------------------------------------------------
        !           126:         *      evaluate the SQL statement
        !           127:         *--------------------------------------------------------------------*/
        !           128: 
        !           129:        [context beginTransaction]; 
        !           130:        result = [channel evaluateExpression:
        !           131:                        [[NSString alloc] initWithCString:(const char *)buffer]];
        !           132:        
        !           133:        if (result){
        !           134:                [resultsView sprintf:"SQL successfully evaluated\n"];
        !           135:                
        !           136:                while ([channel isFetchInProgress] == YES) {
        !           137:                                // get the array of attributes from the result set 
        !           138:                        attributes = [channel describeResults];
        !           139:                
        !           140:                                // since the EO Framework attributes are stored as Attribute1,
        !           141:                                // Attribute2, etc., build a dictionary to do conversion.
        !           142:                                
        !           143:                                 [self buildColumnNamesDictionary:attributes];
        !           144:                
        !           145:                                // The NSDictionary contains all the data for one row
        !           146:                while ((row  = [channel fetchAttributes: attributes withZone:
        !           147:                                                                        [adaptor zone]]) != nil)                                                                        
        !           148:                                // read data back 
        !           149:                        [self readDataFromDict:row ];
        !           150:         
        !           151:                }
        !           152:                [context commitTransaction];
        !           153: 
        !           154:        }
        !           155:        else {
        !           156:                        // do clean-up if SQL statement cannot be evaluated. 
        !           157:                [resultsView sprintf:"SQL evaluation failed\n"];
        !           158:                if ([channel isFetchInProgress] == YES)
        !           159:                        [channel cancelFetch];
        !           160:                [context rollbackTransaction];
        !           161:        }       
        !           162:        free(buffer);
        !           163:     return self;
        !           164: }
        !           165: 
        !           166: 
        !           167: 
        !           168: /* Build a dictionary where the Keys are Attribute1, Attribute2, etc.,
        !           169:  * while the values are the actual column names as specified in the
        !           170:  * database.
        !           171:  */
        !           172: - buildColumnNamesDictionary:(NSArray *) attributesArray
        !           173: {
        !           174:        NSEnumerator    *enumerator;
        !           175:        EOAttribute     *attribute;
        !           176:        NSMutableArray  *keys = [NSMutableArray array];
        !           177:        NSMutableArray  *values = [NSMutableArray array];
        !           178:        
        !           179:        enumerator = [attributesArray objectEnumerator];
        !           180:        
        !           181:        while ((attribute = [enumerator nextObject]) != nil) {
        !           182:                [keys addObject:[attribute name]];
        !           183:                [values addObject:[attribute columnName]];
        !           184:        }
        !           185:        columnNamesDict = [NSDictionary dictionaryWithObjects:values
        !           186:                                        forKeys: keys];
        !           187:        return self;
        !           188: }
        !           189: 
        !           190: /* Cycle through the key and value pairs of the dictionary 
        !           191:  * and print them to result view
        !           192:  *  
        !           193:  */
        !           194: - readDataFromDict:(NSDictionary *) dictionary
        !           195: {
        !           196:        NSEnumerator            *keyEnumerator;
        !           197:        NSString *                      key;
        !           198:        NSString *                      newKey;
        !           199:        id                                      value;
        !           200:        char                            buffer[1024];
        !           201:        SybaseRowType           rowType=0;
        !           202:        
        !           203:        keyEnumerator = [dictionary keyEnumerator];
        !           204:        if (sybaseDelegate)
        !           205:                rowType = [sybaseDelegate currentRowType];
        !           206:        
        !           207:        //print the full dictionary for Sybase regular rows or if the Oracle adaptor is used
        !           208:        if ( ((sybaseDelegate) &&  (rowType == SybaseRegularRow ))
        !           209:                                || (sybaseDelegate == nil) )
        !           210:        {
        !           211:        while ((key = [keyEnumerator nextObject]) != nil) {
        !           212:                newKey = [columnNamesDict objectForKey:[key description]];
        !           213:                 
        !           214:                value = [dictionary objectForKey:key];
        !           215:                sprintf(buffer, "%s: \t %s\n", [[newKey description] cString],
        !           216:                                        [[(NSObject *)value description] cString]);
        !           217:                [resultsView sprintf:buffer];
        !           218:                }
        !           219:        }
        !           220:        else {
        !           221:                // This must be one special sybase row
        !           222:                switch (rowType) {
        !           223:                case SybaseComputeRow:
        !           224:                case SybaseReturnStatusRow:
        !           225:                        // print one row of data only
        !           226:                        key = [keyEnumerator nextObject];
        !           227:                        value = [dictionary objectForKey:key];
        !           228:                        sprintf(buffer, "Row type: %s \t %s\n", (rowType == SybaseComputeRow) ? 
        !           229:                                        "SybaseComputeRow": "SybaseReturnStatusRow",
        !           230:                                        [[(NSObject *)value description] cString]);
        !           231:                        [resultsView sprintf:buffer];
        !           232:                        sprintf(buffer, "************************************\n");
        !           233:                        [resultsView sprintf:buffer];
        !           234:                        break;
        !           235:                case SybaseReturnParameterRow:
        !           236:                        // Exercise for the reader: How to format this row 
        !           237:                        [resultsView sprintf:"SybaseReturnParameterRow: No data printed\n"];
        !           238:                        break;
        !           239:                case SybaseRegularRow:
        !           240:                default:
        !           241:                        break;
        !           242:                }
        !           243:        } 
        !           244:        
        !           245:                
        !           246:        return self;
        !           247: }
        !           248: 
        !           249: - clear:sender
        !           250: {
        !           251:     [resultsView clear:sender];
        !           252:     [[queryView docView] selectText:self];
        !           253:     return self;
        !           254: }
        !           255: 
        !           256: - close:sender
        !           257: {
        !           258:     // close the adaptor channel and disconnect from the database  
        !           259:        [channel closeChannel];
        !           260:        // close the main window  
        !           261:        [[NXApp mainWindow] performClose:sender];
        !           262:        return self;
        !           263: }
        !           264:  
        !           265: 
        !           266: 
        !           267: /*--------------------------------------------------------------------------
        !           268:  *     Announcing Trace Info
        !           269:  *------------------------------------------------------------------------*/
        !           270: - (void) logString:(NSString *) aString
        !           271: {
        !           272:        [resultsView sprintf: "%s", [aString cString]];
        !           273: }
        !           274: 
        !           275: - (void) announce:sender selector:(SEL)selector
        !           276: {
        !           277:        return [self announce:sender selector:selector with:nil];
        !           278: }
        !           279: 
        !           280: 
        !           281: - (void) announce:sender selector:(SEL)selector with:array
        !           282: {
        !           283:        NSMutableString *string;
        !           284:        
        !           285:        string = [NSMutableString stringWithFormat:@"BEGIN> {Sender = %s%s",
        !           286:                [[(NSObject *)[sender class] description] cString], "}" ];
        !           287:        
        !           288:                        
        !           289:        [string appendFormat:@" \n\t{Delegate Method = %s} ", sel_getName(selector)];
        !           290: 
        !           291:        if (array)
        !           292:                {
        !           293:                id object;
        !           294:                id verboseString = [NSMutableString stringWithCapacity:0];
        !           295:                id enumerator = [array objectEnumerator];
        !           296:                
        !           297:                while ((object = [enumerator nextObject]) != nil)
        !           298:                        [verboseString 
        !           299:                                appendFormat:@"\n\t{Argument = %s} \n\t{Argument Description = %s} ", 
        !           300:                                [[(NSObject *)[object class] description] cString], 
        !           301:                                [[(NSObject *) object description] cString]];
        !           302: 
        !           303:                [string appendString:verboseString];
        !           304:                }
        !           305: 
        !           306:                
        !           307:        [string appendFormat:@"\n"];
        !           308:        [resultsView sprintf: "%s", [string cString]];
        !           309: }
        !           310: 
        !           311: 
        !           312: /* Window Delegate method -- constrain window resizing */
        !           313: 
        !           314: - windowWillResize:sender toSize:(NXSize *)frameSize
        !           315: {
        !           316:     if ( frameSize->height < 230 ) frameSize->height= 230;
        !           317:     return self;
        !           318: }
        !           319: 
        !           320: 
        !           321: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.