rubywmq 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/Gemfile +10 -0
 - data/Gemfile.lock +37 -0
 - data/LICENSE.txt +1 -1
 - data/README.md +29 -47
 - data/Rakefile +12 -76
 - data/examples/each_a.rb +2 -3
 - data/examples/each_b.rb +4 -5
 - data/examples/each_header.rb +5 -6
 - data/examples/files_to_q.rb +7 -8
 - data/examples/get_a.rb +3 -5
 - data/examples/get_client.rb +9 -10
 - data/examples/put1_a.rb +2 -3
 - data/examples/put1_b.rb +4 -7
 - data/examples/put1_c.rb +6 -6
 - data/examples/put_a.rb +0 -2
 - data/examples/put_b.rb +5 -7
 - data/examples/put_dlh.rb +11 -12
 - data/examples/put_dynamic_q.rb +7 -7
 - data/examples/put_group_a.rb +3 -4
 - data/examples/put_group_b.rb +7 -7
 - data/examples/put_rfh.rb +13 -11
 - data/examples/put_rfh2_a.rb +9 -10
 - data/examples/put_rfh2_b.rb +9 -9
 - data/examples/put_xmit_q.rb +63 -8
 - data/examples/q_to_files.rb +6 -7
 - data/examples/request.rb +20 -18
 - data/examples/server.rb +19 -16
 - data/ext/extconf.rb +2 -1
 - data/ext/extconf_client.rb +3 -3
 - data/ext/generate/generate_const.rb +30 -23
 - data/ext/generate/generate_reason.rb +70 -72
 - data/ext/generate/generate_structs.rb +20 -19
 - data/ext/generate/wmq_structs.erb +67 -67
 - data/ext/wmq.c +0 -16
 - data/ext/wmq.h +0 -16
 - data/ext/wmq_message.c +8 -24
 - data/ext/wmq_mq_load.c +5 -17
 - data/ext/wmq_queue.c +73 -90
 - data/ext/wmq_queue_manager.c +115 -108
 - data/lib/wmq/message.rb +36 -34
 - data/lib/wmq/queue_manager.rb +22 -19
 - data/lib/wmq/version.rb +1 -1
 - data/rubywmq.gemspec +38 -0
 - data/test/queue_manager_test.rb +334 -0
 - data/test/test_helper.rb +14 -0
 - metadata +16 -26
 - data/tests/test.rb +0 -318
 
    
        data/ext/wmq_queue_manager.c
    CHANGED
    
    | 
         @@ -1,19 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             *  Copyright 2006 J. Reid Morrison
         
     | 
| 
       3 
     | 
    
         
            -
             *
         
     | 
| 
       4 
     | 
    
         
            -
             *  Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
       5 
     | 
    
         
            -
             *  you may not use this file except in compliance with the License.
         
     | 
| 
       6 
     | 
    
         
            -
             *  You may obtain a copy of the License at
         
     | 
| 
       7 
     | 
    
         
            -
             *
         
     | 
| 
       8 
     | 
    
         
            -
             *      http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
       9 
     | 
    
         
            -
             *
         
     | 
| 
       10 
     | 
    
         
            -
             *  Unless required by applicable law or agreed to in writing, software
         
     | 
| 
       11 
     | 
    
         
            -
             *  distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
       12 
     | 
    
         
            -
             *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
       13 
     | 
    
         
            -
             *  See the License for the specific language governing permissions and
         
     | 
| 
       14 
     | 
    
         
            -
             *  limitations under the License.
         
     | 
| 
       15 
     | 
    
         
            -
             */
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
1 
     | 
    
         
             
            #include "wmq.h"
         
     | 
| 
       18 
2 
     | 
    
         | 
| 
       19 
3 
     | 
    
         
             
            static ID ID_open;
         
     | 
| 
         @@ -50,6 +34,7 @@ static ID ID_ssl_cipher_spec; 
     | 
|
| 
       50 
34 
     | 
    
         
             
            static ID ID_ssl_peer_name;
         
     | 
| 
       51 
35 
     | 
    
         
             
            static ID ID_keep_alive_interval;
         
     | 
| 
       52 
36 
     | 
    
         
             
            static ID ID_crypto_hardware;
         
     | 
| 
      
 37 
     | 
    
         
            +
            static ID ID_use_system_connection_data;
         
     | 
| 
       53 
38 
     | 
    
         | 
| 
       54 
39 
     | 
    
         
             
            /* MQSCO ID's */
         
     | 
| 
       55 
40 
     | 
    
         
             
            static ID ID_key_repository;
         
     | 
| 
         @@ -74,26 +59,27 @@ void QueueManager_id_init(void) 
     | 
|
| 
       74 
59 
     | 
    
         
             
                ID_message              = rb_intern("message");
         
     | 
| 
       75 
60 
     | 
    
         | 
| 
       76 
61 
     | 
    
         
             
                /* MQCD ID's */
         
     | 
| 
       77 
     | 
    
         
            -
                ID_channel_name 
     | 
| 
       78 
     | 
    
         
            -
                ID_transport_type 
     | 
| 
       79 
     | 
    
         
            -
                ID_mode_name 
     | 
| 
       80 
     | 
    
         
            -
                ID_tp_name 
     | 
| 
       81 
     | 
    
         
            -
                ID_security_exit 
     | 
| 
       82 
     | 
    
         
            -
                ID_send_exit 
     | 
| 
       83 
     | 
    
         
            -
                ID_receive_exit 
     | 
| 
       84 
     | 
    
         
            -
                ID_max_msg_length 
     | 
| 
       85 
     | 
    
         
            -
                ID_security_user_data 
     | 
| 
       86 
     | 
    
         
            -
                ID_send_user_data 
     | 
| 
       87 
     | 
    
         
            -
                ID_receive_user_data 
     | 
| 
       88 
     | 
    
         
            -
                ID_user_identifier 
     | 
| 
       89 
     | 
    
         
            -
                ID_password 
     | 
| 
       90 
     | 
    
         
            -
                ID_connection_name 
     | 
| 
       91 
     | 
    
         
            -
                ID_heartbeat_interval 
     | 
| 
       92 
     | 
    
         
            -
                ID_long_remote_user_id 
     | 
| 
       93 
     | 
    
         
            -
                ID_remote_security_id 
     | 
| 
       94 
     | 
    
         
            -
                ID_ssl_cipher_spec 
     | 
| 
       95 
     | 
    
         
            -
                ID_ssl_peer_name 
     | 
| 
       96 
     | 
    
         
            -
                ID_keep_alive_interval 
     | 
| 
      
 62 
     | 
    
         
            +
                ID_channel_name                = rb_intern("channel_name");
         
     | 
| 
      
 63 
     | 
    
         
            +
                ID_transport_type              = rb_intern("transport_type");
         
     | 
| 
      
 64 
     | 
    
         
            +
                ID_mode_name                   = rb_intern("mode_name");
         
     | 
| 
      
 65 
     | 
    
         
            +
                ID_tp_name                     = rb_intern("tp_name");
         
     | 
| 
      
 66 
     | 
    
         
            +
                ID_security_exit               = rb_intern("security_exit");
         
     | 
| 
      
 67 
     | 
    
         
            +
                ID_send_exit                   = rb_intern("send_exit");
         
     | 
| 
      
 68 
     | 
    
         
            +
                ID_receive_exit                = rb_intern("receive_exit");
         
     | 
| 
      
 69 
     | 
    
         
            +
                ID_max_msg_length              = rb_intern("max_msg_length");
         
     | 
| 
      
 70 
     | 
    
         
            +
                ID_security_user_data          = rb_intern("security_user_data");
         
     | 
| 
      
 71 
     | 
    
         
            +
                ID_send_user_data              = rb_intern("send_user_data");
         
     | 
| 
      
 72 
     | 
    
         
            +
                ID_receive_user_data           = rb_intern("receive_user_data");
         
     | 
| 
      
 73 
     | 
    
         
            +
                ID_user_identifier             = rb_intern("user_identifier");
         
     | 
| 
      
 74 
     | 
    
         
            +
                ID_password                    = rb_intern("password");
         
     | 
| 
      
 75 
     | 
    
         
            +
                ID_connection_name             = rb_intern("connection_name");
         
     | 
| 
      
 76 
     | 
    
         
            +
                ID_heartbeat_interval          = rb_intern("heartbeat_interval");
         
     | 
| 
      
 77 
     | 
    
         
            +
                ID_long_remote_user_id         = rb_intern("long_remote_user_id");
         
     | 
| 
      
 78 
     | 
    
         
            +
                ID_remote_security_id          = rb_intern("remote_security_id");
         
     | 
| 
      
 79 
     | 
    
         
            +
                ID_ssl_cipher_spec             = rb_intern("ssl_cipher_spec");
         
     | 
| 
      
 80 
     | 
    
         
            +
                ID_ssl_peer_name               = rb_intern("ssl_peer_name");
         
     | 
| 
      
 81 
     | 
    
         
            +
                ID_keep_alive_interval         = rb_intern("keep_alive_interval");
         
     | 
| 
      
 82 
     | 
    
         
            +
                ID_use_system_connection_data  = rb_intern("use_system_connection_data");
         
     | 
| 
       97 
83 
     | 
    
         | 
| 
       98 
84 
     | 
    
         
             
                /* MQSCO ID's */
         
     | 
| 
       99 
85 
     | 
    
         
             
                ID_key_repository       = rb_intern("key_repository");
         
     | 
| 
         @@ -243,12 +229,27 @@ VALUE QueueManager_initialize(VALUE self, VALUE hash) 
     | 
|
| 
       243 
229 
     | 
    
         
             
                 * All Client connection parameters are ignored if connection_name is missing
         
     | 
| 
       244 
230 
     | 
    
         
             
                 */
         
     | 
| 
       245 
231 
     | 
    
         
             
            #ifdef MQCNO_VERSION_2
         
     | 
| 
       246 
     | 
    
         
            -
                 
     | 
| 
      
 232 
     | 
    
         
            +
                int use_system_connection_data = (rb_hash_aref(hash, ID2SYM(ID_use_system_connection_data)) == Qtrue) ? 1 : 0;
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
                if(!NIL_P(rb_hash_aref(hash, ID2SYM(ID_connection_name))) || use_system_connection_data)
         
     | 
| 
       247 
235 
     | 
    
         
             
                {
         
     | 
| 
       248 
236 
     | 
    
         
             
                    PMQCD pmqcd = &pqm->client_conn;              /* Process MQCD */
         
     | 
| 
       249 
237 
     | 
    
         
             
                    pqm->is_client_conn = 1;                      /* Set to Client connection */
         
     | 
| 
       250 
238 
     | 
    
         | 
| 
       251 
     | 
    
         
            -
                     
     | 
| 
      
 239 
     | 
    
         
            +
                    if(use_system_connection_data)
         
     | 
| 
      
 240 
     | 
    
         
            +
                    {
         
     | 
| 
      
 241 
     | 
    
         
            +
                        /*
         
     | 
| 
      
 242 
     | 
    
         
            +
                         * Use system defined connection data rather than explicitly providing a
         
     | 
| 
      
 243 
     | 
    
         
            +
                         * connection name. This is used with CCDT, the MQSERVER ENV var or the
         
     | 
| 
      
 244 
     | 
    
         
            +
                         * mqclient.ini file
         
     | 
| 
      
 245 
     | 
    
         
            +
                         */
         
     | 
| 
      
 246 
     | 
    
         
            +
                        pqm->connect_options.ClientConnPtr = NULL;
         
     | 
| 
      
 247 
     | 
    
         
            +
                    }
         
     | 
| 
      
 248 
     | 
    
         
            +
                    else
         
     | 
| 
      
 249 
     | 
    
         
            +
                    {
         
     | 
| 
      
 250 
     | 
    
         
            +
                        WMQ_HASH2MQCHARS(hash,connection_name,             pmqcd->ConnectionName)
         
     | 
| 
      
 251 
     | 
    
         
            +
                    }
         
     | 
| 
      
 252 
     | 
    
         
            +
             
     | 
| 
       252 
253 
     | 
    
         
             
                    WMQ_HASH2MQLONG (hash,transport_type,              pmqcd->TransportType)
         
     | 
| 
       253 
254 
     | 
    
         
             
                    WMQ_HASH2MQCHARS(hash,mode_name,                   pmqcd->ModeName)
         
     | 
| 
       254 
255 
     | 
    
         
             
                    WMQ_HASH2MQCHARS(hash,tp_name,                     pmqcd->TpName)
         
     | 
| 
         @@ -384,7 +385,7 @@ VALUE QueueManager_initialize(VALUE self, VALUE hash) 
     | 
|
| 
       384 
385 
     | 
    
         
             
             *
         
     | 
| 
       385 
386 
     | 
    
         
             
             * Throws:
         
     | 
| 
       386 
387 
     | 
    
         
             
             * * WMQ::WMQException if comp_code != MQCC_OK
         
     | 
| 
       387 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 388 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       388 
389 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       389 
390 
     | 
    
         
             
             */
         
     | 
| 
       390 
391 
     | 
    
         
             
            VALUE QueueManager_connect(VALUE self)
         
     | 
| 
         @@ -459,7 +460,7 @@ VALUE QueueManager_connect(VALUE self) 
     | 
|
| 
       459 
460 
     | 
    
         
             
             *
         
     | 
| 
       460 
461 
     | 
    
         
             
             * Throws:
         
     | 
| 
       461 
462 
     | 
    
         
             
             * * WMQ::WMQException if comp_code != MQCC_OK
         
     | 
| 
       462 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 463 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       463 
464 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       464 
465 
     | 
    
         
             
             */
         
     | 
| 
       465 
466 
     | 
    
         
             
            VALUE QueueManager_disconnect(VALUE self)
         
     | 
| 
         @@ -509,7 +510,7 @@ VALUE QueueManager_disconnect(VALUE self) 
     | 
|
| 
       509 
510 
     | 
    
         
             
             *
         
     | 
| 
       510 
511 
     | 
    
         
             
             * Note:
         
     | 
| 
       511 
512 
     | 
    
         
             
             * * commit will have no effect if all put and get operations were performed
         
     | 
| 
       512 
     | 
    
         
            -
             *   without specifying : 
     | 
| 
      
 513 
     | 
    
         
            +
             *   without specifying sync:  true
         
     | 
| 
       513 
514 
     | 
    
         
             
             *
         
     | 
| 
       514 
515 
     | 
    
         
             
             * Returns:
         
     | 
| 
       515 
516 
     | 
    
         
             
             * * true : On Success
         
     | 
| 
         @@ -520,7 +521,7 @@ VALUE QueueManager_disconnect(VALUE self) 
     | 
|
| 
       520 
521 
     | 
    
         
             
             *
         
     | 
| 
       521 
522 
     | 
    
         
             
             * Throws:
         
     | 
| 
       522 
523 
     | 
    
         
             
             * * WMQ::WMQException if comp_code != MQCC_OK
         
     | 
| 
       523 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 524 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       524 
525 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       525 
526 
     | 
    
         
             
             */
         
     | 
| 
       526 
527 
     | 
    
         
             
            VALUE QueueManager_commit(VALUE self)
         
     | 
| 
         @@ -561,7 +562,7 @@ VALUE QueueManager_commit(VALUE self) 
     | 
|
| 
       561 
562 
     | 
    
         
             
             *
         
     | 
| 
       562 
563 
     | 
    
         
             
             * Note:
         
     | 
| 
       563 
564 
     | 
    
         
             
             * * backout will have no effect if all put and get operations were performed
         
     | 
| 
       564 
     | 
    
         
            -
             *   without specifying : 
     | 
| 
      
 565 
     | 
    
         
            +
             *   without specifying sync:  true
         
     | 
| 
       565 
566 
     | 
    
         
             
             *
         
     | 
| 
       566 
567 
     | 
    
         
             
             * Returns:
         
     | 
| 
       567 
568 
     | 
    
         
             
             * * true : On Success
         
     | 
| 
         @@ -572,7 +573,7 @@ VALUE QueueManager_commit(VALUE self) 
     | 
|
| 
       572 
573 
     | 
    
         
             
             *
         
     | 
| 
       573 
574 
     | 
    
         
             
             * Throws:
         
     | 
| 
       574 
575 
     | 
    
         
             
             * * WMQ::WMQException if comp_code != MQCC_OK
         
     | 
| 
       575 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 576 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       576 
577 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       577 
578 
     | 
    
         
             
             */
         
     | 
| 
       578 
579 
     | 
    
         
             
            VALUE QueueManager_backout(VALUE self)
         
     | 
| 
         @@ -611,7 +612,7 @@ VALUE QueueManager_backout(VALUE self) 
     | 
|
| 
       611 
612 
     | 
    
         
             
             * resource such as a Database
         
     | 
| 
       612 
613 
     | 
    
         
             
             *
         
     | 
| 
       613 
614 
     | 
    
         
             
             * Starts a new unit of work under which put and get can be called with
         
     | 
| 
       614 
     | 
    
         
            -
             * with the parameter : 
     | 
| 
      
 615 
     | 
    
         
            +
             * with the parameter sync:  true
         
     | 
| 
       615 
616 
     | 
    
         
             
             *
         
     | 
| 
       616 
617 
     | 
    
         
             
             * Returns:
         
     | 
| 
       617 
618 
     | 
    
         
             
             * * true : On Success
         
     | 
| 
         @@ -622,7 +623,7 @@ VALUE QueueManager_backout(VALUE self) 
     | 
|
| 
       622 
623 
     | 
    
         
             
             *
         
     | 
| 
       623 
624 
     | 
    
         
             
             * Throws:
         
     | 
| 
       624 
625 
     | 
    
         
             
             * * WMQ::WMQException if comp_code != MQCC_OK
         
     | 
| 
       625 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 626 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       626 
627 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       627 
628 
     | 
    
         
             
             */
         
     | 
| 
       628 
629 
     | 
    
         
             
            VALUE QueueManager_begin(VALUE self)
         
     | 
| 
         @@ -665,17 +666,17 @@ VALUE QueueManager_begin(VALUE self) 
     | 
|
| 
       665 
666 
     | 
    
         
             
             *
         
     | 
| 
       666 
667 
     | 
    
         
             
             * Summary of parameters and their WebSphere MQ equivalents
         
     | 
| 
       667 
668 
     | 
    
         
             
             *  queue.get(                                             # WebSphere MQ Equivalents:
         
     | 
| 
       668 
     | 
    
         
            -
             * 
     | 
| 
       669 
     | 
    
         
            -
             * 
     | 
| 
       670 
     | 
    
         
            -
             * 
     | 
| 
       671 
     | 
    
         
            -
             * 
     | 
| 
       672 
     | 
    
         
            -
             * 
     | 
| 
       673 
     | 
    
         
            -
             * 
     | 
| 
       674 
     | 
    
         
            -
             * 
     | 
| 
       675 
     | 
    
         
            -
             * 
     | 
| 
       676 
     | 
    
         
            -
             * 
     | 
| 
       677 
     | 
    
         
            -
             * 
     | 
| 
       678 
     | 
    
         
            -
             * 
     | 
| 
      
 669 
     | 
    
         
            +
             *    q_name:            'Queue Name',                  # MQOD.ObjectName
         
     | 
| 
      
 670 
     | 
    
         
            +
             *    q_name:            { queue_manager=>'QMGR_name',  # MQOD.ObjectQMgrName
         
     | 
| 
      
 671 
     | 
    
         
            +
             *                         q_name       =>'q_name'}
         
     | 
| 
      
 672 
     | 
    
         
            +
             *    message:           my_message,                    # n/a : Instance of Message
         
     | 
| 
      
 673 
     | 
    
         
            +
             *    data:              "Hello World",                 # n/a : Data to send
         
     | 
| 
      
 674 
     | 
    
         
            +
             *    sync:              false,                         # MQGMO_SYNCPOINT
         
     | 
| 
      
 675 
     | 
    
         
            +
             *    new_id:            true,                          # MQPMO_NEW_MSG_ID & MQPMO_NEW_CORREL_ID
         
     | 
| 
      
 676 
     | 
    
         
            +
             *    new_msg_id:        true,                          # MQPMO_NEW_MSG_ID
         
     | 
| 
      
 677 
     | 
    
         
            +
             *    new_correl_id:     true,                          # MQPMO_NEW_CORREL_ID
         
     | 
| 
      
 678 
     | 
    
         
            +
             *    fail_if_quiescing: true,                          # MQOO_FAIL_IF_QUIESCING
         
     | 
| 
      
 679 
     | 
    
         
            +
             *    options:           WMQ::MQPMO_FAIL_IF_QUIESCING   # MQPMO_*
         
     | 
| 
       679 
680 
     | 
    
         
             
             *   )
         
     | 
| 
       680 
681 
     | 
    
         
             
             *
         
     | 
| 
       681 
682 
     | 
    
         
             
             * Mandatory Parameters
         
     | 
| 
         @@ -751,7 +752,7 @@ VALUE QueueManager_begin(VALUE self) 
     | 
|
| 
       751 
752 
     | 
    
         
             
             *
         
     | 
| 
       752 
753 
     | 
    
         
             
             * * :options => Fixnum (Advanced MQ Use only)
         
     | 
| 
       753 
754 
     | 
    
         
             
             *   * Numeric field containing any of the MQ Put message options or'd together
         
     | 
| 
       754 
     | 
    
         
            -
             *     * E.g. : 
     | 
| 
      
 755 
     | 
    
         
            +
             *     * E.g. options:  WMQ::MQPMO_PASS_IDENTITY_CONTEXT | WMQ::MQPMO_ALTERNATE_USER_AUTHORITY
         
     | 
| 
       755 
756 
     | 
    
         
             
             *   * Note: If :options is supplied, it is applied first, then the above parameters are
         
     | 
| 
       756 
757 
     | 
    
         
             
             *     applied afterwards.
         
     | 
| 
       757 
758 
     | 
    
         
             
             *   * One or more of the following values:
         
     | 
| 
         @@ -778,7 +779,7 @@ VALUE QueueManager_begin(VALUE self) 
     | 
|
| 
       778 
779 
     | 
    
         
             
             *
         
     | 
| 
       779 
780 
     | 
    
         
             
             * Throws:
         
     | 
| 
       780 
781 
     | 
    
         
             
             * * WMQ::WMQException if comp_code == MQCC_FAILED
         
     | 
| 
       781 
     | 
    
         
            -
             * * Except if : 
     | 
| 
      
 782 
     | 
    
         
            +
             * * Except if exception_on_error:  false was supplied as a parameter
         
     | 
| 
       782 
783 
     | 
    
         
             
             *   to QueueManager.new
         
     | 
| 
       783 
784 
     | 
    
         
             
             */
         
     | 
| 
       784 
785 
     | 
    
         
             
            VALUE QueueManager_put(VALUE self, VALUE hash)
         
     | 
| 
         @@ -1001,9 +1002,9 @@ static VALUE QueueManager_open_queue_each(VALUE parameters) 
     | 
|
| 
       1001 
1002 
     | 
    
         
             
             * Example:
         
     | 
| 
       1002 
1003 
     | 
    
         
             
             *   require 'wmq/wmq_client'
         
     | 
| 
       1003 
1004 
     | 
    
         
             
             *
         
     | 
| 
       1004 
     | 
    
         
            -
             *   WMQ::QueueManager.connect(: 
     | 
| 
       1005 
     | 
    
         
            -
             *     qmgr.open_queue(: 
     | 
| 
       1006 
     | 
    
         
            -
             *       queue.put(: 
     | 
| 
      
 1005 
     | 
    
         
            +
             *   WMQ::QueueManager.connect(q_mgr_name: 'REID', connection_name: 'localhost(1414)') do |qmgr|
         
     | 
| 
      
 1006 
     | 
    
         
            +
             *     qmgr.open_queue(q_name: 'TEST.QUEUE', mode: :output) do |queue|
         
     | 
| 
      
 1007 
     | 
    
         
            +
             *       queue.put(data: 'Hello World')
         
     | 
| 
       1007 
1008 
     | 
    
         
             
             *     end
         
     | 
| 
       1008 
1009 
     | 
    
         
             
             *   end
         
     | 
| 
       1009 
1010 
     | 
    
         
             
             */
         
     | 
| 
         @@ -1069,43 +1070,43 @@ static VALUE QueueManager_singleton_connect_ensure(VALUE self) 
     | 
|
| 
       1069 
1070 
     | 
    
         
             
             * * Since the number of parameters can vary dramatically, all parameters are passed by name in a hash
         
     | 
| 
       1070 
1071 
     | 
    
         
             
             * * Summary of parameters and their WebSphere MQ equivalents:
         
     | 
| 
       1071 
1072 
     | 
    
         
             
             *  WMQ::QueueManager.connect(                             # WebSphere MQ Equivalents:
         
     | 
| 
       1072 
     | 
    
         
            -
             *   : 
     | 
| 
       1073 
     | 
    
         
            -
             *   : 
     | 
| 
       1074 
     | 
    
         
            -
             *   : 
     | 
| 
      
 1073 
     | 
    
         
            +
             *   q_mgr_name:          'queue_manager name',
         
     | 
| 
      
 1074 
     | 
    
         
            +
             *   exception_on_error:  true,                          # n/a
         
     | 
| 
      
 1075 
     | 
    
         
            +
             *   connect_options:     WMQ::MQCNO_FASTBATH_BINDING    # MQCNO.Options
         
     | 
| 
       1075 
1076 
     | 
    
         
             
             *
         
     | 
| 
       1076 
     | 
    
         
            -
             *   : 
     | 
| 
      
 1077 
     | 
    
         
            +
             *   trace_level:         0,                             # n/a
         
     | 
| 
       1077 
1078 
     | 
    
         
             
             *
         
     | 
| 
       1078 
1079 
     | 
    
         
             
             *   # Common client connection parameters
         
     | 
| 
       1079 
     | 
    
         
            -
             *   : 
     | 
| 
       1080 
     | 
    
         
            -
             *   : 
     | 
| 
       1081 
     | 
    
         
            -
             *   : 
     | 
| 
      
 1080 
     | 
    
         
            +
             *   channel_name:        'svrconn channel name',        # MQCD.ChannelName
         
     | 
| 
      
 1081 
     | 
    
         
            +
             *   connection_name:     'localhost(1414)',             # MQCD.ConnectionName
         
     | 
| 
      
 1082 
     | 
    
         
            +
             *   transport_type:      WMQ::MQXPT_TCP,                # MQCD.TransportType
         
     | 
| 
       1082 
1083 
     | 
    
         
             
             *
         
     | 
| 
       1083 
1084 
     | 
    
         
             
             *   # Advanced client connections parameters
         
     | 
| 
       1084 
     | 
    
         
            -
             *   : 
     | 
| 
       1085 
     | 
    
         
            -
             *   : 
     | 
| 
       1086 
     | 
    
         
            -
             *   : 
     | 
| 
       1087 
     | 
    
         
            -
             *   : 
     | 
| 
       1088 
     | 
    
         
            -
             *   : 
     | 
| 
       1089 
     | 
    
         
            -
             *   : 
     | 
| 
       1090 
     | 
    
         
            -
             *   : 
     | 
| 
       1091 
     | 
    
         
            -
             *   : 
     | 
| 
       1092 
     | 
    
         
            -
             *   : 
     | 
| 
       1093 
     | 
    
         
            -
             *   : 
     | 
| 
       1094 
     | 
    
         
            -
             *   : 
     | 
| 
       1095 
     | 
    
         
            -
             *   : 
     | 
| 
       1096 
     | 
    
         
            -
             *   : 
     | 
| 
       1097 
     | 
    
         
            -
             *   : 
     | 
| 
       1098 
     | 
    
         
            -
             *   : 
     | 
| 
       1099 
     | 
    
         
            -
             *   : 
     | 
| 
       1100 
     | 
    
         
            -
             *   : 
     | 
| 
      
 1085 
     | 
    
         
            +
             *   max_msg_length:      65535,                         # MQCD.MaxMsgLength
         
     | 
| 
      
 1086 
     | 
    
         
            +
             *   security_exit:       'Name of security exit',       # MQCD.SecurityExit
         
     | 
| 
      
 1087 
     | 
    
         
            +
             *   send_exit:           'Name of send exit',           # MQCD.SendExit
         
     | 
| 
      
 1088 
     | 
    
         
            +
             *   receive_exit:        'Name of receive exit',        # MQCD.ReceiveExit
         
     | 
| 
      
 1089 
     | 
    
         
            +
             *   security_user_data:  'Security exit User data',     # MQCD.SecurityUserData
         
     | 
| 
      
 1090 
     | 
    
         
            +
             *   send_user_data:      'Send exit user data',         # MQCD.SendUserData
         
     | 
| 
      
 1091 
     | 
    
         
            +
             *   receive_user_data:   'Receive exit user data',      # MQCD.ReceiveUserData
         
     | 
| 
      
 1092 
     | 
    
         
            +
             *   heartbeat_interval:   1,                            # MQCD.HeartbeatInterval
         
     | 
| 
      
 1093 
     | 
    
         
            +
             *   remote_security_id:  'Remote Security id',          # MQCD.RemoteSecurityId
         
     | 
| 
      
 1094 
     | 
    
         
            +
             *   ssl_cipher_spec:     'SSL Cipher Spec',             # MQCD.SSLCipherSpec
         
     | 
| 
      
 1095 
     | 
    
         
            +
             *   keep_alive_interval: -1,                            # MQCD.KeepAliveInterval
         
     | 
| 
      
 1096 
     | 
    
         
            +
             *   mode_name:           'LU6.2 Mode Name',             # MQCD.ModeName
         
     | 
| 
      
 1097 
     | 
    
         
            +
             *   tp_name:             'LU6.2 Transaction pgm name',  # MQCD.TpName
         
     | 
| 
      
 1098 
     | 
    
         
            +
             *   user_identifier:     'LU 6.2 Userid',               # MQCD.UserIdentifier
         
     | 
| 
      
 1099 
     | 
    
         
            +
             *   password:            'LU6.2 Password',              # MQCD.Password
         
     | 
| 
      
 1100 
     | 
    
         
            +
             *   long_remote_user_id: 'Long remote user identifier', # MQCD.LongRemoteUserId (Ptr, Length)
         
     | 
| 
      
 1101 
     | 
    
         
            +
             *   ssl_peer_name:       'SSL Peer name',               # MQCD.SSLPeerName (Ptr, Length)
         
     | 
| 
       1101 
1102 
     | 
    
         
             
             *
         
     | 
| 
       1102 
1103 
     | 
    
         
             
             *   # SSL Options
         
     | 
| 
       1103 
     | 
    
         
            -
             *   : 
     | 
| 
       1104 
     | 
    
         
            -
             *   : 
     | 
| 
      
 1104 
     | 
    
         
            +
             *   key_repository:      '/var/mqm/qmgrs/.../key',        # MQSCO.KeyRepository
         
     | 
| 
      
 1105 
     | 
    
         
            +
             *   crypto_hardware:     'GSK_ACCELERATOR_NCIPHER_NF_ON', # MQSCO.CryptoHardware
         
     | 
| 
       1105 
1106 
     | 
    
         
             
             *   )
         
     | 
| 
       1106 
1107 
     | 
    
         
             
             *
         
     | 
| 
       1107 
1108 
     | 
    
         
             
             * Optional Parameters
         
     | 
| 
       1108 
     | 
    
         
            -
             * * : 
     | 
| 
      
 1109 
     | 
    
         
            +
             * * q_mgr_name:  String
         
     | 
| 
       1109 
1110 
     | 
    
         
             
             *   * Name of the existing WebSphere MQ Queue Manager to connect to
         
     | 
| 
       1110 
1111 
     | 
    
         
             
             *
         
     | 
| 
       1111 
1112 
     | 
    
         
             
             *   * Default:
         
     | 
| 
         @@ -1171,6 +1172,12 @@ static VALUE QueueManager_singleton_connect_ensure(VALUE self) 
     | 
|
| 
       1171 
1172 
     | 
    
         
             
             *   * Default Value:
         
     | 
| 
       1172 
1173 
     | 
    
         
             
             *       WMQ::MQXPT_TCP
         
     | 
| 
       1173 
1174 
     | 
    
         
             
             *
         
     | 
| 
      
 1175 
     | 
    
         
            +
             * * :use_system_connection_data => Boolean
         
     | 
| 
      
 1176 
     | 
    
         
            +
             *   * Used when you want to initialise a client connection, but you want
         
     | 
| 
      
 1177 
     | 
    
         
            +
             *   * to obtain the connection_name and channel_name from one of the system
         
     | 
| 
      
 1178 
     | 
    
         
            +
             *   * configuration methods. These being: mqclient.ini file, MQSERVER ENV
         
     | 
| 
      
 1179 
     | 
    
         
            +
             *   * variable or CCDT.
         
     | 
| 
      
 1180 
     | 
    
         
            +
             *
         
     | 
| 
       1174 
1181 
     | 
    
         
             
             * For the Advanced Client Connection parameters, please see the WebSphere MQ documentation
         
     | 
| 
       1175 
1182 
     | 
    
         
             
             *
         
     | 
| 
       1176 
1183 
     | 
    
         
             
             * Note:
         
     | 
| 
         @@ -1188,13 +1195,13 @@ static VALUE QueueManager_singleton_connect_ensure(VALUE self) 
     | 
|
| 
       1188 
1195 
     | 
    
         
             
             *   require 'wmq/wmq_client'
         
     | 
| 
       1189 
1196 
     | 
    
         
             
             *
         
     | 
| 
       1190 
1197 
     | 
    
         
             
             *   WMQ::QueueManager.connect(
         
     | 
| 
       1191 
     | 
    
         
            -
             *               : 
     | 
| 
       1192 
     | 
    
         
            -
             *               : 
     | 
| 
       1193 
     | 
    
         
            -
             *               : 
     | 
| 
       1194 
     | 
    
         
            -
             *     qmgr.open_queue(: 
     | 
| 
      
 1198 
     | 
    
         
            +
             *               channel_name:     'SYSTEM.DEF.SVRCONN',
         
     | 
| 
      
 1199 
     | 
    
         
            +
             *               transport_type:   WMQ::MQXPT_TCP,
         
     | 
| 
      
 1200 
     | 
    
         
            +
             *               connection_name:  'localhost(1414)' ) do |qmgr|
         
     | 
| 
      
 1201 
     | 
    
         
            +
             *     qmgr.open_queue(q_name: 'TEST.QUEUE', mode: :input) do |queue|
         
     | 
| 
       1195 
1202 
     | 
    
         
             
             *
         
     | 
| 
       1196 
1203 
     | 
    
         
             
             *       message = WMQ::Message.new
         
     | 
| 
       1197 
     | 
    
         
            -
             *       if queue.get(:message 
     | 
| 
      
 1204 
     | 
    
         
            +
             *       if queue.get(message:  message)
         
     | 
| 
       1198 
1205 
     | 
    
         
             
             *         puts "Data Received: #{message.data}"
         
     | 
| 
       1199 
1206 
     | 
    
         
             
             *       else
         
     | 
| 
       1200 
1207 
     | 
    
         
             
             *         puts 'No message available'
         
     | 
| 
         @@ -1325,41 +1332,41 @@ static int QueueManager_execute_each (VALUE key, VALUE value, PQUEUE_MANAGER pqm 
     | 
|
| 
       1325 
1332 
     | 
    
         
             
             * Example
         
     | 
| 
       1326 
1333 
     | 
    
         
             
             *   WMQ::QueueManager.connect do |qmgr|
         
     | 
| 
       1327 
1334 
     | 
    
         
             
             *     result = qmgr.execute(
         
     | 
| 
       1328 
     | 
    
         
            -
             *                 
     | 
| 
       1329 
     | 
    
         
            -
             *                : 
     | 
| 
       1330 
     | 
    
         
            -
             *                : 
     | 
| 
       1331 
     | 
    
         
            -
             *                : 
     | 
| 
      
 1335 
     | 
    
         
            +
             *                command:          :inquire_q,
         
     | 
| 
      
 1336 
     | 
    
         
            +
             *                q_name:           'MY.LOCAL.QUEUE',
         
     | 
| 
      
 1337 
     | 
    
         
            +
             *                q_type:           WMQ::MQQT_LOCAL,
         
     | 
| 
      
 1338 
     | 
    
         
            +
             *                current_q_depth:  nil
         
     | 
| 
       1332 
1339 
     | 
    
         
             
             *                )
         
     | 
| 
       1333 
1340 
     | 
    
         
             
             *     # OR, we can replace the method name execute with the MQAI command:
         
     | 
| 
       1334 
1341 
     | 
    
         
             
             *     result = qmgr.inquire_q(
         
     | 
| 
       1335 
     | 
    
         
            -
             *                : 
     | 
| 
       1336 
     | 
    
         
            -
             *                : 
     | 
| 
       1337 
     | 
    
         
            -
             *                : 
     | 
| 
      
 1342 
     | 
    
         
            +
             *                q_name:           'MY.LOCAL.QUEUE',
         
     | 
| 
      
 1343 
     | 
    
         
            +
             *                q_type:           WMQ::MQQT_LOCAL,
         
     | 
| 
      
 1344 
     | 
    
         
            +
             *                current_q_depth:  nil
         
     | 
| 
       1338 
1345 
     | 
    
         
             
             *                )
         
     | 
| 
       1339 
1346 
     | 
    
         
             
             *
         
     | 
| 
       1340 
1347 
     | 
    
         
             
             * Complete Example:
         
     | 
| 
       1341 
1348 
     | 
    
         
             
             *   require 'wmq/wmq'
         
     | 
| 
       1342 
1349 
     | 
    
         
             
             *   require 'wmq/wmq_const_admin'
         
     | 
| 
       1343 
     | 
    
         
            -
             *   WMQ::QueueManager.connect(: 
     | 
| 
       1344 
     | 
    
         
            -
             *     qmgr.reset_q_stats(: 
     | 
| 
      
 1350 
     | 
    
         
            +
             *   WMQ::QueueManager.connect(q_mgr_name: 'REID', connection_name: 'localhost(1414)') do |qmgr|
         
     | 
| 
      
 1351 
     | 
    
         
            +
             *     qmgr.reset_q_stats(q_name: '*').each {|item| p item }
         
     | 
| 
       1345 
1352 
     | 
    
         
             
             *   end
         
     | 
| 
       1346 
1353 
     | 
    
         
             
             *
         
     | 
| 
       1347 
1354 
     | 
    
         
             
             * Some one line examples
         
     | 
| 
       1348 
     | 
    
         
            -
             *   qmgr.inquire_q(: 
     | 
| 
      
 1355 
     | 
    
         
            +
             *   qmgr.inquire_q(q_name: 'TEST*').each {|item| p item }
         
     | 
| 
       1349 
1356 
     | 
    
         
             
             *
         
     | 
| 
       1350 
     | 
    
         
            -
             *   qmgr.inquire_q(: 
     | 
| 
      
 1357 
     | 
    
         
            +
             *   qmgr.inquire_q(q_name: 'TEST*', q_type: WMQ::MQQT_LOCAL, current_q_depth: nil).each {|item| p item }
         
     | 
| 
       1351 
1358 
     | 
    
         
             
             *
         
     | 
| 
       1352 
     | 
    
         
            -
             *   qmgr.inquire_process(: 
     | 
| 
      
 1359 
     | 
    
         
            +
             *   qmgr.inquire_process(process_name:'*').each {|item| p item }
         
     | 
| 
       1353 
1360 
     | 
    
         
             
             *
         
     | 
| 
       1354 
1361 
     | 
    
         
             
             *   qmgr.ping_q_mgr.each {|item| p item }
         
     | 
| 
       1355 
1362 
     | 
    
         
             
             *
         
     | 
| 
       1356 
1363 
     | 
    
         
             
             *   qmgr.refresh_security.each {|item| p item }
         
     | 
| 
       1357 
1364 
     | 
    
         
             
             *
         
     | 
| 
       1358 
     | 
    
         
            -
             *   qmgr.inquire_q_status(: 
     | 
| 
      
 1365 
     | 
    
         
            +
             *   qmgr.inquire_q_status(q_name: 'TEST*', q_status_type: :q_status, q_status_attrs: :process_id).each {|item| p item }
         
     | 
| 
       1359 
1366 
     | 
    
         
             
             *
         
     | 
| 
       1360 
1367 
     | 
    
         
             
             *   qmgr.start_channel_listener.each {|item| p item }
         
     | 
| 
       1361 
1368 
     | 
    
         
             
             *
         
     | 
| 
       1362 
     | 
    
         
            -
             *   qmgr.inquire_channel_status(: 
     | 
| 
      
 1369 
     | 
    
         
            +
             *   qmgr.inquire_channel_status(channel_name: '*').each {|item| p item }
         
     | 
| 
       1363 
1370 
     | 
    
         
             
             */
         
     | 
| 
       1364 
1371 
     | 
    
         
             
            VALUE QueueManager_execute(VALUE self, VALUE hash)
         
     | 
| 
       1365 
1372 
     | 
    
         
             
            {
         
     | 
    
        data/lib/wmq/message.rb
    CHANGED
    
    | 
         @@ -17,45 +17,47 @@ module WMQ 
     | 
|
| 
       17 
17 
     | 
    
         
             
              #   * The format of any header should not be supplied in the descriptor or any header
         
     | 
| 
       18 
18 
     | 
    
         
             
              #
         
     | 
| 
       19 
19 
     | 
    
         
             
              # Message has the following attributes:
         
     | 
| 
      
 20 
     | 
    
         
            +
              #
         
     | 
| 
       20 
21 
     | 
    
         
             
              # * descriptor = {
         
     | 
| 
       21 
     | 
    
         
            -
              # 
     | 
| 
       22 
     | 
    
         
            -
              # 
     | 
| 
       23 
     | 
    
         
            -
              # 
     | 
| 
       24 
     | 
    
         
            -
              # 
     | 
| 
       25 
     | 
    
         
            -
              # 
     | 
| 
       26 
     | 
    
         
            -
              # 
     | 
| 
       27 
     | 
    
         
            -
              # 
     | 
| 
       28 
     | 
    
         
            -
              # 
     | 
| 
       29 
     | 
    
         
            -
              # 
     | 
| 
       30 
     | 
    
         
            -
              # 
     | 
| 
       31 
     | 
    
         
            -
              # 
     | 
| 
       32 
     | 
    
         
            -
              # 
     | 
| 
       33 
     | 
    
         
            -
              # 
     | 
| 
       34 
     | 
    
         
            -
              # 
     | 
| 
       35 
     | 
    
         
            -
              # 
     | 
| 
       36 
     | 
    
         
            -
              # 
     | 
| 
       37 
     | 
    
         
            -
              # 
     | 
| 
       38 
     | 
    
         
            -
              # 
     | 
| 
       39 
     | 
    
         
            -
              # 
     | 
| 
       40 
     | 
    
         
            -
              # 
     | 
| 
       41 
     | 
    
         
            -
              # 
     | 
| 
       42 
     | 
    
         
            -
              # 
     | 
| 
       43 
     | 
    
         
            -
              # 
     | 
| 
       44 
     | 
    
         
            -
              # 
     | 
| 
       45 
     | 
    
         
            -
              # 
     | 
| 
       46 
     | 
    
         
            -
              # 
     | 
| 
       47 
     | 
    
         
            -
              # 
     | 
| 
       48 
     | 
    
         
            -
              # 
     | 
| 
       49 
     | 
    
         
            -
              # 
     | 
| 
       50 
     | 
    
         
            -
              # 
     | 
| 
       51 
     | 
    
         
            -
              # 
     | 
| 
       52 
     | 
    
         
            -
              # *  
     | 
| 
      
 22 
     | 
    
         
            +
              #                                          # WebSphere MQ Equivalent
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   format:             WMQ::MQFMT_STRING, # MQMD.Format - Format of data only
         
     | 
| 
      
 24 
     | 
    
         
            +
              #                       WMQ::MQFMT_NONE    #   Do not supply header formats here
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   original_length:    Number, # MQMD.OriginalLength
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   priority:           0 .. 9, # MQMD.Priority
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   put_time:           String, # MQMD.PutTime
         
     | 
| 
      
 28 
     | 
    
         
            +
              #   msg_id:             String, # ...
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   expiry:             Number,
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   persistence:        Number,
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   reply_to_q:         String,
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   correl_id:          String,
         
     | 
| 
      
 33 
     | 
    
         
            +
              #   feedback:           Number,
         
     | 
| 
      
 34 
     | 
    
         
            +
              #   offset:             Number,
         
     | 
| 
      
 35 
     | 
    
         
            +
              #   report:             Number,
         
     | 
| 
      
 36 
     | 
    
         
            +
              #   msg_flags:          Number,
         
     | 
| 
      
 37 
     | 
    
         
            +
              #   reply_to_q_mgr:     String,
         
     | 
| 
      
 38 
     | 
    
         
            +
              #   appl_identity_data: String,
         
     | 
| 
      
 39 
     | 
    
         
            +
              #   put_appl_name:      String,
         
     | 
| 
      
 40 
     | 
    
         
            +
              #   user_identifier:    String,
         
     | 
| 
      
 41 
     | 
    
         
            +
              #   msg_seq_number:     Number,
         
     | 
| 
      
 42 
     | 
    
         
            +
              #   appl_origin_data:   String,
         
     | 
| 
      
 43 
     | 
    
         
            +
              #   accounting_token:   String,
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   backout_count:      Number,
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   coded_char_set_id:  Number,
         
     | 
| 
      
 46 
     | 
    
         
            +
              #   put_appl_type:      Number,
         
     | 
| 
      
 47 
     | 
    
         
            +
              #   msg_type:           Number,
         
     | 
| 
      
 48 
     | 
    
         
            +
              #   group_id:           String,
         
     | 
| 
      
 49 
     | 
    
         
            +
              #   put_date:           String,
         
     | 
| 
      
 50 
     | 
    
         
            +
              #   encoding:           Number
         
     | 
| 
      
 51 
     | 
    
         
            +
              # }
         
     | 
| 
      
 52 
     | 
    
         
            +
              #
         
     | 
| 
      
 53 
     | 
    
         
            +
              # * data: String
         
     | 
| 
      
 54 
     | 
    
         
            +
              # * headers: Array<Hash>
         
     | 
| 
       53 
55 
     | 
    
         
             
              #   * Note: Do not supply the format of any header. Ruby WMQ does this for you.
         
     | 
| 
       54 
56 
     | 
    
         
             
              #
         
     | 
| 
       55 
57 
     | 
    
         
             
              #    The following headers are supported:
         
     | 
| 
       56 
58 
     | 
    
         
             
              #   * Rules And Formatting Header (RFH)
         
     | 
| 
       57 
     | 
    
         
            -
              #       : 
     | 
| 
       58 
     | 
    
         
            -
              # 
     | 
| 
      
 59 
     | 
    
         
            +
              #       header_type: :rf_header
         
     | 
| 
      
 60 
     | 
    
         
            +
              #        ....
         
     | 
| 
       59 
61 
     | 
    
         
             
              #   * Rules and Formatting V2 Header (RFH2)
         
     | 
| 
       60 
62 
     | 
    
         
             
              #       ....
         
     | 
| 
       61 
63 
     | 
    
         
             
              #   * Dead Letter Header
         
     |