~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/message/transaction_reader.cc

  • Committer: Lee Bieber
  • Date: 2010-10-29 13:35:47 UTC
  • mfrom: (1890.1.3 build)
  • Revision ID: kalebral@gmail.com-20101029133547-ehu44so1ij4cylr5
Merge Shrews - fix bug 667288: Transaction_reader reporting error about dangerously large protobuf message
Merge Monty - fix bug 667598: static plugins should be addable via plugin-add   
Merge Brian - clean up C++ warnings

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
  {
70
70
    string &sql= *sql_string_iter;
71
71
 
72
 
    /* 
73
 
     * Replace \n and \r with spaces so that SQL statements 
74
 
     * are always on a single line 
 
72
    /*
 
73
     * Replace \n and \r with spaces so that SQL statements
 
74
     * are always on a single line
75
75
     */
76
76
    {
77
77
      string::size_type found= sql.find_first_of(replace_with_spaces);
319
319
  message::TransactionManager trx_mgr;
320
320
 
321
321
  protobuf::io::ZeroCopyInputStream *raw_input= new protobuf::io::FileInputStream(file);
322
 
  protobuf::io::CodedInputStream *coded_input= new protobuf::io::CodedInputStream(raw_input);
323
322
 
324
323
  /* Skip ahead to user supplied position */
325
324
  if (opt_start_pos)
326
325
  {
327
 
    if (not coded_input->Skip(opt_start_pos))
 
326
    if (not raw_input->Skip(opt_start_pos))
328
327
    {
329
328
      cerr << _("Could not skip to position ") << opt_start_pos
330
329
           << _(" in file ") << filename << endl;
340
339
  bool result= true;
341
340
  uint32_t message_type= 0;
342
341
 
343
 
  /* Read in the length of the command */
344
 
  while (result == true && 
345
 
         coded_input->ReadLittleEndian32(&message_type) == true &&
346
 
         coded_input->ReadLittleEndian32(&length) == true)
 
342
  while (result == true)
347
343
  {
 
344
   /*
 
345
     * Odd thing to note about using CodedInputStream: This class wasn't
 
346
     * intended to read large amounts of GPB messages. It has an upper
 
347
     * limit on the number of bytes it will read (see Protobuf docs for
 
348
     * this class for more info). A warning will be produced as you
 
349
     * get close to this limit. Since this is a pretty lightweight class,
 
350
     * we should be able to simply create a new one for each message we
 
351
     * want to read.
 
352
     */
 
353
    protobuf::io::CodedInputStream coded_input(raw_input);
 
354
 
 
355
    /* Read in the type and length of the command */
 
356
    if (not coded_input.ReadLittleEndian32(&message_type) ||
 
357
        not coded_input.ReadLittleEndian32(&length))
 
358
    {
 
359
      break;  /* EOF */
 
360
    }
 
361
 
348
362
    if (message_type != ReplicationServices::TRANSACTION)
349
363
    {
350
364
      cerr << _("Found a non-transaction message in log.  Currently, not supported.\n");
359
373
 
360
374
    if (buffer == NULL)
361
375
    {
362
 
      /* 
 
376
      /*
363
377
       * First time around...just malloc the length.  This block gets rid
364
378
       * of a GCC warning about uninitialized temp_buffer.
365
379
       */
380
394
      buffer= temp_buffer;
381
395
 
382
396
    /* Read the Command */
383
 
    result= coded_input->ReadRaw(buffer, (int) length);
 
397
    result= coded_input.ReadRaw(buffer, (int) length);
384
398
    if (result == false)
385
399
    {
386
400
      char errmsg[STRERROR_MAX];
425
439
      else
426
440
      {
427
441
        /* Need to get the checksum bytes out of stream */
428
 
        coded_input->ReadLittleEndian32(&checksum);
 
442
        coded_input.ReadLittleEndian32(&checksum);
429
443
        previous_length = length;
430
444
        continue;
431
445
      }
472
486
    } /* end ! vm.count("transaction-id") */
473
487
 
474
488
    /* Skip 4 byte checksum */
475
 
    coded_input->ReadLittleEndian32(&checksum);
 
489
    coded_input.ReadLittleEndian32(&checksum);
476
490
 
477
491
    if (do_checksum)
478
492
    {
492
506
  if (buffer)
493
507
    free(buffer);
494
508
 
495
 
  delete coded_input;
496
509
  delete raw_input;
497
510
 
498
511
  return (result == true ? 0 : 1);