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}