~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/drizzledump.cc

  • Committer: Lee
  • Date: 2009-01-06 20:24:58 UTC
  • mfrom: (759 drizzle)
  • mto: This revision was merged to the branch mainline in revision 763.
  • Revision ID: lbieber@lbieber-desktop-20090106202458-82n4kyftrnakvl4r
merge with latest from the trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#include <mystrings/m_ctype.h>
35
35
#include <mysys/hash.h>
36
36
#include <stdarg.h>
 
37
#include <algorithm>
37
38
 
38
39
#include <drizzled/gettext.h>
39
40
 
48
49
#define EX_EOM 4
49
50
#define EX_EOF 5 /* ferror for output file was got */
50
51
#define EX_ILLEGAL_TABLE 6
 
52
#define EX_TABLE_STATUS 7
51
53
 
52
54
/* index into 'show fields from table' */
53
55
 
104
106
             *err_ptr= NULL;
105
107
static char **defaults_argv= NULL;
106
108
static char compatible_mode_normal_str[255];
107
 
/* Server supports character_set_results session variable? */
108
 
static bool server_supports_switching_charsets= true;
109
109
static uint32_t opt_compatible_mode= 0;
110
110
#define DRIZZLE_OPT_MASTER_DATA_EFFECTIVE_SQL 1
111
111
#define DRIZZLE_OPT_MASTER_DATA_COMMENTED_SQL 2
959
959
  return 0;
960
960
}
961
961
 
962
 
 
963
 
/**
964
 
  Switch charset for results to some specified charset.  If the server does not
965
 
  support character_set_results variable, nothing can be done here.  As for
966
 
  whether something should be done here, future new callers of this function
967
 
  should be aware that the server lacking the facility of switching charsets is
968
 
  treated as success.
969
 
 
970
 
  @note  If the server lacks support, then nothing is changed and no error
971
 
         condition is returned.
972
 
 
973
 
  @returns  whether there was an error or not
974
 
*/
975
 
static int switch_character_set_results(const char *cs_name)
976
 
{
977
 
  char query_buffer[QUERY_LENGTH];
978
 
  size_t query_length;
979
 
 
980
 
  /* Server lacks facility.  This is not an error, by arbitrary decision . */
981
 
  if (!server_supports_switching_charsets)
982
 
    return false;
983
 
 
984
 
  query_length= snprintf(query_buffer,
985
 
                         sizeof (query_buffer),
986
 
                         "SET SESSION character_set_results = '%s'",
987
 
                         cs_name);
988
 
 
989
 
  return drizzle_real_query(drizzle, query_buffer, query_length);
990
 
}
991
 
 
992
962
/*
993
963
  Open a new .sql file to dump the table or view into
994
964
 
1391
1361
    db          - db name
1392
1362
    table_type  - table type, e.g. "MyISAM" or "InnoDB", but also "VIEW"
1393
1363
    ignore_flag - what we must particularly ignore - see IGNORE_ defines above
 
1364
    num_fields  - number of fields in the table
1394
1365
 
1395
1366
  RETURN
1396
 
    number of fields in table, 0 if error
 
1367
    true if success, false if error
1397
1368
*/
1398
1369
 
1399
 
static uint get_table_structure(char *table, char *db, char *table_type,
1400
 
                                char *ignore_flag)
 
1370
static bool get_table_structure(char *table, char *db, char *table_type,
 
1371
                                char *ignore_flag, uint64_t *num_fields)
1401
1372
{
1402
1373
  bool    init=0, delayed, write_data, complete_insert;
1403
 
  uint64_t num_fields;
1404
1374
  char       *result_table, *opt_quoted_table;
1405
1375
  const char *insert_option;
1406
1376
  char       name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3];
1456
1426
 
1457
1427
      snprintf(buff, sizeof(buff), "show create table %s", result_table);
1458
1428
 
1459
 
      if (switch_character_set_results("binary") ||
1460
 
          drizzle_query_with_error_report(drizzle, &result, buff) ||
1461
 
          switch_character_set_results(default_charset))
1462
 
        return(0);
 
1429
      if (drizzle_query_with_error_report(drizzle, &result, buff))
 
1430
        return false;
1463
1431
 
1464
1432
      if (path)
1465
1433
      {
1466
1434
        if (!(sql_file= open_sql_file_for_table(table)))
1467
 
          return(0);
 
1435
          return false;
1468
1436
 
1469
1437
        write_header(sql_file, db);
1470
1438
      }
1499
1467
    {
1500
1468
      if (path)
1501
1469
        my_fclose(sql_file, MYF(MY_WME));
1502
 
      return(0);
 
1470
      return false;
1503
1471
    }
1504
1472
 
1505
1473
    /*
1541
1509
        insert_pat.append(quote_name(row[SHOW_FIELDNAME], name_buff, 0));
1542
1510
      }
1543
1511
    }
1544
 
    num_fields= drizzle_num_rows(result);
 
1512
    *num_fields= drizzle_num_rows(result);
1545
1513
    drizzle_free_result(result);
1546
1514
  }
1547
1515
  else
1552
1520
    snprintf(query_buff, sizeof(query_buff), "show fields from %s",
1553
1521
             result_table);
1554
1522
    if (drizzle_query_with_error_report(drizzle, &result, query_buff))
1555
 
      return(0);
 
1523
      return false;
1556
1524
 
1557
1525
    /* Make an sql-file, if path was given iow. option -T was given */
1558
1526
    if (!opt_no_create_info)
1560
1528
      if (path)
1561
1529
      {
1562
1530
        if (!(sql_file= open_sql_file_for_table(table)))
1563
 
          return(0);
 
1531
          return false;
1564
1532
        write_header(sql_file, db);
1565
1533
      }
1566
1534
      if (!opt_xml && opt_comments)
1639
1607
        check_io(sql_file);
1640
1608
      }
1641
1609
    }
1642
 
    num_fields= drizzle_num_rows(result);
 
1610
    *num_fields= drizzle_num_rows(result);
1643
1611
    drizzle_free_result(result);
1644
1612
    if (!opt_no_create_info)
1645
1613
    {
1659
1627
                my_progname, result_table, drizzle_error(drizzle));
1660
1628
        if (path)
1661
1629
          my_fclose(sql_file, MYF(MY_WME));
1662
 
        return(0);
 
1630
        return false;
1663
1631
      }
1664
1632
 
1665
1633
      /* Find first which key is primary key */
1779
1747
    write_footer(sql_file);
1780
1748
    my_fclose(sql_file, MYF(MY_WME));
1781
1749
  }
1782
 
  return((uint) num_fields);
 
1750
  return true;
1783
1751
} /* get_table_structure */
1784
1752
 
1785
1753
static void add_load_option(string &str, const char *option,
1869
1837
  char table_type[NAME_LEN];
1870
1838
  char *result_table, table_buff2[NAME_LEN*2+3], *opt_quoted_table;
1871
1839
  int error= 0;
1872
 
  uint32_t         rownr, row_break, total_length, init_length;
1873
 
  uint num_fields;
 
1840
  uint32_t rownr, row_break, total_length, init_length;
 
1841
  uint64_t num_fields= 0;
1874
1842
  DRIZZLE_RES     *res;
1875
1843
  DRIZZLE_FIELD   *field;
1876
1844
  DRIZZLE_ROW     row;
1880
1848
    Make sure you get the create table info before the following check for
1881
1849
    --no-data flag below. Otherwise, the create table info won't be printed.
1882
1850
  */
1883
 
  num_fields= get_table_structure(table, db, table_type, &ignore_flag);
 
1851
  if (!get_table_structure(table, db, table_type, &ignore_flag, &num_fields))
 
1852
  {
 
1853
    maybe_die(EX_TABLE_STATUS, "Error retrieving table structure for table: \"%s\"", table);
 
1854
    return;
 
1855
  }
1884
1856
 
1885
1857
  /* Check --no-data flag */
1886
1858
  if (opt_no_data)
3150
3122
{
3151
3123
  char bin_log_name[FN_REFLEN];
3152
3124
  int exit_code;
3153
 
  MY_INIT("mysqldump");
 
3125
  MY_INIT("drizzledump");
3154
3126
 
3155
3127
  compatible_mode_normal_str[0]= 0;
3156
3128
  default_charset= (char *)drizzle_universal_client_charset;