Beispiel #1
0
 internal CAsyncResult(CAsyncServiceHandler ash, ushort sReqId, CUQueue q, CAsyncServiceHandler.DAsyncResultHandler arh)
 {
     m_AsyncServiceHandler = ash;
     m_RequestId           = sReqId;
     m_UQueue = q;
     m_CurrentAsyncResultHandler = arh;
 }
Beispiel #2
0
        virtual public bool Send(ushort reqId, byte[] data, uint len)
        {
            CAsyncServiceHandler.DAsyncResultHandler ash = null;
            THandler src = SourceHandler;

            if (src == null)
            {
                return(false);
            }
            IClientQueue cq = src.AttachedClientSocket.ClientQueue;

            if (!cq.Available)
            {
                return(false);
            }
            bool ok = src.SendRequest(reqId, data, len, ash);

            if (Replicable && cq.JobSize == 0)
            {
                ok = cq.AppendTo(TargetQueues);
            }
            return(ok);
        }
Beispiel #3
0
    static void Main(string[] args)
    {
        CConnectionContext cc = new CConnectionContext("localhost", 20901, "hwClientUserId", "password4hwClient");

        using (CSocketPool <HelloWorld> spHw = new CSocketPool <HelloWorld>(true)) //true -- automatic reconnecting
        {
            bool       ok = spHw.StartSocketPool(cc, 1, 1);
            HelloWorld hw = spHw.Seek(); //or HelloWorld hw = spHw.Lock();

            //optionally start a persistent queue at client side to ensure auto failure recovery and once-only delivery
            ok = hw.AttachedClientSocket.ClientQueue.StartQueue("helloworld", 24 * 3600, false); //time-to-live 1 day and true for encryption

            //process requests one by one synchronously
            Console.WriteLine(hw.SayHello("Jone", "Dole"));
            hw.Sleep(5000);
            CMyStruct msOriginal = CMyStruct.MakeOne();
            CMyStruct ms         = hw.Echo(msOriginal);

            //asynchronously process multiple requests with inline batching for best network efficiency
            ok = hw.SendRequest(hwConst.idSayHelloHelloWorld, "Jack", "Smith", (ar) =>
            {
                string ret;
                ar.Load(out ret);
                Console.WriteLine(ret);
            });
            CAsyncServiceHandler.DAsyncResultHandler arh = null;
            ok = hw.SendRequest(hwConst.idSleepHelloWorld, (int)5000, arh);
            ok = hw.SendRequest(hwConst.idEchoHelloWorld, msOriginal, (ar) =>
            {
                ar.Load(out ms);
            });
            ok = hw.WaitAll();
            Console.WriteLine("Press ENTER key to shutdown the demo application ......");
            Console.ReadLine();
        }
    }
Beispiel #4
0
    static void Main(string[] args)
    {
        Console.WriteLine("Input your user id ......");
        CConnectionContext cc = new CConnectionContext("localhost", 20901, Console.ReadLine(), "MyPassword", tagEncryptionMethod.TLSv1);

        //CA file is located at the directory ..\SocketProRoot\bin
        CClientSocket.SSL.SetVerifyLocation("ca.cert.pem");

        //for windows platforms, you can also use windows system store instead
        //CClientSocket.SSL.SetVerifyLocation("my"); //or "root", "my@currentuser", "root@localmachine"

        using (CSocketPool <HelloWorld> spHw = new CSocketPool <HelloWorld>()) //true -- automatic reconnecting
        {
            spHw.DoSslServerAuthentication += (sender, cs) =>
            {
                int    errCode;
                IUcert cert = cs.UCert;
                Console.WriteLine(cert.SessionInfo);
                string res = cert.Verify(out errCode);
                //do ssl server certificate authentication here
                return(errCode == 0);  //true -- user id and password will be sent to server
            };

            //error handling ignored for code clarity
            bool       ok = spHw.StartSocketPool(cc, 1, 1);
            HelloWorld hw = spHw.Seek(); //or HelloWorld hw = spHw.Lock();

            CClientSocket ClientSocket = hw.AttachedClientSocket;
            ClientSocket.Push.OnSubscribe += (cs, messageSender, groups) =>
            {
                Console.WriteLine("Subscribe for " + ToString(groups));
                Console.WriteLine(ToString(messageSender));
                Console.WriteLine();
            };

            ClientSocket.Push.OnUnsubscribe += (cs, messageSender, groups) =>
            {
                Console.WriteLine("Unsubscribe from " + ToString(groups));
                Console.WriteLine(ToString(messageSender));
                Console.WriteLine();
            };

            ClientSocket.Push.OnPublish += (cs, messageSender, groups, msg) =>
            {
                Console.WriteLine("Publish to " + ToString(groups));
                Console.WriteLine(ToString(messageSender));
                Console.WriteLine("message = " + msg);
                Console.WriteLine();
            };

            ClientSocket.Push.OnSendUserMessage += (cs, messageSender, msg) =>
            {
                Console.WriteLine("SendUserMessage");
                Console.WriteLine(ToString(messageSender));
                Console.WriteLine("message = " + msg);
                Console.WriteLine();
            };

            //asynchronously process multiple requests with inline batching for best network efficiency
            ok = hw.SendRequest(hwConst.idSayHelloHelloWorld, "Jack", "Smith", (ar) =>
            {
                string ret;
                ar.Load(out ret);
                Console.WriteLine(ret);
            });

            uint[] chat_ids = { 1, 2 };
            ok = ClientSocket.Push.Publish("We are going to call the method Sleep", chat_ids);
            CAsyncServiceHandler.DAsyncResultHandler arh = null;
            ok = hw.SendRequest(hwConst.idSleepHelloWorld, (int)5000, arh);

            Console.WriteLine("Input a receiver for receiving my message ......");
            Console.WriteLine();
            ok = ClientSocket.Push.SendUserMessage("A message from " + cc.UserId, Console.ReadLine());
            ok = hw.WaitAll();

            Console.WriteLine("Press key ENTER to shutdown the demo application ......");
            Console.ReadLine();
        }
    }
Beispiel #5
0
        /// <summary>
        /// Send affected record set from a trigger for table update, delete or insert onto one or more remote SocketPro servers with auto replication if required.
        /// </summary>
        /// <param name="tableName">A valid table name</param>
        /// <param name="param">An extra info data. For example, a trigger name</param>
        /// <param name="batchSize">The size of a set of records in byte. It defaults to CAsyncAdoSerializationHelper.DEFAULT_BATCH_SIZE</param>
        /// <returns>True for success; and false for failure</returns>
        public virtual bool SendDmlTrigger(string tableName, object param, uint batchSize)
        {
            bool jobing = false;
            bool ok     = true;

            if (tableName == null)
            {
                throw new ArgumentNullException("A valid table name required");
            }
            if (tableName.Length == 0)
            {
                throw new ArgumentException("A valid table name required");
            }

            IClientQueue srcQueue = SourceQueue;

            if (srcQueue == null || !srcQueue.Available)
            {
                throw new InvalidOperationException("No queue available for persisting data");
            }

            TriggerAction ta = SqlContext.TriggerContext.TriggerAction;

            using (SqlConnection conn = new SqlConnection("context connection=true"))
            {
                CAsyncServiceHandler.DAsyncResultHandler arh = null;
                SqlDataReader dr = null;
                try
                {
                    conn.Open();
                    lock (m_csSs)
                    {
                        jobing = (srcQueue.JobSize != 0);
                        THandler h = SourceHandler;
                        try
                        {
                            if (!jobing)
                            {
                                ok = StartJob();
                            }
                            switch (ta)
                            {
                            case TriggerAction.Update:
                            case TriggerAction.Delete:
                            case TriggerAction.Insert:
                                ok = h.SendRequest(CAsyncAdoSerializationHelper.idDmlTriggerMessage, (int)ta, Utilities.GetObjectFullName(conn, tableName, "U"), param, arh);
                                break;

                            default:
                                throw new InvalidOperationException("SendDmlTrigger for table update, insert and delete events only");
                            }

                            if (ta == TriggerAction.Update || ta == TriggerAction.Delete)
                            {
                                SqlCommand cmd = new SqlCommand("select * from deleted", conn);
                                dr = cmd.ExecuteReader();
                                ok = h.Send(dr, batchSize);
                                dr.Close();
                            }

                            if (ta == TriggerAction.Update || ta == TriggerAction.Insert)
                            {
                                SqlCommand cmd = new SqlCommand("select * from inserted", conn);
                                dr = cmd.ExecuteReader();
                                ok = h.Send(dr, batchSize);
                                dr.Close();
                            }

                            if (!jobing)
                            {
                                ok = EndJob();
                            }
                            ok = true;
                        }
                        catch
                        {
                            if (dr != null)
                            {
                                dr.Close();
                            }
                            if (!jobing)
                            {
                                ok = AbortJob();
                            }
                            ok = false;
                        }
                    }
                }
                finally
                {
                    conn.Close();
                }
            }
            return(ok);
        }
Beispiel #6
0
        /// <summary>
        /// Send a record set from a given query statement onto one or more remote SocketPro servers with auto replication if required
        /// </summary>
        /// <param name="sqlQuery">A statement creating a set of records</param>
        /// <param name="recordsetName">An string name for this record set</param>
        /// <param name="batchSize">The size of a set of records in byte. It defaults to CAsyncAdoSerializationHelper.DEFAULT_BATCH_SIZE</param>
        public virtual bool Send(string sqlQuery, string recordsetName, uint batchSize)
        {
            bool ok     = false;
            bool jobing = false;

            if (sqlQuery == null || sqlQuery.Length == 0)
            {
                throw new ArgumentException("A valid sql select query required");
            }
            IClientQueue srcQueue = SourceQueue;

            if (srcQueue == null || !srcQueue.Available)
            {
                throw new InvalidOperationException("No queue available for persisting data");
            }
            using (SqlConnection conn = new SqlConnection("context connection=true"))
            {
                CAsyncServiceHandler.DAsyncResultHandler arh = null;
                SqlDataReader dr = null;
                try
                {
                    conn.Open();
                    lock (m_csSs)
                    {
                        jobing = (srcQueue.JobSize != 0);
                        THandler h = SourceHandler;
                        try
                        {
                            if (!jobing)
                            {
                                ok = StartJob();
                            }
                            ok = h.SendRequest(CAsyncAdoSerializationHelper.idRecordsetName, recordsetName, arh);
                            SqlCommand cmd = new SqlCommand(sqlQuery, conn);
                            dr = cmd.ExecuteReader();
                            do
                            {
                                ok = h.Send(dr, batchSize);
                            } while (dr.NextResult());
                            dr.Close();
                            if (!jobing)
                            {
                                ok = EndJob();
                            }
                            ok = true;
                        }
                        catch
                        {
                            if (dr != null)
                            {
                                dr.Close();
                            }
                            if (!jobing)
                            {
                                ok = AbortJob();
                            }
                            ok = false;
                        }
                    }
                }
                finally
                {
                    conn.Close();
                }
            }
            return(ok);
        }
Beispiel #7
0
 internal void Reset(ushort sReqId, CUQueue q, CAsyncServiceHandler.DAsyncResultHandler arh)
 {
     m_RequestId = sReqId;
     m_UQueue    = q;
     m_CurrentAsyncResultHandler = arh;
 }