예제 #1
0
 internal void RaiseValueChanged(StoreType st)
 {
     if (OnValueChanged != null)
     {
         OnValueChanged(st);
     }
 }
예제 #2
0
 /// <summary>
 /// Generates a value suitable to be concat in a SQL query with mysql concat function.
 /// Doesn't take into account the actual value, just the type.
 /// </summary>
 /// <returns></returns>
 internal string WrapSqlValue()
 {
     if (StoreType.IsString(Type) || StoreType.IsDateTime(Type))
     {
         return(string.Format(" if( {0} is null, 'NULL', concat( '''', {0}, '''' ))", Name));
     }
     else
     {
         return(string.Format(" if( {0} is null, 'NULL', {0} )", Name));
     }
 }
예제 #3
0
 internal StoreType(StoreType st)
 {
     this.ArgType   = st.ArgType;
     this.VarKind   = st.VarKind;
     this.Type      = st.Type;
     this.Value     = st.Value;
     this.Name      = st.Name;
     this.Length    = st.Length;
     this.Precision = st.Precision;
     this.Unsigned  = st.Unsigned;
 }
예제 #4
0
 public static string WrapValue(string Type, object Value)
 {
     if (Value == null || Value == DBNull.Value)
     {
         return("NULL");
     }
     else if (StoreType.IsString(Type) || StoreType.IsDateTime(Type))
     {
         return(string.Format("'{0}'", Value));
     }
     else if (Debugger.Cmp(Type, "bit") == 0)
     {
         return((Convert.ToInt32(Value) == 1) ? "1" : "0");
     }
     else
     {
         return(Value.ToString());
     }
 }
예제 #5
0
 /// <summary>
 /// Parses a data type and update the StoreType with the info gathered.
 /// </summary>
 /// <param name="st"></param>
 /// <param name="node"></param>
 internal void ParseDataType(StoreType st, CommonTree node)
 {
   if (Cmp(node.Text, "data_type") != 0)
   {
     throw new InvalidDataException("Argument node");
   }
   bool isEnum = false;
   CommonTree dtNode = node;
   for (int i = 0; i < dtNode.ChildCount; i++)
   {
     switch (i)
     {
       case 0:
         {
           st.Type = dtNode.GetChild(i).Text;
           if (Debugger.Cmp(st.Type, "set") == 0 || Debugger.Cmp(st.Type, "enum") == 0)
             isEnum = true;
         }
         break;
       case 1:
         {
           int v;
           if (Int32.TryParse(dtNode.GetChild(i).Text, out v))
           {
             st.Length = v;
           }
           else if (Debugger.Cmp(dtNode.GetChild(i).Text, "(") == 0)
           {
             if (isEnum)
             {
               CommonTree parent = (CommonTree)dtNode.GetChild(i);
               st.Values = new List<string>();
               for (int j = 0; j < parent.ChildCount; j++)
               {
                 st.Values.Add(parent.GetChild(j).Text);
               }
             }
             else
             {
               st.Length = Int32.Parse(dtNode.GetChild(i).GetChild(0).Text);
               st.Precision = Int32.Parse(dtNode.GetChild(i).GetChild(1).Text);
             }
           }
           if (Debugger.Cmp(dtNode.GetChild(i).Text, "unsigned") == 0)
             st.Unsigned = true;
         }
         break;
       default:
         // unsigned & zerofill are not tested, since they are the same and unsigned flag is true by default.
         if (Cmp(dtNode.GetChild(i).Text, "signed") == 0)
         {
           st.Unsigned = false;
         }
         // For now, just ignore collate & character
         // ...
         break;
     }
   }
 }
예제 #6
0
 internal KeyValuePair<string, StoreType> ParseArg(CommonTree node)
 {
   StoreType st = new StoreType();
   int i = 0;
   st.Name = node.GetChild(i).Text;
   st.VarKind = VarKindEnum.Argument;
   i++;
   if (Cmp(node.GetChild(i).Text, "data_type") == 0)
   {
     ParseDataType(st, (CommonTree)node.GetChild(i));
     i++;
   }
   if (i < node.ChildCount)
   {
     string s = node.GetChild(i).Text;
     if ((Cmp("in", s) == 0) || (Cmp("out", s) == 0) || (Cmp("inout", s) == 0))
     {
       st.ArgType = (ArgTypeEnum)Enum.Parse(typeof(ArgTypeEnum), s, true);
     }
   }
   return new KeyValuePair<string, StoreType>(st.Name, st);
 }
예제 #7
0
 /// <summary>
 /// Returns a description of the variable (or variables) declared within a single DECLARE statement.
 /// </summary>
 /// <param name="Tree"></param>
 /// <returns>Array with one or more variables.</returns>
 internal StoreType[] ParseDeclare( CommonTree Tree )
 {
   StoreType st = new StoreType();
   StoreType[] stVars = null;
   int idx = 0, i, idxDataType;
   while( ( idx < Tree.ChildCount ) && ( Cmp( Tree.GetChild( idx ).Text, "data_type") != 0) )
     idx++;
   if (idx >= Tree.ChildCount)
     throw new InvalidDataException("Argument node");
   stVars = new StoreType[ idx ];
   idxDataType = idx;
   ParseDataType(st, (CommonTree)Tree.GetChild(idx));
   while ((idx < Tree.ChildCount) && (Cmp(Tree.GetChild(idx).Text, "default") != 0))
     idx++;
   if (idx < Tree.ChildCount)
   {
     st.Value = Tree.GetChild(idx).GetChild(0).Text;
   }
   else
   {
     st.Value = DBNull.Value;
   }
   i = 0;
   while ((i < Tree.ChildCount) && (i < idxDataType))
   {
     stVars[ i ] = new StoreType();
     stVars[ i ].Name = Tree.GetChild(i).Text;
     stVars[ i ].Type = st.Type;
     stVars[ i ].Length = st.Length;
     stVars[ i ].Values = st.Values;
     stVars[ i ].Precision = st.Precision;
     stVars[ i ].Unsigned = st.Unsigned;
     stVars[ i ].Value = st.Value;
     i++;
   }
   return stVars;
 }
예제 #8
0
 /// <summary>
 /// Registers in the current scope all the session variables, so they can be properly emulated.
 /// </summary>
 /// <param name="cts"></param>
 /// <param name="vars"></param>
 private void ParseSessions(CommonTokenStream cts, Dictionary<string, StoreType> vars)
 {
   for( int i = 0; i < cts.Count; i++ )
   {
     IToken tok = cts.Get(i);
     if ((tok.Type == MySQL51Parser.AT1) && ((i + 1) < cts.Count) &&
       (cts.Get(i + 1).Type == MySQL51Parser.ID))
     {
       if ((i > 0) && (cts.Get(i - 1).Type == MySQL51Parser.ID)) continue;
       string id = string.Format( "@{0}", cts.Get( i + 1 ).Text );
       StoreType st;
       if( !vars.TryGetValue( id, out st ) )
       {
         st = new StoreType() { Name = id, Type = "varchar", Value = DBNull.Value, VarKind = VarKindEnum.Session };
         vars.Add(id, st );
       }
     }
   }
 }
예제 #9
0
 private StoreType GetStoreType(MySqlDataReader r, string prefix)
 {
   StoreType st;
   st = new StoreType();
   st.Name = string.Format( "{0}.{1}",prefix, r.GetString(0) );
   st.Type = r.GetString(1);
   if (StoreType.IsString(st.Type))
     st.Length = r.GetInt32(4);
   else if ( StoreType.IsNumeric( st.Type ) )
     st.Length = r.GetInt32(2);
   st.Values = null;   // TODO: For now, no supporting enum types
   st.Precision = StoreType.IsNumeric(st.Type) ? r.GetInt32(3) : 0;
   st.Unsigned = false;
   st.Value = DBNull.Value;
   return st;
 }
예제 #10
0
 internal string WrapValue()
 {
     return(StoreType.WrapValue(Type, Value));
 }
예제 #11
0
 internal StoreType(StoreType st)
 {
   this.ArgType = st.ArgType;
   this.VarKind = st.VarKind;
   this.Type = st.Type;
   this.Value = st.Value;
   this.Name = st.Name;
   this.Length = st.Length;
   this.Precision = st.Precision;
   this.Unsigned = st.Unsigned;
 }
예제 #12
0
 internal void RaiseValueChanged(StoreType st)
 {
   if (OnValueChanged != null)
     OnValueChanged(st);
 }