DELIMITER //

CREATE OR REPLACE PROCEDURE get_tableschema(
  IN p_data NVARCHAR(100)
)
/*
  Function   : 查詢檔案結構
  description: 
  build date : 2023/08/23
  
  Modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    Michael    2023/08/23
    2    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
    3    Assistant  2025/08/09 加入自動從information_schema讀取結構功能
*/
BEGIN
  DECLARE v_count INT;
  
  -- 檢查gex_filestru是否有資料
  SELECT COUNT(*) INTO v_count FROM gex_filestru;
  
  -- 如果沒資料, 就從information_schema讀取並寫入
  IF v_count = 0 THEN
    -- 先清空表(以防萬一)
    TRUNCATE TABLE gex_filestru;
    
    -- 從information_schema讀取所有表結構並插入到gex_filestru
    INSERT INTO gex_filestru (
      Table_name, table_description, seqno, field_name, field_desc, 
      field_type, field_len, field_dec, table_pk, table_index, 
      field_isnull, field_default
    )
    SELECT 
      t.TABLE_NAME AS Table_name,
      '' AS table_description,  -- 初始為空，可手動補充
      c.ORDINAL_POSITION AS seqno,
      c.COLUMN_NAME AS field_name,
      '' AS field_desc,  -- 初始為空，可手動補充
      c.DATA_TYPE AS field_type,
      -- c.CHARACTER_MAXIMUM_LENGTH AS field_len,
	  case when c.CHARACTER_MAXIMUM_LENGTH > 9999 then 9999 else c.CHARACTER_MAXIMUM_LENGTH end AS field_len,
      c.NUMERIC_SCALE AS field_dec,
      IF(kcu.COLUMN_NAME IS NOT NULL, 'Y', 'N') AS table_pk,
      'N' AS table_index,  -- 初始為N，可根據實際索引調整
      IF(c.IS_NULLABLE = 'YES', 'Y', 'N') AS field_isnull,
      c.COLUMN_DEFAULT AS field_default
    FROM 
      information_schema.TABLES t
      JOIN information_schema.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
      LEFT JOIN information_schema.KEY_COLUMN_USAGE kcu ON 
        c.TABLE_NAME = kcu.TABLE_NAME AND 
        c.COLUMN_NAME = kcu.COLUMN_NAME AND 
        c.TABLE_SCHEMA = kcu.TABLE_SCHEMA AND
        kcu.CONSTRAINT_NAME = 'PRIMARY'
    WHERE 
      t.TABLE_SCHEMA = DATABASE() AND
      t.TABLE_TYPE = 'BASE TABLE';
    
    -- 更新表描述為表注釋(如果有)
    UPDATE gex_filestru f
    JOIN information_schema.TABLES t ON f.Table_name = t.TABLE_NAME
    SET f.table_description = t.TABLE_COMMENT
    WHERE t.TABLE_SCHEMA = DATABASE();
    
    -- 更新字段描述為列注釋(如果有)
    UPDATE gex_filestru f
    JOIN information_schema.COLUMNS c ON f.Table_name = c.TABLE_NAME AND f.field_name = c.COLUMN_NAME
    SET f.field_desc = c.COLUMN_COMMENT
    WHERE c.TABLE_SCHEMA = DATABASE();
  END IF;
  
  -- 设置默认返回值
  SELECT 0 AS code, 'ok' AS msg;
  
  -- 查询表结构
  IF p_data = '*' THEN
    SELECT
      Table_name, table_description, seqno, field_name, field_desc, 
      field_type, field_len, field_dec, table_pk, table_index, 
      field_isnull, field_default
    FROM gex_filestru
    ORDER BY table_name, seqno;
  ELSE
    SELECT
      Table_name, table_description, seqno, field_name, field_desc, 
      field_type, field_len, field_dec, table_pk, table_index, 
      field_isnull, field_default
    FROM gex_filestru
    WHERE table_name LIKE CONCAT('%', p_data, '%') 
      OR table_description LIKE CONCAT('%', p_data, '%') 
      OR field_name LIKE CONCAT('%', p_data, '%') 
      OR field_desc LIKE CONCAT('%', p_data, '%')
    ORDER BY table_name, seqno;
  END IF;
END //

DELIMITER ;