internal CAsyncResult(CAsyncServiceHandler ash, ushort sReqId, CUQueue q, CAsyncServiceHandler.DAsyncResultHandler arh) { m_AsyncServiceHandler = ash; m_RequestId = sReqId; m_UQueue = q; m_CurrentAsyncResultHandler = arh; }
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); }
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(); } }
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(); } }
/// <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); }
/// <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); }
internal void Reset(ushort sReqId, CUQueue q, CAsyncServiceHandler.DAsyncResultHandler arh) { m_RequestId = sReqId; m_UQueue = q; m_CurrentAsyncResultHandler = arh; }