DROP TABLE PAGES;
DROP TABLE CONTENTS;
DROP TABLE HISTORY;
DROP TABLE ATTACHED;
DROP TABLE ATT_LINKS;
DROP TABLE LINKS;
DROP TABLE M_OWNERS;
DROP TABLE M_PAGE_TYPES;
DROP TABLE M_DATA_TYPES;
DROP TABLE M_CSS;

CREATE CACHED TABLE PAGES
(
    PAGE_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    PAGE_TYPE INTEGER,
    CONTENT_ID INTEGER,
    CSS_ID INTEGER,
    TITLE VARCHAR(256) NOT NULL,
    OWNER_ID INTEGER,
    FROZEN BIT DEFAULT FALSE,
    USE_PASSWD BIT DEFAULT FALSE,
    PAGE_LOCKED BIT DEFAULT FALSE,
    DELETE_FLAG BIT DEFAULT FALSE,
    EDIT_POINT INTEGER DEFAULT 0,
    CREATE_DATE DATETIME DEFAULT 'current_timestamp',
    CREATE_BY VARCHAR(64),
    UPDATE_DATE DATETIME DEFAULT 'current_timestamp',
    UPDATE_BY VARCHAR(64)
);

CREATE INDEX IDX_PAGES_TITLE ON PAGES (TITLE);
CREATE INDEX IDX_CONTENT_ID ON PAGES (CONTENT_ID);
CREATE INDEX IDX_OWNER_ID ON PAGES (OWNER_ID);
CREATE INDEX IDX_EDIT_POINT ON PAGES (EDIT_POINT);

CREATE CACHED TABLE HITS
(
    PAGE_ID INTEGER NOT NULL,
    HIT_POINT INTEGER DEFAULT 0,
    PRIMARY KEY(PAGE_ID)
);

CREATE CACHED TABLE CONTENTS
(
    CONTENT_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    RAW_DAT VARCHAR NOT NULL,
    QRY_DAT VARCHAR NOT NULL,
    DATA_SIZE INTEGER,
    CREATE_DATE DATETIME DEFAULT 'current_timestamp',
    CREATE_BY VARCHAR(64)
);

CREATE INDEX IDX_RAW_DAT ON CONTENTS (RAW_DAT);
CREATE INDEX IDX_QRY_DAT ON CONTENTS (QRY_DAT);

CREATE CACHED TABLE HISTORY
(
    PAGE_ID INTEGER NOT NULL,
    SEQ_ID INTEGER NOT NULL,
    CONTENT_ID INTEGER NOT NULL,
    PRIMARY KEY(PAGE_ID, SEQ_ID)
);

CREATE INDEX IDX_CONTENT_ID ON HISTORY (CONTENT_ID);

CREATE CACHED TABLE ATT_LINKS
(
    PAGE_ID INTEGER NOT NULL,
    ATT_ID INTEGER NOT NULL,
    CREATE_DATE DATETIME DEFAULT 'current_timestamp',
    CREATE_BY VARCHAR(64),
    PRIMARY KEY(PAGE_ID, ATT_ID)
);

CREATE CACHED TABLE ATTACHED
(
    ATT_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    DATA_TYPE INTEGER,
    PHY_PATH VARCHAR(1024) NOT NULL,
    PHY_NAME VARCHAR(128) NOT NULL,
    FILE_NAME VARCHAR(32) NOT NULL,
    DATA_SIZE INTEGER NOT NULL,
    RAW_DAT OBJECT,
    LOB_ID INTEGER,
    CREATE_DATE DATETIME DEFAULT 'current_timestamp',
    CREATE_BY VARCHAR(64)
);

CREATE CACHED TABLE LINKS
(
    PARENT_ID INTEGER NOT NULL,
    CHILD_ID INTEGER NOT NULL,
    CREATE_DATE DATETIME DEFAULT 'current_timestamp',
    CREATE_BY VARCHAR(64)
);

CREATE INDEX IDX_PARENT_ID ON LINKS (PARENT_ID);
CREATE INDEX IDX_CHILD_ID ON LINKS (CHILD_ID);

CREATE CACHED TABLE M_OWNERS
(
    OWNER_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    DESC VARCHAR(64)
);

CREATE CACHED TABLE M_PAGE_TYPES
(
    PAGE_TYPE INTEGER NOT NULL IDENTITY PRIMARY KEY,
    DESC VARCHAR(64)
);

CREATE CACHED TABLE M_DATA_TYPES
(
    DATA_TYPE INTEGER NOT NULL IDENTITY PRIMARY KEY,
    DESC VARCHAR(64)
);

CREATE CACHED TABLE M_CSS
(
    CSS_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    DESC VARCHAR(64)
);

--/////////////////////////////////////////////////////////////////////////////////

--
-- 一覧用SQL
--
SELECT TOP ? a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 ORDER BY TITLE;

SELECT TOP ? a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 ORDER BY UPDATE_DATE DESC;

SELECT TOP ? a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 ORDER BY PAGE_OWNER;

SELECT TOP ? a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 ORDER BY HIT_POINT DESC;

SELECT TOP ? a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 ORDER BY EDIT_POINT DESC;

--
-- ページ取得用SQL
--

SELECT a.*, b.CONTENT_ID, b.RAW_DAT, b.DATA_SIZE
(SELECT DESC FROM M_CSS WHERE CSS_ID = a.CSS_ID) CSS,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a, CONTENTS b
 WHERE a.CONTENT_ID = b.CONTENT_ID
   AND a.PAGE_ID = ?;

SELECT a.*, b.CONTENT_ID, b.RAW_DAT, b.DATA_SIZE
(SELECT DESC FROM M_CSS WHERE CSS_ID = a.CSS_ID) CSS,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a, CONTENTS b
 WHERE a.CONTENT_ID = b.CONTENT_ID
   AND a.TITLE = ?;

SELECT a.*, b.CONTENT_ID, b.RAW_DAT, b.DATA_SIZE
(SELECT DESC FROM M_CSS WHERE CSS_ID = a.CSS_ID) CSS,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a, CONTENTS b
 WHERE a.CONTENT_ID = b.CONTENT_ID
   AND a.CONTENT_ID = ?;

--
-- ページ履歴一覧用SQL
--
SELECT a.SEQ_ID, a.CONTENT_ID, b.DATA_SIZE, b.CREATE_DATE, b.CREATE_BY,
       b.UPDATE_DATE, b.UPDATE_BY
  FROM HISTORY a, CONTENTS b
 WHERE a.PAGE_ID = ?
 ORDER BY a.SEQ_ID;

--
-- 添付一覧用SQL
--
SELECT a.*,
(SELECT DESC FROM M_DATA_TYPE WHERE DATA_TYPE = a.DATA_TYPE) DATA_TYPE
  FROM ATTACHED a, ATT_LINK b
 WHERE a.ATT_ID = b.ATT_ID
   AND b.PAGE_ID = ?
 ORDER BY a.FILE_NAME;

--
-- 親ページ用SQL
--
SELECT a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 WHERE a.PAGE_ID = (SELECT PARENT_ID FROM LINKS WHERE CHILD_ID = ?)
 ORDER BY TITLE;

--
-- 子ページ用SQL
--
SELECT a.*,
(SELECT DESC FROM M_OWNER WHERE OWNER_ID = a.OWNER_ID) PAGE_OWNER,
(SELECT DESC FROM M_PAGE_TYPE WHERE PAGE_TYPE = a.PAGE_TYPE) PAGE_TYPE,
(SELECT HIT_POINT FROM HITS WHERE PAGE_ID = a.PAGE_ID) HIT_POINT
  FROM PAGES a
 WHERE a.PAGE_ID = (SELECT CHILD_ID FROM LINKS WHERE PARENT_ID = ?)
 ORDER BY TITLE;

--
-- CSSリスト用SQL
--
SELECT * FROM M_CSS;

--
-- OWNERリスト用SQL
--
SELECT * FROM M_OWNERS;


-///////////////////////////////////////
--
-- 参照カウントUPSQL
--
UPDATE HITS
   SET HIT_POINT = HIT_POINT + 1
 WHERE PAGE_ID = ?;

--
-- ページ新規登録用SQL
--
INSERT INTO CONTENT
    (RAW_DAT, QRY_DAT, CREATE_BY)
VALUES
    (?, ?, ?, ?);

INSERT INTO PAGES
    (PAGE_TYPE, CONTENT_ID, CSS, TITLE, OWNER_ID, CREATE_BY, UPDATE_BY)
VALUES
    (?, ?, ?, ?, ?, ?, ?);

INSERT INTO HISTORY
    (PAGE_ID, SEQ_ID, CONTENT_ID)
VALUES
    (?, 0, ?);

INSERT INTO HITS
    (PAGE_ID)
VALUES
    (?);

INSERT INTO LINKS
    (PARENT_ID, CHILD_ID)
VALUES
    (?, ?);

--
-- ページ更新用SQL
--
INSERT INTO CONTENT
    (RAW_DAT, QRY_DAT, CREATE_BY)
VALUES
    (?, ?, ?);

UPDATE PAGES
   SET PAGE_TYPE = ?,
       CONTENT_ID = ?,
       CSS = ?,
       TITLE = ?,
       FROZEN = ?,
       USE_PASSWD = ?,
       PAGE_LOCKED = ?,
       DELETE_FLAG = ?,
       EDIT_POINT = EDIT_POINT + 1,
       UPDATE_DATE = ?,
       UPDATE_BY = ?
 WHERE PAGE_ID = ?;

INSERT INTO HISTORY
    (PAGE_ID, SEQ_ID, CONTENT_ID)
VALUES
    (?, (SELECT MAX(SEQ) FROM HISTORY WHERE PAGE_ID = ?) + 1, ?);

DELETE FROM CONTENTS
 WHERE CONTENT_ID = 
       (SELECT CONTENT_ID
          FROM HISTORY 
         WHERE PAGE_ID = ? 
           AND SEQ_ID = (SELECT MIN(SEQ) FROM HISTORY WHERE PAGE_ID = ?));

DELETE FROM HISTORY
 WHERE PAGE_ID = ?
   AND SEQ_ID = (SELECT MIN(SEQ) FROM HISTORY WHERE PAGE_ID = ?);

UPDATE LINKS
   SET PARENT_ID = ?
 WHERE CHILD_ID = ?;

--
-- ページ削除用SQL
--

--自分が親になっているリンクを里親へ移動
UPDATE LINKS
   SET PARENT_ID = (SELECT PAGE_ID FROM PAGES WHERE PAGE_TYPE = 1)
 WHERE PARENT_ID = ?;

--自分が子になっているリンクはごみ箱へ
UPDATE LINKS
   SET PARENT_ID = (SELECT PAGE_ID FROM PAGES WHERE PAGE_TYPE = 9)
 WHERE CHILD_ID = ?;

--
-- ページ物理削除用SQL
--
DELETE FROM ATTACHED
 WHERE ATT_ID = 
    (SELECT ATT_ID FROM ATT_LINKS WHERE PAGE_ID = ?);

DELETE FROM ATTLINKS
 WHERE PAGE_ID = ?;

DELETE FROM CONTENTS
 WHERE CONTENT_ID = 
    (SELECT CONTENT_ID
       FROM HISTORY
      WHERE PAGE_ID = ?);

DELETE FROM HISTORY
 WHERE PAGE_ID = ?;

DELETE FROM LINKS
 WHERE CHILD_ID = ?;

DELETE FROM LINKS
 WHERE PARENT_ID = ?;

DELETE FROM HITS
 WHERE PAGE_ID = ?;

DELETE FROM PAGES
 WHERE PAGE_ID = ?;

--
-- 添付ファイル登録用SQL
--
 INSERT INTO ATTACHED
     (DATA_TYPE, PHY_PATH, PHY_NAME, FILE_NAME, RAW_DAT, DATA_SIZE)
 VALUES
     (?, ?, ?, ?, ?, ?);

 INSERT INTO ATT_LINKS
     (PAGE_ID, ATT_ID)
 VALUES
     (?, ?);
 
--
-- ユーザー登録用SQL
--
 INSERT INTO M_OWNERS
     (DESC)
 VALUES
     (?);

--
-- CSS登録用SQL
--
 INSERT INTO M_CSS
     (DESC)
 VALUES
     (?);
  
