Ejemplo n.º 1
0
        /**
         *  make sure the function is re-entriable.
         **/
        static CheDaoInterface _HandlePackage(LocalChePackage p)
        {
            CheDaoInterface msg = create(p);

            if (msg != null)
            {
                switch (msg.message_type)
                {
                case CheDaoInterface.data_validation:
                    lock (mPendingList)
                    {
                        CheRequest item = (CheRequest)msg;
                        try
                        {
                            //put to pending list
                            mPendingList.Add(item.Order_Number, item);
                        }
                        catch (Exception e)
                        {
                            Trace.WriteLineIf(Program.trace_sw.TraceError, "Insert CheRequest Failed, maybe the key already exist " + e.Message, "error");
                            msg.Result = 2;     //2:其它不符;
                        }
                    }
                    break;

                case CheDaoInterface.clean_cmd:    //delete the item one hour later
                    int bypass_counter = 0;
                    lock (mPendingList)
                    {
                        Dictionary <String, CheRequest> newPendingList = new Dictionary <String, CheRequest>();
                        foreach (String str in mPendingList.Keys)
                        {
                            CheRequest c_item = mPendingList[str];
                            DateTime   c_date = new DateTime(c_item.create_time);
                            if (c_date.AddMinutes(AppConfig.GetLifeTimeOfRec()) > DateTime.Now)
                            {
                                newPendingList.Add(str, c_item);
                            }
                            else
                            {
                                bypass_counter++;
                            }
                        }
                        mPendingList = newPendingList;
                    }
                    Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "clean up the internal cache and bypass " + bypass_counter.ToString());
                    break;

                case CheDaoInterface.scan_print:
                case CheDaoInterface.manual_print:
                    lock (mPendingList)
                    {
                        ChePrintRequest p_item = (ChePrintRequest)msg;
                        if (mPendingList.ContainsKey(p_item.Order_Number))
                        {
                            CheRequest w_item = mPendingList[p_item.Order_Number];
                            mPendingList.Remove(p_item.Order_Number);
                            Program.NewRequest(w_item);     // to be print
                        }
                        else
                        {
                            Trace.WriteLineIf(Program.trace_sw.TraceError, "invalide print request, no key exist", "error");
                            msg.Result = 2;    //2:已开票;
                        }
                    }
                    break;

                case CheDaoInterface.print_confirm:
                    Program.NewRequest(msg);     //internal message
                    break;

                case CheDaoInterface.delete_cmd:
                    Program.NewRequest(msg);     //internal message
                    break;

                default:
                    msg = null;
                    break;
                }
                try
                {
                    lock (bk_stream)
                    {
                        if (msg != null)
                        {
                            p.save(bk_stream);              // just save the valid msg
                        }
                    }
                }
                catch (Exception e)
                {
                    save_error_count++;
                    Trace.WriteLineIf(Program.trace_sw.TraceError, "Write backup stream failed " + e.Message, "error");
                }
            }
            return(msg);
        }
Ejemplo n.º 2
0
        public static void restore()
        {
            const int max_fragment = 1024;

            byte[] buffer   = new byte[max_fragment];
            int    read_len = 0;

            if (rst_stream != null)
            {
                int msg_count     = 0;
                int discard_count = 0;
                Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "restore dumped package", "info");
                Boolean read_ok = false;
                do
                {
                    read_ok  = false;
                    read_len = rst_stream.Read(buffer, 0, sizeof(int));
                    if (read_len != sizeof(int))
                    {
                        continue;
                    }
                    int msg_len = BitConverter.ToInt32(buffer, 0);
                    read_len = rst_stream.Read(buffer, 0, sizeof(short));
                    if (read_len != sizeof(short))
                    {
                        continue;
                    }
                    short msg_type = BitConverter.ToInt16(buffer, 0);
                    read_len = rst_stream.Read(buffer, 0, sizeof(long));
                    if (read_len != sizeof(long))
                    {
                        continue;
                    }
                    DateTime c_t = new DateTime(BitConverter.ToInt64(buffer, 0));
                    read_len = rst_stream.Read(buffer, 0, msg_len);
                    if (read_len != msg_len)
                    {
                        continue;
                    }
                    read_ok = true;
                    msg_count++;
                    if (c_t.AddMinutes(AppConfig.GetLifeTimeOfRec()) < DateTime.Now)
                    {
                        discard_count++;
                        continue; // skip the message because it is too old.
                    }
                    LocalChePackage p = new LocalChePackage(msg_type, buffer, msg_len, c_t.Ticks);
                    _HandlePackage(p);
                } while (read_ok);
                Trace.WriteLineIf(Program.trace_sw.TraceInfo, String.Format("restore done found msg {0:d} discard {1:d}", msg_count, discard_count), "info");
                String obsolete_fn = active_a == "A-" ? "B-" : "A-";
                rst_stream.Close();
                try
                {
                    File.Delete(obsolete_fn + bk_fn);
                }
                catch (Exception e) {
                    Trace.WriteLineIf(Program.trace_sw.TraceError, "delete backup file " + obsolete_fn + bk_fn + " failed" + e.Message, "error");
                }
            }
            return;
        }