DCL 3.7.4
Loading...
Searching...
No Matches
MessageListView.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#endif
6
7#include <dcl/Numeric.h>
8#include <dcl/Files.h>
9//#include <dcl/Collection.h>
10#include <dcl/URI.h>
11
12#include <dcl/DateTime.h>
13
14#include "HtmlPage.h"
15#include "MessageTree.h"
16#include "LinkUtility.h"
17#include "MessageView.h"
18
19#if __DCL_HAVE_THIS_FILE__
20#undef __THIS_FILE__
21static const char_t __THIS_FILE__[] = __T("fastpage/MessageListView.cpp");
22#endif
23
24__DCL_BEGIN_NAMESPACE
25
27
28MessageListView::MessageListView(HtmlPage* pPage)
29 : MessageView(pPage)
30{
31 __bOverride = false;
32 __bNoAsc = false;
33 __nParts = 5;
34 __nRows = 20;
35 __nCols = 4;
36 __nGroup = 1;
37 __nSubjectShort = 0;
38 __nBodyLength = -1;
39 __nRecentHour = 24;
40 __nThumbnail = TN_NONE;
41 __nFilter = 0;
42 __nType = TYPE_LIST;
43}
44
45void MessageListView::init(SQLFields& fields)
47{
48 MessageView::init(fields);
49
50 __mapParams.lookup(L"DETAIL", __strDetailPage);
51 __mapParams.lookup(L"WRITE", __strWritePage);
52 __mapParams.lookup(L"LIST", __strListPage);
53
54 String rValue;
55 if (__mapParams.lookup(L"OVERRIDE", rValue) &&
56 !rValue.compareNoCase(L"YES"))
57 __bOverride = true;
58
59 if (__mapParams.lookup(L"NO", rValue) && !rValue.isEmpty()) {
60 if (!rValue.compareNoCase(L"ASC"))
61 __bNoAsc = true;
62 }
63
64 if (__mapParams.lookup(L"PARTS", rValue) && !rValue.isEmpty()) {
65 __nParts = Integer::parse(rValue, 10, __nParts);
66 if (__nParts < 5 || __nParts > 20)
67 __nParts = 5;
68 }
69
70 if (__mapParams.lookup(L"ROWS", rValue) && !rValue.isEmpty()) {
71 __nRows = Integer::parse(rValue, 10, __nRows);
72 if (__nRows <= 0)
73 __nRows = 20;
74 }
75
76 if (__mapParams.lookup(L"COLS", rValue) && !rValue.isEmpty()) {
77 __nCols = Integer::parse(rValue, 10, __nCols);
78 if (!(2 <= __nCols && __nCols <= 10)) {
79 __DCL_TRACE1(L"Warning! Invalid Params: COLS=%ls\n", rValue.data());
80 __nCols = 4;
81 }
82 }
83
84 if (__mapParams.lookup(L"GROUP", rValue) && !rValue.isEmpty()) {
85 __nGroup = Integer::parse(rValue, 10, __nGroup);
86 if (!(1 <= __nGroup && __nGroup <= 10)) {
87 __DCL_TRACE1(L"Warning! Invalid Params: GROUP=%ls\n", rValue.data());
88 __nGroup = 1;
89 }
90 }
91
92 if (__mapParams.lookup(L"SUBJECT_SHORT", rValue) && !rValue.isEmpty()) {
93 __nSubjectShort = Integer::parse(rValue, 10, 0);
94 if (__nSubjectShort < 0) {
95 __DCL_TRACE1(L"Warning! Invalid Params: SUBJECT_SHORT=%ls\n", rValue.data());
96 __nSubjectShort = 0;
97 }
98 }
99
100 if (__mapParams.lookup(L"BODY_LENGTH", rValue) && !rValue.isEmpty()) {
101 __nBodyLength = Integer::parse(rValue, 10, 0);
102 }
103
104 if (__mapParams.lookup(L"FILTER", rValue) && !rValue.isEmpty()) {
105 StringArray list;
106 rValue.split(L',', list);
107 StringArray::Iterator itList = list.begin();
108 for(; itList != list.end(); itList++) {
109 (*itList).trim();
110 if (!(*itList).isEmpty()) {
111 if (!(*itList).compareNoCase(L"NOTICE"))
112 __nFilter |= FILTER_NOTICE;
113 else if (!(*itList).compareNoCase(L"START"))
114 __nFilter |= FILTER_START;
115 else if (!(*itList).compareNoCase(L"REPLY"))
116 __nFilter |= FILTER_REPLY;
117 else if (!(*itList).compareNoCase(L"SELF"))
118 __nFilter |= FILTER_SELF;
119 else if (!(*itList).compareNoCase(L"CHILDREN"))
120 __nFilter |= FILTER_CHILDREN;
121 else if (!(*itList).compareNoCase(L"DEPTH_1"))
122 __nFilter |= FILTER_DEPTH_1;
123 else {
124 // invalid value
125 __DCL_TRACE1(L"Warning! Invalid Params: FILTER=%ls\n", rValue.data());
126 }
127 }
128 }
129 if ((__nFilter & 0x000f) && (__nFilter & 0x00f0) && (__nFilter & 0x0f00)) {
130 // NOTICE, START, REPLY 와 SELF, CHILDREN은 함께 사용할 수 없다.
131 __DCL_TRACE1(L"Warning! Invalid Params: FILTER=%ls\n", rValue.data());
132 __nFilter &= 0x000f;
133 }
134 }
135
136 if (__nFilter & (FILTER_SELF | FILTER_CHILDREN)
137 && __mapParams.lookup(L"MSG", rValue) && !rValue.isEmpty()
138 ) {
139 __strMsg = rValue.trim(L", ");;
140 }
141
142 if (__mapParams.lookup(L"RECENT", rValue)) {
143 rValue = rValue.trim();
144 if (!rValue.isEmpty()) {
145 int nHour = Integer::parse(rValue, 10, 0);
146 if (0 < nHour && nHour < 100)
147 __nRecentHour = nHour;
148 else {
149 __DCL_TRACE1(L"Warning! Invalid Params: RECENT=%ls\n", rValue.data());
150 }
151 }
152 }
153
154 if (__mapParams.lookup(L"SORT", rValue) && !rValue.isEmpty()) {
155 if (!rValue.compareNoCase(L"ASC") || !rValue.compareNoCase(L"DESC"))
156 __strSort = rValue;
157 else {
158 __DCL_TRACE1(L"Warning! Invalid Params: SORT=%ls\n", rValue.data());
159 }
160 }
161 else {
162 if (__nSequence)
163 __strSort = L"DESC";
164 else
165 __strSort = L"ASC";
166 }
167
168 if (__mapParams.lookup(L"TYPE", rValue) && !rValue.isEmpty()) {
169 if (!rValue.compareNoCase(L"GRID"))
170 __nType = TYPE_GRID;
171 else if (!rValue.compareNoCase(L"LIST"))
172 __nType = TYPE_LIST;
173 else if (!rValue.compareNoCase(L"ATTACH"))
174 __nType = TYPE_ATTACH;
175 else {
176 __DCL_TRACE1(L"Warning! Invalid Params: TYPE=%ls\n", rValue.data());
177 }
178 }
179
180 if (__mapParams.lookup(L"THUMBNAIL", rValue) && !rValue.isEmpty()) {
181 if (!rValue.compareNoCase(L"CHILD"))
182 __nThumbnail = TN_CHILD;
183 else if (!rValue.compareNoCase(L"SELF"))
184 __nThumbnail = TN_SELF;
185 else {
186 __DCL_TRACE1(L"Warning! Invalid Params: THUMBNAIL=%ls\n", rValue.data());
187 }
188 }
189}
190
191void MessageListView::onPrint(Session& session)
193{
195#ifdef __DCL_DEBUG
196// showNullMacro(true, true);
197#endif
198 SQLQuery& q = session.__query;
199 ListedStringToStringArrayMap& mapQuery = session.__ctx.__queryMap;
200
201 String strTableID = String::valueOf(__nTableID);
202 String strDsID = String::valueOf(__nDsID);
203
204 int nCurrentPart = Integer::parse(getDefault(mapQuery, L"part"), 10, 1);
205 int nRows = __nRows;
206 int nCols = __nCols;
207 int nFilter = __nFilter;
208
209 /*
210 strListPage n[&msg][&...], L"list=" of QUERY_STRING
211 strListPageEnc URLEncode(strListPage)
212 strThisPage n[&msg=n][&rows=n][&cols=n][&...] part 제외
213 strThisPageEx strThisPage + [&part=n][&list=strListPageEnc]
214 strThisPageEnc URLEncode(strThisPageEx)
215 */
216 String strDetailPage = __strDetailPage;
217 String strWritePage = __strWritePage;
218 String strListPage = getDefault(mapQuery, L"list");
219 String strListPageEnc;
220 StringBuilder strThisPage = __pPage->__strPageID;
221 String strThisPageEnc;
222 String strMsg = getDefault(mapQuery, L"msg");
223
224 if (strListPage.isEmpty())
225 strListPage = __strListPage;
226
227 strListPageEnc = URLEncoder::encode(strListPage);
228
229 if (!strMsg.isEmpty()) {
230 assign(L"MSG", strMsg);
231 strThisPage += L"&msg=" + strMsg;
232 }
233
234 if (!__strMsg.isEmpty())
235 strMsg = __strMsg;
236
237 if (!strMsg.isEmpty()) {
238 strMsg = strMsg.trim().trim(L",");
239
240 StringArray list;
241 if (strMsg.split(L',', list) > 0) {
242 if (*(list.begin()) == L"-1") {
243 nFilter = FILTER_DEPTH_1;
244 strMsg.clear();
245 }
246 }
247 }
248
249 if (__bOverride) {
250 String str = getDefault(mapQuery, L"rows");
251 if (!str.isEmpty()) {
252 nRows = Integer::parse(str, 10, nRows);
253 if (nRows <= 0)
254 nRows = __nRows;
255
256 strThisPage += L"&rows=" + String::valueOf(nRows);
257 }
258
259 if (__nType == TYPE_GRID) {
260 str = getDefault(mapQuery, L"cols");
261 if (!str.isEmpty()) {
262 nCols = Integer::parse(str, 10, nCols);
263 if (!(2 <= __nCols && __nCols <= 10))
264 nCols = __nCols;
265
266 strThisPage += L"&cols=" + String::valueOf(nCols);
267 }
268 }
269 }
270
271 TextTemplate* pROW = NULL;
272 TextTemplate* pNOTICE = NULL;
273 TextTemplate* pSTART = NULL;
274 TextTemplate* pREPLY = NULL;
275 TextTemplate* pEMPTY = NULL;
276 TextTemplate* pPADDING = NULL;
277
278 // 레코드를 위한 매크로 이름
279 // 서브템플릿 EMPTY, PADDING은 반드시 포함되어 있어야 한다.
280 String strRecName;
281 String strRowName = L"EMPTY";
282
283 pEMPTY = &((*this)[L"EMPTY"]);
284 if (__nType == TYPE_GRID) {
285 pROW = &((*this)[L"ROW"]);
286 pNOTICE = &((*pROW)[L"NOTICE"]);
287 pSTART = &((*pROW)[L"START"]);
288 pREPLY = &((*pROW)[L"REPLY"]);
289 pPADDING = &((*pROW)[L"PADDING"]);
290
291 strRecName = L"PADDING";
292 pROW->erase(L"NOTICE");
293 pROW->erase(L"START");
294 pROW->erase(L"REPLY");
295 erase(L"ROW");
296 }
297 else {
298 pNOTICE = &((*this)[L"NOTICE"]);
299 pSTART = &((*this)[L"START"]);
300 pREPLY = &((*this)[L"REPLY"]);
301
302 strRecName = L"EMPTY";
303 erase(L"NOTICE");
304 erase(L"START");
305 erase(L"REPLY");
306 }
307
308 assign(L"IS_GUEST", session.isSysGuest() ? L"true" : L"false");
309 assign(L"DETAIL", strDetailPage);
310 assign(L"WRITE", strWritePage);
311 assign(L"LIST", strListPage);
312 assign(L"_THIS", URLEncoder::encode(strThisPage));
313
314 if (nFilter & (FILTER_SELF | FILTER_CHILDREN)) {
315 // FILTER가 SELF, CHILDREN이면 "msg"를 사용한다.
316 if (strMsg.isEmpty()) {
317 assign(strRowName, *pEMPTY);
318 MessageView::onPrint(session);
319 return;
320 }
321 }
322
323 String strWhereEx;
324 switch(nFilter) {
325 default :
326 case FILTER_NOTICE | FILTER_START | FILTER_REPLY :
327 break;
328 case FILTER_NOTICE :
329 strWhereEx = L" AND M.MESSAGE_ID = M.START_ID AND M.MESSAGE_ID > 2000000000";
330 break;
331 case FILTER_START :
332 strWhereEx = L" AND M.MESSAGE_ID = M.START_ID AND M.MESSAGE_ID <= 2000000000";
333 break;
334 case FILTER_NOTICE | FILTER_START :
335 strWhereEx = L" AND M.MESSAGE_ID = M.START_ID";
336 break;
337 case FILTER_START | FILTER_REPLY :
338 strWhereEx = L" AND M.MESSAGE_ID <= 2000000000";
339 break;
340 case FILTER_SELF :
341 strWhereEx = L" AND M.MESSAGE_ID IN (L" + strMsg + L")";
342 break;
343 case FILTER_CHILDREN :
344 strWhereEx = L" AND M.PARENT_ID IN (L" + strMsg + L")";
345 break;
346 case FILTER_SELF | FILTER_CHILDREN :
347 strWhereEx = L" AND ((M.MESSAGE_ID IN (L" + strMsg + L") OR M.PARENT_ID IN (L" + strMsg + L")))";
348 break;
349 case FILTER_DEPTH_1 :
350 strWhereEx = L" AND (M.PARENT_ID = M.START_ID)";
351 break;
352 }
353
354 __DCL_ASSERT(nRows > 0 && nCols > 0);
355
356 TextTemplate* pPART_LINK = atP(L"PART_LINK");
357 int nUsingRecord = nRows;
358 if (__nType == TYPE_GRID)
359 nUsingRecord *= nCols;
360
361 int nTotalRecord = nUsingRecord;
362 int nTotalPart = 1;
363
364 // nNo를 표시하기 위해서 조건에 만족하는 전체레코드의 개수가 항상 필요하다.
365 // 2006.06.26
366// if (nCurrentPart != 1 || pPART_LINK)
367// {
368 q.execute(L""
369 "SELECT COUNT(*) "
370 " FROM DCL_MESSAGE_" + strTableID + L" AS M"
371 " WHERE M.DS_ID = " + strDsID + strWhereEx
372 );
373 q.fetch();
374 nTotalRecord = q.fields()[0].asInteger();
375
376 if (nTotalRecord == 0) {
377 assign(strRowName, *pEMPTY);
378
379 MessageView::onPrint(session);
380 return;
381 }
382
383 nTotalPart = nTotalRecord / nUsingRecord;
384 if (nTotalRecord % nUsingRecord)
385 nTotalPart++;
386// }
387 if (nCurrentPart <= 0 || nCurrentPart > nTotalPart)
388 nCurrentPart = nTotalPart;
389
390 StringBuilder strThisPageEx = strThisPage;
391 if (nCurrentPart > 1)
392 strThisPageEx += L"&part=" + String::valueOf(nCurrentPart);
393
394 if (!strListPageEnc.isEmpty())
395 strThisPageEx += L"&list=" + strListPageEnc;
396
397 strThisPageEnc = URLEncoder::encode(strThisPageEx);
398
399 assign(L"_LIST", strListPageEnc);
400 assign(L"_THIS", strThisPageEnc);
401 if (!session.isSysGuest()) {
402 TextTemplate& _ADD = (*this)[L"_ADD"];
403 _ADD.assign(L"WRITE", strWritePage);
404 _ADD.assign(L"PARENT_ID", L"0");
405 _ADD.assign(L"_LIST", strListPageEnc);
406 _ADD.assign(L"_THIS", strThisPageEnc);
407 assign(L"_ADD", _ADD);
408 }
409
410 StringBuilder strFieldEx;
411 switch(__nThumbnail) {
412 case TN_NONE :
413 break;
414 case TN_CHILD :
415 strFieldEx = L", M.CHILD_ID AS TN_ID";
416 break;
417 case TN_SELF :
418 strFieldEx = L", M.MESSAGE_ID AS TN_ID";
419 break;
420 default :
421 __DCL_ASSERT(false);
422 }
423
424 if (__nBodyLength >= 0)
425 strFieldEx += L", M.BODY_PLAIN";
426
427 String strFrom;
428 StringBuilder strOrderBy;
429 if (nFilter == FILTER_DEPTH_1)
430 strOrderBy = L"M.MESSAGE_ID DESC"; //"M.UPDATE_TIME DESC";
431 else
432 strOrderBy = L"M.START_ID " + __strSort + L", M.REPLY_ID ASC";
433
434 if (__nType == TYPE_ATTACH) {
435 strFrom = L"DCL_MESSAGE_A_" + strTableID + L" AS A"
436 "\n INNER JOIN DCL_MESSAGE_" + strTableID + L" AS M"
437 " ON (A.DS_ID = M.DS_ID AND A.MESSAGE_ID = M.MESSAGE_ID)";
438 strFieldEx += L", A.NO, A.FILENAME, A.NDOWNLOAD, A.ICON, CEILING(A.SIZE / 1024) AS KSIZE";
439 strOrderBy += L", A.NO ASC";
440 }
441 else {
442 strFrom = L"DCL_MESSAGE_" + strTableID + L" AS M";
443 }
444
445 int nOffset = (nCurrentPart - 1) * nUsingRecord;
446
447 String strSQL = L""
448 "SELECT M.DS_ID, M.MESSAGE_ID, M.REPLY_ID, M.NCHILD,"
449 "\n M.NREAD, M.NAGREE, M.NDISAGREE, (M.NAGREE + M.NDISAGREE) AS NVOTE,"
450 "\n (M.NAGREE - M.NDISAGREE) AS NDECISION, M.VOTE_END, M.TYPE AS BODY_TYPE,"
451 "\n M.SUBJECT, M.UPDATE_TIME, M.USER_ID, U.USER_NAME AS WRITER"
452 + strFieldEx.toString() + L""
453 "\n FROM " + strFrom.toString() + L""
454 "\n INNER JOIN DCLWC_USER AS U ON (M.USER_ID = U.USER_ID)" + L""
455 "\n WHERE M.DS_ID = " + strDsID + strWhereEx + L""
456 "\n ORDER BY " + strOrderBy.toString() + L""
457 "\n LIMIT " + String::valueOf(nUsingRecord) + L""
458 "\n OFFSET " + String::valueOf(nOffset);
459
460 __DCL_TRACE1(L"\n%ls\n", strSQL.data());
462
463 q.execute(strSQL);
464 __DCL_TRACE1(L"LIST_SQL: %ls\n", (DateTime::getCurrentLocalTime() - dtStartQ).toString().data());
465 q.fetch();
466 if (q.eof()) {
467 assign(strRowName, *pEMPTY);
468 }
469 else {
470 UpdateLink ul(atP(L"UPDATE_LINK"), strDetailPage, strWritePage, strThisPageEnc, strListPageEnc);
471 RecentIcon ri(atP(L"RECENT"), __nRecentHour);
472 RowGroup rg(atP(L"RGROUP"), __nGroup);
473
474 MessageTree mt(__nReplyDepth);
475 int nNo = 1;
476 if (!__bNoAsc)
477 nNo = nTotalRecord - ((nCurrentPart - 1) * nUsingRecord);
478 int nCol = 1; // for GRID
479 int nRow = 1;
480 do {
481 SQLFields& fields = q.fields();
482
483 int nMessageID = fields.byName(L"MESSAGE_ID").asInteger();
484 int64_t nReplyID = fields.byName(L"REPLY_ID").asInt64();
485 String strMessageID = String::valueOf(nMessageID);
486
488 mt.getPosition(nReplyID, rPos);
489
490 TextTemplate* pDest = NULL;;
491 if (rPos.nDepthIndex > 0) {
492 pDest = pREPLY;
493
494 StringBuilder strIndent;
495 for(int i = 0; i < rPos.nDepthIndex; i++)
496 strIndent += L"&nbsp; ";
497 pDest->assign(L"INDENT", strIndent);
498 }
499 else {
500 if (IS_NOTICE_ID(nMessageID))
501 pDest = pNOTICE;
502 else
503 pDest = pSTART;
504 }
505
506 ul.assign(pDest, fields, session, strMessageID, strListPage, mt, rPos);
507 rg.assign(pDest, nRow++);
508
509 pDest->assign(fields, L"&nbsp;");
510 pDest->assign(L"NO", String::valueOf(nNo));
511 if (__bNoAsc)
512 nNo++;
513 else
514 nNo--;
515 pDest->assign(L"WRITE", strWritePage);
516 pDest->assign(L"DETAIL", strDetailPage);
517 pDest->assign(L"_THIS", strThisPageEnc);
518 pDest->assign(L"_LIST", strListPageEnc);
519
520 if (__nThumbnail) {
521 StringBuilder strThumbnail = Files::dirname(session.__ctx.path());
522 SQLField& fTN_ID = fields.byName(L"TN_ID");
523 if (fTN_ID.asInteger() == 0)
524 strThumbnail += L"images/default_tn.gif";
525 else
526 strThumbnail += L"thumbnail/" + strDsID + L"/"
527 + fTN_ID.asString() + L"-1.dat.jpg";
528
529 pDest->assign(L"THUMBNAIL", strThumbnail);
530 }
531
532 String strSubject;
533 int nBodyType = fields.byName(L"BODY_TYPE").asInteger();
534 if (nBodyType < 0)
535 strSubject = L"삭제됨";
536 else {
537 strSubject = fields.byName(L"SUBJECT").asString();
538 if (strSubject.isEmpty())
539 strSubject = L"제목없음";
540 }
541 pDest->assign(L"SUBJECT", strSubject);
542 if (__nSubjectShort > 0) {
543 String strSubjectShort;
544 if ((ssize_t) strSubject.length() > __nSubjectShort)
545 strSubjectShort = strSubject.left(__nSubjectShort) + L"...";
546 else
547 strSubjectShort = strSubject;
548
549 pDest->assign(L"SUBJECT_SHORT", strSubjectShort);
550 }
551
552 if (__nBodyLength >= 0) {
553 String str = fields.byName(L"BODY_PLAIN").asString();
554 if (__nBodyLength > 0 && str.length() > (size_t) __nBodyLength)
555 str = str.left(__nBodyLength) + L"...";
556 pDest->assign(L"BODY_PLAIN", str);
557 }
558
559 DateTime dtUpdate = fields.byName(L"UPDATE_TIME").asDateTime();
560 pDest->assign(L"UPDATE_DATE", dtUpdate.date().toString());
561 ri.assign(pDest, dtUpdate);
562
563 if (__nType == TYPE_GRID) {
564 pROW->append(strRecName, *pDest);
565 if (nCol == __nCols) {
566 nCol = 1;
567 append(strRowName, *pROW);
568 pROW->reset();
569 }
570 else
571 nCol++;
572 }
573 else
574 append(strRowName, *pDest);
575
576 q.fetch();
577 } while(!q.eof());
578
579 if (__nType == TYPE_GRID && nCol > 1) {
580 for(; nCol <= __nCols; nCol++)
581 pROW->append(strRecName, *pPADDING);
582
583 append(strRowName, *pROW);
584 }
585 }
586 __DCL_TRACE1(L"LIST_ALL: %ls\n", (DateTime::getCurrentLocalTime() - dtStartA).toString().data());
587
588 if (pPART_LINK && nTotalPart > 1) {
589 PartLink pl(pPART_LINK, strThisPage, strListPageEnc);
590 pl.assign(this, nTotalPart, nCurrentPart, __nParts);
591 }
592
593 MessageView::onPrint(session);
594}
595
596__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
wchar_t char_t
Definition Config.h:247
#define __DCL_THROWS1(e)
Definition Config.h:152
#define IMPLEMENT_CLASSINFO_EX(class_name, base_class_name)
Definition HtmlView.h:37
#define IS_NOTICE_ID(nMessageID)
Definition MessageView.h:19
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
String toString() const
Definition DateTime.cpp:251
Date & date()
Definition DateTime.inl:152
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
static String dirname(const String &_path)
Definition Files.cpp:268
static int parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.inl:36
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
virtual void onPrint(Session &session) __DCL_THROWS1(Exception *)
Definition SQL.h:48
_CONST SQLField & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
Definition SQLQuery.cpp:77
_CONST SQLFields & fields() _CONST
Definition SQL.inl:101
void execute() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:316
bool eof() const
Definition SQL.inl:91
void fetch() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:336
static ByteString encode(const ByteString &_str)
Definition URI.cpp:82