67 __mapParams.lookup(L
"ATTACH_TITLE", __strAttachTitle);
70 if (
__mapParams.lookup(L
"PARTS", rValue) && !rValue.isEmpty()) {
72 if (__nParts < 5 || __nParts > 20)
76 if (
__mapParams.lookup(L
"ROWS", rValue) && !rValue.isEmpty()) {
82 if (
__mapParams.lookup(L
"FILTER", rValue) && !rValue.isEmpty()) {
84 rValue.split(L
',', list);
85 StringArray::Iterator itList = list.begin();
86 for(; itList != list.end(); itList++) {
88 if (!(*itList).isEmpty()) {
89 if (!(*itList).compareNoCase(L
"SELF"))
90 __nFilter |= FILTER_SELF;
91 else if (!(*itList).compareNoCase(L
"CHILDREN"))
92 __nFilter |= FILTER_CHILDREN;
95 __DCL_TRACE1(L
"Warning! Invalid Params: FILTER=%ls\n", rValue.data());
101 if (
__mapParams.lookup(L
"MSG", rValue) && !rValue.isEmpty()) {
102 __strMsg = rValue.trim(L
" ,");
105 if (
__mapParams.lookup(L
"SORT", rValue) && !rValue.isEmpty()) {
106 if (!rValue.compareNoCase(L
"ASC") || !rValue.compareNoCase(L
"DESC"))
109 __DCL_TRACE1(L
"Warning! Invalid Params: SORT=%ls\n", rValue.data());
119 if (
__mapParams.lookup(L
"SUBJECT", rValue) && !rValue.isEmpty()) {
121 rValue.split(L
',', list);
122 StringArray::Iterator itList = list.begin();
123 for(; itList != list.end(); itList++) {
125 if (!(*itList).isEmpty()) {
126 if (!(*itList).compareNoCase(L
"PARENT"))
127 __nSubject |= SUBJECT_PARENT;
128 else if (!(*itList).compareNoCase(L
"PREV"))
129 __nSubject |= SUBJECT_PREV;
130 else if (!(*itList).compareNoCase(L
"NEXT"))
131 __nSubject |= SUBJECT_NEXT;
134 __DCL_TRACE1(L
"Warning! Invalid Params: SUBJECT=%ls\n", rValue.data());
147 ListedStringToStringArrayMap& mapQuery = session.__ctx.__queryMap;
150 String strTableID = String::valueOf(
__nTableID);
151 String strDsID = String::valueOf(
__nDsID);
152 String strUserID = String::valueOf(session.__nUserID);
164 String strListPage =
getDefault(mapQuery, L
"list");
165 String strListPageEnc;
166 String strWritePage = __strWritePage;
167 String strDetailPage =
__pPage->__strPageID;
168 StringBuilder strThisPage =
__pPage->__strPageID;
170 bool bAddParentToList =
false;
172 if (strListPage.isEmpty()) {
173 bAddParentToList = __strListPage.contains(L
"&msg");
174 strListPage = __strListPage;
179 if (!__strMsg.isEmpty())
182 strMsg = String::join(mapQuery[L
"msg"], L
',',
false);
184 TextTemplate* pNOTICE = &(*this)[L
"NOTICE"];
185 TextTemplate* pSTART = &(*this)[L
"START"];
186 TextTemplate* pREPLY = &(*this)[L
"REPLY"];
187 TextTemplate& EMPTY = (*this)[L
"EMPTY"];
189 assign(L
"IS_GUEST", session.isSysGuest() ? L
"true" : L
"false");
190 assign(L
"WRITE", strWritePage);
191 assign(L
"LIST", strListPage);
192 EMPTY.assign(L
"LIST", strListPage);
194 if (strMsg.isEmpty()) {
195 assign(L
"EMPTY", EMPTY);
198 strThisPage += L
"&msg=" + strMsg;
204 strWhereEx = L
" AND M.MESSAGE_ID IN (" + strMsg + L
")";
206 case FILTER_CHILDREN :
207 strWhereEx = L
" AND M.PARENT_ID IN (" + strMsg + L
")";
209 case FILTER_SELF | FILTER_CHILDREN :
210 strWhereEx = L
" AND (M.MESSAGE_ID IN (" + strMsg + L
") OR M.PARENT_ID IN (L" + strMsg + L
"))";
216 TextTemplate* pPART_LINK = atP(L
"PART_LINK");
217 int nUsingRecord = nRows;
218 int nTotalRecord = nUsingRecord;
220 if (nCurrentPart != 1 || pPART_LINK) {
223 "\n FROM DCL_MESSAGE_" + strTableID + L
" AS M"
224 "\n WHERE M.DS_ID = " + strDsID + strWhereEx
227 nTotalRecord = q.
fields()[0].asInteger();
229 if (nTotalRecord == 0) {
230 assign(L
"EMPTY", EMPTY);
236 nTotalPart = nTotalRecord / nUsingRecord;
237 if (nTotalRecord % nUsingRecord)
241 if (nCurrentPart <= 0 || nCurrentPart > nTotalPart)
242 nCurrentPart = nTotalPart;
244 StringBuilder strThisEx = strThisPage;
245 if (nCurrentPart > 1)
246 strThisEx += L
"&part=" + String::valueOf(nCurrentPart);
248 if (!strListPageEnc.isEmpty())
249 strThisEx += L
"&list=" + strListPageEnc;
253 assign(L
"_LIST", strListPageEnc);
254 assign(L
"_THIS", strThisEnc);
256 StringBuilder strFieldEx;
257 StringBuilder strJoinEx;
259 if (__nSubject & SUBJECT_PARENT) {
260 strJoinEx += L
"\n LEFT OUTER JOIN DCL_MESSAGE_" + strTableID + L
""
261 " AS P\n ON (M.DS_ID = P.DS_ID AND M.PARENT_ID = P.MESSAGE_ID)";
263 strFieldEx += L
", P.SUBJECT AS P_SUBJECT";
265 if (__nSubject & SUBJECT_PREV) {
268 if (__nSubject & SUBJECT_NEXT) {
272 int nOffset = (nCurrentPart - 1) * nUsingRecord;
275 "SELECT M.MESSAGE_ID, M.PREV_ID, M.NEXT_ID, M.PARENT_ID, M.REPLY_ID,"
276 "\n M.NCHILD, M.TYPE AS BODY_TYPE,"
277 "\n M.USER_ID, M.SUBJECT, M.BODY_HTML, M.UPDATE_TIME,"
278 "\n M.NREAD, M.NAGREE, M.NDISAGREE, (M.NAGREE + M.NDISAGREE) AS NVOTE,"
279 "\n (M.NAGREE - M.NDISAGREE) AS NDECISION, M.VOTE_END,"
280 "\n U.USER_NAME AS WRITER, R.USER_ID AS R_USER_ID"
281 + strFieldEx.toString() + L
""
282 "\n FROM DCL_MESSAGE_" + strTableID + L
" AS M"
283 "\n INNER JOIN DCLWC_USER U ON (M.USER_ID = U.USER_ID)"
284 "\n LEFT OUTER JOIN DCL_MESSAGE_R_" + strTableID + L
" AS R"
285 "\n ON (M.DS_ID = R.DS_ID AND M.MESSAGE_ID = R.MESSAGE_ID"
286 " AND R.USER_ID = " + strUserID + L
")"
287 + strJoinEx.toString() + L
""
288 "\n WHERE M.DS_ID = " + strDsID + strWhereEx + L
""
289 "\n ORDER BY M.START_ID " + __strSort + L
", M.REPLY_ID ASC"
290 "\n LIMIT " + String::valueOf(nUsingRecord) + L
""
291 "\n OFFSET " + String::valueOf(nOffset);
298 assign(L
"EMPTY", EMPTY);
301 UpdateLink ul(atP(L
"UPDATE_LINK"), strDetailPage, strWritePage, strThisEnc, strListPageEnc);
302 SiblingLink sl(atP(L
"SIBLING_LINK"), strDetailPage, strListPageEnc);
309 "SELECT NO, NDOWNLOAD, FILENAME, TYPE, ICON, CEILING(SIZE / 1024) AS KSIZE"
310 "\n FROM DCL_MESSAGE_A_" + strTableID + L
""
311 "\n WHERE DS_ID = " + strDsID + L
""
312 "\n AND MESSAGE_ID = :MESSAGE_ID"
316 "INSERT INTO DCL_MESSAGE_R_" + strTableID + L
""
317 "\n (DS_ID, MESSAGE_ID, USER_ID, NVOTE, UPDATE_TIME)"
318 "\n VALUES (L" + strDsID + L
", :MESSAGE_ID, L" + strUserID
319 + L
", 0, CURRENT_TIMESTAMP)"
322 "UPDATE DCL_MESSAGE_" + strTableID + L
""
323 "\n SET NREAD = NREAD + 1"
324 "\n WHERE DS_ID = " + strDsID + L
""
325 "\n AND MESSAGE_ID = :MESSAGE_ID"
329 TextTemplate* pDest =
NULL;
331 int nMessageID = fields.
byName(L
"MESSAGE_ID").asInteger();
332 int64_t nReplyID = fields.
byName(L
"REPLY_ID").asInt64();
333 int nUserID = fields.
byName(L
"USER_ID").asInteger();
334 String strMessageID = String::valueOf(nMessageID);
351 pDest->assign(L
"VNO",
VNO());
352 if (bAddParentToList) {
353 StringBuilder str = strListPage + L
"=";
354 str += fields.
byName(L
"PARENT_ID").asString();
357 pDest->assign(L
"LIST", str);
358 sl.
assign(pDest, fields, strListPageEnc);
361 pDest->assign(L
"LIST", strListPage);
364 ul.
assign(pDest, fields, session, strMessageID, strListPage, mt, rPos);
367 pDest->assign(fields, L
" ");
368 pDest->assign(L
"UPDATE_DATE", fields.
byName(L
"UPDATE_TIME").asDate().
toString());
370 if (__nSubject & SUBJECT_PARENT) {
374 str = field.asString();
377 append(L
"P_SUBJECT", str);
380 int nBodyType = fields.
byName(L
"BODY_TYPE").asInteger();
382 StringBuilder strBodyHtml = L
"<span style=\"color:red\">(L";
384 strBodyHtml += L
"글쓴이가 글을 삭제했습니다";
386 strBodyHtml += L
"관리자에 의해 삭제되었습니다.";
387 strBodyHtml += L
")</span>";
389 pDest->assign(L
"SUBJECT", L
"삭제됨");
390 pDest->assign(L
"BODY_HTML", strBodyHtml);
393 if (fields.
byName(L
"SUBJECT").asString().isEmpty())
394 pDest->assign(L
"SUBJECT", L
"제목없음");
397 TextTemplate* pATTACH = pDest->atP(L
"ATTACH");
398 TextTemplate* pIMAGE = pDest->atP(L
"IMAGE");
399 if (pATTACH || pIMAGE) {
400 pDest->assign(L
"ATTACH_TITLE", __strAttachTitle);
402 qAttach.
params()[0].setValue(nMessageID);
406 while (!qAttach.
eof()) {
407 String strType = qAttach.
fields().
byName(L
"TYPE").asString();
409 pATTACH->assign(L
"SELF",
SELF());
410 pATTACH->assign(L
"MESSAGE_ID", strMessageID);
411 pATTACH->assign(qAttach.
fields(), String());
413 pDest->assign(L
"ATTACH", *pATTACH);
415 pDest->append(L
"ATTACH", *pATTACH);
417 if (pIMAGE && strType.compareNoCase(L
"image", 5) == 0) {
418 pIMAGE->assign(L
"SELF",
SELF());
419 pIMAGE->assign(L
"MESSAGE_ID", strMessageID);
420 pIMAGE->assign(qAttach.
fields(), String());
422 pDest->assign(L
"IMAGE", *pIMAGE);
424 pDest->append(L
"IMAGE", *pIMAGE);
431 if (!session.isSysGuest() && session.__nUserID != nUserID
432 && fields.
byName(L
"R_USER_ID").isNull()
434 qInsert.
params()[0].setValue(nMessageID);
436 qUpdate.
params()[0].setValue(nMessageID);
441 String::valueOf(fields.
byName(L
"NREAD").asInteger() + 1)
444 append(L
"EMPTY", *pDest);
449 if (pPART_LINK && nTotalPart > 1) {
450 PartLink pl(pPART_LINK, strThisPage, strListPageEnc);
451 pl.
assign(
this, nTotalPart, nCurrentPart, __nParts);
463 ListedStringToStringArrayMap& mapQuery = ctx.__queryMap;
464 ListedStringToStringArrayMap::ConstIterator itM = mapQuery.find(L
"msg");
465 if (itM == mapQuery.end() || (*itM).value.isEmpty()) {
470 String strMessageID = (*itM).value[0];
471 String strTableID = String::valueOf(
__nTableID);
472 String strDsID = String::valueOf(
__nDsID);
474 ListedStringToStringArrayMap::ConstIterator itA = mapQuery.find(L
"attach");
475 if (itA != mapQuery.end() && (*itA).value.size() > 0) {
478 "SELECT FILENAME, TYPE"
479 "\n FROM DCL_MESSAGE_A_" + strTableID + L
""
480 "\n WHERE DS_ID = " + strDsID + L
""
481 "\n AND MESSAGE_ID = " + strMessageID + L
""
482 "\n AND NO = " + (*itA).value[0]
486 String strFileName =
__pPage->site()->strAttachmentDir
487 + String::valueOf(
__nDsID) + L
"/"
488 + (*itM).value[0] + L
"-"
489 + (*itA).value[0] + L
".dat";
493 String strName = q.
fields()[0].asString();
494 String strType = q.
fields()[1].asString();
498 ctx.setContentType(strType);
500 HttpHeader(L
"Content-Length", String::valueOf(nLen))
504 L
"Content-Disposition",
505 L
"inline; filename=\"" + strName + L
"\""
511 while((n = in.read(aBuf, 4096)) > 0) {
521 if (!session.isSysGuest())
534 ListedStringToStringArrayMap::ConstIterator itC = mapQuery.find(L
"c");
535 if (itC != mapQuery.end() && (*itC).value.size() > 0) {
536 String strCM = (*itC).value[0];
537 if (strCM == L
"good")
539 else if (strCM == L
"bad")
541 else if (strCM == L
"erase")
546 String strUserID = String::valueOf(session.__nUserID);
548 "SELECT NVOTE FROM DCL_MESSAGE_R_" + strTableID + L
""
549 "\n WHERE DS_ID = " + strDsID + L
""
550 "\n AND MESSAGE_ID = " + strMessageID + L
""
551 "\n AND USER_ID = " + strUserID
555 if (q.
fields()[0].asInteger() == 0) {
557 "UPDATE DCL_MESSAGE_R_" + strTableID + L
""
558 "\n SET VOTE = " + String::valueOf(nCM) + L
""
559 "\n WHERE DS_ID = " + strDsID + L
""
560 "\n AND MESSAGE_ID = " + strMessageID + L
""
561 "\n AND USER_ID = " + strUserID
566 "UPDATE DCL_MESSAGE_" + strTableID + L
""
567 "\n SET NVOTE = NVOTE + 1 "
568 "\n WHERE DS_ID = " + strDsID + L
""
569 "\n AND MESSAGE_ID = " + strMessageID
573 "UPDATE DCL_MESSAGE_" + strTableID + L
""
574 "\n SET NBAD = NBAD + 1 "
575 "\n WHERE DS_ID = " + strDsID + L
""
576 "\n AND MESSAGE_ID = " + strMessageID
583 "SELECT M.USER_ID, A.NO"
584 "\n FROM DCL_MESSAGE_" + strTableID + L
" AS M"
585 "\n LEFT OUTER JOIN DCL_MESSAGE_A_" + strTableID + L
" AS A"
586 "\n ON (M.DS_ID = A.DS_ID AND M.MESSAGE_ID = A.MESSAGE_ID)"
587 "\n WHERE M.DS_ID = " + strDsID + L
""
588 "\n AND M.MESSAGE_ID = " + strMessageID + L
""
589 "\n AND M.SUBJECT IS NOT NULL"
594 int nUserID = q.
fields()[0].asInteger();
595 if (session.isSysAdmin() || session.__nUserID == nUserID) {
596 if (!q.
fields()[1].isNull()) {
600 __pPage->site()->strAttachmentDir,
612 "DELETE FROM DCL_MESSAGE_A_" + strTableID + L
""
613 "\n WHERE DS_ID = " + strDsID + L
""
614 "\n AND MESSAGE_ID = " + strMessageID
619 if (session.__nUserID == nUserID)
625 "UPDATE DCL_MESSAGE_" + strTableID + L
""
626 "\n SET TYPE = " + strBodyType + L
""
627 "\n ,SUBJECT = NULL, BODY_ORG = NULL, BODY_PLAIN = NULL"
628 "\n ,BODY_HTML = :BODY_HTML, UPDATE_TIME = CURRENT_TIMESTAMP"
629 "\n WHERE DS_ID = " + strDsID + L
""
630 "\n AND MESSAGE_ID = " + strMessageID
634 String strListPage =
getDefault(mapQuery, L
"l");
635 if (strListPage.isEmpty())
636 strListPage = __strListPage;
637 String strRefresh = L
"?p=" + strListPage;
638 __pPage->refresh(session, strRefresh);