home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.0
/
NeXTSTEP3.0.iso
/
NextDeveloper
/
Examples
/
DatabaseKit
/
Binder
/
BinderHandler.m
< prev
next >
Wrap
Text File
|
1992-07-09
|
6KB
|
214 lines
/* BinderHanlder.m:
* You may freely copy, distribute, and reuse the code in this example.
* NeXT disclaims any warranty of any kind, expressed or implied, as to its
* fitness for any particular use.
*
* Written by: Mai Nguyen, NeXT Developer Support
*
*
*/
#import "BinderHandler.h"
#import <appkit/appkit.h>
#import <dbkit/dbkit.h>
#import <libc.h>
/* Define localized strings */
#define FAILURE NXLocalizedString("Failure:", NULL, "Message given to user when an operation has failed.")
#define CANNOT_CONNECT NXLocalizedString("Couldn't connect to database", NULL, "Message given to user to explain what fails. ")
#define OK NXLocalizedString("OK", NULL, "Okay to continue ")
#define NO_BINDER_OBJECT NXLocalizedString("Binder object not properly allocated", NULL, "Message given to user about a system problem.")
/* Global to be used by Author object */
static id myHandler;
@implementation BinderHandler
- appDidInit:sender
{
/* Connect to the Sybase Adaptor */
if ( myDatabase == nil ) {
myDatabase = [[DBDatabase alloc]init];
[myDatabase connectUsingAdaptor:"SybaseAdaptor"
andString:"sa@SYBASE/pubs"];
}
/* TESTING */
if (![myDatabase isConnected]) {
NXRunAlertPanel(FAILURE, CANNOT_CONNECT,OK, NULL, NULL);
return self;
}
myHandler = self;
return self;
}
/* Stuff the binder with attributes from the authors table
*/
- initBinder
{
id authorPrototype = [[Author alloc]init];
propertyList = [[List alloc] init];
containerList = [[List alloc] init];
myBinder = [[DBBinder alloc] init];
author@gty = [myDatabase entityNamed:"authors"];
[myBinder setDatabase:myDatabase];
[myBinder setProperties:propertyList];
[myBinder setRecordPrototype:authorPrototype];
[myBinder associateRecordIvar:"first"
withProperty: [[DBExpression alloc] initForEntity:authorEntity
fromDescription:"au_fname"]];
[myBinder associateRecordIvar:"last"
withProperty: [[DBExpression alloc] initForEntity:authorEntity
fromDescription:"au_lname"]];
[myBinder associateRecordIvar:"address"
withProperty:[[DBExpression alloc] initForEntity:authorEntity
fromDescription:"address"]];
[myBinder associateRecordIvar:"state"
withProperty:[[DBExpression alloc] initForEntity:authorEntity
fromDescription:"state"]];
[myBinder associateRecordIvar:"zip"
withProperty:[[DBExpression alloc] initForEntity:authorEntity
fromDescription:"zip"]];
[myBinder associateRecordIvar:"phone"
withProperty:[[DBExpression alloc] initForEntity:authorEntity
fromDescription:"phone"]];
return self;
}
- showAllRecords:sender
{
[self initBinder];
[self findAllRecords];
return self;
}
- findAllRecords
{
int recordCount;
if ( myBinder == nil ) {
NXRunAlertPanel(FAILURE, NO_BINDER_OBJECT,
"Binder object not properly allocated",
"OK", NULL, NULL);
return self;
}
[myBinder setContainer:containerList];
[myBinder select];
recordCount = [containerList count];
sprintf(buf, "\n------------------------\n");
[self appendToText:buf];
sprintf(buf, "%s\t%d\n", "Total Number of Records:", recordCount);
[self appendToText:buf];
[containerList makeObjectsPerform:@selector(printSelf)];
return self;
}
/* Build a simple SQL query with DBQualifier and retrieve the data via the
* binder object.
*/
- findByName:sender
{
const char * name;
id theQualifier;
id aProp;
name = [lastNameField stringValue];
aProp = [[DBExpression alloc] initForEntity:authorEntity
fromDescription:"au_lname"];
theQualifier = [[DBQualifier allocFromZone:[self zone] ]
initForEntity:authorEntity
fromDescription:"%@ LIKE %s", aProp, name];
/* Must allocate a new binder object */
[self initBinder];
[myBinder setQualifier:theQualifier];
[self findAllR@hds];
return self;
}
- findByState:sender
{
const char * state;
id theQualifier;
id aProp;
state = [stateField stringValue];
aProp = [[DBExpression alloc] initForEntity:authorEntity
fromDescription:"state"];
theQualifier = [[DBQualifier allocFromZone:[self zone] ]
initForEntity:authorEntity
fromDescription:"%@ LIKE %s", aProp, state];
/* Must allocate a new binder object with a different qualifier */
[self initBinder];
[myBinder setQualifier:theQualifier];
[self findAllRecords];
return self;
}
/* Appends the string passed to the doc view of the text view
*/
- appendToText:(const char *)newText
{
int currentLength = [theTextView textLength];
[theTextView setSel:currentLength :currentLength];
[theTextView replaceSel:newText];
[theTextView scrollSelToVisible];
return self;
}
@end
@implementation Author
/* copyFromZone: is VERY important...this is how the prototype
* object is turned into records!
*/
- copyFromZone:(NXZone*)z
{
Author *theCopy = [[Author allocFromZone:z] init];
theCopy->first = NXCopyStringBufferFromZone(first, z);
theCopy->last = NXCopyStringBufferFromZone(last, z);
theCopy->address = NXCopyStringBufferFromZone(address, z);
theCopy->state = NXCopyStringBufferFromZone(state, z);
theCopy->zip = NXCopyStringBufferFromZone(zip, z);
theCopy->phone = NXCopyStringBufferFromZone(phone, z);
return theCopy;
}
/* Print data stored in the author object
*/
- printSelf
{
char buf[200];
sprintf(buf, "%s %s\n%s \t%s %s\n%s\n", first, last, address, state, zip,
phone);
if (myHandler != nil)
[myHandler appendToText: buf];
return self;
}
@end