Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Annotation of /bathyscaphe/trunk/application/source/browser/BSThreadListUpdateTask.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 518 - (hide annotations) (download)
Sat Sep 2 11:41:01 2006 UTC (17 years, 8 months ago) by masakih
File size: 9926 byte(s)
merged from 'MERGED-Root-of-MeteorSweeper' on v111-BASED-BRANCH.
cvs -z3 up  -j MERGED-v120_FINAL -j MERGED-Root-of-MeteorSweeper

1 masakih 419 //
2     // BSThreadListUpdateTask.m
3     // BathyScaphe
4     //
5     // Created by Hori,Masaki on 06/03/29.
6     // Copyright 2006 __MyCompanyName__. All rights reserved.
7     //
8    
9     #import "BSThreadListUpdateTask.h"
10     #import "BSDBThreadList.h"
11     #import "BoardListItem.h"
12     #import "DatabaseManager.h"
13     #import "AppDefaults.h"
14    
15     @implementation BSThreadListUpdateTask
16    
17     + (id)taskWithBSDBThreadList:(BSDBThreadList *)threadList
18     {
19     return [[[[self class] alloc] initWithBSDBThreadList:threadList] autorelease];
20     }
21     - (id)initWithBSDBThreadList:(BSDBThreadList *)threadList
22     {
23     if(self = [super init]) {
24 masakih 518 target = threadList; //[threadList retain];
25 masakih 419 progress = YES;
26     userCanceled = NO;
27     }
28    
29     return self;
30     }
31     - (void)dealloc
32     {
33 masakih 518 // [target release];
34 masakih 419
35     [super dealloc];
36     }
37    
38     - (id) identifier
39     {
40     return [NSValue valueWithPointer:self];
41     }
42    
43     - (NSString *) title
44     {
45     return [[target boardListItem] representName];
46     }
47     - (NSString *) message
48     {
49     return [NSString stringWithFormat:@"Updating -- %@", [[target boardListItem] representName]];
50     }
51     - (BOOL) isInProgress
52     {
53     return progress;
54     }
55    
56     // from 0.0 to 100.0 (or -1: Indeterminate)
57     - (double) amount
58     {
59     return ([self isInProgress]) ? 0 : -1;
60     }
61    
62     - (IBAction) cancel : (id) sender
63     {
64     userCanceled = YES;
65     }
66    
67    
68     //- (id)copyWithZone:(NSZone *)zone
69     //{
70     // BSThreadListUpdateTask *result = [[self class] taskWithBSDBThreadList:target];
71     // if(result) {
72     // result->progress = progress;
73     // result->userCanceled = userCanceled;
74     // }
75     //
76     // return [result retain];
77     //}
78    
79     #pragma mark-
80    
81     static inline NSArray *componentsSeparatedByWhiteSpace(NSString *string)
82     {
83     NSMutableArray *result = [NSMutableArray array];
84     NSScanner *s = [NSScanner scannerWithString : string];
85     NSCharacterSet *cs = [NSCharacterSet whitespaceCharacterSet];
86     NSString *str;
87    
88     while ([s scanUpToCharactersFromSet : cs intoString : &str]) {
89     [result addObject : str];
90     }
91    
92     if ([result count] == 0) {
93     return nil;
94     }
95    
96     return result;
97     }
98     static inline NSString *whereClauseFromSearchString(NSString *searchString)
99     {
100     NSMutableString *clause;
101     NSArray *searchs;
102     NSEnumerator *searchsEnum;
103     NSString *token;
104    
105     NSString *p = @"";
106    
107     searchs = componentsSeparatedByWhiteSpace(searchString);
108    
109     if (!searchs || [searchs count] == 0) {
110     return nil;
111     }
112    
113     clause = [NSMutableString stringWithFormat : @" WHERE "];
114    
115     searchsEnum = [searchs objectEnumerator];
116     while (token = [searchsEnum nextObject]) {
117     if ([token hasPrefix : @"!"]) {
118     if ([token length] == 1) continue;
119    
120     [clause appendFormat : @"%@NOT %@ LIKE '%%%@%%' ",
121     p, ThreadNameColumn, [token substringFromIndex : 1]];
122     } else {
123     [clause appendFormat : @"%@%@ LIKE '%%%@%%' ",
124     p, ThreadNameColumn, token];
125     }
126     p = @"AND ";
127     }
128    
129     return clause;
130     }
131    
132     enum {
133     kNewerThreadType, // ������������
134     kOlderThreadType, // ���������������
135     kAllThreadType, // ���������
136     };
137    
138     // filter ���������
139     // ������������������������������������������������������������������������������DB���������������������������
140     // WHERE���������������
141     static inline NSString *conditionFromStatusAndType( int status, int type )
142     {
143     NSMutableString *result = [NSMutableString string];
144     NSString *brankOrAnd = @"";
145    
146     if(status & ThreadLogCachedStatus &&
147     (type == kOlderThreadType || !(status & ThreadNewCreatedStatus))) {
148     // ������/������������������������������������������ ���������������������������������
149     [result appendFormat : @"NOT %@ IS NULL\n", NumberOfReadColumn];
150     brankOrAnd = @" AND ";
151     } else if(status & ThreadNoCacheStatus) {
152     // ���������������������
153     [result appendFormat : @"%@ IS NULL\n", NumberOfReadColumn];
154     brankOrAnd = @" AND ";
155     } else if(status & ThreadNewCreatedStatus && type == kOlderThreadType) {
156     // ������������������������������������������������������������ boardID ���������������������������0���������
157     [result appendFormat : @"%@ < 0\n",BoardIDColumn];
158     brankOrAnd = @" AND ";
159     }
160    
161     switch(type) {
162     case kNewerThreadType:
163     [result appendFormat : @"%@%@ = %u\n",
164     brankOrAnd, ThreadStatusColumn, ThreadNewCreatedStatus];
165     break;
166     case kOlderThreadType:
167     [result appendFormat : @"%@%@ != %u\n",
168     brankOrAnd, ThreadStatusColumn, ThreadNewCreatedStatus];
169     break;
170     case kAllThreadType:
171     // Do nothing.
172     break;
173     default:
174     UTILUnknownCSwitchCase(type);
175     break;
176     }
177    
178     return result;
179     }
180     static inline NSString *orderBy( NSString *sortKey, BOOL isAscending )
181     {
182     NSString *result = nil;
183     NSString *sortCol = nil;
184     NSString *ascending = @"";
185    
186     if (!isAscending) ascending = @"DESC";
187    
188     if ([sortKey isEqualTo : CMRThreadTitleKey]) {
189     sortCol = ThreadNameColumn;
190     } else if ([sortKey isEqualTo : CMRThreadLastLoadedNumberKey]) {
191     sortCol = NumberOfReadColumn;
192     } else if ([sortKey isEqualTo : CMRThreadNumberOfMessagesKey]) {
193     sortCol = NumberOfAllColumn;
194     } else if ([sortKey isEqualTo : CMRThreadNumberOfUpdatedKey]) {
195     sortCol = NumberOfDifferenceColumn;
196     } else if ([sortKey isEqualTo : CMRThreadSubjectIndexKey]) {
197     sortCol = TempThreadThreadNumberColumn;
198     } else if ([sortKey isEqualTo : CMRThreadStatusKey]) {
199     sortCol = ThreadStatusColumn;
200     } else if ([sortKey isEqualTo : CMRThreadModifiedDateKey]) {
201     sortCol = ModifiedDateColumn;
202     } else if ([sortKey isEqualTo : ThreadPlistIdentifierKey]) {
203     sortCol = ThreadIDColumn;
204     } else if ([sortKey isEqualTo : ThreadPlistBoardNameKey]) {
205     sortCol = BoardNameColumn;
206     }
207    
208 masakih 518 // if(sortCol) {
209     // result = [NSString stringWithFormat : @"ORDER BY %@ %@",sortCol, ascending];
210     // }
211     //
212     // return result;
213     return [sortCol lowercaseString];
214 masakih 419 }
215     - (NSString *) sqlForListForType : (int) type
216     {
217     NSString *targetTable = [[target boardListItem] query];
218     NSMutableString *sql;
219     NSString *whereOrAnd = @" WHERE ";
220     NSString *searchCondition;
221     NSString *filterCondition;
222     NSString *order;
223    
224     sql = [NSMutableString stringWithFormat : @"SELECT * FROM (%@) ",targetTable];
225    
226     if ([target searchString] && ![[target searchString] isEmpty]) {
227     searchCondition = whereClauseFromSearchString([target searchString]);
228     if (searchCondition) {
229     [sql appendString : searchCondition];
230     whereOrAnd = @" AND ";
231     }
232     }
233    
234     filterCondition = conditionFromStatusAndType( [target status], type);
235 masakih 518 if(filterCondition && [filterCondition length] != 0) {
236 masakih 419 [sql appendFormat : @"%@ %@\n", whereOrAnd, filterCondition];
237     // whereOrAnd = @" AND ";
238     }
239    
240 masakih 518 // order = orderBy( [target sortKey], [target isAscending]);
241     // if(order) {
242     // [sql appendString : order];
243     // }
244 masakih 419
245     return sql;
246     }
247     - (id)cursor
248     {
249     id result = nil;
250    
251     [self postTaskWillStartNotification];
252    
253     SQLiteDB *db = [[DatabaseManager defaultManager] databaseForCurrentThread];
254     NSString *newersSQL = nil;
255     NSString *sql;
256     id <SQLiteMutableCursor> newerCursor = nil;
257     id <SQLiteMutableCursor> olderCursor = nil;
258    
259     UTILAssertNotNil(db);
260    
261     if( [CMRPref collectByNew] ) {
262     if(userCanceled) goto final;
263     newersSQL = [self sqlForListForType : kNewerThreadType];
264     if(userCanceled) goto final;
265     sql = [self sqlForListForType : kOlderThreadType];
266     } else {
267     sql = [self sqlForListForType : kAllThreadType];
268     }
269    
270 masakih 518 // if(userCanceled) goto final;
271     // sql = [sql stringByAppendingString:@"\nLIMIT 5000"];
272     // newersSQL = [newersSQL stringByAppendingString:@"\nLIMIT 5000"];
273 masakih 419
274     do {
275     if(userCanceled) goto final;
276     olderCursor = [db cursorForSQL : sql];
277     if ([db lastErrorID] != 0) {
278     NSLog(@"sql error on %s line %d.\n\tReason : %@", __FILE__, __LINE__, [db lastError]);
279     olderCursor = nil;
280     break;
281     }
282     if(userCanceled) goto final;
283     if(newersSQL) {
284     newerCursor = [db cursorForSQL : newersSQL];
285     if([db lastErrorID] != 0) {
286     NSLog(@"sql error on %s line %d.\n\tReason : %@", __FILE__, __LINE__, [db lastError]);
287     newerCursor = nil;
288     break;
289     }
290     }
291 masakih 518
292 masakih 419 if(userCanceled) goto final;
293 masakih 518 id sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:orderBy([target sortKey], 0)
294     ascending:[target isAscending]
295     selector:@selector(numericCompare:)] autorelease];
296     id sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
297     if(newerCursor) {
298     NSArray *data = [newerCursor arrayForTableView];
299     NSArray *col = [newerCursor columnNames];
300     NSArrayController *acon = [[[NSArrayController alloc] initWithContent:data] autorelease];
301    
302     [acon setSortDescriptors:sortDescriptors];
303     data = [acon arrangeObjects:data];
304    
305     newerCursor = [NSDictionary dictionaryWithObjectsAndKeys:data, @"Values", col, @"ColumnNames", nil];
306     }
307     if(olderCursor) {
308     NSArray *data = [olderCursor arrayForTableView];
309     NSArray *col = [olderCursor columnNames];
310     NSArrayController *acon = [[[NSArrayController alloc] initWithContent:data] autorelease];
311    
312     [acon setSortDescriptors:sortDescriptors];
313     data = [acon arrangeObjects:data];
314    
315     olderCursor = [NSDictionary dictionaryWithObjectsAndKeys:data, @"Values", col, @"ColumnNames", nil];
316     }
317    
318     if(userCanceled) goto final;
319 masakih 419 if(newerCursor && [newerCursor rowCount]) {
320     [newerCursor appendCursor : olderCursor];
321     olderCursor = nil;
322     }
323     } while( NO );
324    
325     if(olderCursor || newerCursor) {
326     if(olderCursor) {
327     result = olderCursor;
328     } else {
329     result = newerCursor;
330     }
331     }
332    
333     final:
334     [self postTaskDidFinishNotification];
335    
336     return result;
337     }
338    
339     @end
340    
341     @implementation BSThreadListUpdateTask(TaskNotification)
342     - (void) postTaskWillStartNotification
343     {
344     NSNotificationCenter *nc_;
345    
346     nc_ = [NSNotificationCenter defaultCenter];
347     [nc_ postNotificationName : CMRTaskWillStartNotification
348     object : self];
349     }
350    
351     - (void) postTaskDidFinishNotification
352     {
353     NSNotificationCenter *nc_;
354 tsawada2 426
355     progress = NO;
356 masakih 419
357 masakih 518 progress = NO;
358    
359 masakih 419 nc_ = [NSNotificationCenter defaultCenter];
360     [nc_ postNotificationName : CMRTaskDidFinishNotification
361     object : self];
362     }
363     @end
364 masakih 518
365     @implementation NSString(BSThreadListUpdateTaskAddition)
366     - (NSComparisonResult)numericCompare:(NSString *)string
367     {
368     return [self compare:string options:NSNumericSearch];
369     }
370     @end
371     @implementation NSNumber(BSThreadListUpdateTaskAddition)
372     - (NSComparisonResult)numericCompare:(id)obj
373     {
374     return [self compare:obj];
375     }
376     @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26