001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.EParameterMode;
004import gudusoft.gsqlparser.TBaseType;
005import gudusoft.gsqlparser.EDbVendor;
006import gudusoft.gsqlparser.nodes.teradata.TDataConversion;
007
008import java.util.ArrayList;
009
010/**
011* Parameters in create procedure/function statements.
012* Field declaration in plsql record type definition
013* Parameter declaration in plsql cursor declaration.
014*/
015
016public class TParameterDeclaration extends TParseTreeNode {
017
018    private int mode = TBaseType.parameter_mode_default;
019    private boolean nocopy = false;
020    private EParameterMode parameterMode = EParameterMode.defaultValue;
021
022    /**
023     *
024     * @return Parameter modes that define the action of formal parameters:
025     * <p>Oracle plsq:  in, out, in out.
026     * <p>SQL Server: out, output, readonly
027     *
028     */
029    public EParameterMode getParameterMode() {
030        return parameterMode;
031    }
032
033    public void setNocopy(boolean nocopy) {
034        this.nocopy = nocopy;
035    }
036
037    /**
038     * Datatype of declared element.
039     * @return
040     */
041
042    public TTypeName getDataType() {
043        return dataType;
044    }
045
046    /**
047     * Specify NOCOPY to instruct the database to pass this argument as fast as possible.
048
049     * @return
050
051     */
052    public boolean isNocopy() {
053        return nocopy;
054    }
055
056    public void setMode(int mode) {
057        this.mode = mode;
058        switch (this.mode){
059            case TBaseType.parameter_mode_in:
060                parameterMode = EParameterMode.in;
061                break;
062            case TBaseType.parameter_mode_out:
063                parameterMode = EParameterMode.out;
064                break;
065            case TBaseType.parameter_mode_inout:
066                parameterMode = EParameterMode.inout;
067                break;
068            case TBaseType.parameter_mode_output:
069                parameterMode = EParameterMode.output;
070                break;
071            case TBaseType.parameter_mode_readonly:
072                parameterMode = EParameterMode.readonly;
073                break;
074            case TBaseType.parameter_mode_aslocator:
075                parameterMode = EParameterMode.aslocator;
076                break;
077            default:
078                break;
079        }
080    }
081
082
083    /**
084     *
085     * @return Parameter modes that define the action of formal parameters:
086     * <p>Oracle plsq:  in, out, in out.
087     * <p>SQL Server: out, output, readonly
088     *
089     * Use {@link #getParameterMode() instead}
090     */
091    public int getMode() {
092
093        return mode;
094    }
095
096    /**
097     * Specifies a default value for an IN parameter.
098     * @return
099     */
100    public TExpression getDefaultValue() {
101        return defaultValue;
102    }
103
104    /**
105     * The name of the formal parameter that you are declaring, which you can reference in the body of the subprogram.
106     * <p> Or, the name of the field in field declaration of record type definition.
107     * @return
108     */
109    public TObjectName getParameterName() {
110        return parameterName;
111    }
112
113    private TObjectName parameterName = null;
114    private TTypeName dataType = null;
115
116    public void setDefaultValue(TExpression defaultValue) {
117        this.defaultValue = defaultValue;
118    }
119
120    private TExpression defaultValue = null;
121    private int howtoSetValue = TBaseType.howtoSetValue_none;
122
123    public void setNotNull(Boolean notNull) {
124        NotNull = notNull;
125    }
126
127    /**
128     * Is valid when this class represents field declaration in  plsql record type definition.
129     */
130    public Boolean getNotNull() {
131        return NotNull;
132    }
133
134
135    private Boolean NotNull = false;
136
137
138
139    /**
140     * How deafult value of parameter was set.
141     * <p> := | DEFAULT
142     * <p> := {@link  TBaseType#howtoSetValue_assign}
143     * <p> or DEFAULT keyword  {@link  TBaseType#howtoSetValue_default};
144     * @return
145     */
146
147    public int getHowtoSetValue() {
148        return howtoSetValue;
149    }
150
151
152    private boolean isVarying = false;
153    private TConstant varyPrecision = null;
154
155    /**
156     *  SQL Server varying
157     * @return
158     */
159    public boolean isVarying() {
160        return isVarying;
161    }
162
163    public void setParameterMode(EParameterMode parameterMode) {
164        this.parameterMode = parameterMode;
165    }
166
167    /**
168     * SQL Server varying precision
169     * @return
170
171     */
172    public TConstant getVaryPrecision() {
173        return varyPrecision;
174    }
175
176    public void init(Object arg1) {
177        parameterName = (TObjectName) arg1;
178        parameterName.setObjectType(TObjectName.ttobjParameter);
179    }
180
181    private ArrayList<TDataConversion> dataConversions;
182
183    public ArrayList<TDataConversion> getDataConversions() {
184        return dataConversions;
185    }
186
187    public void init(Object arg1, Object arg2) {
188        if (arg1 != null) { // it's possible that there is no parameter name in db2 create procedure
189            parameterName = (TObjectName) arg1;
190            //parameterName.setObjectType(TObjectName.ttobjParameter);
191        }
192        if (arg2 instanceof TTypeName){
193            dataType = (TTypeName) arg2;
194        }else{
195            // teradata, BEGINDATE (DATE, DEFAULT DATE), bugs/mantisbt/view.php?id=2537
196            dataConversions = ( ArrayList<TDataConversion>)arg2;
197            dataType = dataConversions.get(0).getDataConversionItems().get(0).getDataType();
198        }
199
200    }
201
202    public void init(Object arg1,Object arg2,Object arg3){
203        init(arg1,arg2);
204
205        if (arg3 != null){
206            if (arg3 instanceof TParameterMode){
207                parameterMode = ((TParameterMode)arg3).getParameterMode();
208            }else{//tdummy
209                TDummy dmy = (TDummy)arg3;
210                if ((dmy.dbvendor == EDbVendor.dbvoracle)||(dmy.dbvendor == EDbVendor.dbvdb2)){
211                    if (dmy.int1 == 1){
212                        defaultValue = (TExpression)(dmy.node1);
213                        howtoSetValue = dmy.int1;
214                    }else if (dmy.int1 == 2){
215                        defaultValue = (TExpression)(dmy.node1);
216                        howtoSetValue = dmy.int1;
217                    }
218                }else if ((dmy.dbvendor == EDbVendor.dbvmssql)||(dmy.dbvendor == EDbVendor.dbvsybase)){
219                  if (dmy.st2 != null){
220                      this.isVarying = true;
221                      if (dmy.node2 != null){
222                          this.varyPrecision = (TConstant)(((TDummy)(dmy.node2)).node1);
223                      }
224                    }
225
226                     this.howtoSetValue = dmy.int1;
227                     if (dmy.node1 != null){
228                          this.defaultValue = (TExpression)(dmy.node1);
229                      }
230                      if (dmy.st1 != null){
231                         if (dmy.st1.toString().equalsIgnoreCase("out")){
232                             this.mode = TBaseType.parameter_mode_out;
233                             parameterMode = EParameterMode.out;
234                         }else if (dmy.st1.toString().equalsIgnoreCase("in")){
235                             this.mode = TBaseType.parameter_mode_in;
236                             parameterMode = EParameterMode.in;
237                         }else if (dmy.st1.toString().equalsIgnoreCase("output")){
238                             this.mode = TBaseType.parameter_mode_output;
239                             parameterMode = EParameterMode.output;
240                         }else if (dmy.st1.toString().equalsIgnoreCase("inout")){
241                             this.mode = TBaseType.parameter_mode_inout;
242                             parameterMode = EParameterMode.inout;
243                         }if (dmy.st1.toString().equalsIgnoreCase("readonly")){
244                             this.mode = TBaseType.parameter_mode_readonly;
245                              parameterMode = EParameterMode.readonly;
246                         }
247                      }
248
249                  } // mssql
250
251            }//dummy
252
253        }
254    }
255
256    public void accept(TParseTreeVisitor v){
257        v.preVisit(this);
258        v.postVisit(this);
259    }
260
261    public void acceptChildren(TParseTreeVisitor v){
262        v.preVisit(this);
263        v.postVisit(this);
264    }
265
266    public void setParameterName(TObjectName parameterName) {
267        this.parameterName = parameterName;
268    }
269
270    public void setDataType(TTypeName dataType) {
271        this.dataType = dataType;
272    }
273
274    public void setHowtoSetValue(int howtoSetValue) {
275        this.howtoSetValue = howtoSetValue;
276    }
277
278    public void setVarying(boolean isVarying) {
279        this.isVarying = isVarying;
280    }
281
282    public void setVaryPrecision(TConstant varyPrecision) {
283        this.varyPrecision = varyPrecision;
284    }
285}