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, ...);
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[])
1224
1367
If query is in process, kill query
1225
1368
no query in process, terminate like previous behavior
1227
RETSIGTYPE handle_sigint(int sig)
1371
void handle_sigint(int sig)
1229
1373
char kill_buffer[40];
1230
DRIZZLE *kill_drizzle= NULL;
1374
drizzle_con_st kill_drizzle;
1375
drizzle_result_st res;
1376
drizzle_return_t ret;
1232
1378
/* terminate if no query being executed, or we already tried interrupting */
1233
1379
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))
1383
if (drizzle_con_add_tcp(&drizzle, &kill_drizzle, current_host,
1384
opt_drizzle_port, current_user, opt_password, NULL,
1385
DRIZZLE_CON_NONE) == NULL)
1244
1390
/* 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);
1391
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %u",
1392
drizzle_con_thread_id(&con));
1394
if (drizzle_query_str(&kill_drizzle, &res, kill_buffer, &ret) != NULL)
1395
drizzle_result_free(&res);
1397
drizzle_con_free(&kill_drizzle);
1248
1398
tee_fprintf(stdout, _("Query aborted by Ctrl+C\n"));
1250
1400
interrupted_query= 1;
1277
1427
(char**) &opt_rehash, (char**) &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
1279
1429
{"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."),
1430
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
1431
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1282
1432
{"auto-vertical-output", OPT_AUTO_VERTICAL_OUTPUT,
1283
1433
N_("Automatically switch to vertical output mode if the result is wider than the terminal width."),
1284
1434
(char**) &auto_vertical_output, (char**) &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1286
1436
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
1437
{"column-type-info", OPT_COLUMN_TYPES, N_("Display column type information."),
1291
1438
(char**) &column_types_flag, (char**) &column_types_flag,
1292
1439
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
1360
1507
{"no-pager", OPT_NOPAGER,
1361
1508
N_("Disable pager and print to stdout. See interactive help (\\h) also. WARNING: option deprecated; use --disable-pager instead."),
1362
1509
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
1364
1511
N_("Password to use when connecting to server. If password is not given it's asked from the tty."),
1365
1512
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, ")
1513
{"port", 'p', N_("Port number to use for connection or 0 for default to, in order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, ")
1367
1514
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},
1515
0, 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1370
1516
{"prompt", OPT_PROMPT, N_("Set the drizzle prompt to this value."),
1371
1517
(char**) ¤t_prompt, (char**) ¤t_prompt, 0, GET_STR_ALLOC,
1372
1518
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
1520
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
1521
(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
1595
printf(_("%s Ver %s Distrib %s, for %s (%s) using %s %s\n"),
1449
my_progname, VER, drizzle_get_client_info(),
1596
my_progname, VER.c_str(), drizzle_version(),
1450
1597
SYSTEM_TYPE, MACHINE_TYPE,
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
2365
return (char**) 0;
2198
static char *new_command_generator(const char *text,int state)
2368
inline string lower_string(const string &from_string)
2370
string to_string= from_string;
2371
transform(to_string.begin(), to_string.end(),
2372
to_string.begin(), ::tolower);
2375
inline string lower_string(const char * from_string)
2377
string to_string= from_string;
2378
return lower_string(to_string);
2382
class CompletionMatch :
2383
public unary_function<const string&, bool>
2388
CompletionMatch(string text) : match_text(text) {}
2389
inline bool operator() (const pair<string,string> &match_against) const
2392
lower_string(match_against.first.substr(0,match_text.size()));
2393
return match_func(sub_match,match_text);
2400
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];
2405
completion_string= lower_string(text);
2406
if (completion_string.size() == 0)
2408
completion_iter= completion_map.begin();
2409
completion_end= completion_map.end();
2413
completion_iter= find_if(completion_map.begin(), completion_map.end(),
2414
CompletionMatch<equal_to<string> >(completion_string));
2415
completion_end= find_if(completion_iter, completion_map.end(),
2416
CompletionMatch<not_equal_to<string> >(completion_string));
2419
if (completion_iter == completion_end || (size_t)state > completion_map.size())
2421
char *result= (char *)malloc((*completion_iter).second.size()+1);
2422
strcpy(result, (*completion_iter).second.c_str());
2277
2427
/* Build up the completion hash */
2279
2429
static void build_completion_hash(bool rehash, bool write_info)
2281
2431
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
2432
drizzle_return_t ret;
2433
drizzle_result_st databases,tables,fields;
2434
drizzle_row_t database_row,table_row;
2435
drizzle_column_st *sql_field;
2436
string tmp_str, tmp_str_lower;
2291
2438
if (status.batch || quick || !current_db)
2292
2439
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));
2443
completion_map.clear();
2302
2445
/* hash this file's known subset of SQL commands */
2303
2446
while (cmd->name) {
2304
add_word(&ht,(char*) cmd->name);
2448
tmp_str_lower= lower_string(tmp_str);
2449
completion_map[tmp_str_lower]= tmp_str;
2308
2453
/* hash Drizzle functions (to be implemented) */
2310
2455
/* hash all database names */
2311
if (drizzle_query(&drizzle,"show databases") == 0)
2456
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);
2458
if (ret == DRIZZLE_RETURN_OK)
2317
while ((database_row=drizzle_fetch_row(databases)))
2460
if (drizzle_result_buffer(&databases) != DRIZZLE_RETURN_OK)
2461
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);
2464
while ((database_row=drizzle_row_next(&databases)))
2466
tmp_str= database_row[0];
2467
tmp_str_lower= lower_string(tmp_str);
2468
completion_map[tmp_str_lower]= tmp_str;
2323
drizzle_free_result(databases);
2473
drizzle_result_free(&databases);
2326
2476
/* hash all table names */
2327
if (drizzle_query(&drizzle,"show tables")==0)
2477
if (drizzle_query_str(&con, &tables, "show tables", &ret) != NULL)
2329
if (!(tables = drizzle_store_result(&drizzle)))
2479
if (ret != DRIZZLE_RETURN_OK)
2481
drizzle_result_free(&tables);
2485
if (drizzle_result_buffer(&tables) != DRIZZLE_RETURN_OK)
2330
2486
put_info(drizzle_error(&drizzle),INFO_INFO,0,0);
2333
if (drizzle_num_rows(tables) > 0 && !opt_silent && write_info)
2489
if (drizzle_result_row_count(&tables) > 0 && !opt_silent && write_info)
2335
2491
tee_fprintf(stdout, _("\
2336
2492
Reading table information for completion of table and column names\n \
2337
2493
You can turn off this feature to get a quicker startup with -A\n\n"));
2339
while ((table_row=drizzle_fetch_row(tables)))
2495
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)))
2497
tmp_str= table_row[0];
2498
tmp_str_lower= lower_string(tmp_str);
2499
completion_map[tmp_str_lower]= tmp_str;
2349
2506
/* 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)))
2507
if (drizzle_result_row_count(&tables) == 0)
2509
drizzle_result_free(&tables);
2513
drizzle_row_seek(&tables, 0);
2515
while ((table_row=drizzle_row_next(&tables)))
2519
query.append("show fields in '");
2520
query.append(table_row[0]);
2523
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);
2526
if (ret == DRIZZLE_RETURN_OK &&
2527
drizzle_result_buffer(&fields) == DRIZZLE_RETURN_OK)
2529
while ((sql_field=drizzle_column_next(&fields)))
2531
tmp_str=table_row[0];
2532
tmp_str.append(".");
2533
tmp_str.append(drizzle_column_name(sql_field));
2534
tmp_str_lower= lower_string(tmp_str);
2535
completion_map[tmp_str_lower]= tmp_str;
2537
tmp_str=drizzle_column_name(sql_field);
2538
tmp_str_lower= lower_string(tmp_str);
2539
completion_map[tmp_str_lower]= tmp_str;
2542
drizzle_result_free(&fields);
2395
drizzle_free_result(tables);
2396
field_names[i]=0; // End pointer
2545
drizzle_result_free(&tables);
2546
completion_iter= completion_map.begin();
2400
2549
/* for gnu readline */
2461
2614
The different commands
2462
2615
***************************************************************************/
2464
int drizzle_real_query_for_lazy(const char *buf, int length)
2617
int drizzleclient_real_query_for_lazy(const char *buf, int length,
2618
drizzle_result_st *result,
2619
uint32_t *error_code)
2466
for (uint retry=0;; retry++)
2621
drizzle_return_t ret;
2623
for (uint32_t retry=0;; retry++)
2469
if (!drizzle_real_query(&drizzle,buf,length))
2626
if (drizzle_query(&con,result,buf,length,&ret) != NULL &&
2627
ret == DRIZZLE_RETURN_OK)
2471
error= put_error(&drizzle);
2472
if (drizzle_errno(&drizzle) != CR_SERVER_GONE_ERROR || retry > 1 ||
2631
error= put_error(&con, result);
2633
if (ret == DRIZZLE_RETURN_ERROR_CODE)
2635
*error_code= drizzle_result_error_code(result);
2636
drizzle_result_free(result);
2639
if (ret != DRIZZLE_RETURN_SERVER_GONE || retry > 1 ||
2473
2640
!opt_reconnect)
2475
2645
if (reconnect())
2480
int drizzle_store_result_for_lazy(DRIZZLE_RES **result)
2650
int drizzleclient_store_result_for_lazy(drizzle_result_st *result)
2482
if ((*result=drizzle_store_result(&drizzle)))
2652
if (drizzle_result_buffer(result) == DRIZZLE_RETURN_OK)
2485
if (drizzle_error(&drizzle)[0])
2486
return put_error(&drizzle);
2655
if (drizzle_con_error(&con)[0])
2656
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)))
2661
com_help(string *buffer, const char *)
2597
2663
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);
2664
char buff[32], *end;
2606
2666
put_info(_("List of all Drizzle commands:"), INFO_INFO,0,0);
2607
2667
if (!named_cmds)
2608
2668
put_info(_("Note that all text commands must be first on line and end with ';'"),INFO_INFO,0,0);
2609
2669
for (i = 0; commands[i].name; i++)
2611
end= my_stpcpy(buff, commands[i].name);
2671
end= strcpy(buff, commands[i].name);
2672
end+= strlen(commands[i].name);
2612
2673
for (j= (int)strlen(commands[i].name); j < 10; j++)
2613
end= my_stpcpy(end, " ");
2674
end= strcpy(end, " ")+1;
2614
2675
if (commands[i].func)
2615
2676
tee_fprintf(stdout, "%s(\\%c) %s\n", buff,
2616
2677
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);
2679
tee_fprintf(stdout, "\n");
2625
com_clear(string *buffer,
2626
const char *line __attribute__((unused)))
2686
com_clear(string *buffer, const char *)
2628
2688
if (status.add_to_history)
2629
2689
fix_history(buffer);
2719
2780
time_buff[0]= '\0';
2721
2782
/* Every branch must truncate buff . */
2783
if (drizzle_result_column_count(&result) > 0)
2724
if (!drizzle_num_rows(result) && ! quick && !column_types_flag)
2785
if (!quick && drizzle_result_row_count(&result) == 0 &&
2726
my_stpcpy(buff, _("Empty set"));
2788
strcpy(buff, _("Empty set"));
2731
2793
if (vertical || (auto_vertical_output &&
2732
(terminal_width < get_result_width(result))))
2733
print_table_data_vertically(result);
2794
(terminal_width < get_result_width(&result))))
2795
print_table_data_vertically(&result);
2734
2796
else if (opt_silent && verbose <= 2 && !output_tables)
2735
print_tab_data(result);
2797
print_tab_data(&result);
2737
print_table_data(result);
2799
print_table_data(&result);
2739
2801
ngettext("%ld row in set","%ld rows in set",
2740
(long) drizzle_num_rows(result)),
2741
(long) drizzle_num_rows(result));
2802
(long) drizzle_result_row_count(&result)),
2803
(long) drizzle_result_row_count(&result));
2743
if (drizzle_errno(&drizzle))
2744
error= put_error(&drizzle);
2805
if (drizzle_result_error_code(&result))
2806
error= put_error(&con, &result);
2747
else if (drizzle_affected_rows(&drizzle) == ~(uint64_t) 0)
2748
my_stpcpy(buff,_("Query OK"));
2809
else if (drizzle_result_affected_rows(&result) == ~(uint64_t) 0)
2810
strcpy(buff,_("Query OK"));
2750
2812
sprintf(buff, ngettext("Query OK, %ld row affected",
2751
2813
"Query OK, %ld rows affected",
2752
(long) drizzle_affected_rows(&drizzle)),
2753
(long) drizzle_affected_rows(&drizzle));
2814
(long) drizzle_result_affected_rows(&result)),
2815
(long) drizzle_result_affected_rows(&result));
2755
2817
pos= strchr(buff, '\0');
2756
if ((warnings= drizzle_warning_count(&drizzle)))
2818
if ((warnings= drizzle_result_warning_count(&result)))
2760
pos=int10_to_str(warnings, pos, 10);
2761
pos=my_stpcpy(pos, " warning");
2822
char warnings_buff[20];
2823
memset(warnings_buff,0,20);
2824
sprintf(warnings_buff, "%d", warnings);
2825
strcpy(pos, warnings_buff);
2826
pos+= strlen(warnings_buff);
2827
pos= strcpy(pos, " warning")+8;
2762
2828
if (warnings != 1)
2765
my_stpcpy(pos, time_buff);
2831
strcpy(pos, time_buff);
2766
2832
put_info(buff,INFO_RESULT,0,0);
2767
if (drizzle_info(&drizzle))
2768
put_info(drizzle_info(&drizzle),INFO_RESULT,0,0);
2833
if (strcmp(drizzle_result_info(&result), ""))
2834
put_info(drizzle_result_info(&result),INFO_RESULT,0,0);
2769
2835
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
2838
fflush(stdout);
2775
drizzle_free_result(result);
2776
} while (!(err= drizzle_next_result(&drizzle)));
2839
drizzle_result_free(&result);
2841
if (drizzle_con_status(&con) & DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS)
2843
if (drizzle_result_read(&con, &result, &ret) == NULL ||
2844
ret != DRIZZLE_RETURN_OK)
2846
if (ret == DRIZZLE_RETURN_ERROR_CODE)
2848
error_code= drizzle_result_error_code(&result);
2849
drizzle_result_free(&result);
2852
error= put_error(&con, NULL);
2857
} while (drizzle_con_status(&con) & DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS);
2778
error= put_error(&drizzle);
2859
error= put_error(&con, NULL);
2782
2863
/* Show warnings if any or error occured */
2783
2864
if (show_warnings == 1 && (warnings >= 1 || error))
2865
print_warnings(error_code);
2786
2867
if (!error && !status.batch &&
2787
(drizzle.server_status & SERVER_STATUS_DB_DROPPED))
2868
drizzle_con_status(&con) & DRIZZLE_CON_STATUS_DB_DROPPED)
2788
2870
get_current_db();
2790
2873
executing_query= 0;
2791
2874
return error; /* New command follows */
2855
static const char *fieldtype2str(enum enum_field_types type)
2939
static const char *fieldtype2str(drizzle_column_type_t type)
2857
2941
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";
2942
case DRIZZLE_COLUMN_TYPE_BLOB: return "BLOB";
2943
case DRIZZLE_COLUMN_TYPE_DATE: return "DATE";
2944
case DRIZZLE_COLUMN_TYPE_DATETIME: return "DATETIME";
2945
case DRIZZLE_COLUMN_TYPE_NEWDECIMAL: return "DECIMAL";
2946
case DRIZZLE_COLUMN_TYPE_DOUBLE: return "DOUBLE";
2947
case DRIZZLE_COLUMN_TYPE_ENUM: return "ENUM";
2948
case DRIZZLE_COLUMN_TYPE_LONG: return "LONG";
2949
case DRIZZLE_COLUMN_TYPE_LONGLONG: return "LONGLONG";
2950
case DRIZZLE_COLUMN_TYPE_NULL: return "NULL";
2951
case DRIZZLE_COLUMN_TYPE_TIMESTAMP: return "TIMESTAMP";
2952
case DRIZZLE_COLUMN_TYPE_TINY: return "TINY";
2953
case DRIZZLE_COLUMN_TYPE_VIRTUAL: return "VIRTUAL";
2870
2954
default: return "?-unknown-?";
2874
static char *fieldflags2str(uint f) {
2958
static char *fieldflags2str(uint32_t f) {
2875
2959
static char buf[1024];
2878
2962
#define ff2s_check_flag(X) \
2879
if (f & X ## _FLAG) { s=my_stpcpy(s, # X " "); f &= ~ X ## _FLAG; }
2963
if (f & DRIZZLE_COLUMN_FLAGS_ ## X) { s=strcpy(s, # X " ")+strlen(# X " "); \
2964
f &= ~ DRIZZLE_COLUMN_FLAGS_ ## X; }
2880
2965
ff2s_check_flag(NOT_NULL);
2881
2966
ff2s_check_flag(PRI_KEY);
2882
2967
ff2s_check_flag(UNIQUE_KEY);
2921
3006
"Decimals: %u\n"
2922
3007
"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));
3009
drizzle_column_name(field), drizzle_column_catalog(field),
3010
drizzle_column_db(field), drizzle_column_table(field),
3011
drizzle_column_orig_table(field),
3012
fieldtype2str(drizzle_column_type(field)),
3013
get_charset_name(drizzle_column_charset(field)),
3014
drizzle_column_charset(field), drizzle_column_size(field),
3015
drizzle_column_max_size(field), drizzle_column_decimals(field),
3016
fieldflags2str(drizzle_column_flags(field)));
2930
3018
tee_puts("", PAGER);
2935
print_table_data(DRIZZLE_RES *result)
3023
print_table_data(drizzle_result_st *result)
2938
DRIZZLE_FIELD *field;
3026
drizzle_return_t ret;
3027
drizzle_column_st *field;
2940
3029
string separator;
2942
3031
separator.reserve(256);
2944
num_flag=(bool*) my_malloc(sizeof(bool)*drizzle_num_fields(result),
3033
num_flag=(bool*) malloc(sizeof(bool)*drizzle_result_column_count(result));
2946
3034
if (column_types_flag)
2948
3036
print_field_types(result);
2949
if (!drizzle_num_rows(result))
3037
if (!drizzle_result_row_count(result))
2951
drizzle_field_seek(result,0);
3039
drizzle_column_seek(result,0);
2953
3041
separator.append("+");
2954
while ((field = drizzle_fetch_field(result)))
3042
while ((field = drizzle_column_next(result)))
2956
uint32_t length= column_names ? field->name_length : 0;
3044
uint32_t x, length= 0;
3048
uint32_t name_length= strlen(drizzle_column_name(field));
3050
/* Check if the max_byte value is really the maximum in terms
3051
of visual length since multibyte characters can affect the
3052
length of the separator. */
3053
length= charset_info->cset->numcells(charset_info,
3054
drizzle_column_name(field),
3055
drizzle_column_name(field) +
3058
if (name_length == drizzle_column_max_size(field))
3060
if (length < drizzle_column_max_size(field))
3061
drizzle_column_set_max_size(field, length);
3065
length= name_length;
2958
length=max(length,field->length);
3070
length=max(length,drizzle_column_size(field));
2960
length=max(length,field->max_length);
2961
if (length < 4 && !(field->flags & NOT_NULL_FLAG))
3072
length=max(length,(uint32_t)drizzle_column_max_size(field));
3074
!(drizzle_column_flags(field) & DRIZZLE_COLUMN_FLAGS_NOT_NULL))
2962
3076
// Room for "NULL"
2964
field->max_length=length;
3079
drizzle_column_set_max_size(field, length);
2966
3081
for (x=0; x< (length+2); x++)
2967
3082
separator.append("-");
2968
3083
separator.append("+");
2971
3086
tee_puts((char*) separator.c_str(), PAGER);
2972
3087
if (column_names)
2974
drizzle_field_seek(result,0);
3089
drizzle_column_seek(result,0);
2975
3090
(void) tee_fputs("|", PAGER);
2976
for (uint off=0; (field = drizzle_fetch_field(result)) ; off++)
3091
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;
3093
uint32_t name_length= (uint32_t) strlen(drizzle_column_name(field));
3094
uint32_t numcells= charset_info->cset->numcells(charset_info,
3095
drizzle_column_name(field),
3096
drizzle_column_name(field) +
3098
uint32_t display_length= drizzle_column_max_size(field) + name_length -
2983
3100
tee_fprintf(PAGER, " %-*s |",(int) min(display_length,
2984
3101
MAX_COLUMN_LENGTH),
2986
num_flag[off]= ((field->type <= DRIZZLE_TYPE_LONGLONG) ||
2987
(field->type == DRIZZLE_TYPE_NEWDECIMAL));
3102
drizzle_column_name(field));
3103
num_flag[off]= ((drizzle_column_type(field) <= DRIZZLE_COLUMN_TYPE_LONGLONG) ||
3104
(drizzle_column_type(field) == DRIZZLE_COLUMN_TYPE_NEWDECIMAL));
2989
3106
(void) tee_fputs("\n", PAGER);
2990
3107
tee_puts((char*) separator.c_str(), PAGER);
2993
while ((cur= drizzle_fetch_row(result)))
2995
if (interrupted_query)
3114
cur= drizzle_row_buffer(result, &ret);
3115
if (ret != DRIZZLE_RETURN_OK)
3117
(void)put_error(&con, result);
3122
cur= drizzle_row_next(result);
3124
if (cur == NULL || interrupted_query)
2997
uint32_t *lengths= drizzle_fetch_lengths(result);
3127
size_t *lengths= drizzle_row_field_sizes(result);
2998
3128
(void) tee_fputs("| ", PAGER);
2999
drizzle_field_seek(result, 0);
3000
for (uint off= 0; off < drizzle_num_fields(result); off++)
3129
drizzle_column_seek(result, 0);
3130
for (uint32_t off= 0; off < drizzle_result_column_count(result); off++)
3002
3132
const char *buffer;
3004
uint field_max_length;
3005
uint visible_length;
3133
uint32_t data_length;
3134
uint32_t field_max_length;
3135
uint32_t visible_length;
3136
uint32_t extra_padding;
3008
3138
if (cur[off] == NULL)
3138
print_table_data_vertically(DRIZZLE_RES *result)
3273
print_table_data_vertically(drizzle_result_st *result)
3142
DRIZZLE_FIELD *field;
3276
drizzle_return_t ret;
3277
uint32_t max_length=0;
3278
drizzle_column_st *field;
3144
while ((field = drizzle_fetch_field(result)))
3280
while ((field = drizzle_column_next(result)))
3146
uint length= field->name_length;
3282
uint32_t length= strlen(drizzle_column_name(field));
3147
3283
if (length > max_length)
3148
3284
max_length= length;
3149
field->max_length=length;
3285
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++)
3288
for (uint32_t row_count=1;; row_count++)
3155
if (interrupted_query)
3292
cur= drizzle_row_buffer(result, &ret);
3293
if (ret != DRIZZLE_RETURN_OK)
3295
(void)put_error(&con, result);
3300
cur= drizzle_row_next(result);
3302
if (cur == NULL || interrupted_query)
3157
drizzle_field_seek(result,0);
3304
drizzle_column_seek(result,0);
3158
3305
tee_fprintf(PAGER,
3159
3306
"*************************** %d. row ***************************\n", row_count);
3160
for (uint off=0; off < drizzle_num_fields(result); off++)
3307
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);
3309
field= drizzle_column_next(result);
3310
tee_fprintf(PAGER, "%*s: ",(int) max_length,drizzle_column_name(field));
3164
3311
tee_fprintf(PAGER, "%s\n",cur[off] ? (char*) cur[off] : "NULL");
3314
drizzle_row_free(result, cur);
3170
3319
/* print_warnings should be called right after executing a statement */
3172
static void print_warnings()
3321
static void print_warnings(uint32_t error_code)
3175
DRIZZLE_RES *result;
3324
drizzle_result_st result;
3177
3326
uint64_t num_rows;
3179
/* Save current error before calling "show warnings" */
3180
uint error= drizzle_errno(&drizzle);
3327
uint32_t new_code= 0;
3182
3329
/* Get the warnings */
3183
3330
query= "show warnings";
3184
drizzle_real_query_for_lazy(query, strlen(query));
3185
drizzle_store_result_for_lazy(&result);
3331
drizzleclient_real_query_for_lazy(query, strlen(query),&result,&new_code);
3332
drizzleclient_store_result_for_lazy(&result);
3187
3334
/* Bail out when no warnings */
3188
if (!(num_rows= drizzle_num_rows(result)))
3335
if (!(num_rows= drizzle_result_row_count(&result)))
3191
cur= drizzle_fetch_row(result);
3338
cur= drizzle_row_next(&result);
3194
3341
Don't print a duplicate of the current error. It is possible for SHOW
3253
print_tab_data(DRIZZLE_RES *result)
3403
print_tab_data(drizzle_result_st *result)
3256
DRIZZLE_FIELD *field;
3406
drizzle_return_t ret;
3407
drizzle_column_st *field;
3259
3410
if (opt_silent < 2 && column_names)
3262
while ((field = drizzle_fetch_field(result)))
3413
while ((field = drizzle_column_next(result)))
3265
3416
(void) tee_fputs("\t", PAGER);
3266
(void) tee_fputs(field->name, PAGER);
3417
(void) tee_fputs(drizzle_column_name(field), PAGER);
3268
3419
(void) tee_fputs("\n", PAGER);
3270
while ((cur = drizzle_fetch_row(result)))
3272
lengths= drizzle_fetch_lengths(result);
3425
cur= drizzle_row_buffer(result, &ret);
3426
if (ret != DRIZZLE_RETURN_OK)
3428
(void)put_error(&con, result);
3433
cur= drizzle_row_next(result);
3438
lengths= drizzle_row_field_sizes(result);
3273
3439
safe_put_field(cur[0],lengths[0]);
3274
for (uint off=1 ; off < drizzle_num_fields(result); off++)
3440
for (uint32_t off=1 ; off < drizzle_result_column_count(result); off++)
3276
3442
(void) tee_fputs("\t", PAGER);
3277
3443
safe_put_field(cur[off], lengths[off]);
3279
3445
(void) tee_fputs("\n", PAGER);
3447
drizzle_row_free(result, cur);
3284
com_tee(string *buffer __attribute__((unused)), const char *line )
3452
com_tee(string *, const char *line )
3286
char file_name[FN_REFLEN], *end, *param;
3454
char file_name[FN_REFLEN], *end;
3288
3457
if (status.batch)
3727
3907
sql_connect(char *host,char *database,char *user,char *password,
3910
drizzle_return_t ret;
3733
drizzle_close(&drizzle);
3915
drizzle_con_free(&con);
3916
drizzle_free(&drizzle);
3735
3918
drizzle_create(&drizzle);
3919
if (drizzle_con_add_tcp(&drizzle, &con, host, opt_drizzle_port, user,
3920
password, database, DRIZZLE_CON_NONE) == NULL)
3922
(void) put_error(&con, NULL);
3923
(void) fflush(stdout);
3927
/* XXX add this back in
3736
3928
if (opt_connect_timeout)
3738
uint timeout=opt_connect_timeout;
3739
drizzle_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3930
uint32_t timeout=opt_connect_timeout;
3931
drizzleclient_options(&drizzle,DRIZZLE_OPT_CONNECT_TIMEOUT,
3740
3932
(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);
3936
/* XXX Do we need this?
3748
3937
if (safe_updates)
3750
3939
char init_command[100];
3751
3940
sprintf(init_command,
3752
3941
"SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=%"PRIu32
3753
",SQL_MAX_JOIN_SIZE=%"PRIu32,
3942
",MAX_JOIN_SIZE=%"PRIu32,
3754
3943
select_limit, max_join_size);
3755
drizzle_options(&drizzle, DRIZZLE_INIT_COMMAND, init_command);
3944
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))
3947
if ((ret= drizzle_con_connect(&con)) != DRIZZLE_RETURN_OK)
3762
(drizzle_errno(&drizzle) != CR_CONN_HOST_ERROR &&
3763
drizzle_errno(&drizzle) != CR_CONNECTION_ERROR))
3949
if (!silent || (ret != DRIZZLE_RETURN_GETADDRINFO &&
3950
ret != DRIZZLE_RETURN_COULD_NOT_CONNECT))
3765
(void) put_error(&drizzle);
3952
(void) put_error(&con, NULL);
3766
3953
(void) fflush(stdout);
3767
3954
return ignore_errors ? -1 : 1; // Abort
3769
3956
return -1; // Retryable
3772
3960
drizzle.reconnect= debug_info_flag; // We want to know if this happens
3773
3962
build_completion_hash(opt_rehash, 1);
3779
com_status(string *buffer __attribute__((unused)),
3780
const char *line __attribute__((unused)))
3968
com_status(string *, const char *)
3784
DRIZZLE_RES *result;
3974
drizzle_result_st result;
3975
drizzle_return_t ret;
3786
3977
tee_puts("--------------", stdout);
3787
3978
usage(1); /* Print version */
3790
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_thread_id(&drizzle));
3981
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",drizzle_con_thread_id(&con));
3792
3983
Don't remove "limit 1",
3793
3984
it is protection againts SQL_SELECT_LIMIT=0
3795
if (!drizzle_query(&drizzle,"select DATABASE(), USER() limit 1") &&
3796
(result=drizzle_use_result(&drizzle)))
3986
if (drizzle_query_str(&con,&result,"select DATABASE(), USER() limit 1",
3987
&ret) != NULL && ret == DRIZZLE_RETURN_OK &&
3988
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3798
DRIZZLE_ROW cur=drizzle_fetch_row(result);
3990
drizzle_row_t cur=drizzle_row_next(&result);
3801
3993
tee_fprintf(stdout, "Current database:\t%s\n", cur[0] ? cur[0] : "");
3802
3994
tee_fprintf(stdout, "Current user:\t\t%s\n", cur[1]);
3804
drizzle_free_result(result);
3996
drizzle_result_free(&result);
3998
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
3999
drizzle_result_free(&result);
3806
4000
tee_puts("SSL:\t\t\tNot in use", stdout);
3821
4015
tee_fprintf(stdout, "Current pager:\t\t%s\n", pager);
3822
4016
tee_fprintf(stdout, "Using outfile:\t\t'%s'\n", opt_outfile ? outfile : "");
3823
4017
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)))
4018
tee_fprintf(stdout, "Server version:\t\t%s\n", server_version_string(&con));
4019
tee_fprintf(stdout, "Protocol version:\t%d\n", drizzle_con_protocol_version(&con));
4020
tee_fprintf(stdout, "Connection:\t\t%s\n", drizzle_con_host(&con));
4021
/* XXX need to save this from result
4022
if ((id= drizzleclient_insert_id(&drizzle)))
3828
4023
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);
4026
if (strcmp(drizzle_con_uds(&con), ""))
4027
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");
4029
tee_fprintf(stdout, "TCP port:\t\t%d\n", drizzle_con_port(&con));
3852
4031
if (safe_updates)
3868
4047
static const char *
3869
server_version_string(DRIZZLE *con)
4048
server_version_string(drizzle_con_st *local_con)
3871
static char buf[MAX_SERVER_VERSION_LENGTH] = "";
4050
static string buf("");
4051
static bool server_version_string_reserved= false;
4053
if (!server_version_string_reserved)
4055
buf.reserve(MAX_SERVER_VERSION_LENGTH);
4056
server_version_string_reserved= true;
3873
4058
/* Only one thread calls this, so no synchronization is needed */
3874
4059
if (buf[0] == '\0')
3877
DRIZZLE_RES *result;
4061
drizzle_result_st result;
4062
drizzle_return_t ret;
3879
bufp= my_stpncpy(buf, drizzle_get_server_info(con), sizeof buf);
4064
buf.append(drizzle_con_server_version(local_con));
3881
4066
/* "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)))
4067
(void)drizzle_query_str(local_con, &result,
4068
"select @@version_comment limit 1", &ret);
4069
if (ret == DRIZZLE_RETURN_OK &&
4070
drizzle_result_buffer(&result) == DRIZZLE_RETURN_OK)
3885
DRIZZLE_ROW cur = drizzle_fetch_row(result);
4072
drizzle_row_t cur = drizzle_row_next(&result);
3886
4073
if (cur && cur[0])
3888
bufp = strxnmov(bufp, sizeof buf - (bufp - buf), " ", cur[0], NULL);
3890
drizzle_free_result(result);
4078
drizzle_result_free(&result);
3893
/* str*nmov doesn't guarantee NUL-termination */
3894
if (bufp == buf + sizeof buf)
3895
buf[sizeof buf - 1] = '\0';
4080
else if (ret == DRIZZLE_RETURN_ERROR_CODE)
4081
drizzle_result_free(&result);
3902
put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
4088
put_info(const char *str,INFO_TYPE info_type, uint32_t error, const char *sqlstate)
3904
4090
FILE *file= (info_type == INFO_ERROR ? stderr : stdout);
3905
4091
static int inited=0;
4280
4484
static void add_int_to_prompt(int toadd)
4283
int10_to_str(toadd, buffer, 10);
4284
processed_prompt->append(buffer);
4486
ostringstream buffer;
4488
processed_prompt->append(buffer.str().c_str());
4287
4491
static void init_username()
4289
4494
free(full_username);
4290
4495
free(part_username);
4292
DRIZZLE_RES *result;
4293
if (!drizzle_query(&drizzle,"select USER()") &&
4294
(result=drizzle_use_result(&drizzle)))
4497
drizzle_result_st *result;
4498
if (!drizzleclient_query(&drizzle,"select USER()") &&
4499
(result=drizzleclient_use_result(&drizzle)))
4296
DRIZZLE_ROW cur=drizzle_fetch_row(result);
4501
drizzle_row_t cur=drizzleclient_fetch_row(result);
4297
4502
full_username= strdup(cur[0]);
4298
4503
part_username= strdup(strtok(cur[0],"@"));
4299
(void) drizzle_fetch_row(result); // Read eof
4504
(void) drizzleclient_fetch_row(result); // Read eof
4303
static int com_prompt(string *buffer __attribute__((unused)),
4509
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);
4511
const char *ptr=strchr(line, ' ');
4311
4513
tee_fprintf(stdout, "Returning to default PROMPT of %s\n",
4312
4514
default_prompt);
4516
char * tmpptr= strdup(ptr ? ptr+1 : default_prompt);
4518
tee_fprintf(stdout, "Memory allocation error. Not changing prompt\n");
4521
free(current_prompt);
4522
current_prompt= tmpptr;
4314
4523
tee_fprintf(stdout, "PROMPT set to '%s'\n", current_prompt);