Ejemplo n.º 1
0
void
process_input(mdata_get_t *mdg, const char *buf)
{
	switch (mdg->mdg_state) {
	case MDGS_MESSAGE_HEADER:
		if (strcmp(buf, "NOTFOUND") == 0) {
			mdg->mdg_response = MDGR_NOTFOUND;
			mdg->mdg_state = MDGS_DONE;
		} else if (strcmp(buf, "SUCCESS") == 0) {
			mdg->mdg_response = MDGR_SUCCESS;
			mdg->mdg_state = MDGS_MESSAGE_DATA;
		} else {
			dynstr_append(mdg->mdg_data, buf);
			mdg->mdg_response = MDGR_UNKNOWN;
			mdg->mdg_state = MDGS_DONE;
		}
		break;
	case MDGS_MESSAGE_DATA:
		if (strcmp(buf, ".") == 0) {
			mdg->mdg_state = MDGS_DONE;
		} else {
			int offs = buf[0] == '.' ? 1 : 0;
			if (dynstr_len(mdg->mdg_data) > 0)
				dynstr_append(mdg->mdg_data, "\n");
			dynstr_append(mdg->mdg_data, buf + offs);
		}
		break;
	case MDGS_DONE:
		break;
	default:
		abort();
	}
}
Ejemplo n.º 2
0
MYSQL_RES *MADB_GetDefaultColumnValues(MADB_Stmt *Stmt, MYSQL_FIELD *fields)
{
  DYNAMIC_STRING DynStr;
  unsigned int i;
  MYSQL_RES *result= NULL;
  
  init_dynamic_string(&DynStr, "SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='", 512, 512);
  if (dynstr_append(&DynStr, fields[0].db) ||
      dynstr_append(&DynStr, "' AND TABLE_NAME='") ||
      dynstr_append(&DynStr, fields[0].org_table) ||
      dynstr_append(&DynStr, "' AND COLUMN_NAME IN ("))
    goto error;

  for (i=0; i < mysql_stmt_field_count(Stmt->stmt); i++)
  {
    if (dynstr_append(&DynStr, i > 0 ? ",'" : "'") ||
        dynstr_append(&DynStr, fields[i].org_name) ||
        dynstr_append(&DynStr, "'"))
      goto error;
  }
  if (dynstr_append(&DynStr, ") AND COLUMN_DEFAULT IS NOT NULL"))
    goto error;

  LOCK_MARIADB(Stmt->Connection);
  if (mysql_query(Stmt->Connection->mariadb, DynStr.str))
    goto error;
  result= mysql_store_result(Stmt->Connection->mariadb);
  
error:
    UNLOCK_MARIADB(Stmt->Connection);
    dynstr_free(&DynStr);
    return result;
}
Ejemplo n.º 3
0
/**
  Run a command using the shell, storing its output in the supplied dynamic
  string.
*/
static int run_command(char* cmd,
                       DYNAMIC_STRING *ds_res)
{
  char buf[512]= {0};
  FILE *res_file;
  int error;

  if (opt_verbose >= 4)
    puts(cmd);

  if (!(res_file= popen(cmd, "r")))
    die("popen(\"%s\", \"r\") failed", cmd);

  while (fgets(buf, sizeof(buf), res_file))
  {
    DBUG_PRINT("info", ("buf: %s", buf));
    if(ds_res)
    {
      /* Save the output of this command in the supplied string */
      dynstr_append(ds_res, buf);
    }
    else
    {
      /* Print it directly on screen */
      fprintf(stdout, "%s", buf);
    }
  }

  error= pclose(res_file);
  return WEXITSTATUS(error);
}
Ejemplo n.º 4
0
void test_value_single_date(uint year, uint month, uint day, const char *name)
{
  int rc= FALSE;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;
  /* init values */
  val.type= DYN_COL_DATE;
  val.x.time_value.time_type= MYSQL_TIMESTAMP_DATE;
  val.x.time_value.year= year;
  val.x.time_value.month= month;
  val.x.time_value.day= day;
  mariadb_dyncol_value_init(&res);
  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= ((res.type == DYN_COL_DATE) &&
       (res.x.time_value.time_type == MYSQL_TIMESTAMP_DATE) &&
       (res.x.time_value.year == year) &&
       (res.x.time_value.month == month) &&
       (res.x.time_value.day == day));
err:
  ok(rc, "%s - %04u-%02u-%02u", name, year, month, day);
  /* cleanup */
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 5
0
void test_value_single_string(const char *string, size_t len,
                              CHARSET_INFO *cs)
{
  int rc= FALSE;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;

  /* init values */
  val.type= DYN_COL_STRING;
  val.x.string.value.str= (char*)string;
  val.x.string.value.length= len;
  val.x.string.charset= cs;
  mariadb_dyncol_value_init(&res);

  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= ((res.type == DYN_COL_STRING) &&
       (res.x.string.value.length == len) &&
       (memcmp(res.x.string.value.str, string, len) == 0) &&
       (res.x.string.charset->number == cs->number));
err:
  ok(rc, "'%s' - '%s' %u %u-%s", string,
     res.x.string.value.str, (uint)res.x.string.value.length,
     (uint)res.x.string.charset->number, res.x.string.charset->name);
  /* cleanup */
  val.x.string.value.str= NULL; // we did not allocated it
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 6
0
void test_value_single_decimal(const char *num)
{
  char *end= (((char*)num) + strlen(num));
  char buff[80];
  int rc= FALSE;
  int length= 80;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;

  /* init values */
  mariadb_dyncol_prepare_decimal(&val); // special procedure for decimal!!!
  if (string2decimal(num, &val.x.decimal.value, &end) != E_DEC_OK)
    goto err;
  mariadb_dyncol_value_init(&res);

  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= ((res.type == DYN_COL_DECIMAL) &&
       (decimal_cmp(&res.x.decimal.value, &val.x.decimal.value) == 0));
  decimal2string(&res.x.decimal.value, buff, &length, 0, 0, ' ');
err:
  ok(rc, "%s - %s", num, buff);
  /* cleanup */
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 7
0
static int run_sql_fix_privilege_tables(void)
{
  int found_real_errors= 0;
  const char **query_ptr;
  DYNAMIC_STRING ds_script;
  DYNAMIC_STRING ds_result;
  DBUG_ENTER("run_sql_fix_privilege_tables");

  if (init_dynamic_string(&ds_script, "", 65536, 1024))
    die("Out of memory");

  if (init_dynamic_string(&ds_result, "", 512, 512))
    die("Out of memory");

  verbose("Running 'mysql_fix_privilege_tables'...");

  /*
    Individual queries can not be executed independently by invoking
    a forked mysql client, because the script uses session variables
    and prepared statements.
  */
  for ( query_ptr= &mysql_fix_privilege_tables[0];
        *query_ptr != NULL;
        query_ptr++
      )
  {
    dynstr_append(&ds_script, *query_ptr);
  }

  run_query(ds_script.str,
            &ds_result, /* Collect result */
            TRUE);
  {
    /*
      Scan each line of the result for real errors
      and ignore the expected one(s) like "Duplicate column name",
      "Unknown column" and "Duplicate key name" since they just
      indicate the system tables are already up to date
    */
    char *line= ds_result.str;
    do
    {
      if (!is_expected_error(line))
      {
        /* Something unexpected failed, dump error line to screen */
        found_real_errors++;
        print_line(line);
      }
      else if ((strncmp(line, "WARNING", 7) == 0) ||
               (strncmp(line, "Warning", 7) == 0))
      {
        print_line(line);
      }
    } while ((line= get_line(line)) && *line);
  }

  dynstr_free(&ds_result);
  dynstr_free(&ds_script);
  DBUG_RETURN(found_real_errors);
}
Ejemplo n.º 8
0
static void add_one_option(DYNAMIC_STRING* ds,
                           const struct my_option *opt,
                           const char* argument)

{
  const char* eq= NullS;
  const char* arg= NullS;
  if (opt->arg_type != NO_ARG)
  {
    eq= "=";
    switch (opt->var_type & GET_TYPE_MASK) {
    case GET_STR:
    case GET_PASSWORD:
      arg= argument;
      break;
    case GET_BOOL:
      arg= (*(my_bool *)opt->value) ? "1" : "0";
      break;
    default:
      die("internal error at %s: %d",__FILE__, __LINE__);
    }
  }
  dynstr_append_os_quoted(ds, "--", opt->name, eq, arg, NullS);
  dynstr_append(ds, " ");
}
Ejemplo n.º 9
0
void
read_response(mdata_get_t *mdg)
{
	int retries = 3;
	string_t *resp = dynstr_new();

	for (;;) {
		char buf[2];
		ssize_t sz = fread(&buf, 1, 1, mdg->mdg_fp);

		if (sz == 1) {
			if (buf[0] == '\n') {
				process_input(mdg, dynstr_cstr(resp));
				dynstr_reset(resp);
			} else {
				buf[1] = '\0';
				dynstr_append(resp, buf);
			}
		} else if ((sz == 0) || (sz == -1 && errno == EAGAIN)) {
			if (--retries == 0)
				errx(1, "timed out while reading metadata "
				    "response");
			sleep(1);
		} else {
			errx(1, "could not read metadata response");
		}

		if (mdg->mdg_state == MDGS_DONE)
			break;
	}
}
Ejemplo n.º 10
0
void port_append_value(const PPort *port, DynStr *d)
{
	char		buf[1024];
	const char	*p;

	if((p = value_as_string(&port->value, buf, sizeof buf, NULL)) != NULL)
		dynstr_append(d, p);
}
Ejemplo n.º 11
0
static int run_tool(char *tool_path, DYNAMIC_STRING *ds_res, ...)
{
  int ret;
  const char* arg;
  va_list args;
  DYNAMIC_STRING ds_cmdline;

  DBUG_ENTER("run_tool");
  DBUG_PRINT("enter", ("tool_path: %s", tool_path));

  if (init_dynamic_string(&ds_cmdline, IF_WIN("\"", ""), FN_REFLEN, FN_REFLEN))
    die("Out of memory");

  dynstr_append_os_quoted(&ds_cmdline, tool_path, NullS);
  dynstr_append(&ds_cmdline, " ");

  va_start(args, ds_res);

  while ((arg= va_arg(args, char *)))
  {
    /* Options should be os quoted */
    if (strncmp(arg, "--", 2) == 0)
      dynstr_append_os_quoted(&ds_cmdline, arg, NullS);
    else
      dynstr_append(&ds_cmdline, arg);
    dynstr_append(&ds_cmdline, " ");
  }

  va_end(args);

#ifdef __WIN__
  dynstr_append(&ds_cmdline, "\"");
#endif

  DBUG_PRINT("info", ("Running: %s", ds_cmdline.str));
  ret= run_command(ds_cmdline.str, ds_res);
  DBUG_PRINT("exit", ("ret: %d", ret));
  dynstr_free(&ds_cmdline);
  DBUG_RETURN(ret);
}
Ejemplo n.º 12
0
int
plat_recv(mdata_plat_t *mpl, string_t *data, int timeout_ms)
{
	struct timespec timeout = { (time_t)(timeout_ms/1000), 0 };

	for (;;) {
		struct kevent mpl_ch;
		int nch;

		nch = kevent(mpl->mpl_kq, &mpl->mpl_ev, 1, &mpl_ch, 1, &timeout);

		if (nch == -1) {
			fprintf(stderr, "kqueue error: %d\n", errno);
			if (errno == EINTR) {
				return (-1);
			}
			err(1, "KQUEUE_WAIT ERROR");
		}

		if (nch == 0) {
			fprintf(stderr, "plat_recv timeout\n");
			return (-1);
		}

		if (mpl_ch.flags & EV_ERROR) {
			fprintf(stderr, "EV_ERROR\n");
			return (-1);
		}
		if (mpl_ch.flags & EV_EOF) {
			fprintf(stderr, "EV_EOF\n");
			return (-1);
		}
		if (nch > 0) {
			char buf[2];
			ssize_t sz;

			if ((sz = read(mpl->mpl_conn, buf, 1)) > 0) {
				if (buf[0] == '\n') {
					return (0);
				} else {
					buf[1] = '\0';
					dynstr_append(data, buf);
				}
			}
		}
	}

	return (-1);
}
Ejemplo n.º 13
0
void test_value_single_datetime(uint neg, uint year, uint month, uint day,
                                uint hour, uint minute, uint second,
                                uint mic, const char *name)
{
  int rc= FALSE;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;
  /* init values */
  val.type= DYN_COL_DATETIME;
  val.x.time_value.time_type= MYSQL_TIMESTAMP_DATETIME;
  val.x.time_value.neg= neg;
  val.x.time_value.year= year;
  val.x.time_value.month= month;
  val.x.time_value.day= day;
  val.x.time_value.hour= hour;
  val.x.time_value.minute= minute;
  val.x.time_value.second= second;
  val.x.time_value.second_part= mic;
  mariadb_dyncol_value_init(&res);
  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= ((res.type == DYN_COL_DATETIME) &&
       (res.x.time_value.time_type == MYSQL_TIMESTAMP_DATETIME) &&
       (res.x.time_value.neg == (int)neg) &&
       (res.x.time_value.year == year) &&
       (res.x.time_value.month == month) &&
       (res.x.time_value.day == day) &&
       (res.x.time_value.hour == hour) &&
       (res.x.time_value.minute == minute) &&
       (res.x.time_value.second == second) &&
       (res.x.time_value.second_part == mic));
err:
  ok(rc, "%s - %c %04u-%02u-%02u %02u:%02u:%02u.%06u", name, (neg ? '-' : '+'),
     year, month, day, hour, minute, second, mic);
  /* cleanup */
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 14
0
void test_value_single_null()
{
  int rc= FALSE;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;
  /* init values */
  val.type= DYN_COL_NULL;
  mariadb_dyncol_value_init(&res);
  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= (res.type == DYN_COL_NULL);
err:
  ok(rc, "%s", "NULL");
  /* cleanup */
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 15
0
static int
plat_send_reset(mdata_plat_t *mpl)
{
	int ret = -1;
	string_t *str = dynstr_new();

	dynstr_append(str, "\n");
	if (plat_send(mpl, str) != 0)
		goto bail;
	dynstr_reset(str);

	if (plat_recv(mpl, str, 2000) != 0)
		goto bail;

	if (strcmp(dynstr_cstr(str), "invalid command") != 0)
		goto bail;

	ret = 0;

bail:
	dynstr_free(str);
	return (ret);
}
Ejemplo n.º 16
0
void test_value_single_sint(longlong num, const char *name)
{
  int rc= FALSE;
  uint ids[1]= {1};
  DYNAMIC_COLUMN_VALUE val, res;
  DYNAMIC_COLUMN str;
  /* init values */
  val.type= DYN_COL_INT;
  val.x.long_value= num;
  mariadb_dyncol_value_init(&res);
  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 1, ids, &val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  if (mariadb_dyncol_get_num(&str, 1, &res))
    goto err;
  rc= (res.type == DYN_COL_INT) && (res.x.long_value == num);
  num= res.x.ulong_value;
err:
  ok(rc, "%s - %lld", name, num);
  /* cleanup */
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 17
0
void test_value_multi(ulonglong num0,
                      longlong num1,
                      double num2,
                      const char *num3,
                      const char *string4, size_t len4, CHARSET_INFO *cs4,
                      uint year5, uint month5, uint day5,
                      uint neg6, uint hour6, uint minute6,
                      uint second6, uint mic6,
                      uint neg7, uint year7, uint month7, uint day7,
                      uint hour7, uint minute7, uint second7,
                      uint mic7,
                      uint *column_numbers,
                      const char *name)
{
  char *end3= (((char*)num3) + strlen(num3));
  int rc= FALSE;
  uint i;
  DYNAMIC_COLUMN_VALUE val[9], res[9];
  DYNAMIC_COLUMN str;
  /* init values */
  val[0].type= DYN_COL_UINT;
  val[0].x.ulong_value= num0;
  val[1].type= DYN_COL_INT;
  val[1].x.long_value= num1;
  val[2].type= DYN_COL_DOUBLE;
  val[2].x.double_value= num2;
  mariadb_dyncol_prepare_decimal(val + 3); // special procedure for decimal!!!
  if (string2decimal(num3, &val[3].x.decimal.value, &end3) != E_DEC_OK)
    goto err;
  val[4].type= DYN_COL_STRING;
  val[4].x.string.value.str= (char*)string4;
  val[4].x.string.value.length= len4;
  val[4].x.string.charset= cs4;
  val[5].type= DYN_COL_DATE;
  val[5].x.time_value.time_type= MYSQL_TIMESTAMP_DATE;
  val[5].x.time_value.year= year5;
  val[5].x.time_value.month= month5;
  val[5].x.time_value.day= day5;
  val[6].type= DYN_COL_TIME;
  val[6].x.time_value.time_type= MYSQL_TIMESTAMP_TIME;
  val[6].x.time_value.neg= neg6;
  val[6].x.time_value.hour= hour6;
  val[6].x.time_value.minute= minute6;
  val[6].x.time_value.second= second6;
  val[6].x.time_value.second_part= mic6;
  val[7].type= DYN_COL_DATETIME;
  val[7].x.time_value.time_type= MYSQL_TIMESTAMP_DATETIME;
  val[7].x.time_value.neg= neg7;
  val[7].x.time_value.year= year7;
  val[7].x.time_value.month= month7;
  val[7].x.time_value.day= day7;
  val[7].x.time_value.hour= hour7;
  val[7].x.time_value.minute= minute7;
  val[7].x.time_value.second= second7;
  val[7].x.time_value.second_part= mic7;
  val[8].type= DYN_COL_NULL;
  for (i= 0; i < 9; i++)
    mariadb_dyncol_value_init(res + i);
  /* create column */
  if (mariadb_dyncol_create_many_num(&str, 9, column_numbers, val, 1))
    goto err;
  dynstr_append(&str, "\1"); str.length--; //check for overflow
  /* read column */
  for (i= 0; i < 9; i++)
    if (mariadb_dyncol_get_num(&str, column_numbers[i], res + i))
      goto err;
  rc= ((res[0].type == DYN_COL_UINT) &&
       (res[0].x.ulong_value == num0) &&
       (res[1].type == DYN_COL_INT) &&
       (res[1].x.long_value == num1) &&
       (res[2].type == DYN_COL_DOUBLE) &&
       (res[2].x.double_value == num2) &&
       (res[3].type == DYN_COL_DECIMAL) &&
       (decimal_cmp(&res[3].x.decimal.value, &val[3].x.decimal.value) == 0) &&
       (res[4].type == DYN_COL_STRING) &&
       (res[4].x.string.value.length == len4) &&
       (memcmp(res[4].x.string.value.str, string4, len4) == 0) &&
       (res[4].x.string.charset->number == cs4->number) &&
       (res[5].type == DYN_COL_DATE) &&
       (res[5].x.time_value.time_type == MYSQL_TIMESTAMP_DATE) &&
       (res[5].x.time_value.year == year5) &&
       (res[5].x.time_value.month == month5) &&
       (res[5].x.time_value.day == day5) &&
       (res[6].type == DYN_COL_TIME) &&
       (res[6].x.time_value.time_type == MYSQL_TIMESTAMP_TIME) &&
       (res[6].x.time_value.neg == (int)neg6) &&
       (res[6].x.time_value.hour == hour6) &&
       (res[6].x.time_value.minute == minute6) &&
       (res[6].x.time_value.second == second6) &&
       (res[6].x.time_value.second_part == mic6) &&
       (res[7].type == DYN_COL_DATETIME) &&
       (res[7].x.time_value.time_type == MYSQL_TIMESTAMP_DATETIME) &&
       (res[7].x.time_value.neg == (int)neg7) &&
       (res[7].x.time_value.year == year7) &&
       (res[7].x.time_value.month == month7) &&
       (res[7].x.time_value.day == day7) &&
       (res[7].x.time_value.hour == hour7) &&
       (res[7].x.time_value.minute == minute7) &&
       (res[7].x.time_value.second == second7) &&
       (res[7].x.time_value.second_part == mic7) &&
       (res[8].type == DYN_COL_NULL));
err:
  ok(rc, "%s", name);
  /* cleanup */
  val[4].x.string.value.str= NULL; // we did not allocated it
  mariadb_dyncol_free(&str);
}
Ejemplo n.º 18
0
int main(int argc, char **argv)
{
  char self_name[FN_REFLEN];

  MY_INIT(argv[0]);

#if __WIN__
  if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0)
#endif
  {
    strncpy(self_name, argv[0], FN_REFLEN);
  }

  if (init_dynamic_string(&ds_args, "", 512, 256) ||
      init_dynamic_string(&conn_args, "", 512, 256))
    die("Out of memory");

  if (load_defaults("my", load_default_groups, &argc, &argv))
    die(NULL);
  defaults_argv= argv; /* Must be freed by 'free_defaults' */

  if (handle_options(&argc, &argv, my_long_options, get_one_option))
    die(NULL);
  if (debug_info_flag)
    my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
  if (debug_check_flag)
    my_end_arg= MY_CHECK_ERROR;

  if (tty_password)
  {
    opt_password= get_tty_password(NullS);
    /* add password to defaults file */
    dynstr_append_os_quoted(&ds_args, "--password="******" ");
  }
  /* add user to defaults file */
  dynstr_append_os_quoted(&ds_args, "--user="******" ");

  /* Find mysql */
  find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name);

  /* Find mysqlcheck */
  find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name);

  if (opt_systables_only && !opt_silent)
    printf("The --upgrade-system-tables option was used, user tables won't be touched.\n");


  /*
    Read the mysql_upgrade_info file to check if mysql_upgrade
    already has been run for this installation of MySQL
  */
  if (!opt_force && upgrade_already_done())
  {
    printf("This installation of MySQL is already upgraded to %s, "
           "use --force if you still need to run mysql_upgrade\n",
           MYSQL_SERVER_VERSION);
    goto end;
  }

  if (opt_version_check && check_version_match())
    die("Upgrade failed");

  upgrade_from_mysql= is_mysql();

  /*
    Run "mysqlcheck" and "mysql_fix_privilege_tables.sql"
  */
  if (run_mysqlcheck_upgrade(TRUE) ||
      run_mysqlcheck_views() ||
      run_sql_fix_privilege_tables() ||
      run_mysqlcheck_fixnames() ||
      run_mysqlcheck_upgrade(FALSE))
    die("Upgrade failed" );

  verbose("Phase %d/%d: Running 'FLUSH PRIVILEGES'", ++phase, phases_total);
  if (run_query("FLUSH PRIVILEGES", NULL, TRUE))
    die("Upgrade failed" );

  verbose("OK");

  /* Create a file indicating upgrade has been performed */
  create_mysql_upgrade_info_file();

  DBUG_ASSERT(phase == phases_total);

end:
  free_used_memory();
  my_end(my_end_arg);
  exit(0);
}
Ejemplo n.º 19
0
int main(int argc, char **argv)
{
  char self_name[FN_REFLEN];

  MY_INIT(argv[0]);

#if __WIN__
  if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0)
#endif
  {
    strncpy(self_name, argv[0], FN_REFLEN);
  }

  if (init_dynamic_string(&ds_args, "", 512, 256) ||
      init_dynamic_string(&conn_args, "", 512, 256))
    die("Out of memory");

  if (load_defaults("my", load_default_groups, &argc, &argv))
    die(NULL);
  defaults_argv= argv; /* Must be freed by 'free_defaults' */

  if (handle_options(&argc, &argv, my_long_options, get_one_option))
    die(NULL);
  if (debug_info_flag)
    my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
  if (debug_check_flag)
    my_end_arg= MY_CHECK_ERROR;

  if (tty_password)
  {
    opt_password= get_tty_password(NullS);
    /* add password to defaults file */
    dynstr_append_os_quoted(&ds_args, "--password="******" ");
  }
  /* add user to defaults file */
  dynstr_append_os_quoted(&ds_args, "--user="******" ");

  /* Find mysql */
  find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name);

  if (!opt_systables_only)
  {
    /* Find mysqlcheck */
    find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name);
  }
  else
  {
    if (!opt_silent)
      printf("The --upgrade-system-tables option was used, databases won't be touched.\n");
  }

  /*
    Read the mysql_upgrade_info file to check if mysql_upgrade
    already has been run for this installation of MySQL
  */
  if (!opt_force && upgrade_already_done())
  {
    printf("This installation of MySQL is already upgraded to %s, "
           "use --force if you still need to run mysql_upgrade\n",
           MYSQL_SERVER_VERSION);
    die(NULL);
  }

  if (opt_version_check && check_version_match())
    die("Upgrade failed");

  /*
    Run "mysqlcheck" and "mysql_fix_privilege_tables.sql"
  */
  if ((!opt_systables_only &&
       (run_mysqlcheck_fixnames() || run_mysqlcheck_upgrade())) ||
      run_sql_fix_privilege_tables())
  {
    /*
      The upgrade failed to complete in some way or another,
      significant error message should have been printed to the screen
    */
    die("Upgrade failed" );
  }
  verbose("OK");

  /* Create a file indicating upgrade has been performed */
  create_mysql_upgrade_info_file();

  free_used_memory();
  my_end(my_end_arg);
  exit(0);
}
Ejemplo n.º 20
0
SQLRETURN MADB_DaeStmt(MADB_Stmt *Stmt, SQLUSMALLINT Operation)
{
  char *TableName= MADB_GetTableName(Stmt);
  char *CatalogName= MADB_GetCatalogName(Stmt);
  DYNAMIC_STRING DynStmt;

  MADB_CLEAR_ERROR(&Stmt->Error);
  memset(&DynStmt, 0, sizeof(DYNAMIC_STRING));

  if (Stmt->DaeStmt)
    Stmt->Methods->StmtFree(Stmt->DaeStmt, SQL_DROP);
  Stmt->DaeStmt= NULL;
  if (!SQL_SUCCEEDED(SQLAllocStmt(Stmt->Connection, (SQLHANDLE *)&Stmt->DaeStmt)))
  {
    MADB_CopyError(&Stmt->Error, &Stmt->Connection->Error);
    goto end;
  }

  switch(Operation)
  {
  case SQL_ADD:
    if (init_dynamic_string(&DynStmt, "INSERT INTO ", 1024, 1024) ||
        MADB_DynStrAppendQuoted(&DynStmt, CatalogName) ||
        dynstr_append(&DynStmt, ".") ||
        MADB_DynStrAppendQuoted(&DynStmt, TableName)||
        MADB_DynStrUpdateSet(Stmt, &DynStmt))
    {
      dynstr_free(&DynStmt);
      return Stmt->Error.ReturnValue;
    }
    Stmt->DataExecutionType= MADB_DAE_ADD;
    break;
  case SQL_DELETE:
    if (init_dynamic_string(&DynStmt, "DELETE FROM ", 1024, 1024) ||
        MADB_DynStrAppendQuoted(&DynStmt, CatalogName) ||
        dynstr_append(&DynStmt, ".") ||
        MADB_DynStrAppendQuoted(&DynStmt, TableName) ||
        MADB_DynStrGetWhere(Stmt, &DynStmt, TableName, FALSE))
    {
      dynstr_free(&DynStmt);
      return Stmt->Error.ReturnValue;
    }
    Stmt->DataExecutionType= MADB_DAE_DELETE;
    break;
  case SQL_UPDATE:
    Stmt->Methods->RefreshRowPtrs(Stmt);
    if (init_dynamic_string(&DynStmt, "UPDATE ", 1024, 1024) ||
        MADB_DynStrAppendQuoted(&DynStmt, CatalogName) ||
        dynstr_append(&DynStmt, ".") ||
        MADB_DynStrAppendQuoted(&DynStmt, TableName)||
        MADB_DynStrUpdateSet(Stmt, &DynStmt)||
        MADB_DynStrGetWhere(Stmt, &DynStmt, TableName, FALSE))
    {
      dynstr_free(&DynStmt);
      return Stmt->Error.ReturnValue;
    }
    Stmt->DataExecutionType= MADB_DAE_UPDATE;
    break;
  }
  
  if (!SQL_SUCCEEDED(SQLPrepare(Stmt->DaeStmt, (SQLCHAR *)DynStmt.str, SQL_NTS)))
  {
    MADB_CopyError(&Stmt->Error, &Stmt->DaeStmt->Error);
    Stmt->Methods->StmtFree(Stmt->DaeStmt, SQL_DROP);
  }
   
end:
  dynstr_free(&DynStmt);
  return Stmt->Error.ReturnValue;

}