mysql5/mysql-5.7.27/sql/rpl_gtid_specification.cc

103 lines
2.8 KiB
C++

/* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; version 2 of the
License.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA */
#include "rpl_gtid.h"
//const int Gtid_specification::MAX_TEXT_LENGTH;
#ifndef MYSQL_CLIENT
enum_return_status Gtid_specification::parse(Sid_map *sid_map, const char *text)
{
DBUG_ENTER("Gtid_specification::parse");
DBUG_ASSERT(text != NULL);
if (my_strcasecmp(&my_charset_latin1, text, "AUTOMATIC") == 0)
{
type= AUTOMATIC_GROUP;
gtid.sidno= 0;
gtid.gno= 0;
}
else if (my_strcasecmp(&my_charset_latin1, text, "ANONYMOUS") == 0)
{
type= ANONYMOUS_GROUP;
gtid.sidno= 0;
gtid.gno= 0;
}
else
{
PROPAGATE_REPORTED_ERROR(gtid.parse(sid_map, text));
type= GTID_GROUP;
}
RETURN_OK;
};
bool Gtid_specification::is_valid(const char *text)
{
DBUG_ENTER("Gtid_specification::is_valid");
DBUG_ASSERT(text != NULL);
if (my_strcasecmp(&my_charset_latin1, text, "AUTOMATIC") == 0)
DBUG_RETURN(true);
else if (my_strcasecmp(&my_charset_latin1, text, "ANONYMOUS") == 0)
DBUG_RETURN(true);
else
DBUG_RETURN(Gtid::is_valid(text));
}
#endif // ifndef MYSQL_CLIENT
int Gtid_specification::to_string(const rpl_sid *sid, char *buf) const
{
DBUG_ENTER("Gtid_specification::to_string(char*)");
switch (type)
{
case AUTOMATIC_GROUP:
strcpy(buf, "AUTOMATIC");
DBUG_RETURN(9);
case NOT_YET_DETERMINED_GROUP:
/*
This can happen if user issues SELECT @@SESSION.GTID_NEXT
immediately after a BINLOG statement containing a
Format_description_log_event.
*/
strcpy(buf, "NOT_YET_DETERMINED");
DBUG_RETURN(18);
case ANONYMOUS_GROUP:
strcpy(buf, "ANONYMOUS");
DBUG_RETURN(9);
/*
UNDEFINED_GROUP must be printed like GTID_GROUP because of
SELECT @@SESSION.GTID_NEXT.
*/
case UNDEFINED_GROUP:
case GTID_GROUP:
DBUG_RETURN(gtid.to_string(*sid, buf));
}
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
int Gtid_specification::to_string(const Sid_map *sid_map, char *buf, bool need_lock) const
{
return to_string(type == GTID_GROUP || type == UNDEFINED_GROUP ?
&sid_map->sidno_to_sid(gtid.sidno, need_lock) : NULL,
buf);
}