예제 #1
0
파일: Repl.cs 프로젝트: lanicon/etlyte
        public static void Run(string[] args, ConfigFile configFile)
        {
            try
            {
                string   dbname = (args.Length > 1) && (args[1] != null) ? args[1] : null;
                SqliteDb db     = new SqliteDb(dbname, true, null, configFile.Extract.Delimiter, configFile.Db.LogFile).Init();
                if (dbname == null)
                {
                    dbname = "a transient in-memory database.";
                }

                Writer = new PlainTextResultWriter(Console.Out, Console.Out, Console.Out);
                var tables  = db.GetTableNames();
                var columns = new List <string>();
                foreach (var t in tables)
                {
                    foreach (var col in db.GetColumnNamesForTable(t))
                    {
                        if (!columns.Contains(col))
                        {
                            columns.Add(col);
                        }
                    }
                }
                var startupMsg = "ETLyte v. " + Globals.Version;
                startupMsg += Environment.NewLine + "Connected to " + dbname;
                string          prompt = "ETLyte> ";
                CSharpEvaluator eval   = new CSharpEvaluator();
                InteractivePrompt.Run(
                    ((cmd, rawinput, completions) =>
                {
                    // add new completions
                    foreach (var c in cmd.Split(' '))
                    {
                        if (!completions.Contains(c))
                        {
                            completions.Add(c);
                        }
                    }

                    string retstr = "";
                    var arg = cmd.Split(' ');
                    var firstArg = arg[0];
                    if (firstArg.Trim()[0] == '.')
                    {
                        switch (firstArg.ToLower())
                        {
                        case ".tables":
                            var sqlcmd = "SELECT name FROM sqlite_master WHERE type='table';";
                            if (db.ExecuteQuery(sqlcmd, Writer) != 0)
                            {
                                Writer.WriteStd(db.LastError);
                            }
                            break;

                        case ".output":
                            if (arg[1].ToLower() == "json")
                            {
                                Writer = new JsonResultWriter(Console.Out, Console.Out, Console.Out);
                                retstr = "Switched to JSON output" + Environment.NewLine;
                            }
                            else if (arg[1].ToLower() == "plain")
                            {
                                Writer = new PlainTextResultWriter(Console.Out, Console.Out, Console.Out);
                                retstr = "Switched to plain output" + Environment.NewLine;
                            }
                            break;

                        default:
                            retstr = "Unrecognized command." + Environment.NewLine;
                            break;
                        }
                    }
                    else if (firstArg.Trim()[0] == '{')
                    {
                        retstr = eval.HandleCmd(cmd.Trim().Substring(1)) + Environment.NewLine;
                    }
                    else
                    {
                        if (db.ExecuteQuery(cmd, Writer) != 0)
                        {
                            Writer.WriteStd(db.LastError);
                        }
                    }

                    return(retstr);
                }), prompt, startupMsg, tables.Concat(columns).ToList());
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.InnerException);
                Console.WriteLine(e.StackTrace);
            }
        }