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.hayabusa.db;
017
018import java.sql.SQLData;
019import java.sql.SQLInput;
020import java.sql.SQLOutput;
021import java.sql.SQLException;
022
023import org.opengion.hayabusa.common.HybsSystemException;
024import org.opengion.fukurou.util.StringUtil;
025
026/**
027 * QLData インターフェースを継承した ユーザー変数の受け渡し用オブジェクトです。
028 * 登録されている属性情報は、セットメソッドを通して、順番に設定されます。
029 *
030 * @og.group DB/Shell制御
031 *
032 * @version  4.0
033 * @author   Kazuhiko Hasegawa
034 * @since    JDK5.0,
035 */
036// 8.5.5.1 (2024/02/29) spotbugs CT_CONSTRUCTOR_THROW(コンストラクタで、Excweptionを出さない) class を final にすれば、警告は消える。
037// public class DBUserArg implements SQLData {
038public final class DBUserArg implements SQLData {
039        private String sqlType ;
040
041        private final String[] names;
042        private String[] values;
043
044        /**
045         *  すべての属性情報を指定して、新しい DBUserArg オブジェクトを作成します。
046         *
047         * @og.rev 3.3.3.1 (2003/07/18) DB登録時の後ろスペースを削除する。
048         * @og.rev 3.5.6.0 (2004/06/18) 内部に取り込み時に、キー配列は、 arraycopy を行う。
049         *
050         * @param    type データベースタイプ文字列
051         * @param    nms キー配列
052         * @param    vals 属性配列
053         */
054        public DBUserArg( final String type,final String[] nms,final String[] vals ) {
055                if( nms == null ) {
056                        final String errMsg = "引数のキー配列が null です。" ;
057                        throw new HybsSystemException( errMsg );
058                }
059
060                final int size = nms.length;
061                names = new String[size];
062                System.arraycopy( nms,0,names,0,size );
063
064                sqlType = type;
065                values   = StringUtil.rTrims( vals );
066        }
067
068        /**
069         *  属性配列情報を取得します。
070         *
071         * @og.rev 3.5.6.0 (2004/06/18) 取り出し時に内部配列を clone して返します。
072         * @og.rev 3.6.0.0 (2004/09/22) 属性配列が null の場合は、エラー
073         *
074         * @return    属性配列
075         * @og.rtnNotNull
076         */
077        public String[] getValues() {
078                if( values != null ) {
079                        return values.clone();
080                }
081
082                final String errMsg = "属性配列が、初期化されていません。";
083                throw new HybsSystemException( errMsg );
084        }
085
086        // ============================================================
087        // implements SQLData
088        // ============================================================
089
090        /**
091         *  SQLタイプの文字列を返します。
092         *
093         * @return    SQLタイプの文字列
094         * @throws SQLException ※ この実装からは SQLException は、throw されません。
095         */
096        @Override       // SQLData
097        public String getSQLTypeName() throws SQLException {
098                return sqlType;
099        }
100
101        /**
102         *  データベース内部より内部属性を取得し、オブジェクトを構築します。
103         *
104         * @param       stream  ストリーム
105         * @param    typeName SQLタイプの文字列
106         * @throws SQLException データベースアクセスエラー
107         */
108        @Override       // SQLData
109        public void readSQL( final SQLInput stream, final String typeName ) throws SQLException {
110                sqlType = typeName;
111
112                values = new String[names.length];
113                for( int i=0; i<names.length; i++ ) {
114                        values[i] = stream.readString();
115                }
116        }
117
118        /**
119         *  データベース内部に内部属性を設定します。
120         *
121         * @param       stream  ストリーム
122         * @throws SQLException データベースアクセスエラー
123         */
124        @Override       // SQLData
125        public void writeSQL( final SQLOutput stream ) throws SQLException {
126                for( int i=0; i<names.length; i++ ) {
127                        stream.writeString( values[i] );
128                }
129        }
130}