summaryrefslogtreecommitdiff
path: root/sql-common
diff options
context:
space:
mode:
Diffstat (limited to 'sql-common')
-rw-r--r--sql-common/client.c53
-rw-r--r--sql-common/my_time.c73
2 files changed, 107 insertions, 19 deletions
diff --git a/sql-common/client.c b/sql-common/client.c
index 41f0bb80844..ef025d1853a 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -727,6 +727,7 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
static void cli_flush_use_result(MYSQL *mysql)
{
/* Clear the current execution status */
+ DBUG_ENTER("cli_flush_use_result");
DBUG_PRINT("warning",("Not all packets read, clearing them"));
for (;;)
{
@@ -744,6 +745,7 @@ static void cli_flush_use_result(MYSQL *mysql)
break; /* End of data */
}
}
+ DBUG_VOID_RETURN;
}
@@ -875,12 +877,12 @@ static const char *default_options[]=
};
static TYPELIB option_types={array_elements(default_options)-1,
- "options",default_options};
+ "options",default_options, NULL};
const char *sql_protocol_names_lib[] =
{ "TCP", "SOCKET", "PIPE", "MEMORY", NullS };
TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"",
- sql_protocol_names_lib};
+ sql_protocol_names_lib, NULL};
static int add_init_command(struct st_mysql_options *options, const char *cmd)
{
@@ -1401,6 +1403,7 @@ mysql_init(MYSQL *mysql)
bzero((char*) (mysql),sizeof(*(mysql)));
mysql->options.connect_timeout= CONNECT_TIMEOUT;
mysql->last_used_con= mysql->next_slave= mysql->master = mysql;
+ strmov(mysql->net.sqlstate, not_error_sqlstate);
/*
By default, we are a replication pivot. The caller must reset it
after we return if this is not the case.
@@ -1614,7 +1617,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
sock=0;
unix_socket = 0;
host=mysql->options.shared_memory_base_name;
- host_info=(char*) ER(CR_SHARED_MEMORY_CONNECTION);
+ sprintf(host_info=buff, ER(CR_SHARED_MEMORY_CONNECTION), host);
}
}
#endif /* HAVE_SMEM */
@@ -1678,8 +1681,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
else
{
net->vio=vio_new_win32pipe(hPipe);
- sprintf(host_info=buff, ER(CR_NAMEDPIPE_CONNECTION), host,
- unix_socket);
+ sprintf(host_info=buff, ER(CR_NAMEDPIPE_CONNECTION), unix_socket);
}
}
#endif
@@ -2239,6 +2241,32 @@ static void mysql_close_free(MYSQL *mysql)
}
+/*
+ Clear connection pointer of every statement: this is necessary
+ to give error on attempt to use a prepared statement of closed
+ connection.
+
+ SYNOPSYS
+ mysql_detach_stmt_list()
+ stmt_list pointer to mysql->stmts
+*/
+
+void mysql_detach_stmt_list(LIST **stmt_list __attribute__((unused)))
+{
+#ifdef MYSQL_CLIENT
+ /* Reset connection handle in all prepared statements. */
+ LIST *element= *stmt_list;
+ for (; element; element= element->next)
+ {
+ MYSQL_STMT *stmt= (MYSQL_STMT *) element->data;
+ stmt->mysql= 0;
+ /* No need to call list_delete for statement here */
+ }
+ *stmt_list= 0;
+#endif /* MYSQL_CLIENT */
+}
+
+
void STDCALL mysql_close(MYSQL *mysql)
{
DBUG_ENTER("mysql_close");
@@ -2255,20 +2283,7 @@ void STDCALL mysql_close(MYSQL *mysql)
}
mysql_close_free_options(mysql);
mysql_close_free(mysql);
-#ifdef MYSQL_CLIENT
- if (mysql->stmts)
- {
- /* Reset connection handle in all prepared statements. */
- LIST *element;
- for (element= mysql->stmts; element; element= element->next)
- {
- MYSQL_STMT *stmt= (MYSQL_STMT *) element->data;
- stmt->mysql= 0;
- /* No need to call list_delete for statement here */
- }
- mysql->stmts= 0;
- }
-#endif /*MYSQL_CLIENT*/
+ mysql_detach_stmt_list(&mysql->stmts);
#ifndef TO_BE_DELETED
/* free/close slave list */
if (mysql->rpl_pivot)
diff --git a/sql-common/my_time.c b/sql-common/my_time.c
index 703cfb089c0..dc997921f74 100644
--- a/sql-common/my_time.c
+++ b/sql-common/my_time.c
@@ -785,3 +785,76 @@ void set_zero_time(MYSQL_TIME *tm)
tm->time_type= MYSQL_TIMESTAMP_NONE;
}
+
+/*
+ Functions to convert time/date/datetime value to a string,
+ using default format.
+ This functions don't check that given TIME structure members are
+ in valid range. If they are not, return value won't reflect any
+ valid date either. Additionally, make_time doesn't take into
+ account time->day member: it's assumed that days have been converted
+ to hours already.
+
+ RETURN
+ number of characters written to 'to'
+*/
+
+int my_time_to_str(const MYSQL_TIME *l_time, char *to)
+{
+ uint extra_hours= 0;
+ return my_sprintf(to, (to, "%s%02d:%02d:%02d",
+ (l_time->neg ? "-" : ""),
+ extra_hours+ l_time->hour,
+ l_time->minute,
+ l_time->second));
+}
+
+int my_date_to_str(const MYSQL_TIME *l_time, char *to)
+{
+ return my_sprintf(to, (to, "%04d-%02d-%02d",
+ l_time->year,
+ l_time->month,
+ l_time->day));
+}
+
+int my_datetime_to_str(const MYSQL_TIME *l_time, char *to)
+{
+ return my_sprintf(to, (to, "%04d-%02d-%02d %02d:%02d:%02d",
+ l_time->year,
+ l_time->month,
+ l_time->day,
+ l_time->hour,
+ l_time->minute,
+ l_time->second));
+}
+
+
+/*
+ Convert struct DATE/TIME/DATETIME value to string using built-in
+ MySQL time conversion formats.
+
+ SYNOPSIS
+ my_TIME_to_string()
+
+ NOTE
+ The string must have at least MAX_DATE_STRING_REP_LENGTH bytes reserved.
+*/
+
+int my_TIME_to_str(const MYSQL_TIME *l_time, char *to)
+{
+ switch (l_time->time_type) {
+ case MYSQL_TIMESTAMP_DATETIME:
+ return my_datetime_to_str(l_time, to);
+ case MYSQL_TIMESTAMP_DATE:
+ return my_date_to_str(l_time, to);
+ case MYSQL_TIMESTAMP_TIME:
+ return my_time_to_str(l_time, to);
+ case MYSQL_TIMESTAMP_NONE:
+ case MYSQL_TIMESTAMP_ERROR:
+ to[0]='\0';
+ return 0;
+ default:
+ DBUG_ASSERT(0);
+ return 0;
+ }
+}