75
#ifdef HAVE_LIBREADLINE
76
# if defined(HAVE_READLINE_READLINE_H)
77
# include <readline/readline.h>
78
# elif defined(HAVE_READLINE_H)
79
# include <readline.h>
80
# else /* !defined(HAVE_READLINE_H) */
81
extern char *readline ();
82
# endif /* !defined(HAVE_READLINE_H) */
84
#else /* !defined(HAVE_READLINE_READLINE_H) */
86
# error Readline Required
87
#endif /* HAVE_LIBREADLINE */
97
#undef bcmp // Fix problem with new readline
89
#ifdef HAVE_READLINE_HISTORY
90
# if defined(HAVE_READLINE_HISTORY_H)
91
# include <readline/history.h>
92
# elif defined(HAVE_HISTORY_H)
94
# else /* !defined(HAVE_HISTORY_H) */
95
extern void add_history ();
96
extern int write_history ();
97
extern int read_history ();
98
# endif /* defined(HAVE_READLINE_HISTORY_H) */
100
#endif /* HAVE_READLINE_HISTORY */
99
#ifdef HAVE_READLINE_HISTORY_H
100
#include <readline/history.h>
102
#include <readline/readline.h>
103
105
Make the old readline interface look like the new one.
105
#ifndef HAVE_RL_COMPLETION
106
typedef char **rl_completion_func_t(const char *, int, int);
107
#ifndef USE_NEW_READLINE_INTERFACE
108
typedef CPPFunction rl_completion_func_t;
109
typedef Function rl_compentry_func_t;
107
110
#define rl_completion_matches(str, func) \
108
111
completion_matches((char *)str, (CPFunction *)func)
111
#ifdef HAVE_RL_COMPENTRY
112
# ifdef HAVE_WORKING_RL_COMPENTRY
113
typedef rl_compentry_func_t drizzle_compentry_func_t;
115
/* Snow Leopard ships an rl_compentry which cannot be assigned to
116
* rl_completion_entry_function. We must undo the complete and total
119
typedef Function drizzle_compentry_func_t;
122
typedef Function drizzle_compentry_func_t;
125
#if defined(HAVE_LOCALE_H)
129
#include <drizzled/gettext.h>
132
void* sql_alloc(unsigned size); // Don't use drizzled alloc for these
133
void sql_element_free(void *ptr);
136
115
#if !defined(HAVE_VIDATTR)
138
117
#define vidattr(A) {} // Can't get this to work
120
#ifdef FN_NO_CASE_SENCE
121
#define cmp_database(cs,A,B) my_strcasecmp((cs), (A), (B))
123
#define cmp_database(cs,A,B) strcmp((A),(B))
126
#include "completion_hash.h"
144
128
using namespace std;
146
const string VER("14.14");
147
/* Don't try to make a nice table if the data is too big */
148
const uint32_t MAX_COLUMN_LENGTH= 1024;
150
/* Buffer to hold 'version' and 'version_comment' */
151
const int MAX_SERVER_VERSION_LENGTH= 128;
153
130
#define PROMPT_CHAR '\\'
154
131
#define DEFAULT_DELIMITER ";"
159
136
uint32_t query_start_line;
161
LineBuffer *line_buff;
138
LINE_BUFFER *line_buff;
162
139
bool batch,add_to_history;
166
static map<string, string>::iterator completion_iter;
167
static map<string, string>::iterator completion_end;
168
static map<string, string> completion_map;
169
static string completion_string;
171
144
static char **defaults_argv;
173
146
enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
174
147
typedef enum enum_info_type INFO_TYPE;
176
static drizzle_st drizzle; /* The library handle */
177
static drizzle_con_st con; /* The connection */
178
static bool ignore_errors= false, quick= false,
179
connected= false, opt_raw_data= false, unbuffered= false,
180
output_tables= false, opt_rehash= true, skip_updates= false,
181
safe_updates= false, one_database= false,
182
opt_compress= false, opt_shutdown= false, opt_ping= false,
183
vertical= false, line_numbers= true, column_names= true,
184
opt_nopager= true, opt_outfile= false, named_cmds= false,
185
tty_password= false, opt_nobeep= false, opt_reconnect= true,
186
default_charset_used= false, opt_secure_auth= false,
187
default_pager_set= false, opt_sigint_ignore= false,
188
auto_vertical_output= false,
189
show_warnings= false, executing_query= false, interrupted_query= false;
190
static uint32_t show_progress_size= 0;
149
static DRIZZLE drizzle; /* The connection */
150
static bool ignore_errors=0,quick=0,
151
connected=0,opt_raw_data=0,unbuffered=0,output_tables=0,
152
opt_rehash=1,skip_updates=0,safe_updates=0,one_database=0,
153
opt_compress=0, using_opt_local_infile=0,
154
vertical=0, line_numbers=1, column_names=1,
155
opt_nopager=1, opt_outfile=0, named_cmds= 0,
156
tty_password= 0, opt_nobeep=0, opt_reconnect=1,
157
default_charset_used= 0, opt_secure_auth= 0,
158
default_pager_set= 0, opt_sigint_ignore= 0,
159
auto_vertical_output= 0,
160
show_warnings= 0, executing_query= 0, interrupted_query= 0;
161
static bool debug_info_flag, debug_check_flag;
191
162
static bool column_types_flag;
192
static bool preserve_comments= false;
193
static uint32_t opt_max_input_line, opt_drizzle_port= 0;
194
static int verbose= 0, opt_silent= 0, opt_local_infile= 0;
195
static char * opt_drizzle_unix_port= NULL;
196
static drizzle_capabilities_t connect_flag= DRIZZLE_CAPABILITIES_NONE;
197
static char *current_host, *current_db, *current_user= NULL,
198
*opt_password= NULL, *delimiter_str= NULL, *current_prompt= NULL;
163
static bool preserve_comments= 0;
164
static uint32_t opt_max_allowed_packet, opt_net_buffer_length;
165
static int verbose=0,opt_silent=0,opt_drizzle_port=0, opt_local_infile=0;
166
static uint my_end_arg;
167
static char * opt_drizzle_unix_port=0;
168
static int connect_flag=CLIENT_INTERACTIVE;
169
static char *current_host,*current_db,*current_user=0,*opt_password=0,
170
*delimiter_str= 0,* current_prompt= 0,
171
*default_charset= (char*) DRIZZLE_DEFAULT_CHARSET_NAME;
199
172
static char *histfile;
200
173
static char *histfile_tmp;
201
174
static string *glob_buffer;
202
175
static string *processed_prompt= NULL;
203
176
static char *default_prompt= NULL;
204
static char *full_username= NULL,*part_username= NULL;
177
static char *full_username=0,*part_username=0;
205
178
static STATUS status;
206
179
static uint32_t select_limit;
207
180
static uint32_t max_join_size;
208
181
static uint32_t opt_connect_timeout= 0;
182
static char drizzle_charsets_dir[FN_REFLEN+1];
209
183
// TODO: Need to i18n these
210
static const char *day_names[]= {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
211
static const char *month_names[]= {"Jan","Feb","Mar","Apr","May","Jun","Jul",
184
static const char *day_names[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
185
static const char *month_names[]={"Jan","Feb","Mar","Apr","May","Jun","Jul",
212
186
"Aug","Sep","Oct","Nov","Dec"};
213
187
static char default_pager[FN_REFLEN];
214
188
static char pager[FN_REFLEN], outfile[FN_REFLEN];
215
189
static FILE *PAGER, *OUTFILE;
216
static uint32_t prompt_counter;
190
static MEM_ROOT hash_mem_root;
191
static uint prompt_counter;
217
192
static char delimiter[16]= DEFAULT_DELIMITER;
218
static uint32_t delimiter_length= 1;
193
static uint delimiter_length= 1;
219
194
unsigned short terminal_width= 80;
221
static const CHARSET_INFO *charset_info= &my_charset_utf8_general_ci;
196
static uint opt_protocol= DRIZZLE_PROTOCOL_TCP;
197
static const CHARSET_INFO *charset_info= &my_charset_latin1;
223
int drizzleclient_real_query_for_lazy(const char *buf, int length,
224
drizzle_result_st *result,
225
uint32_t *error_code);
226
int drizzleclient_store_result_for_lazy(drizzle_result_st *result);
199
int drizzle_real_query_for_lazy(const char *buf, int length);
200
int drizzle_store_result_for_lazy(DRIZZLE_RES **result);
229
203
void tee_fprintf(FILE *file, const char *fmt, ...);
242
216
com_connect(string *str,const char*), com_status(string *str,const char*),
243
217
com_use(string *str,const char*), com_source(string *str, const char*),
244
218
com_rehash(string *str, const char*), com_tee(string *str, const char*),
245
com_notee(string *str, const char*),
219
com_notee(string *str, const char*), com_charset(string *str,const char*),
246
220
com_prompt(string *str, const char*), com_delimiter(string *str, const char*),
247
221
com_warnings(string *str, const char*), com_nowarnings(string *str, const char*),
248
222
com_nopager(string *str, const char*), com_pager(string *str, const char*);
250
224
static int read_and_execute(bool interactive);
251
225
static int sql_connect(char *host,char *database,char *user,char *password,
253
static const char *server_version_string(drizzle_con_st *con);
254
static int put_info(const char *str,INFO_TYPE info,uint32_t error,
227
static const char *server_version_string(DRIZZLE *drizzle);
228
static int put_info(const char *str,INFO_TYPE info,uint error,
255
229
const char *sql_state);
256
static int put_error(drizzle_con_st *con, drizzle_result_st *res);
230
static int put_error(DRIZZLE *drizzle);
257
231
static void safe_put_field(const char *pos,uint32_t length);
258
232
static void init_pager(void);
259
233
static void end_pager(void);
281
255
static COMMANDS commands[] = {
282
{ "?", '?', com_help, 0, N_("Synonym for `help'.") },
256
{ "?", '?', com_help, 1, N_("Synonym for `help'.") },
283
257
{ "clear", 'c', com_clear, 0, N_("Clear command.")},
284
258
{ "connect",'r', com_connect,1,
285
N_("Reconnect to the server. Optional arguments are db and host.")},
259
N_("Reconnect to the server. Optional arguments are db and host." }),
286
260
{ "delimiter", 'd', com_delimiter, 1,
287
261
N_("Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.") },
288
262
{ "ego", 'G', com_ego, 0,
289
263
N_("Send command to drizzle server, display result vertically.")},
290
264
{ "exit", 'q', com_quit, 0, N_("Exit drizzle. Same as quit.")},
291
265
{ "go", 'g', com_go, 0, N_("Send command to drizzle server.") },
292
{ "help", 'h', com_help, 0, N_("Display this help.") },
266
{ "help", 'h', com_help, 1, N_("Display this help.") },
293
267
{ "nopager",'n', com_nopager,0, N_("Disable pager, print to stdout.") },
294
268
{ "notee", 't', com_notee, 0, N_("Don't write into outfile.") },
295
269
{ "pager", 'P', com_pager, 1,
801
788
{ "ATAN2", 0, 0, 0, ""},
802
789
{ "BENCHMARK", 0, 0, 0, ""},
803
790
{ "BIN", 0, 0, 0, ""},
791
{ "BIT_COUNT", 0, 0, 0, ""},
804
792
{ "BIT_OR", 0, 0, 0, ""},
805
793
{ "BIT_AND", 0, 0, 0, ""},
806
794
{ "BIT_XOR", 0, 0, 0, ""},
807
795
{ "CAST", 0, 0, 0, ""},
808
796
{ "CEIL", 0, 0, 0, ""},
809
797
{ "CEILING", 0, 0, 0, ""},
798
{ "BIT_LENGTH", 0, 0, 0, ""},
810
799
{ "CENTROID", 0, 0, 0, ""},
811
800
{ "CHAR_LENGTH", 0, 0, 0, ""},
812
801
{ "CHARACTER_LENGTH", 0, 0, 0, ""},
970
962
{ "SUBSTR", 0, 0, 0, ""},
971
963
{ "SUBSTRING", 0, 0, 0, ""},
972
964
{ "SUBSTRING_INDEX", 0, 0, 0, ""},
965
{ "SUBTIME", 0, 0, 0, ""},
973
966
{ "SUM", 0, 0, 0, ""},
974
967
{ "SYSDATE", 0, 0, 0, ""},
975
968
{ "SYSTEM_USER", 0, 0, 0, ""},
976
969
{ "TAN", 0, 0, 0, ""},
977
970
{ "TIME_FORMAT", 0, 0, 0, ""},
971
{ "TIME_TO_SEC", 0, 0, 0, ""},
972
{ "TIMEDIFF", 0, 0, 0, ""},
978
973
{ "TO_DAYS", 0, 0, 0, ""},
979
974
{ "TOUCHES", 0, 0, 0, ""},
980
975
{ "TRIM", 0, 0, 0, ""},
1011
1006
static bool add_line(string *buffer,char *line,char *in_string,
1012
1007
bool *ml_comment);
1013
1008
static void remove_cntrl(string *buffer);
1014
static void print_table_data(drizzle_result_st *result);
1015
static void print_tab_data(drizzle_result_st *result);
1016
static void print_table_data_vertically(drizzle_result_st *result);
1017
static void print_warnings(uint32_t error_code);
1009
static void print_table_data(DRIZZLE_RES *result);
1010
static void print_tab_data(DRIZZLE_RES *result);
1011
static void print_table_data_vertically(DRIZZLE_RES *result);
1012
static void print_warnings(void);
1018
1013
static uint32_t start_timer(void);
1019
1014
static void end_timer(uint32_t start_time,char *buff);
1020
1015
static void drizzle_end_timer(uint32_t start_time,char *buff);
1021
1016
static void nice_time(double sec,char *buff,bool part_second);
1022
extern "C" void drizzle_end(int sig);
1023
extern "C" void handle_sigint(int sig);
1017
extern sig_handler drizzle_end(int sig);
1018
extern sig_handler handle_sigint(int sig);
1024
1019
#if defined(HAVE_TERMIOS_H) && defined(GWINSZ_IN_SYS_IOCTL)
1025
static void window_resize(int sig);
1020
static sig_handler window_resize(int sig);
1028
static inline int is_prefix(const char *s, const char *t)
1031
if (*s++ != *t++) return 0;
1032
return 1; /* WRONG */
1036
Shutdown the server that we are currently connected to.
1043
static bool server_shutdown(void)
1045
drizzle_result_st result;
1046
drizzle_return_t ret;
1050
printf("shutting down drizzled");
1051
if (opt_drizzle_port > 0)
1052
printf(" on port %d", opt_drizzle_port);
1056
if (drizzle_shutdown(&con, &result, DRIZZLE_SHUTDOWN_DEFAULT,
1057
&ret) == NULL || ret != DRIZZLE_RETURN_OK)
1059
if (ret == DRIZZLE_RETURN_ERROR_CODE)
1061
fprintf(stderr, "shutdown failed; error: '%s'",
1062
drizzle_result_error(&result));
1063
drizzle_result_free(&result);
1067
fprintf(stderr, "shutdown failed; error: '%s'",
1068
drizzle_con_error(&con));
1073
drizzle_result_free(&result);
1082
Ping the server that we are currently connected to.
1089
static bool server_ping(void)
1091
drizzle_result_st result;
1092
drizzle_return_t ret;
1094
if (drizzle_ping(&con, &result, &ret) != NULL && ret == DRIZZLE_RETURN_OK)
1097
printf("drizzled is alive\n");
1101
if (ret == DRIZZLE_RETURN_ERROR_CODE)
1103
fprintf(stderr, "ping failed; error: '%s'",
1104
drizzle_result_error(&result));
1105
drizzle_result_free(&result);
1109
fprintf(stderr, "drizzled won't answer to ping, error: '%s'",
1110
drizzle_con_error(&con));
1114
drizzle_result_free(&result);
1119
Execute command(s) specified by the user.
1121
@param error error status of command execution.
1122
If an error had occurred, this variable will be set
1123
to 1 whereas on success, it shall be set to 0. This
1124
value will be supplied to the exit() function used
1128
false no commands were executed
1130
true at least one command was executed
1132
static bool execute_commands(int *error)
1134
bool executed= false;
1139
if (server_ping() == false)
1146
if (server_shutdown() == false)
1153
1023
int main(int argc,char *argv[])
1155
1027
#if defined(ENABLE_NLS)
1156
1028
# if defined(HAVE_LOCALE_H)
1157
1029
setlocale(LC_ALL, "");
1377
1224
If query is in process, kill query
1378
1225
no query in process, terminate like previous behavior
1381
void handle_sigint(int sig)
1227
sig_handler handle_sigint(int sig)
1383
1229
char kill_buffer[40];
1384
drizzle_con_st kill_drizzle;
1385
drizzle_result_st res;
1386
drizzle_return_t ret;
1230
DRIZZLE *kill_drizzle= NULL;
1388
1232
/* terminate if no query being executed, or we already tried interrupting */
1389
1233
if (!executing_query || interrupted_query) {
1393
if (drizzle_con_add_tcp(&drizzle, &kill_drizzle, current_host,
1394
opt_drizzle_port, current_user, opt_password, NULL,
1395
DRIZZLE_CON_NONE) == NULL)
1237
kill_drizzle= drizzle_create(kill_drizzle);
1238
if (!drizzle_connect(kill_drizzle,current_host, current_user, opt_password,
1239
"", opt_drizzle_port, opt_drizzle_unix_port,0))
1400
1244
/* kill_buffer is always big enough because max length of %lu is 15 */
1401
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %u",
1402
drizzle_con_thread_id(&con));
1404
if (drizzle_query_str(&kill_drizzle, &res, kill_buffer, &ret) != NULL)
1405
drizzle_result_free(&res);
1407
drizzle_con_free(&kill_drizzle);
1245
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %u", drizzle_thread_id(&drizzle));
1246
drizzle_real_query(kill_drizzle, kill_buffer, strlen(kill_buffer));
1247
drizzle_close(kill_drizzle);
1408
1248
tee_fprintf(stdout, _("Query aborted by Ctrl+C\n"));
1410
1250
interrupted_query= 1;
1437
1277
(char**) &opt_rehash, (char**) &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
1439
1279
{"no-auto-rehash", 'A',
1440
N_("No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of drizzle_st and disables rehashing on reconnect. WARNING: options deprecated; use --disable-auto-rehash instead."),
1280
N_("No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of DRIZZLE and disables rehashing on reconnect. WARNING: options deprecated; use --disable-auto-rehash instead."),
1441
1281
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1442
1282
{"auto-vertical-output", OPT_AUTO_VERTICAL_OUTPUT,
1443
1283
N_("Automatically switch to vertical output mode if the result is wider than the terminal width."),
1444
1284
(char**) &auto_vertical_output, (char**) &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1446
1286
N_("Don't use history file. Disable interactive behavior. (Enables --silent)"), 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1287
{"character-sets-dir", OPT_CHARSETS_DIR,
1288
N_("Directory where character sets are."), (char**) &charsets_dir,
1289
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1447
1290
{"column-type-info", OPT_COLUMN_TYPES, N_("Display column type information."),
1448
1291
(char**) &column_types_flag, (char**) &column_types_flag,
1449
1292
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1453
1296
{"compress", 'C', N_("Use compression in server/client protocol."),
1454
1297
(char**) &opt_compress, (char**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
1299
{"debug-check", OPT_DEBUG_CHECK, N_("Check memory and open file usage at exit ."),
1300
(char**) &debug_check_flag, (char**) &debug_check_flag, 0,
1301
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1302
{"debug-info", 'T', N_("Print some debug info at exit."), (char**) &debug_info_flag,
1303
(char**) &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1456
1304
{"database", 'D', N_("Database to use."), (char**) ¤t_db,
1457
1305
(char**) ¤t_db, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1458
1306
{"default-character-set", OPT_DEFAULT_CHARSET,
1459
N_("(not used)"), 0,
1460
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1307
N_("Set the default character set."), (char**) &default_charset,
1308
(char**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1461
1309
{"delimiter", OPT_DELIMITER, N_("Delimiter to be used."), (char**) &delimiter_str,
1462
1310
(char**) &delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1463
1311
{"execute", 'e', N_("Execute command and quit. (Disables --force and history file)"), 0,
1512
1360
{"no-pager", OPT_NOPAGER,
1513
1361
N_("Disable pager and print to stdout. See interactive help (\\h) also. WARNING: option deprecated; use --disable-pager instead."),
1514
1362
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1516
1364
N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
1517
1365
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
1518
{"port", 'p', N_("Port number to use for connection or 0 for default to, in order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, ")
1366
{"port", 'P', N_("Port number to use for connection or 0 for default to, in order of preference, my.cnf, $DRIZZLE_TCP_PORT, ")
1519
1367
N_("built-in default") " (" STRINGIFY_ARG(DRIZZLE_PORT) ").",
1520
0, 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1368
(char**) &opt_drizzle_port,
1369
(char**) &opt_drizzle_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1521
1370
{"prompt", OPT_PROMPT, N_("Set the drizzle prompt to this value."),
1522
1371
(char**) ¤t_prompt, (char**) ¤t_prompt, 0, GET_STR_ALLOC,
1523
1372
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1373
{"protocol", OPT_DRIZZLE_PROTOCOL, N_("The protocol of connection (tcp,socket,pipe,memory)."),
1374
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1525
1376
N_("Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file."),
1526
1377
(char**) &quick, (char**) &quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1560
1411
{"connect_timeout", OPT_CONNECT_TIMEOUT,
1561
1412
N_("Number of seconds before connection timeout."),
1562
1413
(char**) &opt_connect_timeout,
1563
(char**) &opt_connect_timeout, 0, GET_UINT32, REQUIRED_ARG, 0, 0, 3600*12, 0,
1414
(char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 3600*12, 0,
1565
{"max_input_line", OPT_MAX_INPUT_LINE,
1566
N_("Max length of input line"),
1567
(char**) &opt_max_input_line, (char**) &opt_max_input_line, 0,
1568
GET_UINT32, REQUIRED_ARG, 16 *1024L*1024L, 4096,
1416
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET,
1417
N_("Max packet length to send to, or receive from server"),
1418
(char**) &opt_max_allowed_packet, (char**) &opt_max_allowed_packet, 0,
1419
GET_ULONG, REQUIRED_ARG, 16 *1024L*1024L, 4096,
1569
1420
(int64_t) 2*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
1421
{"net_buffer_length", OPT_NET_BUFFER_LENGTH,
1422
N_("Buffer for TCP/IP and socket communication"),
1423
(char**) &opt_net_buffer_length, (char**) &opt_net_buffer_length, 0, GET_ULONG,
1424
REQUIRED_ARG, 16384, 1024, 512*1024*1024L, MALLOC_OVERHEAD, 1024, 0},
1570
1425
{"select_limit", OPT_SELECT_LIMIT,
1571
1426
N_("Automatic limit for SELECT when using --safe-updates"),
1572
1427
(char**) &select_limit,
1573
(char**) &select_limit, 0, GET_UINT32, REQUIRED_ARG, 1000L, 1, ULONG_MAX,
1428
(char**) &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ULONG_MAX,
1575
1430
{"max_join_size", OPT_MAX_JOIN_SIZE,
1576
1431
N_("Automatic limit for rows in a join when using --safe-updates"),
1577
1432
(char**) &max_join_size,
1578
(char**) &max_join_size, 0, GET_UINT32, REQUIRED_ARG, 1000000L, 1, ULONG_MAX,
1433
(char**) &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, 1, ULONG_MAX,
1580
1435
{"secure-auth", OPT_SECURE_AUTH, N_("Refuse client connecting to server if it uses old (pre-4.1.1) protocol"), (char**) &opt_secure_auth,
1581
1436
(char**) &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1582
1437
{"show-warnings", OPT_SHOW_WARNINGS, N_("Show warnings after every statement."),
1583
1438
(char**) &show_warnings, (char**) &show_warnings, 0, GET_BOOL, NO_ARG,
1584
1439
0, 0, 0, 0, 0, 0},
1585
{"show-progress-size", OPT_SHOW_PROGRESS_SIZE, N_("Number of lines before each import progress report."),
1586
(char**) &show_progress_size, (char**) &show_progress_size, 0, GET_UINT32, REQUIRED_ARG,
1588
{"ping", OPT_PING, N_("Ping the server to check if it's alive."),
1589
(char**) &opt_ping, (char**) &opt_ping, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1590
1440
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
1596
1446
const char* readline= "readline";
1598
printf(_("%s Ver %s Distrib %s, for %s-%s (%s) using %s %s\n"),
1599
my_progname, VER.c_str(), drizzle_version(),
1600
HOST_VENDOR, HOST_OS, HOST_CPU,
1448
printf(_("%s Ver %s Distrib %s, for %s (%s) using %s %s\n"),
1449
my_progname, VER, drizzle_get_client_info(),
1450
SYSTEM_TYPE, MACHINE_TYPE,
1601
1451
readline, rl_library_version);
1605
printf(_("Copyright (C) 2008 Sun Microsystems\n"
1606
"This software comes with ABSOLUTELY NO WARRANTY. "
1607
"This is free software,\n"
1608
"and you are welcome to modify and redistribute it "
1609
"under the GPL license\n"));
1456
Copyright (C) 2000-2008 MySQL AB\n \
1457
This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n \
1458
and you are welcome to modify and redistribute it under the GPL license\n"));
1610
1459
printf(_("Usage: %s [OPTIONS] [database]\n"), my_progname);
1611
1460
my_print_help(my_long_options);
1612
print_defaults("drizzle", load_default_groups);
1461
print_defaults("my", load_default_groups);
1613
1462
my_print_variables(my_long_options);
1618
get_one_option(int optid, const struct my_option *, char *argument)
1467
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
1620
char *endchar= NULL;
1621
uint64_t temp_drizzle_port= 0;
1623
1470
switch(optid) {
1471
case OPT_CHARSETS_DIR:
1472
strmake(drizzle_charsets_dir, argument, sizeof(drizzle_charsets_dir) - 1);
1473
charsets_dir = drizzle_charsets_dir;
1624
1475
case OPT_DEFAULT_CHARSET:
1625
1476
default_charset_used= 1;
1627
1478
case OPT_DELIMITER:
1628
1479
if (argument == disabled_my_option)
1630
strcpy(delimiter, DEFAULT_DELIMITER);
1481
stpcpy(delimiter, DEFAULT_DELIMITER);
1634
1485
/* Check that delimiter does not contain a backslash */
1635
1486
if (!strstr(argument, "\\"))
1637
strncpy(delimiter, argument, sizeof(delimiter) - 1);
1488
strmake(delimiter, argument, sizeof(delimiter) - 1);
1641
1492
put_info(_("DELIMITER cannot contain a backslash character"),
1642
1493
INFO_ERROR,0,0);
1646
delimiter_length= (uint32_t)strlen(delimiter);
1497
delimiter_length= (uint)strlen(delimiter);
1647
1498
delimiter_str= delimiter;
1500
case OPT_LOCAL_INFILE:
1501
using_opt_local_infile=1;
1650
1504
if (argument == disabled_my_option)
2364
2198
return (char**) 0;
2367
inline string lower_string(const string &from_string)
2369
string to_string= from_string;
2370
transform(to_string.begin(), to_string.end(),
2371
to_string.begin(), ::tolower);
2374
inline string lower_string(const char * from_string)
2376
string to_string= from_string;
2377
return lower_string(to_string);
2381
class CompletionMatch :
2382
public unary_function<const string&, bool>
2387
CompletionMatch(string text) : match_text(text) {}
2388
inline bool operator() (const pair<string,string> &match_against) const
2391
lower_string(match_against.first.substr(0,match_text.size()));
2392
return match_func(sub_match,match_text);
2399
char *new_command_generator(const char *text, int state)
2202
static char *new_command_generator(const char *text,int state)
2404
completion_string= lower_string(text);
2405
if (completion_string.size() == 0)
2407
completion_iter= completion_map.begin();
2408
completion_end= completion_map.end();
2412
completion_iter= find_if(completion_map.begin(), completion_map.end(),
2413
CompletionMatch<equal_to<string> >(completion_string));
2414
completion_end= find_if(completion_iter, completion_map.end(),
2415
CompletionMatch<not_equal_to<string> >(completion_string));
2418
if (completion_iter == completion_end || (size_t)state > completion_map.size())
2420
char *result= (char *)malloc((*completion_iter).second.size()+1);
2421
strcpy(result, (*completion_iter).second.c_str());
2211
textlen=(uint) strlen(text);
2214
{ /* lookup in the hash */
2219
b = find_all_matches(&ht,text,(uint) strlen(text),&len);
2227
ptr= strdup(e->str);
2233
{ /* traverse the entire hash, ugly but works */
2237
/* find the first used bucket */
2238
for (i=0 ; i < ht.nTableSize ; i++)
2240
if (ht.arBuckets[i])
2242
b = ht.arBuckets[i];
2250
{ /* find valid entry in bucket */
2251
if ((uint) strlen(e->str) == b->nKeyLength)
2252
ptr = strdup(e->str);
2253
/* find the next used entry */
2256
{ /* find the next used bucket */
2260
for (i++ ; i<ht.nTableSize; i++)
2262
if (ht.arBuckets[i])
2264
b = ht.arBuckets[i];
2426
2281
/* Build up the completion hash */
2428
2283
static void build_completion_hash(bool rehash, bool write_info)
2430
2285
COMMANDS *cmd=commands;
2431
drizzle_return_t ret;
2432
drizzle_result_st databases,tables,fields;
2433
drizzle_row_t database_row,table_row;
2434
drizzle_column_st *sql_field;
2435
string tmp_str, tmp_str_lower;
2286
DRIZZLE_RES *databases=0,*tables=0;
2287
DRIZZLE_RES *fields;
2288
static char ***field_names= 0;
2289
DRIZZLE_ROW database_row,table_row;
2290
DRIZZLE_FIELD *sql_field;
2291
char buf[NAME_LEN*2+2]; // table name plus field name plus 2
2437
2295
if (status.batch || quick || !current_db)
2438
2296
return; // We don't need completion in batches
2442
completion_map.clear();
2300
/* Free old used memory */
2303
completion_hash_clean(&ht);
2304
free_root(&hash_mem_root,MYF(0));
2444
2306
/* hash this file's known subset of SQL commands */
2445
2307
while (cmd->name) {
2447
tmp_str_lower= lower_string(tmp_str);
2448
completion_map[tmp_str_lower]= tmp_str;
2308
add_word(&ht,(char*) cmd->name);
2452
2312
/* hash Drizzle functions (to be implemented) */
2454
2314
/* hash all database names */
2455
if (drizzle_query_str(&con, &databases, "show databases", &ret) != NULL)
2315
if (drizzle_query(&drizzle,"show databases") == 0)
2457
if (ret == DRIZZLE_RETURN_OK)
2317
if (!(databases = drizzle_store_result(&drizzle)))
2318
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2459
if (drizzle_result_buffer(&databases) != DRIZZLE_RETURN_OK)
2460
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2321
while ((database_row=drizzle_fetch_row(databases)))
2463
while ((database_row=drizzle_row_next(&databases)))
2465
tmp_str= database_row[0];
2466
tmp_str_lower= lower_string(tmp_str);
2467
completion_map[tmp_str_lower]= tmp_str;
2323
char *str=strdup_root(&hash_mem_root, (char*) database_row[0]);
2325
add_word(&ht,(char*) str);
2327
drizzle_free_result(databases);
2472
drizzle_result_free(&databases);
2475
2330
/* hash all table names */
2476
if (drizzle_query_str(&con, &tables, "show tables", &ret) != NULL)
2331
if (drizzle_query(&drizzle,"show tables")==0)
2478
if (ret != DRIZZLE_RETURN_OK)
2480
drizzle_result_free(&tables);
2484
if (drizzle_result_buffer(&tables) != DRIZZLE_RETURN_OK)
2333
if (!(tables = drizzle_store_result(&drizzle)))
2485
2334
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2488
if (drizzle_result_row_count(&tables) > 0 && !opt_silent && write_info)
2337
if (drizzle_num_rows(tables) > 0 && !opt_silent && write_info)
2490
2339
tee_fprintf(stdout, _("\
2491
2340
Reading table information for completion of table and column names\n \
2492
2341
You can turn off this feature to get a quicker startup with -A\n\n"));
2494
while ((table_row=drizzle_row_next(&tables)))
2343
while ((table_row=drizzle_fetch_row(tables)))
2496
tmp_str= table_row[0];
2497
tmp_str_lower= lower_string(tmp_str);
2498
completion_map[tmp_str_lower]= tmp_str;
2345
char *str=strdup_root(&hash_mem_root, (char*) table_row[0]);
2347
!completion_hash_exists(&ht,(char*) str, (uint) strlen(str)))
2505
2353
/* hash all field names, both with the table prefix and without it */
2506
if (drizzle_result_row_count(&tables) == 0)
2508
drizzle_result_free(&tables);
2512
drizzle_row_seek(&tables, 0);
2514
while ((table_row=drizzle_row_next(&tables)))
2518
query.append("show fields in '");
2519
query.append(table_row[0]);
2522
if (drizzle_query(&con, &fields, query.c_str(), query.length(),
2354
if (!tables) /* no tables */
2358
drizzle_data_seek(tables,0);
2359
if (!(field_names= (char ***) alloc_root(&hash_mem_root,sizeof(char **) *
2360
(uint) (drizzle_num_rows(tables)+1))))
2362
drizzle_free_result(tables);
2366
while ((table_row=drizzle_fetch_row(tables)))
2368
if ((fields=drizzle_list_fields(&drizzle,(const char*) table_row[0],NullS)))
2525
if (ret == DRIZZLE_RETURN_OK &&
2526
drizzle_result_buffer(&fields) == DRIZZLE_RETURN_OK)
2528
while ((sql_field=drizzle_column_next(&fields)))
2530
tmp_str=table_row[0];
2531
tmp_str.append(".");
2532
tmp_str.append(drizzle_column_name(sql_field));
2533
tmp_str_lower= lower_string(tmp_str);
2534
completion_map[tmp_str_lower]= tmp_str;
2536
tmp_str=drizzle_column_name(sql_field);
2537
tmp_str_lower= lower_string(tmp_str);
2538
completion_map[tmp_str_lower]= tmp_str;
2541
drizzle_result_free(&fields);
2370
num_fields=drizzle_num_fields(fields);
2371
if (!(field_names[i] = (char **) alloc_root(&hash_mem_root,
2375
drizzle_free_result(fields);
2378
field_names[i][num_fields*2]= '\0';
2380
while ((sql_field=drizzle_fetch_field(fields)))
2382
sprintf(buf,"%.64s.%.64s",table_row[0],sql_field->name);
2383
field_names[i][j] = strdup_root(&hash_mem_root,buf);
2384
add_word(&ht,field_names[i][j]);
2385
field_names[i][num_fields+j] = strdup_root(&hash_mem_root,
2387
if (!completion_hash_exists(&ht,field_names[i][num_fields+j],
2388
(uint) strlen(field_names[i][num_fields+j])))
2389
add_word(&ht,field_names[i][num_fields+j]);
2392
drizzle_free_result(fields);
2544
drizzle_result_free(&tables);
2545
completion_iter= completion_map.begin();
2399
drizzle_free_result(tables);
2400
field_names[i]=0; // End pointer
2548
2404
/* for gnu readline */
2611
2465
The different commands
2612
2466
***************************************************************************/
2614
int drizzleclient_real_query_for_lazy(const char *buf, int length,
2615
drizzle_result_st *result,
2616
uint32_t *error_code)
2468
int drizzle_real_query_for_lazy(const char *buf, int length)
2618
drizzle_return_t ret;
2620
for (uint32_t retry=0;; retry++)
2470
for (uint retry=0;; retry++)
2623
if (drizzle_query(&con,result,buf,length,&ret) != NULL &&
2624
ret == DRIZZLE_RETURN_OK)
2473
if (!drizzle_real_query(&drizzle,buf,length))
2628
error= put_error(&con, result);
2630
if (ret == DRIZZLE_RETURN_ERROR_CODE)
2632
*error_code= drizzle_result_error_code(result);
2633
drizzle_result_free(result);
2636
if (ret != DRIZZLE_RETURN_SERVER_GONE || retry > 1 ||
2475
error= put_error(&drizzle);
2476
if (drizzle_errno(&drizzle) != CR_SERVER_GONE_ERROR || retry > 1 ||
2637
2477
!opt_reconnect)
2642
2479
if (reconnect())
2647
int drizzleclient_store_result_for_lazy(drizzle_result_st *result)
2484
int drizzle_store_result_for_lazy(DRIZZLE_RES **result)
2649
if (drizzle_result_buffer(result) == DRIZZLE_RETURN_OK)
2486
if ((*result=drizzle_store_result(&drizzle)))
2652
if (drizzle_con_error(&con)[0])
2653
return put_error(&con, result);
2489
if (drizzle_error(&drizzle)[0])
2490
return put_error(&drizzle);
2494
static void print_help_item(DRIZZLE_ROW *cur, int num_name, int num_cat, char *last_char)
2496
char ccat= (*cur)[num_cat][0];
2497
if (*last_char != ccat)
2499
put_info(ccat == 'Y' ? _("categories:") : _("topics:"), INFO_INFO,0,0);
2502
tee_fprintf(PAGER, " %s\n", (*cur)[num_name]);
2506
static int com_server_help(string *buffer,
2507
const char *line __attribute__((unused)),
2511
const char *server_cmd= buffer->c_str();
2513
DRIZZLE_RES *result;
2516
if (help_arg[0] != '\'')
2518
char *end_arg= strend(help_arg);
2521
while (my_isspace(charset_info,*end_arg))
2525
(void) strxnmov(cmd_buf, sizeof(cmd_buf), "help '", help_arg, "'", NullS);
2526
server_cmd= cmd_buf;
2529
if (!connected && reconnect())
2532
if ((error= drizzle_real_query_for_lazy(server_cmd,(int)strlen(server_cmd))) ||
2533
(error= drizzle_store_result_for_lazy(&result)))
2538
unsigned int num_fields= drizzle_num_fields(result);
2539
uint64_t num_rows= drizzle_num_rows(result);
2540
drizzle_fetch_fields(result);
2541
if (num_fields==3 && num_rows==1)
2543
if (!(cur= drizzle_fetch_row(result)))
2550
tee_fprintf(PAGER, _("Name: \'%s\'\n"), cur[0]);
2551
tee_fprintf(PAGER, _("Description:\n%s"), cur[1]);
2552
if (cur[2] && *((char*)cur[2]))
2553
tee_fprintf(PAGER, _("Examples:\n%s"), cur[2]);
2554
tee_fprintf(PAGER, "\n");
2557
else if (num_fields >= 2 && num_rows)
2562
int num_name= 0, num_cat= 0;
2564
if (num_fields == 2)
2566
put_info(_("Many help items for your request exist."), INFO_INFO,0,0);
2567
put_info(_("To make a more specific request, please type 'help <item>',\nwhere <item> is one of the following"), INFO_INFO,0,0);
2571
else if ((cur= drizzle_fetch_row(result)))
2573
tee_fprintf(PAGER, _("You asked for help about help category: '%s'\n"), cur[0]);
2574
put_info(_("For more information, type 'help <item>', where <item> is one of the following"), INFO_INFO,0,0);
2577
print_help_item(&cur,1,2,&last_char);
2580
while ((cur= drizzle_fetch_row(result)))
2581
print_help_item(&cur,num_name,num_cat,&last_char);
2582
tee_fprintf(PAGER, "\n");
2587
put_info(_("\nNothing found"), INFO_INFO,0,0);
2588
put_info(_("Please try to run 'help contents' for a list of all accessible topics\n"), INFO_INFO,0,0);
2593
drizzle_free_result(result);
2658
com_help(string *buffer, const char *)
2598
com_help(string *buffer __attribute__((unused)),
2599
const char *line __attribute__((unused)))
2660
2601
register int i, j;
2661
char buff[32], *end;
2602
char * help_arg= strchr(line,' '), buff[32], *end;
2605
while (my_isspace(charset_info,*help_arg))
2607
if (*help_arg) return com_server_help(buffer,line,help_arg);
2663
2610
put_info(_("List of all Drizzle commands:"), INFO_INFO,0,0);
2664
2611
if (!named_cmds)
2665
2612
put_info(_("Note that all text commands must be first on line and end with ';'"),INFO_INFO,0,0);
2666
2613
for (i = 0; commands[i].name; i++)
2668
end= strcpy(buff, commands[i].name);
2669
end+= strlen(commands[i].name);
2615
end= stpcpy(buff, commands[i].name);
2670
2616
for (j= (int)strlen(commands[i].name); j < 10; j++)
2671
end= strcpy(end, " ")+1;
2617
end= stpcpy(end, " ");
2672
2618
if (commands[i].func)
2673
2619
tee_fprintf(stdout, "%s(\\%c) %s\n", buff,
2674
2620
commands[i].cmd_char, _(commands[i].doc));
2676
tee_fprintf(stdout, "\n");
2622
if (connected && drizzle_get_server_version(&drizzle) >= 40100)
2623
put_info(_("\nFor server side help, type 'help contents'\n"), INFO_INFO,0,0);
2683
com_clear(string *buffer, const char *)
2629
com_clear(string *buffer,
2630
const char *line __attribute__((unused)))
2685
2632
if (status.add_to_history)
2686
2633
fix_history(buffer);
2777
2748
time_buff[0]= '\0';
2779
2750
/* Every branch must truncate buff . */
2780
if (drizzle_result_column_count(&result) > 0)
2782
if (!quick && drizzle_result_row_count(&result) == 0 &&
2753
if (!drizzle_num_rows(result) && ! quick && !column_types_flag)
2785
strcpy(buff, _("Empty set"));
2755
stpcpy(buff, _("Empty set"));
2790
2760
if (vertical || (auto_vertical_output &&
2791
(terminal_width < get_result_width(&result))))
2792
print_table_data_vertically(&result);
2761
(terminal_width < get_result_width(result))))
2762
print_table_data_vertically(result);
2793
2763
else if (opt_silent && verbose <= 2 && !output_tables)
2794
print_tab_data(&result);
2764
print_tab_data(result);
2796
print_table_data(&result);
2766
print_table_data(result);
2798
2768
ngettext("%ld row in set","%ld rows in set",
2799
(long) drizzle_result_row_count(&result)),
2800
(long) drizzle_result_row_count(&result));
2769
(long) drizzle_num_rows(result)),
2770
(long) drizzle_num_rows(result));
2802
if (drizzle_result_error_code(&result))
2803
error= put_error(&con, &result);
2772
if (drizzle_errno(&drizzle))
2773
error= put_error(&drizzle);
2806
else if (drizzle_result_affected_rows(&result) == ~(uint64_t) 0)
2807
strcpy(buff,_("Query OK"));
2776
else if (drizzle_affected_rows(&drizzle) == ~(uint64_t) 0)
2777
stpcpy(buff,_("Query OK"));
2809
2779
sprintf(buff, ngettext("Query OK, %ld row affected",
2810
2780
"Query OK, %ld rows affected",
2811
(long) drizzle_result_affected_rows(&result)),
2812
(long) drizzle_result_affected_rows(&result));
2781
(long) drizzle_affected_rows(&drizzle)),
2782
(long) drizzle_affected_rows(&drizzle));
2814
pos= strchr(buff, '\0');
2815
if ((warnings= drizzle_result_warning_count(&result)))
2785
if ((warnings= drizzle_warning_count(&drizzle)))
2819
char warnings_buff[20];
2820
memset(warnings_buff,0,20);
2821
sprintf(warnings_buff, "%d", warnings);
2822
strcpy(pos, warnings_buff);
2823
pos+= strlen(warnings_buff);
2824
pos= strcpy(pos, " warning")+8;
2789
pos=int10_to_str(warnings, pos, 10);
2790
pos=stpcpy(pos, " warning");
2825
2791
if (warnings != 1)
2828
strcpy(pos, time_buff);
2794
stpcpy(pos, time_buff);
2829
2795
put_info(buff,INFO_RESULT,0,0);
2830
if (strcmp(drizzle_result_info(&result), ""))
2831
put_info(drizzle_result_info(&result),INFO_RESULT,0,0);
2796
if (drizzle_info(&drizzle))
2797
put_info(drizzle_info(&drizzle),INFO_RESULT,0,0);
2832
2798
put_info("",INFO_RESULT,0,0); // Empty row
2800
if (result && !drizzle_eof(result)) /* Something wrong when using quick */
2801
error= put_error(&drizzle);
2802
else if (unbuffered)
2835
2803
fflush(stdout);
2836
drizzle_result_free(&result);
2838
if (drizzle_con_status(&con) & DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS)
2840
if (drizzle_result_read(&con, &result, &ret) == NULL ||
2841
ret != DRIZZLE_RETURN_OK)
2843
if (ret == DRIZZLE_RETURN_ERROR_CODE)
2845
error_code= drizzle_result_error_code(&result);
2846
drizzle_result_free(&result);
2849
error= put_error(&con, NULL);
2854
} while (drizzle_con_status(&con) & DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS);
2804
drizzle_free_result(result);
2805
} while (!(err= drizzle_next_result(&drizzle)));
2856
error= put_error(&con, NULL);
2807
error= put_error(&drizzle);
2860
2811
/* Show warnings if any or error occured */
2861
2812
if (show_warnings == 1 && (warnings >= 1 || error))
2862
print_warnings(error_code);
2864
2815
if (!error && !status.batch &&
2865
drizzle_con_status(&con) & DRIZZLE_CON_STATUS_DB_DROPPED)
2816
(drizzle.server_status & SERVER_STATUS_DB_DROPPED))
2867
2817
get_current_db();
2870
2819
executing_query= 0;
2871
2820
return error; /* New command follows */
2936
static const char *fieldtype2str(drizzle_column_type_t type)
2884
static const char *fieldtype2str(enum enum_field_types type)
2938
2886
switch (type) {
2939
case DRIZZLE_COLUMN_TYPE_BLOB: return "BLOB";
2940
case DRIZZLE_COLUMN_TYPE_DATE: return "DATE";
2941
case DRIZZLE_COLUMN_TYPE_DATETIME: return "DATETIME";
2942
case DRIZZLE_COLUMN_TYPE_NEWDECIMAL: return "DECIMAL";
2943
case DRIZZLE_COLUMN_TYPE_DOUBLE: return "DOUBLE";
2944
case DRIZZLE_COLUMN_TYPE_ENUM: return "ENUM";
2945
case DRIZZLE_COLUMN_TYPE_LONG: return "LONG";
2946
case DRIZZLE_COLUMN_TYPE_LONGLONG: return "LONGLONG";
2947
case DRIZZLE_COLUMN_TYPE_NULL: return "NULL";
2948
case DRIZZLE_COLUMN_TYPE_TIMESTAMP: return "TIMESTAMP";
2887
case DRIZZLE_TYPE_BLOB: return "BLOB";
2888
case DRIZZLE_TYPE_NEWDATE: return "DATE";
2889
case DRIZZLE_TYPE_DATETIME: return "DATETIME";
2890
case DRIZZLE_TYPE_NEWDECIMAL: return "DECIMAL";
2891
case DRIZZLE_TYPE_DOUBLE: return "DOUBLE";
2892
case DRIZZLE_TYPE_ENUM: return "ENUM";
2893
case DRIZZLE_TYPE_LONG: return "LONG";
2894
case DRIZZLE_TYPE_LONGLONG: return "LONGLONG";
2895
case DRIZZLE_TYPE_NULL: return "NULL";
2896
case DRIZZLE_TYPE_SHORT: return "SHORT";
2897
case DRIZZLE_TYPE_TIME: return "TIME";
2898
case DRIZZLE_TYPE_TIMESTAMP: return "TIMESTAMP";
2899
case DRIZZLE_TYPE_TINY: return "TINY";
2949
2900
default: return "?-unknown-?";
2953
static char *fieldflags2str(uint32_t f) {
2904
static char *fieldflags2str(uint f) {
2954
2905
static char buf[1024];
2957
2908
#define ff2s_check_flag(X) \
2958
if (f & DRIZZLE_COLUMN_FLAGS_ ## X) { s=strcpy(s, # X " ")+strlen(# X " "); \
2959
f &= ~ DRIZZLE_COLUMN_FLAGS_ ## X; }
2909
if (f & X ## _FLAG) { s=stpcpy(s, # X " "); f &= ~ X ## _FLAG; }
2960
2910
ff2s_check_flag(NOT_NULL);
2961
2911
ff2s_check_flag(PRI_KEY);
2962
2912
ff2s_check_flag(UNIQUE_KEY);
3001
2951
"Decimals: %u\n"
3002
2952
"Flags: %s\n\n",
3004
drizzle_column_name(field), drizzle_column_catalog(field),
3005
drizzle_column_db(field), drizzle_column_table(field),
3006
drizzle_column_orig_table(field),
3007
fieldtype2str(drizzle_column_type(field)),
3008
get_charset_name(drizzle_column_charset(field)),
3009
drizzle_column_charset(field), drizzle_column_size(field),
3010
drizzle_column_max_size(field), drizzle_column_decimals(field),
3011
fieldflags2str(drizzle_column_flags(field)));
2954
field->name, field->catalog, field->db, field->table,
2955
field->org_table, fieldtype2str(field->type),
2956
get_charset_name(field->charsetnr), field->charsetnr,
2957
field->length, field->max_length, field->decimals,
2958
fieldflags2str(field->flags));
3013
2960
tee_puts("", PAGER);
3018
print_table_data(drizzle_result_st *result)
2965
print_table_data(DRIZZLE_RES *result)
3021
drizzle_return_t ret;
3022
drizzle_column_st *field;
2968
DRIZZLE_FIELD *field;
3024
2970
string separator;
3026
2972
separator.reserve(256);
3028
num_flag=(bool*) malloc(sizeof(bool)*drizzle_result_column_count(result));
2974
num_flag=(bool*) my_malloc(sizeof(bool)*drizzle_num_fields(result),
3029
2976
if (column_types_flag)
3031
2978
print_field_types(result);
3032
if (!drizzle_result_row_count(result))
2979
if (!drizzle_num_rows(result))
3034
drizzle_column_seek(result,0);
2981
drizzle_field_seek(result,0);
3036
2983
separator.append("+");
3037
while ((field = drizzle_column_next(result)))
2984
while ((field = drizzle_fetch_field(result)))
3039
uint32_t x, length= 0;
3043
uint32_t name_length= strlen(drizzle_column_name(field));
3045
/* Check if the max_byte value is really the maximum in terms
3046
of visual length since multibyte characters can affect the
3047
length of the separator. */
3048
length= charset_info->cset->numcells(charset_info,
3049
drizzle_column_name(field),
3050
drizzle_column_name(field) +
3053
if (name_length == drizzle_column_max_size(field))
3055
if (length < drizzle_column_max_size(field))
3056
drizzle_column_set_max_size(field, length);
3060
length= name_length;
2986
uint32_t length= column_names ? field->name_length : 0;
3065
length=max(length,drizzle_column_size(field));
2988
length=max(length,field->length);
3067
length=max(length,(uint32_t)drizzle_column_max_size(field));
3069
!(drizzle_column_flags(field) & DRIZZLE_COLUMN_FLAGS_NOT_NULL))
2990
length=max(length,field->max_length);
2991
if (length < 4 && !IS_NOT_NULL(field->flags))
3071
2992
// Room for "NULL"
3074
drizzle_column_set_max_size(field, length);
2994
field->max_length=length;
3076
2996
for (x=0; x< (length+2); x++)
3077
2997
separator.append("-");
3078
2998
separator.append("+");
3081
3001
tee_puts((char*) separator.c_str(), PAGER);
3082
3002
if (column_names)
3084
drizzle_column_seek(result,0);
3004
drizzle_field_seek(result,0);
3085
3005
(void) tee_fputs("|", PAGER);
3086
for (uint32_t off=0; (field = drizzle_column_next(result)) ; off++)
3006
for (uint off=0; (field = drizzle_fetch_field(result)) ; off++)
3088
uint32_t name_length= (uint32_t) strlen(drizzle_column_name(field));
3089
uint32_t numcells= charset_info->cset->numcells(charset_info,
3090
drizzle_column_name(field),
3091
drizzle_column_name(field) +
3093
uint32_t display_length= drizzle_column_max_size(field) + name_length -
3008
uint name_length= (uint) strlen(field->name);
3009
uint numcells= charset_info->cset->numcells(charset_info,
3011
field->name + name_length);
3012
uint32_t display_length= field->max_length + name_length - numcells;
3095
3013
tee_fprintf(PAGER, " %-*s |",(int) min(display_length,
3096
3014
MAX_COLUMN_LENGTH),
3097
drizzle_column_name(field));
3098
num_flag[off]= ((drizzle_column_type(field) <= DRIZZLE_COLUMN_TYPE_LONGLONG) ||
3099
(drizzle_column_type(field) == DRIZZLE_COLUMN_TYPE_NEWDECIMAL));
3016
num_flag[off]= IS_NUM(field->type);
3101
3018
(void) tee_fputs("\n", PAGER);
3102
3019
tee_puts((char*) separator.c_str(), PAGER);
3022
while ((cur= drizzle_fetch_row(result)))
3109
cur= drizzle_row_buffer(result, &ret);
3110
if (ret != DRIZZLE_RETURN_OK)
3112
(void)put_error(&con, result);
3117
cur= drizzle_row_next(result);
3119
if (cur == NULL || interrupted_query)
3024
if (interrupted_query)
3122
size_t *lengths= drizzle_row_field_sizes(result);
3026
uint32_t *lengths= drizzle_fetch_lengths(result);
3123
3027
(void) tee_fputs("| ", PAGER);
3124
drizzle_column_seek(result, 0);
3125
for (uint32_t off= 0; off < drizzle_result_column_count(result); off++)
3028
drizzle_field_seek(result, 0);
3029
for (uint off= 0; off < drizzle_num_fields(result); off++)
3127
3031
const char *buffer;
3128
uint32_t data_length;
3129
uint32_t field_max_length;
3130
uint32_t visible_length;
3131
uint32_t extra_padding;
3033
uint field_max_length;
3034
uint visible_length;
3133
3037
if (cur[off] == NULL)
3268
print_table_data_vertically(drizzle_result_st *result)
3167
print_table_data_vertically(DRIZZLE_RES *result)
3271
drizzle_return_t ret;
3272
uint32_t max_length=0;
3273
drizzle_column_st *field;
3171
DRIZZLE_FIELD *field;
3275
while ((field = drizzle_column_next(result)))
3173
while ((field = drizzle_fetch_field(result)))
3277
uint32_t length= strlen(drizzle_column_name(field));
3175
uint length= field->name_length;
3278
3176
if (length > max_length)
3279
3177
max_length= length;
3280
drizzle_column_set_max_size(field, length);
3178
field->max_length=length;
3283
for (uint32_t row_count=1;; row_count++)
3181
drizzle_field_seek(result,0);
3182
for (uint row_count=1; (cur= drizzle_fetch_row(result)); row_count++)
3287
cur= drizzle_row_buffer(result, &ret);
3288
if (ret != DRIZZLE_RETURN_OK)
3290
(void)put_error(&con, result);
3295
cur= drizzle_row_next(result);
3297
if (cur == NULL || interrupted_query)
3184
if (interrupted_query)
3299
drizzle_column_seek(result,0);
3186
drizzle_field_seek(result,0);
3300
3187
tee_fprintf(PAGER,
3301
3188
"*************************** %d. row ***************************\n", row_count);
3302
for (uint32_t off=0; off < drizzle_result_column_count(result); off++)
3189
for (uint off=0; off < drizzle_num_fields(result); off++)
3304
field= drizzle_column_next(result);
3305
tee_fprintf(PAGER, "%*s: ",(int) max_length,drizzle_column_name(field));
3191
field= drizzle_fetch_field(result);
3192
tee_fprintf(PAGER, "%*s: ",(int) max_length,field->name);
3306
3193
tee_fprintf(PAGER, "%s\n",cur[off] ? (char*) cur[off] : "NULL");
3309
drizzle_row_free(result, cur);
3314
3199
/* print_warnings should be called right after executing a statement */
3316
static void print_warnings(uint32_t error_code)
3201
static void print_warnings()
3319
drizzle_result_st result;
3204
DRIZZLE_RES *result;
3321
3206
uint64_t num_rows;
3322
uint32_t new_code= 0;
3208
/* Save current error before calling "show warnings" */
3209
uint error= drizzle_errno(&drizzle);
3324
3211
/* Get the warnings */
3325
3212
query= "show warnings";
3326
drizzleclient_real_query_for_lazy(query, strlen(query),&result,&new_code);
3327
drizzleclient_store_result_for_lazy(&result);
3213
drizzle_real_query_for_lazy(query, strlen(query));
3214
drizzle_store_result_for_lazy(&result);
3329
3216
/* Bail out when no warnings */
3330
if (!(num_rows= drizzle_result_row_count(&result)))
3217
if (!(num_rows= drizzle_num_rows(result)))
3333
cur= drizzle_row_next(&result);
3220
cur= drizzle_fetch_row(result);
3336
3223
Don't print a duplicate of the current error. It is possible for SHOW
3367
3251
if (opt_raw_data)
3368
3252
tee_fputs(pos, PAGER);
3369
3253
else for (const char *end=pos+length ; pos != end ; pos++)
3372
if (use_mb(charset_info) &&
3373
(l = my_ismbchar(charset_info, pos, end)))
3376
tee_putc(*pos++, PAGER);
3381
tee_fputs("\\0", PAGER); // This makes everything hard
3382
else if (*pos == '\t')
3383
tee_fputs("\\t", PAGER); // This would destroy tab format
3384
else if (*pos == '\n')
3385
tee_fputs("\\n", PAGER); // This too
3386
else if (*pos == '\\')
3387
tee_fputs("\\\\", PAGER);
3389
tee_putc(*pos, PAGER);
3257
if (use_mb(charset_info) &&
3258
(l = my_ismbchar(charset_info, pos, end)))
3261
tee_putc(*pos++, PAGER);
3267
tee_fputs("\\0", PAGER); // This makes everything hard
3268
else if (*pos == '\t')
3269
tee_fputs("\\t", PAGER); // This would destroy tab format
3270
else if (*pos == '\n')
3271
tee_fputs("\\n", PAGER); // This too
3272
else if (*pos == '\\')
3273
tee_fputs("\\\\", PAGER);
3275
tee_putc(*pos, PAGER);
3396
print_tab_data(drizzle_result_st *result)
3282
print_tab_data(DRIZZLE_RES *result)
3399
drizzle_return_t ret;
3400
drizzle_column_st *field;
3285
DRIZZLE_FIELD *field;
3403
3288
if (opt_silent < 2 && column_names)
3406
while ((field = drizzle_column_next(result)))
3291
while ((field = drizzle_fetch_field(result)))
3409
3294
(void) tee_fputs("\t", PAGER);
3410
(void) tee_fputs(drizzle_column_name(field), PAGER);
3295
(void) tee_fputs(field->name, PAGER);
3412
3297
(void) tee_fputs("\n", PAGER);
3299
while ((cur = drizzle_fetch_row(result)))
3418
cur= drizzle_row_buffer(result, &ret);
3419
if (ret != DRIZZLE_RETURN_OK)
3421
(void)put_error(&con, result);
3426
cur= drizzle_row_next(result);
3431
lengths= drizzle_row_field_sizes(result);
3301
lengths= drizzle_fetch_lengths(result);
3432
3302
safe_put_field(cur[0],lengths[0]);
3433
for (uint32_t off=1 ; off < drizzle_result_column_count(result); off++)
3303
for (uint off=1 ; off < drizzle_num_fields(result); off++)
3435
3305
(void) tee_fputs("\t", PAGER);
3436
3306
safe_put_field(cur[off], lengths[off]);
3438
3308
(void) tee_fputs("\n", PAGER);
3440
drizzle_row_free(result, cur);
3445
com_tee(string *, const char *line )
3313
com_tee(string *buffer __attribute__((unused)), const char *line )
3447
char file_name[FN_REFLEN], *end;
3315
char file_name[FN_REFLEN], *end, *param;
3450
3317
if (status.batch)
3896
3750
valid_arg= ptr != start;
3897
return valid_arg ? start : NULL;
3751
return valid_arg ? start : NullS;
3902
3756
sql_connect(char *host,char *database,char *user,char *password,
3905
drizzle_return_t ret;
3910
drizzle_con_free(&con);
3911
drizzle_free(&drizzle);
3762
drizzle_close(&drizzle);
3913
3764
drizzle_create(&drizzle);
3914
if (drizzle_con_add_tcp(&drizzle, &con, host, opt_drizzle_port, user,
3915
password, database, DRIZZLE_CON_NONE) == NULL)
3917
(void) put_error(&con, NULL);
3918
(void) fflush(stdout);
3922
/* XXX add this back in
3923
3765
if (opt_connect_timeout)
3925
uint32_t timeout=opt_connect_timeout;
3926
drizzleclient_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3767
uint timeout=opt_connect_timeout;
3768
drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3927
3769
(char*) &timeout);
3931
/* XXX Do we need this?
3772
drizzle_options(&drizzle,DRIZZLE_OPT_COMPRESS,NullS);
3773
if (opt_secure_auth)
3774
drizzle_options(&drizzle, DRIZZLE_SECURE_AUTH, (char *) &opt_secure_auth);
3775
if (using_opt_local_infile)
3776
drizzle_options(&drizzle,DRIZZLE_OPT_LOCAL_INFILE, (char*) &opt_local_infile);
3777
drizzle_options(&drizzle,DRIZZLE_OPT_PROTOCOL,(char*)&opt_protocol);
3932
3778
if (safe_updates)
3934
3780
char init_command[100];
3935
3781
sprintf(init_command,
3936
3782
"SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=%"PRIu32
3937
",MAX_JOIN_SIZE=%"PRIu32,
3783
",SQL_MAX_JOIN_SIZE=%"PRIu32,
3938
3784
select_limit, max_join_size);
3939
drizzleclient_options(&drizzle, DRIZZLE_INIT_COMMAND, init_command);
3785
drizzle_options(&drizzle, DRIZZLE_INIT_COMMAND, init_command);
3942
if ((ret= drizzle_con_connect(&con)) != DRIZZLE_RETURN_OK)
3787
if (default_charset_used)
3788
drizzle_options(&drizzle, DRIZZLE_SET_CHARSET_NAME, default_charset);
3789
if (!drizzle_connect(&drizzle, host, user, password,
3790
database, opt_drizzle_port, opt_drizzle_unix_port,
3791
connect_flag | CLIENT_MULTI_STATEMENTS))
3944
if (!silent || (ret != DRIZZLE_RETURN_GETADDRINFO &&
3945
ret != DRIZZLE_RETURN_COULD_NOT_CONNECT))
3794
(drizzle_errno(&drizzle) != CR_CONN_HOST_ERROR &&
3795
drizzle_errno(&drizzle) != CR_CONNECTION_ERROR))
3947
(void) put_error(&con, NULL);
3797
(void) put_error(&drizzle);
3948
3798
(void) fflush(stdout);
3949
3799
return ignore_errors ? -1 : 1; // Abort
3951
3801
return -1; // Retryable
3804
drizzle.reconnect= debug_info_flag; // We want to know if this happens
3955
3805
build_completion_hash(opt_rehash, 1);
3961
com_status(string *, const char *)
3811
com_status(string *buffer __attribute__((unused)),
3812
const char *line __attribute__((unused)))
3967
drizzle_result_st result;
3968
drizzle_return_t ret;
3816
DRIZZLE_RES *result;
3970
3818
tee_puts("--------------", stdout);
3971
3819
usage(1); /* Print version */
3974
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_con_thread_id(&con));
3822
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_thread_id(&drizzle));
3976
3824
Don't remove "limit 1",
3977
3825
it is protection againts SQL_SELECT_LIMIT=0
3979
if (drizzle_query_str(&con,&result,"select DATABASE(), USER() limit 1",
3980
&ret) != NULL && ret == DRIZZLE_RETURN_OK &&
3981
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3827
if (!drizzle_query(&drizzle,"select DATABASE(), USER() limit 1") &&
3828
(result=drizzle_use_result(&drizzle)))
3983
drizzle_row_t cur=drizzle_row_next(&result);
3830
DRIZZLE_ROW cur=drizzle_fetch_row(result);
3986
3833
tee_fprintf(stdout, "Current database:\t%s\n", cur[0] ? cur[0] : "");
3987
3834
tee_fprintf(stdout, "Current user:\t\t%s\n", cur[1]);
3989
drizzle_result_free(&result);
3836
drizzle_free_result(result);
3991
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
3992
drizzle_result_free(&result);
3993
3838
tee_puts("SSL:\t\t\tNot in use", stdout);
4008
3853
tee_fprintf(stdout, "Current pager:\t\t%s\n", pager);
4009
3854
tee_fprintf(stdout, "Using outfile:\t\t'%s'\n", opt_outfile ? outfile : "");
4010
3855
tee_fprintf(stdout, "Using delimiter:\t%s\n", delimiter);
4011
tee_fprintf(stdout, "Server version:\t\t%s\n", server_version_string(&con));
4012
tee_fprintf(stdout, "Protocol version:\t%d\n", drizzle_con_protocol_version(&con));
4013
tee_fprintf(stdout, "Connection:\t\t%s\n", drizzle_con_host(&con));
4014
/* XXX need to save this from result
4015
if ((id= drizzleclient_insert_id(&drizzle)))
3856
tee_fprintf(stdout, "Server version:\t\t%s\n", server_version_string(&drizzle));
3857
tee_fprintf(stdout, "Protocol version:\t%d\n", drizzle_get_proto_info(&drizzle));
3858
tee_fprintf(stdout, "Connection:\t\t%s\n", drizzle_get_host_info(&drizzle));
3859
if ((id= drizzle_insert_id(&drizzle)))
4016
3860
tee_fprintf(stdout, "Insert id:\t\t%s\n", llstr(id, buff));
4019
if (strcmp(drizzle_con_uds(&con), ""))
4020
tee_fprintf(stdout, "UNIX socket:\t\t%s\n", drizzle_con_uds(&con));
4022
tee_fprintf(stdout, "TCP port:\t\t%d\n", drizzle_con_port(&con));
3862
/* "limit 1" is protection against SQL_SELECT_LIMIT=0 */
3863
if (!drizzle_query(&drizzle,"select @@character_set_client, @@character_set_connection, @@character_set_server, @@character_set_database limit 1") &&
3864
(result=drizzle_use_result(&drizzle)))
3866
DRIZZLE_ROW cur=drizzle_fetch_row(result);
3869
tee_fprintf(stdout, "Server characterset:\t%s\n", cur[2] ? cur[2] : "");
3870
tee_fprintf(stdout, "Db characterset:\t%s\n", cur[3] ? cur[3] : "");
3871
tee_fprintf(stdout, "Client characterset:\t%s\n", cur[0] ? cur[0] : "");
3872
tee_fprintf(stdout, "Conn. characterset:\t%s\n", cur[1] ? cur[1] : "");
3874
drizzle_free_result(result);
3878
/* Probably pre-4.1 server */
3879
tee_fprintf(stdout, "Client characterset:\t%s\n", charset_info->csname);
3880
tee_fprintf(stdout, "Server characterset:\t%s\n", drizzle.charset->csname);
3883
if (strstr(drizzle_get_host_info(&drizzle),"TCP/IP") || ! drizzle.unix_socket)
3884
tee_fprintf(stdout, "TCP port:\t\t%d\n", drizzle.port);
3886
tee_fprintf(stdout, "UNIX socket:\t\t%s\n", drizzle.unix_socket);
3887
if (drizzle.net.compress)
3888
tee_fprintf(stdout, "Protocol:\t\tCompressed\n");
4024
3890
if (safe_updates)
4040
3906
static const char *
4041
server_version_string(drizzle_con_st *local_con)
3907
server_version_string(DRIZZLE *con)
4043
static string buf("");
4044
static bool server_version_string_reserved= false;
3909
static char buf[MAX_SERVER_VERSION_LENGTH] = "";
4046
if (!server_version_string_reserved)
4048
buf.reserve(MAX_SERVER_VERSION_LENGTH);
4049
server_version_string_reserved= true;
4051
3911
/* Only one thread calls this, so no synchronization is needed */
4052
3912
if (buf[0] == '\0')
4054
drizzle_result_st result;
4055
drizzle_return_t ret;
3915
DRIZZLE_RES *result;
4057
buf.append(drizzle_con_server_version(local_con));
3917
bufp= stpncpy(buf, drizzle_get_server_info(con), sizeof buf);
4059
3919
/* "limit 1" is protection against SQL_SELECT_LIMIT=0 */
4060
(void)drizzle_query_str(local_con, &result,
4061
"select @@version_comment limit 1", &ret);
4062
if (ret == DRIZZLE_RETURN_OK &&
4063
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3920
if (!drizzle_query(con, "select @@version_comment limit 1") &&
3921
(result = drizzle_use_result(con)))
4065
drizzle_row_t cur = drizzle_row_next(&result);
3923
DRIZZLE_ROW cur = drizzle_fetch_row(result);
4066
3924
if (cur && cur[0])
3926
bufp = strxnmov(bufp, sizeof buf - (bufp - buf), " ", cur[0], NullS);
4071
drizzle_result_free(&result);
3928
drizzle_free_result(result);
4073
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
4074
drizzle_result_free(&result);
3931
/* str*nmov doesn't guarantee NUL-termination */
3932
if (bufp == buf + sizeof buf)
3933
buf[sizeof buf - 1] = '\0';
4081
put_info(const char *str,INFO_TYPE info_type, uint32_t error, const char *sqlstate)
3940
put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
4083
3942
FILE *file= (info_type == INFO_ERROR ? stderr : stdout);
4084
3943
static int inited=0;
4477
4318
static void add_int_to_prompt(int toadd)
4479
ostringstream buffer;
4481
processed_prompt->append(buffer.str().c_str());
4321
int10_to_str(toadd, buffer, 10);
4322
processed_prompt->append(buffer);
4484
4325
static void init_username()
4487
free(full_username);
4488
free(part_username);
4327
my_free(full_username,MYF(MY_ALLOW_ZERO_PTR));
4328
my_free(part_username,MYF(MY_ALLOW_ZERO_PTR));
4490
drizzle_result_st *result;
4491
if (!drizzleclient_query(&drizzle,"select USER()") &&
4492
(result=drizzleclient_use_result(&drizzle)))
4330
DRIZZLE_RES *result;
4331
if (!drizzle_query(&drizzle,"select USER()") &&
4332
(result=drizzle_use_result(&drizzle)))
4494
drizzle_row_t cur=drizzleclient_fetch_row(result);
4334
DRIZZLE_ROW cur=drizzle_fetch_row(result);
4495
4335
full_username= strdup(cur[0]);
4496
4336
part_username= strdup(strtok(cur[0],"@"));
4497
(void) drizzleclient_fetch_row(result); // Read eof
4337
(void) drizzle_fetch_row(result); // Read eof
4502
static int com_prompt(string *, const char *line)
4341
static int com_prompt(string *buffer __attribute__((unused)),
4504
const char *ptr=strchr(line, ' ');
4344
char *ptr=strchr(line, ' ');
4346
my_free(current_prompt, MYF(MY_ALLOW_ZERO_PTR));
4347
current_prompt= strdup(ptr ? ptr+1 : default_prompt);
4506
4349
tee_fprintf(stdout, "Returning to default PROMPT of %s\n",
4507
4350
default_prompt);
4509
char * tmpptr= strdup(ptr ? ptr+1 : default_prompt);
4511
tee_fprintf(stdout, "Memory allocation error. Not changing prompt\n");
4514
free(current_prompt);
4515
current_prompt= tmpptr;
4516
4352
tee_fprintf(stdout, "PROMPT set to '%s'\n", current_prompt);
4522
4357
strcont(str, set) if str contanies any character in the string set.
4523
The result is the position of the first found character in str, or NULL
4358
The result is the position of the first found character in str, or NullS
4524
4359
if there isn't anything found.