2 Copyright (C) 2000-2003 SKYRIX Software AG
4 This file is part of OGo
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 #import "EOQualTool.h"
25 #include <EOControl/EOControl.h>
26 #include <EOControl/EOSQLParser.h>
28 @interface dateTime : NSDate
31 @implementation dateTime
33 - (id)initWithString:(NSString *)_s {
35 NSString *fmt = @"%Y-%m-%dT%H:%M:%SZ";
37 date = [NSCalendarDate dateWithString:_s calendarFormat:fmt];
38 [date setCalendarFormat:@"%Y-%m-%d %H:%M %Z"];
44 @implementation EOQualTool
48 - (void)indent:(int)_level {
50 for (i = 0; i < _level; i++)
54 - (void)printQualifiers:(NSArray *)_qs nesting:(int)_level {
58 e = [_qs objectEnumerator];
59 while ((q = [e nextObject]))
60 [self printQualifier:q nesting:_level];
63 - (void)printQualifier:(id)_q nesting:(int)_level {
66 if ([_q isKindOfClass:[EOAndQualifier class]]) {
68 [self printQualifiers:[_q qualifiers] nesting:_level + 1];
70 else if ([_q isKindOfClass:[EOOrQualifier class]]) {
72 [self printQualifiers:[_q qualifiers] nesting:_level + 1];
74 else if ([_q isKindOfClass:[EONotQualifier class]]) {
76 [self printQualifier:[_q qualifier] nesting:_level + 1];
78 else if ([_q isKindOfClass:[EOKeyValueQualifier class]]) {
80 printf("key OP value\n");
83 printf("key: %s\n", [[_q key] cString]);
85 printf("value: '%s' (class=%s)\n",
86 [[v stringValue] cString],
87 [NSStringFromClass([v class]) cString]);
89 printf("OP: %s\n", [NSStringFromSelector([_q selector]) cString]);
92 else if ([_q isKindOfClass:[EOKeyComparisonQualifier class]]) {
93 printf("key1 OP key1\n");
96 printf("left: %s\n", [[_q leftKey] cString]);
98 printf("right: %s\n", [[_q rightKey] cString]);
100 printf("OP: %s\n", [NSStringFromSelector([_q selector]) cString]);
104 printf("unknown: %s\n", [NSStringFromClass([_q class]) cString]);
107 - (void)processQualifier:(NSString *)_qs {
111 printf("qualifier: '%s'\n", [_qs cString]);
113 if ((q = [EOQualifier qualifierWithQualifierFormat:_qs arguments:args])) {
114 printf(" parsed: %s\n", [[q description] cString]);
116 [self printQualifier:q nesting:1];
119 printf(" parsing failed !\n");
122 - (void)testExQualifier {
123 [self processQualifier:
124 @"\"DAV:iscollection\" = False and "
125 @"\"http://schemas.microsoft.com/mapi/proptag/x0c1e001f\" = "
127 @"\"http://schemas.microsoft.com/mapi/proptag/x0e230003\" > 0"];
129 - (void)testComplexCastQualifier {
130 [self processQualifier:
131 @"\"DAV:getlastmodified\" < "
132 @" cast(\"1970-01-01T00:00:00Z\" as 'dateTime') "
133 @" and \"DAV:contentclass\" = 'urn:content-classes:appointment'"
134 @" and (\"urn:schemas:calendar:instancetype\" = 0 "
135 @" or \"urn:schemas:calendar:instancetype\" = 1)"];
138 - (void)testQualifiers {
139 [self testExQualifier];
140 [self testComplexCastQualifier];
143 - (void)testSQL:(NSString *)_sql {
145 EOFetchSpecification *fs;
147 if ([_sql hasPrefix:@"test"]) {
150 s = NSSelectorFromString(_sql);
151 if ([EOSQLParser respondsToSelector:s]) {
152 [EOSQLParser performSelector:s];
157 parser = [EOSQLParser sharedSQLParser];
159 [self logWithFormat:@"parse SQL: %@", _sql];
160 [self logWithFormat:@"parser: %@", parser];
162 fs = [parser parseSQLSelectStatement:_sql];
163 [self logWithFormat:@"got fs: %@", fs];
169 fprintf(stderr, "usage: eoqual <quals>\n");
173 - (int)runWithArguments:(NSArray *)_args {
177 _args = [_args subarrayWithRange:NSMakeRange(1, [_args count] - 1)];
178 if ([_args count] == 0)
181 ud = [NSUserDefaults standardUserDefaults];
183 for (i = 0; i < [_args count]; i++) {
186 q = [_args objectAtIndex:i];
187 if ([q hasPrefix:@"sql:"])
188 [self testSQL:[q stringWithoutPrefix:@"sql:"]];
189 else if ([q isEqualToString:@"test"])
190 [self testQualifiers];
192 [self processQualifier:q];
198 @end /* EOQualTool */