141
148
uint32_t query_start_line;
143
LINE_BUFFER *line_buff;
150
LineBuffer *line_buff;
144
151
bool batch,add_to_history;
155
static map<string, string>::iterator completion_iter;
156
static map<string, string>::iterator completion_end;
157
static map<string, string> completion_map;
158
static string completion_string;
149
160
static char **defaults_argv;
151
162
enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
152
163
typedef enum enum_info_type INFO_TYPE;
154
static DRIZZLE drizzle; /* The connection */
155
static bool ignore_errors=0,quick=0,
156
connected=0,opt_raw_data=0,unbuffered=0,output_tables=0,
157
opt_rehash=1,skip_updates=0,safe_updates=0,one_database=0,
158
opt_compress=0, using_opt_local_infile=0,
159
vertical=0, line_numbers=1, column_names=1,
160
opt_nopager=1, opt_outfile=0, named_cmds= 0,
161
tty_password= 0, opt_nobeep=0, opt_reconnect=1,
162
default_charset_used= 0, opt_secure_auth= 0,
163
default_pager_set= 0, opt_sigint_ignore= 0,
164
auto_vertical_output= 0,
165
show_warnings= 0, executing_query= 0, interrupted_query= 0;
165
static drizzle_st drizzle; /* The library handle */
166
static drizzle_con_st con; /* The connection */
167
static bool ignore_errors= false, quick= false,
168
connected= false, opt_raw_data= false, unbuffered= false,
169
output_tables= false, opt_rehash= true, skip_updates= false,
170
safe_updates= false, one_database= false,
171
opt_compress= false, opt_shutdown= false, opt_ping= false,
172
vertical= false, line_numbers= true, column_names= true,
173
opt_nopager= true, opt_outfile= false, named_cmds= false,
174
tty_password= false, opt_nobeep= false, opt_reconnect= true,
175
default_charset_used= false, opt_secure_auth= false,
176
default_pager_set= false, opt_sigint_ignore= false,
177
auto_vertical_output= false,
178
show_warnings= false, executing_query= false, interrupted_query= false;
179
static uint32_t show_progress_size= 0;
166
180
static bool debug_info_flag, debug_check_flag;
167
181
static bool column_types_flag;
168
static bool preserve_comments= 0;
169
static uint32_t opt_max_allowed_packet, opt_net_buffer_length;
170
static int verbose=0,opt_silent=0,opt_drizzle_port=0, opt_local_infile=0;
171
static uint my_end_arg;
172
static char * opt_drizzle_unix_port=0;
173
static int connect_flag=CLIENT_INTERACTIVE;
174
static char *current_host,*current_db,*current_user=0,*opt_password=0,
175
*delimiter_str= 0,* current_prompt= 0;
182
static bool preserve_comments= false;
183
static uint32_t opt_max_input_line, opt_drizzle_port= 0;
184
static int verbose= 0, opt_silent= 0, opt_local_infile= 0;
185
static uint32_t my_end_arg;
186
static char * opt_drizzle_unix_port= NULL;
187
static drizzle_capabilities_t connect_flag= DRIZZLE_CAPABILITIES_NONE;
188
static char *current_host, *current_db, *current_user= NULL,
189
*opt_password= NULL, *delimiter_str= NULL, *current_prompt= NULL;
176
190
static char *histfile;
177
191
static char *histfile_tmp;
178
192
static string *glob_buffer;
179
193
static string *processed_prompt= NULL;
180
194
static char *default_prompt= NULL;
181
static char *full_username=0,*part_username=0;
195
static char *full_username= NULL,*part_username= NULL;
182
196
static STATUS status;
183
197
static uint32_t select_limit;
184
198
static uint32_t max_join_size;
185
199
static uint32_t opt_connect_timeout= 0;
186
static char drizzle_charsets_dir[FN_REFLEN+1];
187
200
// TODO: Need to i18n these
188
static const char *day_names[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
189
static const char *month_names[]={"Jan","Feb","Mar","Apr","May","Jun","Jul",
201
static const char *day_names[]= {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
202
static const char *month_names[]= {"Jan","Feb","Mar","Apr","May","Jun","Jul",
190
203
"Aug","Sep","Oct","Nov","Dec"};
191
204
static char default_pager[FN_REFLEN];
192
205
static char pager[FN_REFLEN], outfile[FN_REFLEN];
193
206
static FILE *PAGER, *OUTFILE;
194
static MEM_ROOT hash_mem_root;
195
static uint prompt_counter;
207
static uint32_t prompt_counter;
196
208
static char delimiter[16]= DEFAULT_DELIMITER;
197
static uint delimiter_length= 1;
209
static uint32_t delimiter_length= 1;
198
210
unsigned short terminal_width= 80;
200
212
static const CHARSET_INFO *charset_info= &my_charset_utf8_general_ci;
202
int drizzle_real_query_for_lazy(const char *buf, int length);
203
int drizzle_store_result_for_lazy(DRIZZLE_RES **result);
214
int drizzleclient_real_query_for_lazy(const char *buf, int length,
215
drizzle_result_st *result,
216
uint32_t *error_code);
217
int drizzleclient_store_result_for_lazy(drizzle_result_st *result);
206
220
void tee_fprintf(FILE *file, const char *fmt, ...);
258
272
static COMMANDS commands[] = {
259
{ "?", '?', com_help, 1, N_("Synonym for `help'.") },
273
{ "?", '?', com_help, 0, N_("Synonym for `help'.") },
260
274
{ "clear", 'c', com_clear, 0, N_("Clear command.")},
261
275
{ "connect",'r', com_connect,1,
262
N_("Reconnect to the server. Optional arguments are db and host." }),
276
N_("Reconnect to the server. Optional arguments are db and host.")},
263
277
{ "delimiter", 'd', com_delimiter, 1,
264
278
N_("Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.") },
265
279
{ "ego", 'G', com_ego, 0,
266
280
N_("Send command to drizzle server, display result vertically.")},
267
281
{ "exit", 'q', com_quit, 0, N_("Exit drizzle. Same as quit.")},
268
282
{ "go", 'g', com_go, 0, N_("Send command to drizzle server.") },
269
{ "help", 'h', com_help, 1, N_("Display this help.") },
283
{ "help", 'h', com_help, 0, N_("Display this help.") },
270
284
{ "nopager",'n', com_nopager,0, N_("Disable pager, print to stdout.") },
271
285
{ "notee", 't', com_notee, 0, N_("Don't write into outfile.") },
272
286
{ "pager", 'P', com_pager, 1,
789
793
{ "ATAN2", 0, 0, 0, ""},
790
794
{ "BENCHMARK", 0, 0, 0, ""},
791
795
{ "BIN", 0, 0, 0, ""},
792
{ "BIT_COUNT", 0, 0, 0, ""},
793
796
{ "BIT_OR", 0, 0, 0, ""},
794
797
{ "BIT_AND", 0, 0, 0, ""},
795
798
{ "BIT_XOR", 0, 0, 0, ""},
796
799
{ "CAST", 0, 0, 0, ""},
797
800
{ "CEIL", 0, 0, 0, ""},
798
801
{ "CEILING", 0, 0, 0, ""},
799
{ "BIT_LENGTH", 0, 0, 0, ""},
800
802
{ "CENTROID", 0, 0, 0, ""},
801
803
{ "CHAR_LENGTH", 0, 0, 0, ""},
802
804
{ "CHARACTER_LENGTH", 0, 0, 0, ""},
963
962
{ "SUBSTR", 0, 0, 0, ""},
964
963
{ "SUBSTRING", 0, 0, 0, ""},
965
964
{ "SUBSTRING_INDEX", 0, 0, 0, ""},
966
{ "SUBTIME", 0, 0, 0, ""},
967
965
{ "SUM", 0, 0, 0, ""},
968
966
{ "SYSDATE", 0, 0, 0, ""},
969
967
{ "SYSTEM_USER", 0, 0, 0, ""},
970
968
{ "TAN", 0, 0, 0, ""},
971
969
{ "TIME_FORMAT", 0, 0, 0, ""},
972
{ "TIME_TO_SEC", 0, 0, 0, ""},
973
{ "TIMEDIFF", 0, 0, 0, ""},
974
970
{ "TO_DAYS", 0, 0, 0, ""},
975
971
{ "TOUCHES", 0, 0, 0, ""},
976
972
{ "TRIM", 0, 0, 0, ""},
1007
1003
static bool add_line(string *buffer,char *line,char *in_string,
1008
1004
bool *ml_comment);
1009
1005
static void remove_cntrl(string *buffer);
1010
static void print_table_data(DRIZZLE_RES *result);
1011
static void print_tab_data(DRIZZLE_RES *result);
1012
static void print_table_data_vertically(DRIZZLE_RES *result);
1013
static void print_warnings(void);
1006
static void print_table_data(drizzle_result_st *result);
1007
static void print_tab_data(drizzle_result_st *result);
1008
static void print_table_data_vertically(drizzle_result_st *result);
1009
static void print_warnings(uint32_t error_code);
1014
1010
static uint32_t start_timer(void);
1015
1011
static void end_timer(uint32_t start_time,char *buff);
1016
1012
static void drizzle_end_timer(uint32_t start_time,char *buff);
1017
1013
static void nice_time(double sec,char *buff,bool part_second);
1018
extern RETSIGTYPE drizzle_end(int sig);
1019
extern RETSIGTYPE handle_sigint(int sig);
1014
extern "C" void drizzle_end(int sig);
1015
extern "C" void handle_sigint(int sig);
1020
1016
#if defined(HAVE_TERMIOS_H) && defined(GWINSZ_IN_SYS_IOCTL)
1021
static RETSIGTYPE window_resize(int sig);
1017
static void window_resize(int sig);
1020
static inline int is_prefix(const char *s, const char *t)
1023
if (*s++ != *t++) return 0;
1024
return 1; /* WRONG */
1028
Shutdown the server that we are currently connected to.
1035
static bool server_shutdown(void)
1037
drizzle_result_st result;
1038
drizzle_return_t ret;
1042
printf("shutting down drizzled");
1043
if (opt_drizzle_port > 0)
1044
printf(" on port %d", opt_drizzle_port);
1048
if (drizzle_shutdown(&con, &result, DRIZZLE_SHUTDOWN_DEFAULT,
1049
&ret) == NULL || ret != DRIZZLE_RETURN_OK)
1051
if (ret == DRIZZLE_RETURN_ERROR_CODE)
1053
fprintf(stderr, "shutdown failed; error: '%s'",
1054
drizzle_result_error(&result));
1055
drizzle_result_free(&result);
1059
fprintf(stderr, "shutdown failed; error: '%s'",
1060
drizzle_con_error(&con));
1065
drizzle_result_free(&result);
1074
Ping the server that we are currently connected to.
1081
static bool server_ping(void)
1083
drizzle_result_st result;
1084
drizzle_return_t ret;
1086
if (drizzle_ping(&con, &result, &ret) != NULL && ret == DRIZZLE_RETURN_OK)
1089
printf("drizzled is alive\n");
1093
if (ret == DRIZZLE_RETURN_ERROR_CODE)
1095
fprintf(stderr, "ping failed; error: '%s'",
1096
drizzle_result_error(&result));
1097
drizzle_result_free(&result);
1101
fprintf(stderr, "drizzled won't answer to ping, error: '%s'",
1102
drizzle_con_error(&con));
1106
drizzle_result_free(&result);
1111
Execute command(s) specified by the user.
1113
@param error error status of command execution.
1114
If an error had occurred, this variable will be set
1115
to 1 whereas on success, it shall be set to 0. This
1116
value will be supplied to the exit() function used
1120
false no commands were executed
1122
true at least one command was executed
1124
static bool execute_commands(int *error)
1126
bool executed= false;
1131
if (server_ping() == false)
1138
if (server_shutdown() == false)
1024
1145
int main(int argc,char *argv[])
1028
1147
#if defined(ENABLE_NLS)
1029
1148
# if defined(HAVE_LOCALE_H)
1030
1149
setlocale(LC_ALL, "");
1224
1369
If query is in process, kill query
1225
1370
no query in process, terminate like previous behavior
1227
RETSIGTYPE handle_sigint(int sig)
1373
void handle_sigint(int sig)
1229
1375
char kill_buffer[40];
1230
DRIZZLE *kill_drizzle= NULL;
1376
drizzle_con_st kill_drizzle;
1377
drizzle_result_st res;
1378
drizzle_return_t ret;
1232
1380
/* terminate if no query being executed, or we already tried interrupting */
1233
1381
if (!executing_query || interrupted_query) {
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))
1385
if (drizzle_con_add_tcp(&drizzle, &kill_drizzle, current_host,
1386
opt_drizzle_port, current_user, opt_password, NULL,
1387
DRIZZLE_CON_NONE) == NULL)
1244
1392
/* kill_buffer is always big enough because max length of %lu is 15 */
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);
1393
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %u",
1394
drizzle_con_thread_id(&con));
1396
if (drizzle_query_str(&kill_drizzle, &res, kill_buffer, &ret) != NULL)
1397
drizzle_result_free(&res);
1399
drizzle_con_free(&kill_drizzle);
1248
1400
tee_fprintf(stdout, _("Query aborted by Ctrl+C\n"));
1250
1402
interrupted_query= 1;
1277
1429
(char**) &opt_rehash, (char**) &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
1279
1431
{"no-auto-rehash", 'A',
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."),
1432
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."),
1281
1433
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1282
1434
{"auto-vertical-output", OPT_AUTO_VERTICAL_OUTPUT,
1283
1435
N_("Automatically switch to vertical output mode if the result is wider than the terminal width."),
1284
1436
(char**) &auto_vertical_output, (char**) &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1286
1438
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},
1290
1439
{"column-type-info", OPT_COLUMN_TYPES, N_("Display column type information."),
1291
1440
(char**) &column_types_flag, (char**) &column_types_flag,
1292
1441
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1360
1509
{"no-pager", OPT_NOPAGER,
1361
1510
N_("Disable pager and print to stdout. See interactive help (\\h) also. WARNING: option deprecated; use --disable-pager instead."),
1362
1511
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1364
1513
N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
1365
1514
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
1366
{"port", 'P', N_("Port number to use for connection or 0 for default to, in order of preference, my.cnf, $DRIZZLE_TCP_PORT, ")
1515
{"port", 'p', N_("Port number to use for connection or 0 for default to, in order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, ")
1367
1516
N_("built-in default") " (" STRINGIFY_ARG(DRIZZLE_PORT) ").",
1368
(char**) &opt_drizzle_port,
1369
(char**) &opt_drizzle_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1517
0, 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1370
1518
{"prompt", OPT_PROMPT, N_("Set the drizzle prompt to this value."),
1371
1519
(char**) ¤t_prompt, (char**) ¤t_prompt, 0, GET_STR_ALLOC,
1372
1520
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},
1376
1522
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."),
1377
1523
(char**) &quick, (char**) &quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1411
1557
{"connect_timeout", OPT_CONNECT_TIMEOUT,
1412
1558
N_("Number of seconds before connection timeout."),
1413
1559
(char**) &opt_connect_timeout,
1414
(char**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 3600*12, 0,
1560
(char**) &opt_connect_timeout, 0, GET_UINT32, REQUIRED_ARG, 0, 0, 3600*12, 0,
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,
1562
{"max_input_line", OPT_MAX_INPUT_LINE,
1563
N_("Max length of input line"),
1564
(char**) &opt_max_input_line, (char**) &opt_max_input_line, 0,
1565
GET_UINT32, REQUIRED_ARG, 16 *1024L*1024L, 4096,
1420
1566
(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},
1425
1567
{"select_limit", OPT_SELECT_LIMIT,
1426
1568
N_("Automatic limit for SELECT when using --safe-updates"),
1427
1569
(char**) &select_limit,
1428
(char**) &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ULONG_MAX,
1570
(char**) &select_limit, 0, GET_UINT32, REQUIRED_ARG, 1000L, 1, ULONG_MAX,
1430
1572
{"max_join_size", OPT_MAX_JOIN_SIZE,
1431
1573
N_("Automatic limit for rows in a join when using --safe-updates"),
1432
1574
(char**) &max_join_size,
1433
(char**) &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, 1, ULONG_MAX,
1575
(char**) &max_join_size, 0, GET_UINT32, REQUIRED_ARG, 1000000L, 1, ULONG_MAX,
1435
1577
{"secure-auth", OPT_SECURE_AUTH, N_("Refuse client connecting to server if it uses old (pre-4.1.1) protocol"), (char**) &opt_secure_auth,
1436
1578
(char**) &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1437
1579
{"show-warnings", OPT_SHOW_WARNINGS, N_("Show warnings after every statement."),
1438
1580
(char**) &show_warnings, (char**) &show_warnings, 0, GET_BOOL, NO_ARG,
1439
1581
0, 0, 0, 0, 0, 0},
1582
{"show-progress-size", OPT_SHOW_PROGRESS_SIZE, N_("Number of lines before each import progress report."),
1583
(char**) &show_progress_size, (char**) &show_progress_size, 0, GET_UINT32, REQUIRED_ARG,
1585
{"ping", OPT_PING, N_("Ping the server to check if it's alive."),
1586
(char**) &opt_ping, (char**) &opt_ping, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1440
1587
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
1446
1593
const char* readline= "readline";
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,
1595
printf(_("%s Ver %s Distrib %s, for %s-%s (%s) using %s %s\n"),
1596
my_progname, VER.c_str(), drizzle_version(),
1597
HOST_VENDOR, HOST_OS, HOST_CPU,
1451
1598
readline, rl_library_version);
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"));
1602
printf(_("Copyright (C) 2008 Sun Microsystems\n"
1603
"This software comes with ABSOLUTELY NO WARRANTY. "
1604
"This is free software,\n"
1605
"and you are welcome to modify and redistribute it "
1606
"under the GPL license\n"));
1459
1607
printf(_("Usage: %s [OPTIONS] [database]\n"), my_progname);
1460
1608
my_print_help(my_long_options);
1461
print_defaults("my", load_default_groups);
1609
print_defaults("drizzle", load_default_groups);
1462
1610
my_print_variables(my_long_options);
1467
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
1615
get_one_option(int optid, const struct my_option *, char *argument)
1617
char *endchar= NULL;
1618
uint64_t temp_drizzle_port= 0;
1470
1620
switch(optid) {
1471
case OPT_CHARSETS_DIR:
1472
strmake(drizzle_charsets_dir, argument, sizeof(drizzle_charsets_dir) - 1);
1473
charsets_dir = drizzle_charsets_dir;
1475
1621
case OPT_DEFAULT_CHARSET:
1476
1622
default_charset_used= 1;
1478
1624
case OPT_DELIMITER:
1479
1625
if (argument == disabled_my_option)
1481
my_stpcpy(delimiter, DEFAULT_DELIMITER);
1627
strcpy(delimiter, DEFAULT_DELIMITER);
1485
1631
/* Check that delimiter does not contain a backslash */
1486
1632
if (!strstr(argument, "\\"))
1488
strmake(delimiter, argument, sizeof(delimiter) - 1);
1634
strncpy(delimiter, argument, sizeof(delimiter) - 1);
1492
1638
put_info(_("DELIMITER cannot contain a backslash character"),
1493
1639
INFO_ERROR,0,0);
1497
delimiter_length= (uint)strlen(delimiter);
1643
delimiter_length= (uint32_t)strlen(delimiter);
1498
1644
delimiter_str= delimiter;
1500
case OPT_LOCAL_INFILE:
1501
using_opt_local_infile=1;
1504
1647
if (argument == disabled_my_option)
2194
2364
return (char**) 0;
2198
static char *new_command_generator(const char *text,int state)
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)
2207
textlen=(uint) strlen(text);
2210
{ /* lookup in the hash */
2215
b = find_all_matches(&ht,text,(uint) strlen(text),&len);
2223
ptr= strdup(e->str);
2229
{ /* traverse the entire hash, ugly but works */
2233
/* find the first used bucket */
2234
for (i=0 ; i < ht.nTableSize ; i++)
2236
if (ht.arBuckets[i])
2238
b = ht.arBuckets[i];
2246
{ /* find valid entry in bucket */
2247
if ((uint) strlen(e->str) == b->nKeyLength)
2248
ptr = strdup(e->str);
2249
/* find the next used entry */
2252
{ /* find the next used bucket */
2256
for (i++ ; i<ht.nTableSize; i++)
2258
if (ht.arBuckets[i])
2260
b = ht.arBuckets[i];
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());
2277
2426
/* Build up the completion hash */
2279
2428
static void build_completion_hash(bool rehash, bool write_info)
2281
2430
COMMANDS *cmd=commands;
2282
DRIZZLE_RES *databases=0,*tables=0;
2283
DRIZZLE_RES *fields;
2284
static char ***field_names= 0;
2285
DRIZZLE_ROW database_row,table_row;
2286
DRIZZLE_FIELD *sql_field;
2287
char buf[NAME_LEN*2+2]; // table name plus field name plus 2
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;
2291
2437
if (status.batch || quick || !current_db)
2292
2438
return; // We don't need completion in batches
2296
/* Free old used memory */
2299
completion_hash_clean(&ht);
2300
free_root(&hash_mem_root,MYF(0));
2442
completion_map.clear();
2302
2444
/* hash this file's known subset of SQL commands */
2303
2445
while (cmd->name) {
2304
add_word(&ht,(char*) cmd->name);
2447
tmp_str_lower= lower_string(tmp_str);
2448
completion_map[tmp_str_lower]= tmp_str;
2308
2452
/* hash Drizzle functions (to be implemented) */
2310
2454
/* hash all database names */
2311
if (drizzle_query(&drizzle,"show databases") == 0)
2455
if (drizzle_query_str(&con, &databases, "show databases", &ret) != NULL)
2313
if (!(databases = drizzle_store_result(&drizzle)))
2314
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2457
if (ret == DRIZZLE_RETURN_OK)
2317
while ((database_row=drizzle_fetch_row(databases)))
2459
if (drizzle_result_buffer(&databases) != DRIZZLE_RETURN_OK)
2460
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2319
char *str=strdup_root(&hash_mem_root, (char*) database_row[0]);
2321
add_word(&ht,(char*) str);
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
drizzle_free_result(databases);
2472
drizzle_result_free(&databases);
2326
2475
/* hash all table names */
2327
if (drizzle_query(&drizzle,"show tables")==0)
2476
if (drizzle_query_str(&con, &tables, "show tables", &ret) != NULL)
2329
if (!(tables = drizzle_store_result(&drizzle)))
2478
if (ret != DRIZZLE_RETURN_OK)
2480
drizzle_result_free(&tables);
2484
if (drizzle_result_buffer(&tables) != DRIZZLE_RETURN_OK)
2330
2485
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2333
if (drizzle_num_rows(tables) > 0 && !opt_silent && write_info)
2488
if (drizzle_result_row_count(&tables) > 0 && !opt_silent && write_info)
2335
2490
tee_fprintf(stdout, _("\
2336
2491
Reading table information for completion of table and column names\n \
2337
2492
You can turn off this feature to get a quicker startup with -A\n\n"));
2339
while ((table_row=drizzle_fetch_row(tables)))
2494
while ((table_row=drizzle_row_next(&tables)))
2341
char *str=strdup_root(&hash_mem_root, (char*) table_row[0]);
2343
!completion_hash_exists(&ht,(char*) str, (uint) strlen(str)))
2496
tmp_str= table_row[0];
2497
tmp_str_lower= lower_string(tmp_str);
2498
completion_map[tmp_str_lower]= tmp_str;
2349
2505
/* hash all field names, both with the table prefix and without it */
2350
if (!tables) /* no tables */
2354
drizzle_data_seek(tables,0);
2355
if (!(field_names= (char ***) alloc_root(&hash_mem_root,sizeof(char **) *
2356
(uint) (drizzle_num_rows(tables)+1))))
2358
drizzle_free_result(tables);
2362
while ((table_row=drizzle_fetch_row(tables)))
2364
if ((fields=drizzle_list_fields(&drizzle,(const char*) table_row[0],NULL)))
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(),
2366
num_fields=drizzle_num_fields(fields);
2367
if (!(field_names[i] = (char **) alloc_root(&hash_mem_root,
2371
drizzle_free_result(fields);
2374
field_names[i][num_fields*2]= '\0';
2376
while ((sql_field=drizzle_fetch_field(fields)))
2378
sprintf(buf,"%.64s.%.64s",table_row[0],sql_field->name);
2379
field_names[i][j] = strdup_root(&hash_mem_root,buf);
2380
add_word(&ht,field_names[i][j]);
2381
field_names[i][num_fields+j] = strdup_root(&hash_mem_root,
2383
if (!completion_hash_exists(&ht,field_names[i][num_fields+j],
2384
(uint) strlen(field_names[i][num_fields+j])))
2385
add_word(&ht,field_names[i][num_fields+j]);
2388
drizzle_free_result(fields);
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);
2395
drizzle_free_result(tables);
2396
field_names[i]=0; // End pointer
2544
drizzle_result_free(&tables);
2545
completion_iter= completion_map.begin();
2400
2548
/* for gnu readline */
2461
2611
The different commands
2462
2612
***************************************************************************/
2464
int drizzle_real_query_for_lazy(const char *buf, int length)
2614
int drizzleclient_real_query_for_lazy(const char *buf, int length,
2615
drizzle_result_st *result,
2616
uint32_t *error_code)
2466
for (uint retry=0;; retry++)
2618
drizzle_return_t ret;
2620
for (uint32_t retry=0;; retry++)
2469
if (!drizzle_real_query(&drizzle,buf,length))
2623
if (drizzle_query(&con,result,buf,length,&ret) != NULL &&
2624
ret == DRIZZLE_RETURN_OK)
2471
error= put_error(&drizzle);
2472
if (drizzle_errno(&drizzle) != CR_SERVER_GONE_ERROR || retry > 1 ||
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 ||
2473
2637
!opt_reconnect)
2475
2642
if (reconnect())
2480
int drizzle_store_result_for_lazy(DRIZZLE_RES **result)
2647
int drizzleclient_store_result_for_lazy(drizzle_result_st *result)
2482
if ((*result=drizzle_store_result(&drizzle)))
2649
if (drizzle_result_buffer(result) == DRIZZLE_RETURN_OK)
2485
if (drizzle_error(&drizzle)[0])
2486
return put_error(&drizzle);
2652
if (drizzle_con_error(&con)[0])
2653
return put_error(&con, result);
2490
static void print_help_item(DRIZZLE_ROW *cur, int num_name, int num_cat, char *last_char)
2492
char ccat= (*cur)[num_cat][0];
2493
if (*last_char != ccat)
2495
put_info(ccat == 'Y' ? _("categories:") : _("topics:"), INFO_INFO,0,0);
2498
tee_fprintf(PAGER, " %s\n", (*cur)[num_name]);
2502
static int com_server_help(string *buffer,
2503
const char *line __attribute__((unused)),
2507
const char *server_cmd= buffer->c_str();
2509
DRIZZLE_RES *result;
2512
if (help_arg[0] != '\'')
2514
char *end_arg= strchr(help_arg, '\0');
2517
while (my_isspace(charset_info,*end_arg))
2521
(void) strxnmov(cmd_buf, sizeof(cmd_buf), "help '", help_arg, "'", NULL);
2522
server_cmd= cmd_buf;
2525
if (!connected && reconnect())
2528
if ((error= drizzle_real_query_for_lazy(server_cmd,(int)strlen(server_cmd))) ||
2529
(error= drizzle_store_result_for_lazy(&result)))
2534
unsigned int num_fields= drizzle_num_fields(result);
2535
uint64_t num_rows= drizzle_num_rows(result);
2536
drizzle_fetch_fields(result);
2537
if (num_fields==3 && num_rows==1)
2539
if (!(cur= drizzle_fetch_row(result)))
2546
tee_fprintf(PAGER, _("Name: \'%s\'\n"), cur[0]);
2547
tee_fprintf(PAGER, _("Description:\n%s"), cur[1]);
2548
if (cur[2] && *((char*)cur[2]))
2549
tee_fprintf(PAGER, _("Examples:\n%s"), cur[2]);
2550
tee_fprintf(PAGER, "\n");
2553
else if (num_fields >= 2 && num_rows)
2558
int num_name= 0, num_cat= 0;
2560
if (num_fields == 2)
2562
put_info(_("Many help items for your request exist."), INFO_INFO,0,0);
2563
put_info(_("To make a more specific request, please type 'help <item>',\nwhere <item> is one of the following"), INFO_INFO,0,0);
2567
else if ((cur= drizzle_fetch_row(result)))
2569
tee_fprintf(PAGER, _("You asked for help about help category: '%s'\n"), cur[0]);
2570
put_info(_("For more information, type 'help <item>', where <item> is one of the following"), INFO_INFO,0,0);
2573
print_help_item(&cur,1,2,&last_char);
2576
while ((cur= drizzle_fetch_row(result)))
2577
print_help_item(&cur,num_name,num_cat,&last_char);
2578
tee_fprintf(PAGER, "\n");
2583
put_info(_("\nNothing found"), INFO_INFO,0,0);
2584
put_info(_("Please try to run 'help contents' for a list of all accessible topics\n"), INFO_INFO,0,0);
2589
drizzle_free_result(result);
2594
com_help(string *buffer __attribute__((unused)),
2595
const char *line __attribute__((unused)))
2658
com_help(string *buffer, const char *)
2597
2660
register int i, j;
2598
char * help_arg= strchr(line,' '), buff[32], *end;
2601
while (my_isspace(charset_info,*help_arg))
2603
if (*help_arg) return com_server_help(buffer,line,help_arg);
2661
char buff[32], *end;
2606
2663
put_info(_("List of all Drizzle commands:"), INFO_INFO,0,0);
2607
2664
if (!named_cmds)
2608
2665
put_info(_("Note that all text commands must be first on line and end with ';'"),INFO_INFO,0,0);
2609
2666
for (i = 0; commands[i].name; i++)
2611
end= my_stpcpy(buff, commands[i].name);
2668
end= strcpy(buff, commands[i].name);
2669
end+= strlen(commands[i].name);
2612
2670
for (j= (int)strlen(commands[i].name); j < 10; j++)
2613
end= my_stpcpy(end, " ");
2671
end= strcpy(end, " ")+1;
2614
2672
if (commands[i].func)
2615
2673
tee_fprintf(stdout, "%s(\\%c) %s\n", buff,
2616
2674
commands[i].cmd_char, _(commands[i].doc));
2618
if (connected && drizzle_get_server_version(&drizzle) >= 40100)
2619
put_info(_("\nFor server side help, type 'help contents'\n"), INFO_INFO,0,0);
2676
tee_fprintf(stdout, "\n");
2625
com_clear(string *buffer,
2626
const char *line __attribute__((unused)))
2683
com_clear(string *buffer, const char *)
2628
2685
if (status.add_to_history)
2629
2686
fix_history(buffer);
2719
2777
time_buff[0]= '\0';
2721
2779
/* Every branch must truncate buff . */
2780
if (drizzle_result_column_count(&result) > 0)
2724
if (!drizzle_num_rows(result) && ! quick && !column_types_flag)
2782
if (!quick && drizzle_result_row_count(&result) == 0 &&
2726
my_stpcpy(buff, _("Empty set"));
2785
strcpy(buff, _("Empty set"));
2731
2790
if (vertical || (auto_vertical_output &&
2732
(terminal_width < get_result_width(result))))
2733
print_table_data_vertically(result);
2791
(terminal_width < get_result_width(&result))))
2792
print_table_data_vertically(&result);
2734
2793
else if (opt_silent && verbose <= 2 && !output_tables)
2735
print_tab_data(result);
2794
print_tab_data(&result);
2737
print_table_data(result);
2796
print_table_data(&result);
2739
2798
ngettext("%ld row in set","%ld rows in set",
2740
(long) drizzle_num_rows(result)),
2741
(long) drizzle_num_rows(result));
2799
(long) drizzle_result_row_count(&result)),
2800
(long) drizzle_result_row_count(&result));
2743
if (drizzle_errno(&drizzle))
2744
error= put_error(&drizzle);
2802
if (drizzle_result_error_code(&result))
2803
error= put_error(&con, &result);
2747
else if (drizzle_affected_rows(&drizzle) == ~(uint64_t) 0)
2748
my_stpcpy(buff,_("Query OK"));
2806
else if (drizzle_result_affected_rows(&result) == ~(uint64_t) 0)
2807
strcpy(buff,_("Query OK"));
2750
2809
sprintf(buff, ngettext("Query OK, %ld row affected",
2751
2810
"Query OK, %ld rows affected",
2752
(long) drizzle_affected_rows(&drizzle)),
2753
(long) drizzle_affected_rows(&drizzle));
2811
(long) drizzle_result_affected_rows(&result)),
2812
(long) drizzle_result_affected_rows(&result));
2755
2814
pos= strchr(buff, '\0');
2756
if ((warnings= drizzle_warning_count(&drizzle)))
2815
if ((warnings= drizzle_result_warning_count(&result)))
2760
pos=int10_to_str(warnings, pos, 10);
2761
pos=my_stpcpy(pos, " warning");
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;
2762
2825
if (warnings != 1)
2765
my_stpcpy(pos, time_buff);
2828
strcpy(pos, time_buff);
2766
2829
put_info(buff,INFO_RESULT,0,0);
2767
if (drizzle_info(&drizzle))
2768
put_info(drizzle_info(&drizzle),INFO_RESULT,0,0);
2830
if (strcmp(drizzle_result_info(&result), ""))
2831
put_info(drizzle_result_info(&result),INFO_RESULT,0,0);
2769
2832
put_info("",INFO_RESULT,0,0); // Empty row
2771
if (result && !drizzle_eof(result)) /* Something wrong when using quick */
2772
error= put_error(&drizzle);
2773
else if (unbuffered)
2774
2835
fflush(stdout);
2775
drizzle_free_result(result);
2776
} while (!(err= drizzle_next_result(&drizzle)));
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);
2778
error= put_error(&drizzle);
2856
error= put_error(&con, NULL);
2782
2860
/* Show warnings if any or error occured */
2783
2861
if (show_warnings == 1 && (warnings >= 1 || error))
2862
print_warnings(error_code);
2786
2864
if (!error && !status.batch &&
2787
(drizzle.server_status & SERVER_STATUS_DB_DROPPED))
2865
drizzle_con_status(&con) & DRIZZLE_CON_STATUS_DB_DROPPED)
2788
2867
get_current_db();
2790
2870
executing_query= 0;
2791
2871
return error; /* New command follows */
2855
static const char *fieldtype2str(enum enum_field_types type)
2936
static const char *fieldtype2str(drizzle_column_type_t type)
2857
2938
switch (type) {
2858
case DRIZZLE_TYPE_BLOB: return "BLOB";
2859
case DRIZZLE_TYPE_NEWDATE: return "DATE";
2860
case DRIZZLE_TYPE_DATETIME: return "DATETIME";
2861
case DRIZZLE_TYPE_NEWDECIMAL: return "DECIMAL";
2862
case DRIZZLE_TYPE_DOUBLE: return "DOUBLE";
2863
case DRIZZLE_TYPE_ENUM: return "ENUM";
2864
case DRIZZLE_TYPE_LONG: return "LONG";
2865
case DRIZZLE_TYPE_LONGLONG: return "LONGLONG";
2866
case DRIZZLE_TYPE_NULL: return "NULL";
2867
case DRIZZLE_TYPE_TIME: return "TIME";
2868
case DRIZZLE_TYPE_TIMESTAMP: return "TIMESTAMP";
2869
case DRIZZLE_TYPE_TINY: return "TINY";
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";
2949
case DRIZZLE_COLUMN_TYPE_TINY: return "TINY";
2950
case DRIZZLE_COLUMN_TYPE_VIRTUAL: return "VIRTUAL";
2870
2951
default: return "?-unknown-?";
2874
static char *fieldflags2str(uint f) {
2955
static char *fieldflags2str(uint32_t f) {
2875
2956
static char buf[1024];
2878
2959
#define ff2s_check_flag(X) \
2879
if (f & X ## _FLAG) { s=my_stpcpy(s, # X " "); f &= ~ X ## _FLAG; }
2960
if (f & DRIZZLE_COLUMN_FLAGS_ ## X) { s=strcpy(s, # X " ")+strlen(# X " "); \
2961
f &= ~ DRIZZLE_COLUMN_FLAGS_ ## X; }
2880
2962
ff2s_check_flag(NOT_NULL);
2881
2963
ff2s_check_flag(PRI_KEY);
2882
2964
ff2s_check_flag(UNIQUE_KEY);
2921
3003
"Decimals: %u\n"
2922
3004
"Flags: %s\n\n",
2924
field->name, field->catalog, field->db, field->table,
2925
field->org_table, fieldtype2str(field->type),
2926
get_charset_name(field->charsetnr), field->charsetnr,
2927
field->length, field->max_length, field->decimals,
2928
fieldflags2str(field->flags));
3006
drizzle_column_name(field), drizzle_column_catalog(field),
3007
drizzle_column_db(field), drizzle_column_table(field),
3008
drizzle_column_orig_table(field),
3009
fieldtype2str(drizzle_column_type(field)),
3010
get_charset_name(drizzle_column_charset(field)),
3011
drizzle_column_charset(field), drizzle_column_size(field),
3012
drizzle_column_max_size(field), drizzle_column_decimals(field),
3013
fieldflags2str(drizzle_column_flags(field)));
2930
3015
tee_puts("", PAGER);
2935
print_table_data(DRIZZLE_RES *result)
3020
print_table_data(drizzle_result_st *result)
2938
DRIZZLE_FIELD *field;
3023
drizzle_return_t ret;
3024
drizzle_column_st *field;
2940
3026
string separator;
2942
3028
separator.reserve(256);
2944
num_flag=(bool*) my_malloc(sizeof(bool)*drizzle_num_fields(result),
3030
num_flag=(bool*) malloc(sizeof(bool)*drizzle_result_column_count(result));
2946
3031
if (column_types_flag)
2948
3033
print_field_types(result);
2949
if (!drizzle_num_rows(result))
3034
if (!drizzle_result_row_count(result))
2951
drizzle_field_seek(result,0);
3036
drizzle_column_seek(result,0);
2953
3038
separator.append("+");
2954
while ((field = drizzle_fetch_field(result)))
3039
while ((field = drizzle_column_next(result)))
2956
uint32_t length= column_names ? field->name_length : 0;
3041
uint32_t x, length= 0;
3045
uint32_t name_length= strlen(drizzle_column_name(field));
3047
/* Check if the max_byte value is really the maximum in terms
3048
of visual length since multibyte characters can affect the
3049
length of the separator. */
3050
length= charset_info->cset->numcells(charset_info,
3051
drizzle_column_name(field),
3052
drizzle_column_name(field) +
3055
if (name_length == drizzle_column_max_size(field))
3057
if (length < drizzle_column_max_size(field))
3058
drizzle_column_set_max_size(field, length);
3062
length= name_length;
2958
length=max(length,field->length);
3067
length=max(length,drizzle_column_size(field));
2960
length=max(length,field->max_length);
2961
if (length < 4 && !(field->flags & NOT_NULL_FLAG))
3069
length=max(length,(uint32_t)drizzle_column_max_size(field));
3071
!(drizzle_column_flags(field) & DRIZZLE_COLUMN_FLAGS_NOT_NULL))
2962
3073
// Room for "NULL"
2964
field->max_length=length;
3076
drizzle_column_set_max_size(field, length);
2966
3078
for (x=0; x< (length+2); x++)
2967
3079
separator.append("-");
2968
3080
separator.append("+");
2971
3083
tee_puts((char*) separator.c_str(), PAGER);
2972
3084
if (column_names)
2974
drizzle_field_seek(result,0);
3086
drizzle_column_seek(result,0);
2975
3087
(void) tee_fputs("|", PAGER);
2976
for (uint off=0; (field = drizzle_fetch_field(result)) ; off++)
3088
for (uint32_t off=0; (field = drizzle_column_next(result)) ; off++)
2978
uint name_length= (uint) strlen(field->name);
2979
uint numcells= charset_info->cset->numcells(charset_info,
2981
field->name + name_length);
2982
uint32_t display_length= field->max_length + name_length - numcells;
3090
uint32_t name_length= (uint32_t) strlen(drizzle_column_name(field));
3091
uint32_t numcells= charset_info->cset->numcells(charset_info,
3092
drizzle_column_name(field),
3093
drizzle_column_name(field) +
3095
uint32_t display_length= drizzle_column_max_size(field) + name_length -
2983
3097
tee_fprintf(PAGER, " %-*s |",(int) min(display_length,
2984
3098
MAX_COLUMN_LENGTH),
2986
num_flag[off]= ((field->type <= DRIZZLE_TYPE_LONGLONG) ||
2987
(field->type == DRIZZLE_TYPE_NEWDECIMAL));
3099
drizzle_column_name(field));
3100
num_flag[off]= ((drizzle_column_type(field) <= DRIZZLE_COLUMN_TYPE_LONGLONG) ||
3101
(drizzle_column_type(field) == DRIZZLE_COLUMN_TYPE_NEWDECIMAL));
2989
3103
(void) tee_fputs("\n", PAGER);
2990
3104
tee_puts((char*) separator.c_str(), PAGER);
2993
while ((cur= drizzle_fetch_row(result)))
2995
if (interrupted_query)
3111
cur= drizzle_row_buffer(result, &ret);
3112
if (ret != DRIZZLE_RETURN_OK)
3114
(void)put_error(&con, result);
3119
cur= drizzle_row_next(result);
3121
if (cur == NULL || interrupted_query)
2997
uint32_t *lengths= drizzle_fetch_lengths(result);
3124
size_t *lengths= drizzle_row_field_sizes(result);
2998
3125
(void) tee_fputs("| ", PAGER);
2999
drizzle_field_seek(result, 0);
3000
for (uint off= 0; off < drizzle_num_fields(result); off++)
3126
drizzle_column_seek(result, 0);
3127
for (uint32_t off= 0; off < drizzle_result_column_count(result); off++)
3002
3129
const char *buffer;
3004
uint field_max_length;
3005
uint visible_length;
3130
uint32_t data_length;
3131
uint32_t field_max_length;
3132
uint32_t visible_length;
3133
uint32_t extra_padding;
3008
3135
if (cur[off] == NULL)
3138
print_table_data_vertically(DRIZZLE_RES *result)
3270
print_table_data_vertically(drizzle_result_st *result)
3142
DRIZZLE_FIELD *field;
3273
drizzle_return_t ret;
3274
uint32_t max_length=0;
3275
drizzle_column_st *field;
3144
while ((field = drizzle_fetch_field(result)))
3277
while ((field = drizzle_column_next(result)))
3146
uint length= field->name_length;
3279
uint32_t length= strlen(drizzle_column_name(field));
3147
3280
if (length > max_length)
3148
3281
max_length= length;
3149
field->max_length=length;
3282
drizzle_column_set_max_size(field, length);
3152
drizzle_field_seek(result,0);
3153
for (uint row_count=1; (cur= drizzle_fetch_row(result)); row_count++)
3285
for (uint32_t row_count=1;; row_count++)
3155
if (interrupted_query)
3289
cur= drizzle_row_buffer(result, &ret);
3290
if (ret != DRIZZLE_RETURN_OK)
3292
(void)put_error(&con, result);
3297
cur= drizzle_row_next(result);
3299
if (cur == NULL || interrupted_query)
3157
drizzle_field_seek(result,0);
3301
drizzle_column_seek(result,0);
3158
3302
tee_fprintf(PAGER,
3159
3303
"*************************** %d. row ***************************\n", row_count);
3160
for (uint off=0; off < drizzle_num_fields(result); off++)
3304
for (uint32_t off=0; off < drizzle_result_column_count(result); off++)
3162
field= drizzle_fetch_field(result);
3163
tee_fprintf(PAGER, "%*s: ",(int) max_length,field->name);
3306
field= drizzle_column_next(result);
3307
tee_fprintf(PAGER, "%*s: ",(int) max_length,drizzle_column_name(field));
3164
3308
tee_fprintf(PAGER, "%s\n",cur[off] ? (char*) cur[off] : "NULL");
3311
drizzle_row_free(result, cur);
3170
3316
/* print_warnings should be called right after executing a statement */
3172
static void print_warnings()
3318
static void print_warnings(uint32_t error_code)
3175
DRIZZLE_RES *result;
3321
drizzle_result_st result;
3177
3323
uint64_t num_rows;
3179
/* Save current error before calling "show warnings" */
3180
uint error= drizzle_errno(&drizzle);
3324
uint32_t new_code= 0;
3182
3326
/* Get the warnings */
3183
3327
query= "show warnings";
3184
drizzle_real_query_for_lazy(query, strlen(query));
3185
drizzle_store_result_for_lazy(&result);
3328
drizzleclient_real_query_for_lazy(query, strlen(query),&result,&new_code);
3329
drizzleclient_store_result_for_lazy(&result);
3187
3331
/* Bail out when no warnings */
3188
if (!(num_rows= drizzle_num_rows(result)))
3332
if (!(num_rows= drizzle_result_row_count(&result)))
3191
cur= drizzle_fetch_row(result);
3335
cur= drizzle_row_next(&result);
3194
3338
Don't print a duplicate of the current error. It is possible for SHOW
3222
3369
if (opt_raw_data)
3223
3370
tee_fputs(pos, PAGER);
3224
3371
else for (const char *end=pos+length ; pos != end ; pos++)
3228
if (use_mb(charset_info) &&
3229
(l = my_ismbchar(charset_info, pos, end)))
3232
tee_putc(*pos++, PAGER);
3238
tee_fputs("\\0", PAGER); // This makes everything hard
3239
else if (*pos == '\t')
3240
tee_fputs("\\t", PAGER); // This would destroy tab format
3241
else if (*pos == '\n')
3242
tee_fputs("\\n", PAGER); // This too
3243
else if (*pos == '\\')
3244
tee_fputs("\\\\", PAGER);
3246
tee_putc(*pos, PAGER);
3374
if (use_mb(charset_info) &&
3375
(l = my_ismbchar(charset_info, pos, end)))
3378
tee_putc(*pos++, PAGER);
3383
tee_fputs("\\0", PAGER); // This makes everything hard
3384
else if (*pos == '\t')
3385
tee_fputs("\\t", PAGER); // This would destroy tab format
3386
else if (*pos == '\n')
3387
tee_fputs("\\n", PAGER); // This too
3388
else if (*pos == '\\')
3389
tee_fputs("\\\\", PAGER);
3391
tee_putc(*pos, PAGER);
3253
print_tab_data(DRIZZLE_RES *result)
3398
print_tab_data(drizzle_result_st *result)
3256
DRIZZLE_FIELD *field;
3401
drizzle_return_t ret;
3402
drizzle_column_st *field;
3259
3405
if (opt_silent < 2 && column_names)
3262
while ((field = drizzle_fetch_field(result)))
3408
while ((field = drizzle_column_next(result)))
3265
3411
(void) tee_fputs("\t", PAGER);
3266
(void) tee_fputs(field->name, PAGER);
3412
(void) tee_fputs(drizzle_column_name(field), PAGER);
3268
3414
(void) tee_fputs("\n", PAGER);
3270
while ((cur = drizzle_fetch_row(result)))
3272
lengths= drizzle_fetch_lengths(result);
3420
cur= drizzle_row_buffer(result, &ret);
3421
if (ret != DRIZZLE_RETURN_OK)
3423
(void)put_error(&con, result);
3428
cur= drizzle_row_next(result);
3433
lengths= drizzle_row_field_sizes(result);
3273
3434
safe_put_field(cur[0],lengths[0]);
3274
for (uint off=1 ; off < drizzle_num_fields(result); off++)
3435
for (uint32_t off=1 ; off < drizzle_result_column_count(result); off++)
3276
3437
(void) tee_fputs("\t", PAGER);
3277
3438
safe_put_field(cur[off], lengths[off]);
3279
3440
(void) tee_fputs("\n", PAGER);
3442
drizzle_row_free(result, cur);
3284
com_tee(string *buffer __attribute__((unused)), const char *line )
3447
com_tee(string *, const char *line )
3286
char file_name[FN_REFLEN], *end, *param;
3449
char file_name[FN_REFLEN], *end;
3288
3452
if (status.batch)
3727
3904
sql_connect(char *host,char *database,char *user,char *password,
3907
drizzle_return_t ret;
3733
drizzle_close(&drizzle);
3912
drizzle_con_free(&con);
3913
drizzle_free(&drizzle);
3735
3915
drizzle_create(&drizzle);
3916
if (drizzle_con_add_tcp(&drizzle, &con, host, opt_drizzle_port, user,
3917
password, database, DRIZZLE_CON_NONE) == NULL)
3919
(void) put_error(&con, NULL);
3920
(void) fflush(stdout);
3924
/* XXX add this back in
3736
3925
if (opt_connect_timeout)
3738
uint timeout=opt_connect_timeout;
3739
drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3927
uint32_t timeout=opt_connect_timeout;
3928
drizzleclient_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3740
3929
(char*) &timeout);
3743
drizzle_options(&drizzle,DRIZZLE_OPT_COMPRESS,NULL);
3744
if (opt_secure_auth)
3745
drizzle_options(&drizzle, DRIZZLE_SECURE_AUTH, (char *) &opt_secure_auth);
3746
if (using_opt_local_infile)
3747
drizzle_options(&drizzle,DRIZZLE_OPT_LOCAL_INFILE, (char*) &opt_local_infile);
3933
/* XXX Do we need this?
3748
3934
if (safe_updates)
3750
3936
char init_command[100];
3751
3937
sprintf(init_command,
3752
3938
"SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=%"PRIu32
3753
",SQL_MAX_JOIN_SIZE=%"PRIu32,
3939
",MAX_JOIN_SIZE=%"PRIu32,
3754
3940
select_limit, max_join_size);
3755
drizzle_options(&drizzle, DRIZZLE_INIT_COMMAND, init_command);
3941
drizzleclient_options(&drizzle, DRIZZLE_INIT_COMMAND, init_command);
3757
if (!drizzle_connect(&drizzle, host, user, password,
3758
database, opt_drizzle_port, opt_drizzle_unix_port,
3759
connect_flag | CLIENT_MULTI_STATEMENTS))
3944
if ((ret= drizzle_con_connect(&con)) != DRIZZLE_RETURN_OK)
3762
(drizzle_errno(&drizzle) != CR_CONN_HOST_ERROR &&
3763
drizzle_errno(&drizzle) != CR_CONNECTION_ERROR))
3946
if (!silent || (ret != DRIZZLE_RETURN_GETADDRINFO &&
3947
ret != DRIZZLE_RETURN_COULD_NOT_CONNECT))
3765
(void) put_error(&drizzle);
3949
(void) put_error(&con, NULL);
3766
3950
(void) fflush(stdout);
3767
3951
return ignore_errors ? -1 : 1; // Abort
3769
3953
return -1; // Retryable
3772
3957
drizzle.reconnect= debug_info_flag; // We want to know if this happens
3773
3959
build_completion_hash(opt_rehash, 1);
3779
com_status(string *buffer __attribute__((unused)),
3780
const char *line __attribute__((unused)))
3965
com_status(string *, const char *)
3784
DRIZZLE_RES *result;
3971
drizzle_result_st result;
3972
drizzle_return_t ret;
3786
3974
tee_puts("--------------", stdout);
3787
3975
usage(1); /* Print version */
3790
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_thread_id(&drizzle));
3978
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_con_thread_id(&con));
3792
3980
Don't remove "limit 1",
3793
3981
it is protection againts SQL_SELECT_LIMIT=0
3795
if (!drizzle_query(&drizzle,"select DATABASE(), USER() limit 1") &&
3796
(result=drizzle_use_result(&drizzle)))
3983
if (drizzle_query_str(&con,&result,"select DATABASE(), USER() limit 1",
3984
&ret) != NULL && ret == DRIZZLE_RETURN_OK &&
3985
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3798
DRIZZLE_ROW cur=drizzle_fetch_row(result);
3987
drizzle_row_t cur=drizzle_row_next(&result);
3801
3990
tee_fprintf(stdout, "Current database:\t%s\n", cur[0] ? cur[0] : "");
3802
3991
tee_fprintf(stdout, "Current user:\t\t%s\n", cur[1]);
3804
drizzle_free_result(result);
3993
drizzle_result_free(&result);
3995
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
3996
drizzle_result_free(&result);
3806
3997
tee_puts("SSL:\t\t\tNot in use", stdout);
3821
4012
tee_fprintf(stdout, "Current pager:\t\t%s\n", pager);
3822
4013
tee_fprintf(stdout, "Using outfile:\t\t'%s'\n", opt_outfile ? outfile : "");
3823
4014
tee_fprintf(stdout, "Using delimiter:\t%s\n", delimiter);
3824
tee_fprintf(stdout, "Server version:\t\t%s\n", server_version_string(&drizzle));
3825
tee_fprintf(stdout, "Protocol version:\t%d\n", drizzle_get_proto_info(&drizzle));
3826
tee_fprintf(stdout, "Connection:\t\t%s\n", drizzle_get_host_info(&drizzle));
3827
if ((id= drizzle_insert_id(&drizzle)))
4015
tee_fprintf(stdout, "Server version:\t\t%s\n", server_version_string(&con));
4016
tee_fprintf(stdout, "Protocol version:\t%d\n", drizzle_con_protocol_version(&con));
4017
tee_fprintf(stdout, "Connection:\t\t%s\n", drizzle_con_host(&con));
4018
/* XXX need to save this from result
4019
if ((id= drizzleclient_insert_id(&drizzle)))
3828
4020
tee_fprintf(stdout, "Insert id:\t\t%s\n", llstr(id, buff));
3830
/* "limit 1" is protection against SQL_SELECT_LIMIT=0 */
3831
if (!drizzle_query(&drizzle,"select @@character_set_client, @@character_set_connection, @@character_set_server, @@character_set_database limit 1") &&
3832
(result=drizzle_use_result(&drizzle)))
3834
DRIZZLE_ROW cur=drizzle_fetch_row(result);
3837
tee_fprintf(stdout, "Server characterset:\t%s\n", cur[2] ? cur[2] : "");
3838
tee_fprintf(stdout, "Db characterset:\t%s\n", cur[3] ? cur[3] : "");
3839
tee_fprintf(stdout, "Client characterset:\t%s\n", cur[0] ? cur[0] : "");
3840
tee_fprintf(stdout, "Conn. characterset:\t%s\n", cur[1] ? cur[1] : "");
3842
drizzle_free_result(result);
3845
if (strstr(drizzle_get_host_info(&drizzle),"TCP/IP") || ! drizzle.unix_socket)
3846
tee_fprintf(stdout, "TCP port:\t\t%d\n", drizzle.port);
4023
if (strcmp(drizzle_con_uds(&con), ""))
4024
tee_fprintf(stdout, "UNIX socket:\t\t%s\n", drizzle_con_uds(&con));
3848
tee_fprintf(stdout, "UNIX socket:\t\t%s\n", drizzle.unix_socket);
3849
if (drizzle.net.compress)
3850
tee_fprintf(stdout, "Protocol:\t\tCompressed\n");
4026
tee_fprintf(stdout, "TCP port:\t\t%d\n", drizzle_con_port(&con));
3852
4028
if (safe_updates)
3868
4044
static const char *
3869
server_version_string(DRIZZLE *con)
4045
server_version_string(drizzle_con_st *local_con)
3871
static char buf[MAX_SERVER_VERSION_LENGTH] = "";
4047
static string buf("");
4048
static bool server_version_string_reserved= false;
4050
if (!server_version_string_reserved)
4052
buf.reserve(MAX_SERVER_VERSION_LENGTH);
4053
server_version_string_reserved= true;
3873
4055
/* Only one thread calls this, so no synchronization is needed */
3874
4056
if (buf[0] == '\0')
3877
DRIZZLE_RES *result;
4058
drizzle_result_st result;
4059
drizzle_return_t ret;
3879
bufp= my_stpncpy(buf, drizzle_get_server_info(con), sizeof buf);
4061
buf.append(drizzle_con_server_version(local_con));
3881
4063
/* "limit 1" is protection against SQL_SELECT_LIMIT=0 */
3882
if (!drizzle_query(con, "select @@version_comment limit 1") &&
3883
(result = drizzle_use_result(con)))
4064
(void)drizzle_query_str(local_con, &result,
4065
"select @@version_comment limit 1", &ret);
4066
if (ret == DRIZZLE_RETURN_OK &&
4067
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3885
DRIZZLE_ROW cur = drizzle_fetch_row(result);
4069
drizzle_row_t cur = drizzle_row_next(&result);
3886
4070
if (cur && cur[0])
3888
bufp = strxnmov(bufp, sizeof buf - (bufp - buf), " ", cur[0], NULL);
3890
drizzle_free_result(result);
4075
drizzle_result_free(&result);
3893
/* str*nmov doesn't guarantee NUL-termination */
3894
if (bufp == buf + sizeof buf)
3895
buf[sizeof buf - 1] = '\0';
4077
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
4078
drizzle_result_free(&result);
3902
put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
4085
put_info(const char *str,INFO_TYPE info_type, uint32_t error, const char *sqlstate)
3904
4087
FILE *file= (info_type == INFO_ERROR ? stderr : stdout);
3905
4088
static int inited=0;
4280
4481
static void add_int_to_prompt(int toadd)
4283
int10_to_str(toadd, buffer, 10);
4284
processed_prompt->append(buffer);
4483
ostringstream buffer;
4485
processed_prompt->append(buffer.str().c_str());
4287
4488
static void init_username()
4289
4491
free(full_username);
4290
4492
free(part_username);
4292
DRIZZLE_RES *result;
4293
if (!drizzle_query(&drizzle,"select USER()") &&
4294
(result=drizzle_use_result(&drizzle)))
4494
drizzle_result_st *result;
4495
if (!drizzleclient_query(&drizzle,"select USER()") &&
4496
(result=drizzleclient_use_result(&drizzle)))
4296
DRIZZLE_ROW cur=drizzle_fetch_row(result);
4498
drizzle_row_t cur=drizzleclient_fetch_row(result);
4297
4499
full_username= strdup(cur[0]);
4298
4500
part_username= strdup(strtok(cur[0],"@"));
4299
(void) drizzle_fetch_row(result); // Read eof
4501
(void) drizzleclient_fetch_row(result); // Read eof
4303
static int com_prompt(string *buffer __attribute__((unused)),
4506
static int com_prompt(string *, const char *line)
4306
char *ptr=strchr(line, ' ');
4308
free(current_prompt);
4309
current_prompt= strdup(ptr ? ptr+1 : default_prompt);
4508
const char *ptr=strchr(line, ' ');
4311
4510
tee_fprintf(stdout, "Returning to default PROMPT of %s\n",
4312
4511
default_prompt);
4513
char * tmpptr= strdup(ptr ? ptr+1 : default_prompt);
4515
tee_fprintf(stdout, "Memory allocation error. Not changing prompt\n");
4518
free(current_prompt);
4519
current_prompt= tmpptr;
4314
4520
tee_fprintf(stdout, "PROMPT set to '%s'\n", current_prompt);