2 Copyright (C) 2004 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include "OCSFolder.h"
24 #include "OCSFolderManager.h"
25 #include "OCSFolderType.h"
26 #include "OCSChannelManager.h"
27 #include "OCSFieldExtractor.h"
28 #include "NSURL+OCS.h"
29 #include "EOAdaptorChannel+OCS.h"
32 @implementation OCSFolder
34 static BOOL debugOn = YES;
37 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
39 debugOn = [ud boolForKey:@"OCSFolderDebugEnabled"];
42 - (id)initWithPath:(NSString *)_path primaryKey:(id)_folderId
43 folderTypeName:(NSString *)_ftname folderType:(OCSFolderType *)_ftype
44 location:(NSURL *)_loc quickLocation:(NSURL *)_qloc
45 folderManager:(OCSFolderManager *)_fm
47 if ((self = [super init])) {
48 self->folderManager = [_fm retain];
49 self->folderInfo = [_ftype retain];
51 self->folderId = [_folderId copy];
52 self->folderName = [[_path lastPathComponent] copy];
53 self->path = [_path copy];
54 self->location = [_loc retain];
55 self->quickLocation = [_qloc retain];
56 self->folderTypeName = [_ftname copy];
61 return [self initWithPath:nil primaryKey:nil
62 folderTypeName:nil folderType:nil
63 location:nil quickLocation:nil
68 [self->folderManager release];
69 [self->folderInfo release];
70 [self->folderId release];
71 [self->folderName release];
73 [self->location release];
74 [self->quickLocation release];
75 [self->folderTypeName release];
81 - (NSNumber *)folderId {
82 return self->folderId;
85 - (NSString *)folderName {
86 return self->folderName;
93 return self->location;
95 - (NSURL *)quickLocation {
96 return self->quickLocation;
99 - (NSString *)folderTypeName {
100 return self->folderTypeName;
103 - (OCSFolderManager *)folderManager {
104 return self->folderManager;
106 - (OCSChannelManager *)channelManager {
107 return [[self folderManager] channelManager];
110 - (NSString *)storeTableName {
111 return [[self location] ocsTableName];
113 - (NSString *)quickTableName {
114 return [[self quickLocation] ocsTableName];
119 - (EOAdaptorChannel *)acquireStoreChannel {
120 return [[self channelManager] acquireOpenChannelForURL:[self location]];
122 - (EOAdaptorChannel *)acquireQuickChannel {
123 return [[self channelManager] acquireOpenChannelForURL:[self quickLocation]];
126 - (void)releaseChannel:(EOAdaptorChannel *)_channel {
127 [[self channelManager] releaseChannel:_channel];
128 if (debugOn) [self debugWithFormat:@"released channel: %@", _channel];
131 - (BOOL)canConnectStore {
132 return [[self channelManager] canConnect:[self location]];
134 - (BOOL)canConnectQuick {
135 return [[self channelManager] canConnect:[self quickLocation]];
140 - (NSArray *)subFolderNames {
141 return [[self folderManager] listSubFoldersAtPath:[self path]
144 - (NSArray *)allSubFolderNames {
145 return [[self folderManager] listSubFoldersAtPath:[self path]
149 - (NSString *)fetchContentWithName:(NSString *)_name {
150 EOAdaptorChannel *channel;
157 if ((channel = [self acquireStoreChannel]) == nil) {
158 [self logWithFormat:@"ERROR(%s): could not open storage channel!"];
164 sql = @"SELECT \"c_content\" FROM ";
165 sql = [sql stringByAppendingString:[self storeTableName]];
166 sql = [sql stringByAppendingString:@" WHERE \"c_name\" = '"];
167 sql = [sql stringByAppendingString:_name];
168 sql = [sql stringByAppendingString:@"'"];
172 if ((error = [channel evaluateExpressionX:sql]) != nil) {
173 [self logWithFormat:@"ERROR(%s): cannot execute blob-fetch SQL '%@': %@",
174 __PRETTY_FUNCTION__, sql, error];
175 [self releaseChannel:channel];
182 attrs = [channel describeResults];
183 if ((row = [channel fetchAttributes:attrs withZone:NULL]) != nil) {
184 result = [[[row objectForKey:@"cContent"] copy] autorelease];
185 if (![result isNotNull]) result = nil;
186 [channel cancelFetch];
189 /* release and return result */
191 [self releaseChannel:channel];
195 - (NSException *)writeContent:(NSString *)_content toName:(NSString *)_name {
196 EOAdaptorChannel *storeChannel, *quickChannel;
197 NSMutableDictionary *quickRow;
198 OCSFieldExtractor *extractor;
202 extractor = [self->folderInfo quickExtractor];
203 quickRow = [extractor extractQuickFieldsFromContent:_content];
207 if ((storeChannel = [self acquireStoreChannel]) == nil) {
208 [self logWithFormat:@"ERROR(%s): could not open storage channel!"];
211 if ((quickChannel = [self acquireQuickChannel]) == nil) {
212 [self logWithFormat:@"ERROR(%s): could not open quick channel!"];
213 [self releaseChannel:storeChannel];
217 // TODO: gen SQL, execute in transactions
219 [self releaseChannel:storeChannel];
220 [self releaseChannel:quickChannel];
222 return [NSException exceptionWithName:@"NotYetImplemented"
223 reason:@"no time, no money, ..."
229 - (NSString *)description {
233 ms = [NSMutableString stringWithCapacity:256];
234 [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
237 [ms appendFormat:@" id=%@", self->folderId];
239 [ms appendString:@" no-id"];
241 if ((tmp = [self path])) [ms appendFormat:@" path=%@", tmp];
242 if ((tmp = [self folderTypeName])) [ms appendFormat:@" type=%@", tmp];
243 if ((tmp = [self location]))
244 [ms appendFormat:@" loc=%@", [tmp absoluteString]];
246 [ms appendString:@">"];