/// <summary>
        /// Get the connection string name when given a GUID
        /// </summary>
        /// <param name="conn_guid_str"></param>
        /// <returns></returns>
        public static string GetConnectionStringPrefix(string conn_guid_str)
        {
            SsisObject connobj = SsisObject.GetObjectByGuid(Guid.Parse(conn_guid_str));

            if (connobj == null)
            {
                return("Sql");
            }
            string objecttype = connobj.Properties["CreationName"];

            if (objecttype.StartsWith("OLEDB"))
            {
                return("OleDb");
            }
            else if (objecttype.StartsWith("ADO.NET:System.Data.SqlClient.SqlConnection"))
            {
                return("Sql");
            }
            else
            {
                SourceWriter.Help(null, "I don't understand the database connection type " + objecttype);
            }
            return("");
        }
        public ProgramVariable(SsisObject o, bool as_global)
        {
            // Figure out what type of a variable we are
            DtsType      = o.GetChildByType("DTS:VariableValue").Attributes["DTS:DataType"];
            CSharpType   = null;
            DefaultValue = o.GetChildByType("DTS:VariableValue").ContentValue;
            Comment      = o.Description;
            Namespace    = o.Properties["Namespace"];
            IsGlobal     = as_global;
            VariableName = o.DtsObjectName;

            // Here are the DTS type codes I know
            if (DtsType == "3")
            {
                CSharpType = "int";
            }
            else if (DtsType == "8")
            {
                CSharpType = "string";
                if (!String.IsNullOrEmpty(DefaultValue))
                {
                    DefaultValue = "\"" + DefaultValue.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\"";
                }
            }
            else if (DtsType == "13")
            {
                CSharpType   = "DataTable";
                DefaultValue = "new DataTable()";
            }
            else if (DtsType == "2")
            {
                CSharpType = "short";
            }
            else if (DtsType == "11")
            {
                CSharpType = "bool";
                if (DefaultValue == "1")
                {
                    DefaultValue = "true";
                }
                else
                {
                    DefaultValue = "false";
                }
            }
            else if (DtsType == "20")
            {
                CSharpType = "long";
            }
            else if (DtsType == "7")
            {
                CSharpType = "DateTime";
                if (!String.IsNullOrEmpty(DefaultValue))
                {
                    DefaultValue = "DateTime.Parse(\"" + DefaultValue + "\")";
                }
            }
            else
            {
                SourceWriter.Help(o, "I don't understand DTS type " + DtsType);
            }
        }
        public Token ConsumeToken(ref string s)
        {
            // Get the first character
            char c = s[0];

            // Is it whitespace?  Just consume this character and move on
            if (c == ' ' || c == '\r' || c == '\n' || c == '\t')
            {
                s = s.Substring(1);
                return(null);

                // Is this a lineage column reference?
            }
            else if (c == '#')
            {
                return(new LineageToken(ref s, this));

                // Is this a global variable reference?
            }
            else if (c == '@')
            {
                return(new VariableToken(ref s, this));

                // Is this a type conversion?  If so, we need one more token
            }
            else if (c == '(')
            {
                return(new ConversionToken(ref s, this));

                // Is this a math operation?
            }
            else if (c == '+' || c == '-' || c == '*' || c == '/')
            {
                s = s.Substring(1);
                return(new OperationToken()
                {
                    Op = c.ToString()
                });

                // Check for solo negation or not-equals
            }
            else if (c == '!')
            {
                if (s[1] == '=')
                {
                    s = s.Substring(2);
                    return(new OperationToken()
                    {
                        Op = "!="
                    });
                }
                s = s.Substring(1);
                return(new OperationToken()
                {
                    Op = "!"
                });

                // This could be either assignment or equality
            }
            else if (c == '=')
            {
                if (s[1] == '=')
                {
                    s = s.Substring(2);
                    return(new OperationToken()
                    {
                        Op = "=="
                    });
                }
                s = s.Substring(1);
                return(new OperationToken()
                {
                    Op = "="
                });

                // Is this a string constant?
            }
            else if (c == '"')
            {
                Match m = STRING_REGEX.Match(s);
                if (m.Success)
                {
                    s = s.Substring(m.Index + m.Length);
                    return(new ConstantToken()
                    {
                        Value = m.Captures[0].Value, TypeRef = "System.String"
                    });
                }

                // Is this a numeric constant?
            }
            else if (c >= '0' && c <= '9')
            {
                Match m = NUMBER_REGEX.Match(s);
                if (m.Success)
                {
                    s = s.Substring(m.Index + m.Length);
                    return(new ConstantToken()
                    {
                        Value = m.Captures[0].Value, TypeRef = "System.Int32"
                    });
                }

                // Is this boolean true or false?
            }
            else if (s.StartsWith("true", StringComparison.CurrentCultureIgnoreCase))
            {
                s = s.Substring(4);
                return(new ConstantToken()
                {
                    Value = "true", TypeRef = "System.Boolean"
                });
            }
            else if (s.StartsWith("false", StringComparison.CurrentCultureIgnoreCase))
            {
                s = s.Substring(5);
                return(new ConstantToken()
                {
                    Value = "false", TypeRef = "System.Boolean"
                });
            }

            // Did we fail to process this token?  Fail out
            SourceWriter.Help(null, "Unable to parse expression '" + _expression + "'");
            s = "";
            return(null);
        }