114 |
return clause; |
return clause; |
115 |
} |
} |
116 |
|
|
117 |
enum { |
- (NSString *) sqlForList |
|
kNewerThreadType, // 新着検索 |
|
|
kOlderThreadType, // 非新着検索 |
|
|
kAllThreadType, // 全部! |
|
|
}; |
|
|
|
|
|
// filter 処理と |
|
|
// 新着のみもしくは非新着のみもしくはすべてのスレッドをDBから取得するための |
|
|
// WHERE句を生成。 |
|
|
static inline NSString *conditionFromStatusAndType( int status, int type ) |
|
|
{ |
|
|
NSMutableString *result = [NSMutableString string]; |
|
|
NSString *brankOrAnd = @""; |
|
|
|
|
|
if(status & ThreadLogCachedStatus && |
|
|
(type == kOlderThreadType || !(status & ThreadNewCreatedStatus))) { |
|
|
// 新着/既得スレッドで且つ既得分表示 もしくは 既得スレッド |
|
|
[result appendFormat : @"NOT %@ IS NULL\n", NumberOfReadColumn]; |
|
|
brankOrAnd = @" AND "; |
|
|
} else if(status & ThreadNoCacheStatus) { |
|
|
// 未取得スレッド |
|
|
[result appendFormat : @"%@ IS NULL\n", NumberOfReadColumn]; |
|
|
brankOrAnd = @" AND "; |
|
|
} else if(status & ThreadNewCreatedStatus && type == kOlderThreadType) { |
|
|
// 新着スレッドで且つ既得分表示。あり得ない boardID を指定し、要素数を0にする |
|
|
[result appendFormat : @"%@ < 0\n",BoardIDColumn]; |
|
|
brankOrAnd = @" AND "; |
|
|
} else if ((status == ~ThreadNoCacheStatus) && type == kAllThreadType) { |
|
|
// 新着スレッドを常に最上位にソート「しない」かつ「新着/既得スレッド」 |
|
|
[result appendFormat:@"%@ > %u\n", ThreadStatusColumn, ThreadNoCacheStatus]; |
|
|
} else if ((status == (ThreadNewCreatedStatus ^ ThreadNoCacheStatus)) && type == kAllThreadType) { |
|
|
// 新着スレッドを常に最上位にソート「しない」かつ「新着スレッド」 |
|
|
[result appendFormat:@"%@ = %u\n", ThreadStatusColumn, ThreadNewCreatedStatus]; |
|
|
} |
|
|
|
|
|
switch(type) { |
|
|
case kNewerThreadType: |
|
|
[result appendFormat : @"%@%@ = %u\n", |
|
|
brankOrAnd, ThreadStatusColumn, ThreadNewCreatedStatus]; |
|
|
break; |
|
|
case kOlderThreadType: |
|
|
[result appendFormat : @"%@%@ != %u\n", |
|
|
brankOrAnd, ThreadStatusColumn, ThreadNewCreatedStatus]; |
|
|
break; |
|
|
case kAllThreadType: |
|
|
// Do nothing. |
|
|
break; |
|
|
default: |
|
|
UTILUnknownCSwitchCase(type); |
|
|
break; |
|
|
} |
|
|
|
|
|
return result; |
|
|
} |
|
|
- (NSString *) sqlForListForType : (int) type |
|
118 |
{ |
{ |
119 |
NSString *targetTable = [[target boardListItem] query]; |
NSString *targetTable = [[target boardListItem] query]; |
120 |
NSMutableString *sql; |
NSMutableString *sql; |
|
NSString *whereOrAnd = @" WHERE "; |
|
121 |
NSString *searchCondition; |
NSString *searchCondition; |
|
NSString *filterCondition; |
|
122 |
|
|
123 |
sql = [NSMutableString stringWithFormat : @"SELECT * FROM (%@) ",targetTable]; |
sql = [NSMutableString stringWithFormat : @"SELECT * FROM (%@) ",targetTable]; |
124 |
|
|
126 |
searchCondition = whereClauseFromSearchString([target searchString]); |
searchCondition = whereClauseFromSearchString([target searchString]); |
127 |
if (searchCondition) { |
if (searchCondition) { |
128 |
[sql appendString : searchCondition]; |
[sql appendString : searchCondition]; |
|
whereOrAnd = @" AND "; |
|
129 |
} |
} |
130 |
} |
} |
131 |
|
|
|
filterCondition = conditionFromStatusAndType( [target status], type); |
|
|
if(filterCondition && [filterCondition length] != 0) { |
|
|
[sql appendFormat : @"%@ %@\n", whereOrAnd, filterCondition]; |
|
|
} |
|
|
|
|
132 |
return sql; |
return sql; |
133 |
} |
} |
134 |
- (id)cursor |
- (id)cursor |
150 |
|
|
151 |
UTILAssertNotNil(db); |
UTILAssertNotNil(db); |
152 |
|
|
153 |
sql = [self sqlForListForType : kAllThreadType]; |
sql = [self sqlForList]; |
154 |
if(userCanceled) goto final; |
if(userCanceled) goto final; |
155 |
result = [db cursorForSQL : sql]; |
result = [db cursorForSQL : sql]; |
156 |
if ([db lastErrorID] != 0) { |
if ([db lastErrorID] != 0) { |