|
|
1.1 root 1: /*--------------------------------------------------------------------------
2: *
3: * You may freely copy, distribute, and reuse the code in this example.
4: * SHL Systemhouse disclaims any warranty of any kind, expressed or
5: * implied, as to its fitness for any particular use.
6: *
7: *
8: * DataSource
9: *
10: * Inherits From: NSObject
11: *
12: * Conforms To: EOQualifiedDataSources, EORollbackDataSources
13: *
14: * Declared In: DataSource.h
15: *
16: *
17: *------------------------------------------------------------------------*/
18: #import "DataSource.h"
19: #import "Motorcycle.h"
20: #import <foundation/NSUtilities.h>
21: #import <appkit/Application.h>
22:
23: #define print_trace [[NXApp delegate] perform: @selector (console:) with:\
24: [NSString stringWithFormat: @"DATASOURCE %s\n", sel_getName(_cmd)]]
25:
26:
27:
28:
29: @implementation DataSource
30:
31: /*--------------------------------------------------------------------------
32: * EODataSources Protocol
33: *
34: * The EODataSources protocol defines the interface for a source of
35: * data-bearing objects retrieved from some external store, such as an RDBMS.
36: * EODataSources uses a simple insert/delete/update/fetch model.
37: *
38: * Changes to the objects provided by a data source are made in two phases.
39: * First, you can modify an object independently of the data source. These
40: * changes don't affect the external store until you send an -insertObject:,
41: * -deleteObject:, or -updateObject: message. For example, if you release an
42: * object you received from the data source, it isn't deleted from the
43: * external store. Invoking one of the messages listed sends the changes
44: * associated with the object to the external store. You must invoke
45: * -saveObjects to make your changes permanent. If an external store supports
46: * rolling back of changes you can invoke -rollback (declared in the
47: * EORollbackDataSources protocol) to undo the changes made since the last
48: * -saveObjects message.
49: *
50: *------------------------------------------------------------------------*/
51: - (NSArray *) keys
52: {
53: // Returns the names of the keys that describe the data-bearing objects.
54:
55: print_trace;
56: return [NSArray arrayWithObject: @"Model"];
57: }
58:
59:
60: - createObject
61: {
62: // Returns a new data bearing object with no values set, or nil if the
63: // data source won't allow object insertion. You're responsible for
64: // assigning a proper primary key.
65:
66: print_trace;
67: return [[Motorcycle alloc] init];
68: }
69:
70: - coerceValue: value forKey: (NSString *)key
71: {
72: return value;
73: }
74:
75: - (BOOL) insertObject: object
76: {
77: // Inserts object into the data source. Returns YES on success, NO on
78: // failure for any reason.
79:
80: print_trace;
81:
82: if ([object isKindOf: [Motorcycle class]] == NO) return NO;
83:
84: if (workingStore == nil)
85: workingStore = [[NSMutableArray allocWithZone: [self zone]]
86: initWithCapacity: 1];
87:
88: [workingStore addObject: object];
89: return YES;
90: }
91:
92:
93: - (BOOL) deleteObject: object
94: {
95: // Deletes object from the data source. Returns YES on success, NO on
96: // failure for any reason.
97:
98: print_trace;
99:
100: if ([object isKindOf: [Motorcycle class]] == NO) return NO;
101: if (workingStore == nil) return NO;
102:
103: [workingStore removeObject: object];
104: return YES;
105: }
106:
107:
108: - (BOOL) updateObject: object
109: {
110: // Saves changes to object to the data source. Returns YES on success,
111: // NO on failure for any reason.
112:
113: print_trace;
114: return YES;
115: }
116:
117:
118: - (NSArray *) fetchObjects
119: {
120: // Returns an array of the data-bearing objects in the data source.
121:
122: print_trace;
123: return persistentStore;
124: }
125:
126:
127: - (BOOL) saveObjects
128: {
129: // Saves objects to persistent storage, if needed. Returns YES on
130: // success, NO on failure for any reason.
131:
132: print_trace;
133:
134: if (persistentStore == nil)
135: persistentStore = [[NSMutableArray allocWithZone: [self zone]]
136: initWithCapacity: [workingStore count]];
137:
138: [persistentStore removeAllObjects];
139: [persistentStore addObjectsFromArray: workingStore];
140: return YES;
141: }
142:
143:
144: - (BOOL) canDelete
145: {
146: // Returns YES if the data source allows objects to be deleted, NO if it
147: // doesn't.
148:
149: print_trace;
150: return YES;
151: }
152:
153:
154: /*--------------------------------------------------------------------------
155: * EOQualifiedDataSources Protocol
156: *
157: * The EOQualifiedDataSources protocol decalres methods that must be
158: * implemented by data sources that provide sub data sources rooted in the
159: * super data source.
160: *
161: *------------------------------------------------------------------------*/
162: - (NSArray *) keysForPath: (NSString *)aPath
163: {
164: // The path supplied is a concatenation of all the keys used to get to
165: // a detail datasource with each key separated by a '.'; for example,
166: // "toAuthor.toPublisher.address".
167:
168: print_trace;
169: return nil;
170: }
171:
172:
173: - (id <EODataSources>) dataSourceQualifiedByKey:(NSString *)key ofObject:object
174: {
175: // Returns a data source that supplies objects associated with object's
176: // key. This can be used for creating master-detail data sources.
177:
178: print_trace;
179: return nil;
180: }
181:
182:
183: /*--------------------------------------------------------------------------
184: * EORollbackDataSources Protocol
185: *------------------------------------------------------------------------*/
186: - (void) rollback
187: {
188: // Reverses any changes made by -insertObject:, -deleteObject:, or
189: // -updateObject: since the data source was last sent a -saveObjects
190: // message.
191:
192: print_trace;
193: [workingStore removeAllObjects];
194: [workingStore addObjectsFromArray: persistentStore];
195: }
196:
197:
198: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.