Annotation of Examples/DatabaseKit/Binder/BinderHandler.m, revision 1.1.1.1

1.1       root        1: /* BinderHanlder.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:  * Written by: Mai Nguyen, NeXT Developer Support
                      7:  *
                      8:  *
                      9:  */
                     10:  
                     11: #import "BinderHandler.h"
                     12: #import <appkit/appkit.h>
                     13: #import <dbkit/dbkit.h>
                     14: #import <libc.h>
                     15: 
                     16:        /* Define localized strings */
                     17: #define FAILURE NXLocalizedString("Failure:", NULL, "Message given to user when an operation has failed.")
                     18: #define CANNOT_CONNECT NXLocalizedString("Couldn't connect to database", NULL, "Message given to user to explain what fails. ")
                     19: #define OK NXLocalizedString("OK", NULL, "Okay to continue ")
                     20: #define NO_BINDER_OBJECT NXLocalizedString("Binder object not properly allocated", NULL, "Message given to user about a system problem.")
                     21: 
                     22:        /* Global to be used by Author object */
                     23: static id myHandler;
                     24: @implementation BinderHandler
                     25: 
                     26: - appDidInit:sender
                     27: {
                     28:        /* Connect to the Sybase Adaptor */
                     29:        if ( myDatabase == nil ) {
                     30:                myDatabase = [[DBDatabase alloc]init];
                     31:                [myDatabase connectUsingAdaptor:"SybaseAdaptor"
                     32:                                                                 andString:"sa@SYBASE/pubs"];
                     33:                }
                     34:        
                     35:                /* TESTING */
                     36:        if (![myDatabase isConnected]) {
                     37:                NXRunAlertPanel(FAILURE, CANNOT_CONNECT,OK, NULL, NULL);
                     38:                return self;
                     39:                }
                     40:        [myDatabase setDelegate:self];
                     41:        authorEntity = [myDatabase entityNamed:"authors"];
                     42: 
                     43:        myHandler = self;
                     44:  
                     45:        return self;
                     46: }
                     47: 
                     48: /* Stuff the binder with attributes from the authors table
                     49:  */
                     50: - initBinder
                     51: {
                     52:        
                     53:        authorPrototype = [[Author alloc]init];
                     54:        propertyList = [[List alloc] init];
                     55:        containerList = [[List alloc] init];
                     56:        myBinder = [[DBBinder alloc] init];
                     57:        
                     58:        [myBinder setDatabase:myDatabase];
                     59:        [myBinder setProperties:propertyList];
                     60:        [myBinder setRecordPrototype:authorPrototype];
                     61: 
                     62:        [myBinder associateRecordIvar:"first"
                     63:         withProperty: [[DBExpression alloc] initForEntity:authorEntity
                     64:                                             fromDescription:"au_fname"]];
                     65:        [myBinder associateRecordIvar:"last" 
                     66:         withProperty: [[DBExpression alloc] initForEntity:authorEntity
                     67:                                             fromDescription:"au_lname"]];
                     68:        [myBinder associateRecordIvar:"address"
                     69:                withProperty:[[DBExpression alloc] initForEntity:authorEntity
                     70:                                                                                        fromDescription:"address"]];
                     71:        [myBinder associateRecordIvar:"state"
                     72:                withProperty:[[DBExpression alloc] initForEntity:authorEntity
                     73:                                                                                        fromDescription:"state"]];
                     74:        [myBinder associateRecordIvar:"zip"
                     75:                withProperty:[[DBExpression alloc] initForEntity:authorEntity
                     76:                                                                                        fromDescription:"zip"]];
                     77:        [myBinder associateRecordIvar:"phone"
                     78:                withProperty:[[DBExpression alloc] initForEntity:authorEntity
                     79:                                                                                        fromDescription:"phone"]];
                     80:        
                     81:        return self;
                     82: }
                     83: 
                     84: 
                     85: - free
                     86: {      
                     87:        if (authorPrototype)
                     88:                [authorPrototype free];
                     89:        if (propertyList)
                     90:                [propertyList free];
                     91:        if (containerList)
                     92:                [containerList free];
                     93:        if (myBinder)
                     94:                [myBinder free];
                     95: 
                     96:        return [super free];
                     97: }
                     98:                
                     99: - showAllRecords:sender
                    100: {
                    101:        [self initBinder];
                    102:        [self findAllRecords];
                    103: 
                    104:        return self;
                    105: }
                    106: 
                    107: 
                    108: - findAllRecords
                    109: {
                    110:        int  recordCount;
                    111:        
                    112:        if ( myBinder == nil )  {
                    113:                NXRunAlertPanel(FAILURE, NO_BINDER_OBJECT,
                    114:                        "Binder object not properly allocated",
                    115:                                "OK", NULL, NULL);
                    116:                return self;
                    117:        }
                    118:                
                    119:        [myBinder setContainer:containerList];          
                    120:        [myBinder select];
                    121:        
                    122:        recordCount = [containerList count];
                    123:        sprintf(buf, "\n------------------------\n");
                    124:        [self appendToText:buf];
                    125:        sprintf(buf, "%s\t%d\n", "Total Number of Records:", recordCount);
                    126:        [self appendToText:buf];
                    127:        [containerList makeObjectsPerform:@selector(printSelf)];
                    128:                /* Make the input field first responder */
                    129:        [lastNameField selectText:0];
                    130:        return self;
                    131: }
                    132: 
                    133: 
                    134: /* Build a simple SQL query with DBQualifier and retrieve the data via the
                    135:  * binder object.
                    136:  */
                    137: - findByName:sender
                    138: {
                    139:        const char * name;
                    140:        id                       aProp;
                    141:        id                       theQualifier;
                    142:        
                    143:        name = [lastNameField stringValue];
                    144:        
                    145:        aProp = [[DBExpression alloc] initForEntity:authorEntity
                    146:                                             fromDescription:"au_lname"];
                    147:        theQualifier = [[DBQualifier allocFromZone:[self zone] ] 
                    148:                initForEntity:authorEntity
                    149:                fromDescription:"%@ LIKE %s", aProp, name];
                    150: 
                    151:                /* Must allocate a new binder object */ 
                    152:        [self initBinder];
                    153:        [myBinder setQualifier:theQualifier];
                    154:        [self findAllRecords];
                    155:        [aProp free];
                    156:        [theQualifier free];
                    157:        return self;
                    158: }
                    159: 
                    160: 
                    161: - findByState:sender
                    162: {
                    163:        const char * state;
                    164:        id                       aProp;
                    165:        id                       theQualifier;
                    166:                
                    167:        
                    168:        state = [stateField stringValue];
                    169:        
                    170:        aProp = [[DBExpression alloc] initForEntity:authorEntity
                    171:                                             fromDescription:"state"];
                    172:        theQualifier = [[DBQualifier allocFromZone:[self zone] ] 
                    173:                initForEntity:authorEntity
                    174:                fromDescription:"%@ LIKE %s", aProp, state];
                    175:                
                    176:                /* Must allocate a new binder object with a different qualifier */
                    177:        [self initBinder];
                    178:        [myBinder setQualifier:theQualifier];
                    179:        [self findAllRecords];
                    180:        [aProp free];
                    181:        [theQualifier free];
                    182:        return self;
                    183: }
                    184: 
                    185: 
                    186: /* Appends the string passed to the doc view of the text view
                    187:  */
                    188: - appendToText:(const char *)newText
                    189: {
                    190:        int currentLength = [theTextView textLength];
                    191:        [theTextView setSel:currentLength :currentLength];
                    192:        [theTextView replaceSel:newText];
                    193:        [theTextView scrollSelToVisible];
                    194:        return self;
                    195: }
                    196: 
                    197: 
                    198: /* DBDatabase delegate methods to log error messages and SQL queries */
                    199: 
                    200: - (BOOL)db:aDb willEvaluateString:(const unsigned char*)aString usingBinder:aBinder
                    201: {
                    202:        [self appendToText:"\n << SQL Query:\n"];
                    203:        [self appendToText:aString];
                    204:        [self appendToText:" >> \n"];
                    205:        return YES;
                    206: }
                    207: 
                    208: @end
                    209: 
                    210: @implementation Author
                    211: 
                    212: /* copyFromZone: is VERY important...this is how the prototype
                    213:  *  object is turned into records!
                    214:  */
                    215: 
                    216: - copyFromZone:(NXZone*)z
                    217: {
                    218:   Author *theCopy = [[Author allocFromZone:z] init];
                    219:   theCopy->first = NXCopyStringBufferFromZone(first, z);
                    220:   theCopy->last = NXCopyStringBufferFromZone(last, z);
                    221:   theCopy->address = NXCopyStringBufferFromZone(address, z);
                    222:   theCopy->state = NXCopyStringBufferFromZone(state, z);
                    223:   theCopy->zip = NXCopyStringBufferFromZone(zip, z);
                    224:   theCopy->phone = NXCopyStringBufferFromZone(phone, z);
                    225:   return theCopy;
                    226: }
                    227: 
                    228: 
                    229: /* Print data stored in the author object
                    230:  */ 
                    231: - printSelf
                    232: {
                    233:  char buf[200];
                    234:  
                    235:  sprintf(buf, "%s %s\n%s \t%s %s\n%s\n", first, last, address, state, zip,
                    236:                                                                                                                                         phone);
                    237:  if (myHandler != nil)
                    238:        [myHandler appendToText: buf];
                    239:   return self;
                    240: }
                    241: 
                    242: 
                    243: @end

unix.superglobalmegacorp.com

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