001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.plugin.table;
017
018import org.opengion.fukurou.system.OgBuilder ;                          // 6.4.4.1 (2016/03/18)
019
020/**
021 * TableFilter_TABLE_FIREBIRD は、TableUpda インターフェースを継承した、DBTableModel 処理用の
022 * 実装クラスです。とくに、Firebird用のDB定義スクリプトを作成します。
023 *
024 * ここでは、テーブル一覧の検索結果より、GF05 のテーブルカラム定義テーブルから
025 * 必要な情報を取得し、テーブル作成スクリプトを作成します。
026 * 出力ファイルは、テーブル名+"S.sql" という命名規則で作成します。
027 * 検索では、(SYSTEM_ID,TBLSYU,TABLE_NAME,NAME_JA,TABLESPACE_NAME,INITIAL_EXTENT,COMMENTS)
028 * の項目を取得する必要があります。
029 *
030 * @og.rev 5.1.1.0 (2009/12/01) 新規作成
031 *
032 * @version  0.9.0  2000/10/17
033 * @author   Kazuhiko Hasegawa
034 * @since    JDK1.1,
035 */
036public class TableFilter_TABLE_FIREBIRD extends TableFilter_TABLE {
037        /** このプログラムのVERSION文字列を設定します。   {@value} */
038        private static final String VERSION = "6.4.4.1 (2016/03/18)" ;
039
040        /**
041         * デフォルトコンストラクター
042         *
043         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
044         */
045        public TableFilter_TABLE_FIREBIRD() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
046
047        /**
048         * 各行部分(カラム定義)の処理を実行します。
049         *
050         * @og.rev 5.1.1.0 (2009/12/01) 各カラムの説明を追加
051         * @og.rev 5.3.9.0 (2011/09/01) PRIMARY KEY の作成は、INDEX側で行うこととする。
052         * @og.rev 5.5.8.2 (2012/11/09) NUMBER の小数の扱いを、DECIMAL にする。
053         * @og.rev 5.6.9.2 (2013/10/18) useLen が、nullやゼロ文字列の場合の考慮
054         *
055         * @param       data    1行分のデータ配列
056         * @param       first   最初の行かどうか[true:最初/false:それ以降]
057         *
058         * @return      各行部分(カラム定義)配列
059         */
060        @Override
061        protected String[] makeLineList( final String[] data,final boolean first ) {
062
063                final String clsName = data[GF05_CLS_NAME] ;
064                String useLen  = data[GF05_USE_LENGTH] ;
065                if( useLen != null && useLen.contains( "." ) ) { useLen = useLen.replace( '.' , ',' ); }
066
067                data[GF05_USE_LENGTH] = null;                           // 標準では、桁数をクリアしておく。
068
069                // 5.1.1.0 (2009/12/01) 各カラムの説明文を 入れたくない場合は、null を設定する。
070                if( isXml ) { data[GF05_NAME_JA] = null; }
071
072                if( "UNIQ".equalsIgnoreCase( data[GF05_CLM] ) || "UNIQSEQ".equalsIgnoreCase( data[GF05_CLM] ) ) {
073                        data[GF05_CLS_NAME]     = "BIGINT";
074                        data[GF05_DATA_DEFAULT] = null;
075                        data[GF05_NOT_NULL]     = "1";
076                }
077                else if( clsName == null || clsName.isEmpty() || clsName.startsWith( "VARCHAR" ) ) {            // 6.1.0.0 (2014/12/26) refactoring
078                        data[GF05_CLS_NAME]   = "VARCHAR" ;
079                        data[GF05_USE_LENGTH] = useLen ;
080                }
081                else if( clsName.startsWith( "CLOB" ) ) {
082                        data[GF05_CLS_NAME]     = "BLOB SUB_TYPE 1";
083                        data[GF05_DATA_DEFAULT] = null;
084                        data[GF05_NOT_NULL]     = null;
085                }
086                // 5.6.9.2 (2013/10/18) useLen が、nullやゼロ文字列の場合の考慮
087                else if( clsName.startsWith( "NUMBER" ) && useLen != null && useLen.length() > 0 ) {
088
089                        if( useLen.contains( "," ) ) {          // カンマがある
090                                data[GF05_CLS_NAME] = "DECIMAL";                // 5.5.8.2 (2012/11/09) 小数は、DECIMAL
091                                data[GF05_USE_LENGTH] = useLen ;
092                        }
093                        else if( Integer.parseInt( useLen ) < 10 ) {    // 10桁以下
094                                data[GF05_CLS_NAME] = "INTEGER";                // 5.5.8.2 (2012/11/09) NUMBER のデフォルトは、INTEGER
095                        }
096                        else if( Integer.parseInt( useLen ) < 18 ) {    // 18桁以下
097                                data[GF05_CLS_NAME] = "BIGINT";
098                        }
099                }
100
101                // 5.5.8.2 (2012/11/09) 4000 文字なら、VARCHAR のままで登録できる。
102        //      // 暫定追加
103        //      if( "4000".equalsIgnoreCase( data[GF05_USE_LENGTH] ) ) {
104        //              data[GF05_CLS_NAME]     = "BLOB";
105        //              data[GF05_DATA_DEFAULT] = null;
106        //              data[GF05_NOT_NULL]     = null;
107        //              data[GF05_USE_LENGTH]   = null;
108        //      }
109
110                return super.makeLineList( data,first );
111        }
112
113        /**
114         * 定義の最後の部分の処理を実行します。
115         *
116         * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
117         *
118         * @param       clmNo   カラム番号配列
119         * @param       data    1行分のデータ配列
120         *
121         * @return      定義の最後の部分
122         * @og.rtnNotNull
123         */
124        @Override
125        protected String makeEndLine( final int[] clmNo,final String[] data ) {
126                return ")" + execEndTag ;                                               // 6.0.2.3 (2014/10/10) 改行を含める。
127        }
128
129        /**
130         * ユニークシーケンスの作成処理を実行します。
131         *
132         * @og.rev 5.1.9.0 (2010/08/01) シーケンス名を[TABLE_NAME]S00に変更
133         * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
134         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
135         *
136         * @param       clmNo   カラム番号配列
137         * @param       data    1行分のデータ配列
138         *
139         * @return      ユニークシーケンス
140         * @og.rtnNotNull
141         */
142        @Override
143        protected String makeUniqSeq( final int[] clmNo,final String[] data ) {
144                return new OgBuilder()
145                                .appendCR()
146                                .appendIfCR( isXml , EXEC_START_TAG )
147                                .append( "CREATE SEQUENCE " , data[clmNo[TABLE_NAME]] , "S00 " )
148                                .append( execEndTag )
149                                .toString();
150        }
151
152        /**
153         * ユニークシーケンスと関連付けるトリガの作成処理を実行します。
154         *
155         * @og.rev 5.1.9.0 (2010/08/01) トリガー名を[TABLE_NAME]T00に変更
156         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
157         *
158         * @param       clmNo           カラム番号配列
159         * @param       data            1行分のデータ配列
160         * @param   uniqName    ユニークトリガ名
161         *
162         * @return      ユニークシーケンスと関連付けるトリガ
163         * @og.rtnNotNull
164         */
165        @Override
166        protected String makeUniqTrig( final int[] clmNo,final String[] data, final String uniqName ) {
167                final String TBL_NAME = data[clmNo[TABLE_NAME]] ;
168
169                return new OgBuilder()
170                                .appendCR()
171                                .appendIfCR( isXml , EXEC_START_TAG )
172                                .append(   "CREATE TRIGGER "    , TBL_NAME )
173                                .appendCR( "T00 FOR "                   , TBL_NAME )
174                                .appendCR( "  BEFORE INSERT AS " )
175                                .appendCR( "  BEGIN " )
176                                .append(   "    NEW."                   , uniqName      )
177                                .appendCR( " = GEN_ID( "                , TBL_NAME , "S00,1 );" )
178                                .appendCR( "  END; " )
179                                .appendIf( isXml , EXEC_END_TAG )               // ここはキャッシュではなく、EXEC_END_TAG を使う。
180                                .toString();
181        }
182}