18#if __DCL_HAVE_THIS_FILE__
29static const wchar_t* __dsTypeName(
int nDsType)
36 return L
"Invalid DsType";
41DataSourceListView::DataSourceListView(
HtmlPage* pPage)
51void DataSourceListView::init(
SQLFields& fields)
56 __mapParams.lookup(L
"DETAIL", __strDetailPage);
57 __mapParams.lookup(L
"WRITE", __strWritePage);
61 if (__mapParams.lookup(L
"PARTS", rValue) && !rValue.isEmpty()) {
63 if (__nParts < 5 || __nParts > 20)
67 if (__mapParams.lookup(L
"ROWS", rValue) && !rValue.isEmpty()) {
73 if (__mapParams.lookup(L
"SHORT_COMMENT", rValue) && !rValue.isEmpty()) {
79 if (__mapParams.lookup(L
"NO", rValue)) {
80 if (!rValue.compareNoCase(L
"ASC"))
84 if (__mapParams.lookup(L
"FILTER", rValue)) {
85 if (!rValue.compareNoCase(L
"ALL"))
90void DataSourceListView::onPrint(
Session& session)
95 ListedStringToStringArrayMap& mapQuery = session.
__ctx.__queryMap;
102 String strListPage =
getDefault(mapQuery, L
"list");
104 StringBuilder strThisPage =
__pPage->__strPageID;
105 String strThisPageEnc;
107 String strDsType =
getDefault(mapQuery, L
"type");
108 String strUserID =
getDefault(mapQuery, L
"user");
112 TextTemplate* pUSER = atP(L
"USER");
115 "SELECT USER_ID, USER_NAME"
117 "\n WHERE -1 < USER_ID"
119 "\n ORDER BY USER_ID"
123 pUSER->assign(q.
fields(), L
"");
124 append(L
"USER", *pUSER);
130 StringBuilder strWhere = L
"\n WHERE D.DS_ID ";
132 strWhere += L
"> -10";
136 if (!strUserID.isEmpty()) {
138 "SELECT USER_ID, USER_NAME"
140 "\n WHERE USER_ID = " + String::valueOf(nUserID)
146 strWhere += L
" AND D.USER_ID = " + strUserID;
147 strThisPage += L
"&user=" + strUserID;
150 if (!strDsType.isEmpty()) {
151 strWhere += L
" AND D.DS_TYPE = " + strDsType;
152 strThisPage += L
"&type=" + strDsType;
155 assign(L
"DETAIL", strDetailPage);
156 assign(L
"WRITE", strWritePage);
157 assign(L
"LIST", strListPage);
159 assign(L
"USER_ID", strUserID);
160 assign(L
"TYPE", strDsType);
162 int nUsingRecord = nRows;
163 int nTotalRecord = nUsingRecord;
169 "\n FROM DCL_DATA_SOURCE AS D"
170 + strWhere.toString()
173 nTotalRecord = q.
fields()[0].asInteger();
174 if (nTotalRecord == 0) {
175 assign(L
"EMPTY", (*
this)[L
"EMPTY"]);
182 nTotalPart = nTotalRecord / nUsingRecord;
183 if (nTotalRecord % nUsingRecord)
186 if (nCurrentPart <= 0 || nCurrentPart > nTotalPart)
187 nCurrentPart = nTotalPart;
189 StringBuilder strThisPageEx = strThisPage;
190 if (nCurrentPart > 1)
191 strThisPageEx += L
"&part=" + String::valueOf(nCurrentPart);
192 if (!strListPageEnc.isEmpty())
193 strThisPageEx += L
"&list=" + strListPageEnc;
196 assign(L
"_LIST", strListPageEnc);
197 assign(L
"_THIS", strThisPageEnc);
199 int nOffset = (nCurrentPart - 1) * nUsingRecord;
200 int nNo = nTotalRecord - ((nCurrentPart - 1) * nUsingRecord);
202 TextTemplate& DS = (*this)[L
"DS"];
205 "SELECT D.USER_ID, D.DS_ID, D.DS_NAME, D.DS_TYPE, D.TABLE_ID"
206 ", D.COMMENT, D.UPDATE_TIME, U.USER_NAME"
207 "\n FROM DCL_DATA_SOURCE AS D"
208 "\n INNER JOIN DCL_USER AS U ON (D.USER_ID = U.USER_ID)"
209 + strWhere.toString() + L
""
210 "\n ORDER BY D.USER_ID, D.DS_ID"
211 "\n LIMIT " + String::valueOf(nUsingRecord) + L
""
212 "\n OFFSET " + String::valueOf(nOffset);
219 assign(L
"EMPTY", (*
this)[L
"EMPTY"]);
225 DS.assign(q.
fields(), L
" ");
226 DS.assign(L
"DS_TYPE_NAME",
227 __dsTypeName(q.
fields().
byName(L
"DS_TYPE").asInteger()));
235 strShort = L
" ";
238 DS.assign(L
"SHORT_COMMENT", strShort);
239 DS.assign(L
"COMMENT", strLong);
242 DS.assign(L
"NO", String::valueOf(nNo));
247 DS.assign(L
"DETAIL", strDetailPage);
248 DS.assign(L
"WRITE", strWritePage);
249 DS.assign(L
"_THIS", strThisPageEnc);
251 append(L
"EMPTY", DS);
255 TextTemplate* pPART_LINK = atP(L
"PART_LINK");
256 if (pPART_LINK && nTotalPart > 1) {
257 PartLink pl(pPART_LINK, strThisPage, String());
258 pl.assign(
this, nTotalPart, nCurrentPart,
__nParts);
267DataSourceWriteForm::DataSourceWriteForm(
HtmlPage* pPage)
272void DataSourceWriteForm::init(
SQLFields& fields)
277 __mapParams.lookup(L
"DETAIL", __strDetailPage);
278 __mapParams.lookup(L
"LIST", __strListPage);
281void DataSourceWriteForm::onPrint(
Session& session)
284 ListedStringToStringArrayMap& mapQuery = session.
__ctx.__queryMap;
287 String strUserID = getDefault(mapQuery, L
"user");
288 String strDsID = getDefault(mapQuery, L
"ds");
289 String strListPage = getDefault(mapQuery, L
"list");
290 if (!strListPage.isEmpty()) {
292 assign(L
"_LIST", strListPageEnc);
295 strListPage = __strListPage;
297 assign(L
"LIST", strListPage);
308 if (!strUserID.isEmpty()) {
309 append(L
"ACTION", L
"&user=" + strUserID);
310 if (!strDsID.isEmpty()) {
312 append(L
"ACTION", L
"&ds=" + strDsID);
319 FormView::onPrint(session);
325 "SELECT ROLE_ID, ROLE_NAME FROM DCL_ROLE"
326 "\n WHERE ROLE_ID > 0"
327 "\n ORDER BY ROLE_ID"
331 ROLE.assign(q.
fields(), L
"");
332 append(L
"ROLE", ROLE);
338 "SELECT D.USER_ID, D.DS_ID, D.DS_NAME"
339 ", D.DS_TYPE, D.TABLE_ID, D.COMMENT"
340 ", D.REPLY_DEPTH, D.SEQUENCE, D.MESSAGE_ID, D.NOTICE_ID"
341 ", D.START_WPERM_ID, D.REPLY_WPERM_ID, D.ATTACH_RPERM_ID"
343 "\n FROM DCL_DATA_SOURCE AS D"
344 "\n INNER JOIN DCL_USER AS U ON (D.USER_ID = U.USER_ID)"
345 "\n WHERE D.USER_ID = " + strUserID + L
""
346 "\n AND D.DS_ID = " + strDsID
352 assign(L
"REPLY_WIDTH",
369 "SELECT USER_ID, USER_NAME"
371 "\n WHERE USER_ID = " + strUserID
378 "SELECT MAX(TABLE_ID)"
379 "\n FROM DCL_DATA_SOURCE"
380 "\n WHERE TABLE_ID >= 0"
386 nTableID = q.
fields()[0].asInteger() + 1;
387 assign(L
"_TABLE_ID", String::valueOf(nTableID));
391 "\n FROM DCL_DATA_SOURCE"
392 "\n WHERE USER_ID = " + strUserID
396 if (!q.
fields()[0].isNull())
397 nDsID += q.
fields()[0].asInteger();
398 assign(L
"_DS_ID", String::valueOf(nDsID));
407 FormView::onPrint(session);
410static void __CreateTables(
SQLQuery& q,
int nDsType,
int nTableID);
412void DataSourceWriteForm::onPost(
Session& session)
418 ListedStringToStringArrayMap& mapQuery = session.
__ctx.__queryMap;
419 ListedStringToStringArrayMap& mapForm = session.
__ctx.__formMap;
422 String strUserID = getDefault(mapQuery, L
"user");
423 String strDsID = getDefault(mapQuery, L
"ds");
434 if (!strUserID.isEmpty()) {
435 if (!strDsID.isEmpty())
439 strDsID = getDefault(mapForm, L
"DS_ID");
444 String strListPage = getDefault(mapQuery, L
"list");
445 if (strListPage.isEmpty())
446 strListPage = __strListPage;
447 __pPage->refresh(session, L
"?page=" + strListPage);
453 int nDsType =
Integer::parse(getDefault(mapForm, L
"DS_TYPE"), 10, 0);
454 int nTableID =
Integer::parse(getDefault(mapForm, L
"TABLE_ID"), 10, 0);
455 int nReplyDepth =
Integer::parse(getDefault(mapForm, L
"REPLY_DEPTH"), 10, 2);
456 int nSequence =
Integer::parse(getDefault(mapForm, L
"SEQUENCE"), 10, -1);
457 int nStartWPermID =
Integer::parse(getDefault(mapForm, L
"START_WPERM_ID"), 10, 0);
458 int nReplyWPermID =
Integer::parse(getDefault(mapForm, L
"REPLY_WPERM_ID"), 10, 0);
459 int nAttachRPermID =
Integer::parse(getDefault(mapForm, L
"ATTACH_RPERM_ID"), 10, 0);
460 String strDsName = getDefault(mapForm, L
"DS_NAME");
461 String strComment = getDefault(mapForm, L
"COMMENT");
463 if (nUserID < 0 || strDsName.isEmpty()) {
467 L
"메시지소스를 생성하는데 필요한 필수 입력값이 잘못되었습니다."
473 "SELECT DISTINCT TABLE_ID"
474 "\n FROM DCL_DATA_SOURCE"
475 "\n WHERE DS_TYPE = " + String::valueOf(nDsType) + L
""
476 "\n AND TABLE_ID = " + String::valueOf(nTableID)
480 __CreateTables(q, nDsType, nTableID);
484 String strOldTableID;
488 "INSERT INTO DCL_DATA_SOURCE(L"
489 "USER_ID, DS_ID, DS_NAME, DS_TYPE, TABLE_ID"
490 ", COMMENT, UPDATE_TIME"
491 ", REPLY_DEPTH, SEQUENCE, MESSAGE_ID, NOTICE_ID"
492 ", START_WPERM_ID, REPLY_WPERM_ID, ATTACH_RPERM_ID"
495 ":USER_ID, :DS_ID, :DS_NAME, :DS_TYPE, :TABLE_ID"
496 ", :COMMENT, CURRENT_TIMESTAMP"
497 ", :REPLY_DEPTH, :SEQUENCE, :MESSAGE_ID, :NOTICE_ID"
498 ", :START_WPERM_ID, :REPLY_WPERM_ID, :ATTACH_RPERM_ID"
504 q.
execute(L
"SET AUTOCOMMIT = 0");
508 "SELECT DS_TYPE, TABLE_ID, REPLY_DEPTH, SEQUENCE, MESSAGE_ID, NOTICE_ID"
509 "\n FROM DCL_DATA_SOURCE"
510 "\n WHERE USER_ID = " + strUserID + L
""
511 "\n AND DS_ID = " + strDsID + L
""
516 if ((q.
fields()[1].asInteger() != nTableID)
517 || (q.
fields()[2].asInteger() != nReplyDepth)
518 || (q.
fields()[3].asInteger() != nSequence)
522 nOldDsType = q.
fields()[0].asInteger();
523 strOldTableID = q.
fields()[1].asString();
528 "DELETE FROM DCL_MESSAGE_A_" + strOldTableID + L
""
529 "\n WHERE USER_ID = " + strUserID + L
" AND DS_ID = " + strDsID
532 "DELETE FROM DCL_MESSAGE_R_" + strOldTableID + L
""
533 "\n WHERE USER_ID = " + strUserID + L
" AND DS_ID = " + strDsID
536 "DELETE FROM DCL_MESSAGE_" + strOldTableID + L
""
537 "\n WHERE USER_ID = " + strUserID + L
" AND DS_ID = " + strDsID
545 "UPDATE DCL_DATA_SOURCE SET"
546 " DS_NAME = :DS_NAME"
547 ", TABLE_ID = :TABLE_ID"
548 ", COMMENT = :COMMENT"
549 ", UPDATE_TIME = CURRENT_TIMESTAMP"
550 ", REPLY_DEPTH = :REPLY_DEPTH"
551 ", SEQUENCE = :SEQUENCE"
552 ", MESSAGE_ID = :MESSAGE_ID"
553 ", NOTICE_ID = :NOTICE_ID"
554 ", START_WPERM_ID = :START_WPERM_ID"
555 ", REPLY_WPERM_ID = :REPLY_WPERM_ID"
556 ", ATTACH_RPERM_ID = :ATTACH_RPERM_ID"
557 "\n WHERE USER_ID = :USER_ID"
558 "\n AND DS_ID = :DS_ID"
563 params.
byName(L
"USER_ID").setValue(nUserID);
564 params.
byName(L
"DS_ID").setValue(nDsID);
565 params.
byName(L
"DS_NAME").setValue(strDsName);
566 if (strComment.isEmpty())
567 params.
byName(L
"COMMENT").setNull();
569 params.
byName(L
"COMMENT").setValue(strComment);
572 params.
byName(L
"DS_TYPE").setValue(nDsType);
574 params.
byName(L
"TABLE_ID").setValue(nTableID);
576 params.
byName(L
"REPLY_DEPTH").setValue(nReplyDepth);
577 params.
byName(L
"SEQUENCE").setValue(nSequence);
580 params.
byName(L
"START_WPERM_ID").setValue(nStartWPermID);
581 params.
byName(L
"REPLY_WPERM_ID").setValue(nReplyWPermID);
582 params.
byName(L
"ATTACH_RPERM_ID").setValue(nAttachRPermID);
587 q.
execute(L
"SET AUTOCOMMIT = 1");
592 "SELECT DISTINCT TABLE_ID"
593 "\n FROM DCL_DATA_SOURCE"
594 "\n WHERE DS_TYPE = " + String::valueOf(nOldDsType) + L
""
595 "\n AND TABLE_ID = " + strOldTableID
599 switch (nOldDsType) {
601 q.
execute(L
"DROP TABLE DCL_MESSAGE_A_" + strOldTableID);
602 q.
execute(L
"DROP TABLE DCL_MESSAGE_R_" + strOldTableID);
603 q.
execute(L
"DROP TABLE DCL_MESSAGE_" + strOldTableID);
611 StringBuilder strNext = getDefault(mapQuery, L
"next");
612 if (strNext.isEmpty()) {
613 strNext = __strDetailPage;
614 strNext += L
"&user=" + String::valueOf(nUserID)
615 + L
"&ds=" + String::valueOf(nDsID);
618 String strListPage = getDefault(mapQuery, L
"list");
619 if (!strListPage.isEmpty())
622 __pPage->refresh(session, L
"?page=" + strNext.toString());
627DataSourceDetailView::DataSourceDetailView(
HtmlPage* pPage)
632void DataSourceDetailView::init(
SQLFields& fields)
637 __mapParams.lookup(L
"LIST", __strListPage);
638 __mapParams.lookup(L
"WRITE", __strWritePage);
641void DataSourceDetailView::onPrint(
Session& session)
644 ListedStringToStringArrayMap& mapQuery = session.
__ctx.__queryMap;
647 String strListPage = getDefault(mapQuery, L
"list");
648 String strListPageEnc;
649 String strWritePage = __strWritePage;
650 if (strListPage.isEmpty())
651 strListPage = __strListPage;
655 assign(L
"LIST", strListPage);
656 assign(L
"_LIST", strListPageEnc);
657 assign(L
"WRITE", strWritePage);
659 String strUserID = getDefault(mapQuery, L
"user");
660 String strMsIDs = String::join(mapQuery[L
"ds"], L
',');
665 if (strUserID.isEmpty() || strMsIDs.isEmpty()) {
666 assign(L
"EMPTY", EMPTY);
672 "SELECT D.USER_ID, D.DS_ID, D.DS_NAME, D.DS_TYPE, D.TABLE_ID"
673 ", D.COMMENT, D.UPDATE_TIME"
674 ", D.REPLY_DEPTH, D.SEQUENCE, D.MESSAGE_ID, D.NOTICE_ID"
675 ", D.START_WPERM_ID, D.REPLY_WPERM_ID, D.ATTACH_RPERM_ID"
676 ", U.USER_NAME, S.ROLE_NAME AS START_WPERM"
677 ", R.ROLE_NAME AS REPLY_WPERM, A.ROLE_NAME AS ATTACH_RPERM"
678 "\n FROM DCL_DATA_SOURCE AS D"
679 "\n INNER JOIN DCL_USER AS U ON (D.USER_ID = U.USER_ID)"
680 "\n INNER JOIN DCL_ROLE AS S ON (D.START_WPERM_ID = S.ROLE_ID)"
681 "\n INNER JOIN DCL_ROLE AS R ON (D.REPLY_WPERM_ID = R.ROLE_ID)"
682 "\n INNER JOIN DCL_ROLE AS A ON (D.ATTACH_RPERM_ID = A.ROLE_ID)"
683 "\n WHERE D.USER_ID = " + strUserID + L
""
684 "\n AND D.DS_ID IN (" + strMsIDs + L
")"
685 "\n ORDER BY D.DS_ID"
690 assign(L
"EMPTY", EMPTY);
693 DS.assign(q.
fields(), L
" ");
694 int nDsType = q.
fields().
byName(L
"DS_TYPE").asInteger();
695 DS.assign(L
"DS_TYPE_NAME", __dsTypeName(nDsType));
697 DS.assign(L
"REPLY_WIDTH",
705 int nSequence = q.
fields().
byName(L
"SEQUENCE").asInteger();
707 DS.assign(L
"SEQUENCE_NAME", L
"내림차순");
709 DS.assign(L
"SEQUENCE_NAME", L
"오름차순");
712 static const wchar_t* apsz[] = {
725 for(
size_t i = 0; i < (
sizeof(apsz) /
sizeof(
const char*)); i++)
726 DS.assign(apsz[i], strNA);
730 if (!field.isNull()) {
731 String strComment = field.asString();
732 if (!strComment.isEmpty()) {
741 strComment = L
" ";
743 DS.assign(L
"COMMENT", strComment);
746 DS.assign(L
"LIST", strListPage);
747 DS.assign(L
"_LIST", strListPageEnc);
748 DS.assign(L
"WRITE", strWritePage);
758static void __CreateTables(
SQLQuery& q,
int nDsType,
int nTableID)
760 String strTableID = String::valueOf(nTableID);
765 "CREATE TABLE DCL_MESSAGE_" + strTableID + L
""
767 "\n USER_ID INTEGER NOT NULL,"
768 "\n DS_ID SMALLINT NOT NULL,"
769 "\n MESSAGE_ID INTEGER NOT NULL,"
770 "\n PREV_ID INTEGER NOT NULL DEFAULT 0,"
771 "\n NEXT_ID INTEGER NOT NULL DEFAULT 0,"
772 "\n PARENT_ID INTEGER NOT NULL DEFAULT 0,"
773 "\n CHILD_ID INTEGER NOT NULL DEFAULT 0,"
774 "\n START_ID INTEGER NOT NULL,"
775 "\n REPLY_ID BIGINT NOT NULL DEFAULT 1,"
776 "\n NCHILD INTEGER NOT NULL DEFAULT 0,"
777 "\n TYPE TINYINT NOT NULL DEFAULT 0,"
778 "\n WRITER_ID INTEGER NOT NULL,"
779 "\n SUBJECT VARCHAR(255) NULL,"
780 "\n BODY_ORG TEXT NULL,"
781 "\n BODY_PLAIN TEXT NULL,"
782 "\n BODY_HTML TEXT NULL,"
783 "\n UPDATE_TIME DATETIME NOT NULL,"
784 "\n NREAD INTEGER NOT NULL DEFAULT 0,"
785 "\n NAGREE INTEGER NOT NULL DEFAULT 0,"
786 "\n NDISAGREE INTEGER NOT NULL DEFAULT 0,"
787 "\n VOTE_END DATETIME,"
788 "\n CONSTRAINT PRIMARY KEY (USER_ID, DS_ID, MESSAGE_ID),"
789 "\n CONSTRAINT FOREIGN KEY (WRITER_ID) REFERENCES DCL_USER (USER_ID),"
790 "\n CONSTRAINT UNIQUE INDEX (USER_ID, DS_ID, START_ID, REPLY_ID),"
791 "\n INDEX (USER_ID, DS_ID, PARENT_ID)"
795 "CREATE TABLE DCL_MESSAGE_R_" + strTableID + L
""
797 "\n USER_ID INTEGER NOT NULL,"
798 "\n DS_ID SMALLINT NOT NULL,"
799 "\n MESSAGE_ID INTEGER NOT NULL,"
800 "\n READER_ID INTEGER NOT NULL,"
801 "\n NVOTE TINYINT NOT NULL DEFAULT 0,"
802 "\n UPDATE_TIME DATETIME NOT NULL,"
803 "\n CONSTRAINT PRIMARY KEY (USER_ID, DS_ID, MESSAGE_ID, READER_ID),"
804 "\n CONSTRAINT FOREIGN KEY (USER_ID, DS_ID, MESSAGE_ID)"
805 "\n REFERENCES DCL_MESSAGE_" + strTableID + L
""
806 " (USER_ID, DS_ID, MESSAGE_ID)"
810 "CREATE TABLE DCL_MESSAGE_A_" + strTableID + L
""
812 "\n USER_ID INTEGER NOT NULL,"
813 "\n DS_ID SMALLINT NOT NULL,"
814 "\n MESSAGE_ID INTEGER NOT NULL,"
815 "\n NO SMALLINT NOT NULL DEFAULT 1,"
816 "\n NREAD INTEGER NOT NULL DEFAULT 0,"
817 "\n FILENAME VARCHAR(255) NOT NULL,"
818 "\n TYPE VARCHAR(255) NOT NULL,"
819 "\n ICON VARCHAR(20),"
820 "\n SIZE INTEGER NOT NULL DEFAULT 0,"
821 "\n CONSTRAINT PRIMARY KEY (USER_ID, DS_ID, MESSAGE_ID, NO),"
822 "\n CONSTRAINT FOREIGN KEY (USER_ID, DS_ID, MESSAGE_ID)"
823 "\n REFERENCES DCL_MESSAGE_" + strTableID + L
""
824 " (USER_ID, DS_ID, MESSAGE_ID)"
#define IMPLEMENT_CLASSINFO_EX(class_name, base_class_name)
#define DEFAULT_SHORT_STRING
#define __DCL_TRACE0(psz)
#define __DCL_TRACE1(fmt, arg1)
#define __DCL_VERIFY(expr)
#define __DCL_ASSERT(expr)
String toStringAll() const
static String format(const String &_str, int _tab2Space, const String &_beginOfLine, const String &_endOfLine)
virtual void onPrint(Session &session) __DCL_THROWS1(Exception *)
static String getDefault(ListedStringToStringArrayMap &map, const String &strKey)
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
static size_t getShortString(SQLField &field, size_t _len, String &strLong, String &strShort)
static int parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
static int getDefaultWidth(int nDepth)
_CONST SQLField & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
SQLParam & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
void prepare(const String &_sql) __DCL_THROWS1(SQLException *)
_CONST SQLParams & params() _CONST
_CONST SQLFields & fields() _CONST
void execute() __DCL_THROWS1(SQLException *)
void fetch() __DCL_THROWS1(SQLException *)
HttpServletContextEx & __ctx
static ByteString encode(const ByteString &_str)