예제 #1
0
        public static WebResultSet CreateRequest(HtunConnection conn, string sql, int limit, Dictionary <string, string> queryPars)
        {
            List <string> qnames = new List <string>(queryPars.Keys);

            qnames.Sort(delegate(string a, string b) { return(b.Length - a.Length); });
            foreach (string qpar in qnames)
            {
                string val = queryPars[qpar];
                if (val == null)
                {
                    sql = sql.Replace(qpar, "NULL");
                }
                else
                {
                    sql = sql.Replace(qpar, "'" + val.Replace("'", "\\'") + "'");
                }
            }

            Dictionary <string, byte[]> extpars = new Dictionary <string, byte[]>();

            extpars["LIMIT"]   = Encoding.ASCII.GetBytes(limit.ToString());
            extpars["COMMAND"] = EncodeCommand(conn, sql);

            WebResponse resp = CreateWebResponse(conn, "QUERY", extpars, sql);

            return(new WebResultSet(resp, conn.ResultSetEncoding));
        }
예제 #2
0
        public static WebResultSendScript CreateSendScript(HtunConnection conn, IEnumerable <string> script)
        {
            var extpars = new Dictionary <string, byte[]>();
            int index   = 0;

            foreach (string cmd in script)
            {
                extpars["COMMAND" + index.ToString()] = EncodeCommand(conn, cmd);
                index++;
            }
            extpars["CMDCOUNT"] = Encoding.ASCII.GetBytes(index.ToString());
            var resp = CreateWebResponse(conn, "SCRIPT", extpars, null);

            return(new WebResultSendScript(resp, conn.ResultSetEncoding));
        }
예제 #3
0
 public static WebResultSet CreateRequest(HtunConnection conn, string sql)
 {
     return(CreateRequest(conn, sql, -1, new Dictionary <string, string>()));
 }
예제 #4
0
 protected static byte[] EncodeCommand(HtunConnection conn, string sql)
 {
     byte[] cmd = (conn.BinaryCommandEncoding ?? conn.ResultSetEncoding).GetBytes(sql);
     Array.Reverse(cmd);
     return(cmd);
 }
예제 #5
0
        public static WebResponse CreateWebResponse(HtunConnection conn, string op, Dictionary <string, byte[]> extpars, string sqlForLogPurpose)
        {
            var       fp        = conn.FailoverParams;
            var       start     = DateTime.Now;
            Exception httpError = null;
            int       reqindex  = 0;

            for (; reqindex < fp.MaxRequestCount; reqindex++)
            {
                try
                {
                    HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(conn.Driver.Url);

                    if (!String.IsNullOrEmpty(conn.Driver.HttpLogin))
                    {
                        webrequest.Credentials = new NetworkCredential(conn.Driver.HttpLogin, conn.Driver.HttpPassword);
                    }


                    webrequest.ContentType = "application/x-www-form-urlencoded; charset=" + conn.Driver.RealEncoding.WebName;
                    webrequest.Method      = "POST";

                    var pars  = new Dictionary <string, byte[]>();
                    var spars = new Dictionary <string, string>();
                    conn.GetDatabaseParams(spars);
                    foreach (var tuple in spars)
                    {
                        pars[tuple.Key] = Encoding.ASCII.GetBytes(tuple.Value);
                    }
                    pars["ENCODINGSTYLE"] = Encoding.ASCII.GetBytes(conn.Driver.EncodingStyle.ToString());
                    pars["VERSION"]       = Encoding.ASCII.GetBytes(VERSION.ToString());
                    pars["OPERATION"]     = Encoding.ASCII.GetBytes(op);
                    pars["DATABASE"]      = Encoding.ASCII.GetBytes(conn.Database ?? "");
                    pars["SESSIONINIT"]   = EncodeCommand(conn, conn.SessionInitScript ?? "");

                    //pars["HOST"] = Encoding.ASCII.GetBytes(conn.Params.Host ?? "");
                    //pars["USER"] = Encoding.ASCII.GetBytes(conn.Params.Login ?? "");
                    ////pars["PORT"] = Encoding.ASCII.GetBytes(PtunDefaults.Instance.Port(conn.Params.Engine, conn.Params.Port).ToString());
                    //pars["PORT"] = Encoding.ASCII.GetBytes(conn.Params.Port.ToString());
                    //pars["PASSWORD"] = Encoding.ASCII.GetBytes(conn.Params.Password ?? "");
                    //pars["ENGINE"] = Encoding.ASCII.GetBytes(conn.Params.Engine ?? "");
                    //pars["DATABASE"] = Encoding.ASCII.GetBytes(conn.Database ?? "");
                    pars.AddAll(extpars);

                    string pars_enc = StringTool.UrlEncode(pars);
                    byte[] data     = conn.Driver.RealEncoding.GetBytes(pars_enc);
                    webrequest.ContentLength = data.Length;

                    webrequest.Timeout = reqindex == 0 ? fp.HttpRequestTimeoutMilisecs : fp.RepeatedHttpRequestTimeoutMilisecs;
                    using (Stream requestStream = webrequest.GetRequestStream())
                    {
                        requestStream.Write(data, 0, data.Length);
                    }

                    try
                    {
                        WebResponse resp = webrequest.GetResponse();
                        return(resp);
                    }
                    catch (Exception e)
                    {
                        Logging.Warning(String.Format("HTTP tunnel error (run {0}), trying again:{1}", reqindex, e.Message));
                        Thread.Sleep(fp.DelayBeforeRepeatedRequestMilisecs);
                        httpError = e;
                    }
                    if ((DateTime.Now - start).TotalMilliseconds > fp.RepeatedRequestTimeoutMilisecs)
                    {
                        break;
                    }
                }
                catch (UriFormatException err)
                {
                    throw new ConnectionFailedError("DAE-00329", err);
                }
            }
            Logging.Info(String.Format("Repeated HTTPTUN request failed, repeated={0}", reqindex));
            if (sqlForLogPurpose != null)
            {
                DbConnectionExtension.LogExecuteQuery(sqlForLogPurpose);
            }
            else
            {
                Logging.Debug("Executing HTTPTUN operation:" + op);
            }
            throw httpError;
        }
예제 #6
0
        public static WebResultDbPing CreatePing(HtunConnection conn)
        {
            var resp = CreateWebResponse(conn, "DBPING", null, null);

            return(new WebResultDbPing(resp, conn.ResultSetEncoding));
        }