@@ -164,7 +164,7 @@ Q_SEND, Q_REAP,
164
164
Q_DIRTY_CLOSE , Q_REPLACE ,
165
165
Q_PING , Q_EVAL ,
166
166
Q_RPL_PROBE , Q_ENABLE_RPL_PARSE ,
167
- Q_DISABLE_RPL_PARSE ,
167
+ Q_DISABLE_RPL_PARSE , Q_EVAL_RESULT ,
168
168
Q_UNKNOWN , /* Unknown command. */
169
169
Q_COMMENT , /* Comments, ignored. */
170
170
Q_COMMENT_WITH_COMMAND
@@ -173,7 +173,7 @@ Q_COMMENT_WITH_COMMAND
173
173
/* this should really be called command */
174
174
struct st_query
175
175
{
176
- char * query , * query_buf ,* first_argument ;
176
+ char * query , * query_buf ,* first_argument , * end ;
177
177
int first_word_len ;
178
178
my_bool abort_on_error , require_file ;
179
179
uint expected_errno [MAX_EXPECTED_ERRORS ];
@@ -195,7 +195,7 @@ const char *command_names[] = {
195
195
"dirty_close" , "replace_result" ,
196
196
"ping" , "eval" ,
197
197
"rpl_probe" , "enable_rpl_parse" ,
198
- "disable_rpl_parse" ,
198
+ "disable_rpl_parse" , "eval_result" ,
199
199
0
200
200
};
201
201
@@ -238,10 +238,12 @@ void free_pointer_array(POINTER_ARRAY *pa);
238
238
static int initialize_replace_buffer (void );
239
239
static void free_replace_buffer (void );
240
240
static void do_eval (DYNAMIC_STRING * query_eval , const char * query );
241
+ void str_to_file (const char * fname , char * str , int size );
241
242
242
243
struct st_replace * glob_replace ;
243
244
static char * out_buff ;
244
245
static uint out_length ;
246
+ static int eval_result = 0 ;
245
247
246
248
static void do_eval (DYNAMIC_STRING * query_eval , const char * query )
247
249
{
@@ -298,7 +300,7 @@ static void close_files()
298
300
{
299
301
do
300
302
{
301
- if (* cur_file != stdin )
303
+ if (* cur_file != stdin && * cur_file )
302
304
my_fclose (* cur_file ,MYF (0 ));
303
305
} while (cur_file -- != file_stack );
304
306
}
@@ -393,25 +395,53 @@ int hex_val(int c)
393
395
int dyn_string_cmp (DYNAMIC_STRING * ds , const char * fname )
394
396
{
395
397
MY_STAT stat_info ;
396
- char * tmp ;
398
+ char * tmp , * res_ptr ;
399
+ char eval_file [FN_REFLEN ];
397
400
int res ;
401
+ uint res_len ;
398
402
int fd ;
403
+ DYNAMIC_STRING res_ds ;
399
404
DBUG_ENTER ("dyn_string_cmp" );
400
405
401
406
if (!my_stat (fname , & stat_info , MYF (MY_WME )))
402
407
die (NullS );
403
- if (stat_info .st_size != ds -> length )
408
+ if (! eval_result && stat_info .st_size != ds -> length )
404
409
DBUG_RETURN (2 );
405
- if (!(tmp = (char * ) my_malloc (ds -> length , MYF (MY_WME ))))
410
+ if (!(tmp = (char * ) my_malloc (stat_info . st_size + 1 , MYF (MY_WME ))))
406
411
die (NullS );
407
412
if ((fd = my_open (fname , O_RDONLY , MYF (MY_WME ))) < 0 )
408
413
die (NullS );
409
414
if (my_read (fd , (byte * )tmp , stat_info .st_size , MYF (MY_WME |MY_NABP )))
410
415
die (NullS );
411
- res = (memcmp (tmp , ds -> str , stat_info .st_size )) ? 1 : 0 ;
416
+ tmp [stat_info .st_size ] = 0 ;
417
+ init_dynamic_string (& res_ds , "" , 0 , 65536 );
418
+ if (eval_result )
419
+ {
420
+ do_eval (& res_ds , tmp );
421
+ res_ptr = res_ds .str ;
422
+ if ((res_len = res_ds .length ) != ds -> length )
423
+ {
424
+ res = 2 ;
425
+ goto err ;
426
+ }
427
+ }
428
+ else
429
+ {
430
+ res_ptr = tmp ;
431
+ res_len = stat_info .st_size ;
432
+ }
433
+
434
+ res = (memcmp (res_ptr , ds -> str , res_len )) ? 1 : 0 ;
435
+
436
+ err :
437
+ if (res && eval_result )
438
+ str_to_file (fn_format (eval_file , fname , "" , ".eval" ,2 ), res_ptr ,
439
+ res_len );
440
+
412
441
my_free ((gptr ) tmp , MYF (0 ));
413
442
my_close (fd , MYF (MY_WME ));
414
-
443
+ dynstr_free (& res_ds );
444
+
415
445
DBUG_RETURN (res );
416
446
}
417
447
@@ -508,7 +538,6 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
508
538
char * var_val_end )
509
539
{
510
540
int digit ;
511
- int val_len ;
512
541
VAR * v ;
513
542
if (* var_name ++ != '$' )
514
543
{
@@ -523,21 +552,8 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
523
552
}
524
553
else
525
554
v = var_reg + digit ;
526
- if (v -> alloced_len < (val_len = (int )(var_val_end - var_val )+ 1 ))
527
- {
528
- v -> alloced_len = (val_len < MIN_VAR_ALLOC ) ? MIN_VAR_ALLOC : val_len ;
529
- if (!(v -> str_val =
530
- v -> str_val ? my_realloc (v -> str_val , v -> alloced_len , MYF (MY_WME )) :
531
- my_malloc (v -> alloced_len , MYF (MY_WME ))))
532
- die ("Out of memory" );
533
- }
534
- val_len -- ;
535
- memcpy (v -> str_val , var_val , val_len );
536
- v -> str_val_len = val_len ;
537
- v -> str_val [val_len ] = 0 ;
538
- v -> int_val = atoi (v -> str_val );
539
- v -> int_dirty = 0 ;
540
- return 0 ;
555
+
556
+ return eval_expr (v , var_val , (const char * * )& var_val_end );
541
557
}
542
558
543
559
int open_file (const char * name )
@@ -565,6 +581,35 @@ int do_source(struct st_query* q)
565
581
return open_file (name );
566
582
}
567
583
584
+ int var_query_set (VAR * v , const char * p , const char * * p_end )
585
+ {
586
+ char * end = (char * )((p_end && * p_end ) ? * p_end : p + strlen (p ));
587
+ MYSQL_RES * res ;
588
+ MYSQL_ROW row ;
589
+ MYSQL * mysql = & cur_con -> mysql ;
590
+ LINT_INIT (res );
591
+
592
+ while (end > p && * end != '`' )
593
+ -- end ;
594
+ if (p == end )
595
+ die ("Syntax error in query, missing '`'" );
596
+ ++ p ;
597
+
598
+ if (mysql_real_query (mysql , p , (int )(end - p )) ||
599
+ !(res = mysql_store_result (mysql )))
600
+ {
601
+ * end = 0 ;
602
+ die ("Error running query '%s': %s" , p , mysql_error (mysql ));
603
+ }
604
+
605
+ if ((row = mysql_fetch_row (res )) && row [0 ])
606
+ eval_expr (v , row [0 ], 0 );
607
+ else
608
+ eval_expr (v , "" , 0 );
609
+
610
+ mysql_free_result (res );
611
+ return 0 ;
612
+ }
568
613
569
614
int eval_expr (VAR * v , const char * p , const char * * p_end )
570
615
{
@@ -577,10 +622,27 @@ int eval_expr(VAR* v, const char* p, const char** p_end)
577
622
return 0 ;
578
623
}
579
624
}
625
+ else if (* p == '`' )
626
+ {
627
+ return var_query_set (v , p , p_end );
628
+ }
580
629
else
581
630
{
582
- v -> str_val = (char * )p ;
583
- v -> str_val_len = (p_end && * p_end ) ? (int ) (* p_end - p ) : (int ) strlen (p );
631
+ int new_val_len = (p_end && * p_end ) ?
632
+ (int ) (* p_end - p ) : (int ) strlen (p );
633
+ if (new_val_len + 1 >= v -> alloced_len )
634
+ {
635
+ v -> alloced_len = (new_val_len < MIN_VAR_ALLOC - 1 ) ?
636
+ MIN_VAR_ALLOC : new_val_len + 1 ;
637
+ if (!(v -> str_val =
638
+ v -> str_val ? my_realloc (v -> str_val , v -> alloced_len ,
639
+ MYF (MY_WME )) :
640
+ my_malloc (v -> alloced_len , MYF (MY_WME ))))
641
+ die ("Out of memory" );
642
+ }
643
+ v -> str_val_len = new_val_len ;
644
+ memcpy (v -> str_val , p , new_val_len );
645
+ v -> str_val [new_val_len ] = 0 ;
584
646
v -> int_val = atoi (p );
585
647
v -> int_dirty = 0 ;
586
648
return 0 ;
@@ -724,9 +786,7 @@ int do_let(struct st_query* q)
724
786
while (* p && isspace (* p ))
725
787
p ++ ;
726
788
var_val_start = p ;
727
- while (* p && !isspace (* p ))
728
- p ++ ;
729
- return var_set (var_name , var_name_end , var_val_start , p );
789
+ return var_set (var_name , var_name_end , var_val_start , q -> end );
730
790
}
731
791
732
792
int do_rpl_probe (struct st_query * __attribute__((unused )) q )
@@ -1400,7 +1460,7 @@ int read_query(struct st_query** q_ptr)
1400
1460
q -> first_word_len = (uint ) (p - q -> query );
1401
1461
while (* p && isspace (* p )) p ++ ;
1402
1462
q -> first_argument = p ;
1403
-
1463
+ q -> end = strend ( q -> query );
1404
1464
parser .read_lines ++ ;
1405
1465
return 0 ;
1406
1466
}
@@ -1787,11 +1847,13 @@ static VAR* var_init(const char* name, int name_len, const char* val,
1787
1847
if (!val_len )
1788
1848
val_len = strlen (val ) ;
1789
1849
val_alloc_len = val_len + 16 ; /* room to grow */
1790
- if (!(tmp_var = (VAR * )my_malloc (sizeof (* tmp_var ) + val_alloc_len
1850
+ if (!(tmp_var = (VAR * )my_malloc (sizeof (* tmp_var )
1791
1851
+ name_len , MYF (MY_WME ))))
1792
1852
die ("Out of memory" );
1793
1853
tmp_var -> name = (char * )tmp_var + sizeof (* tmp_var );
1794
- tmp_var -> str_val = tmp_var -> name + name_len ;
1854
+ if (!(tmp_var -> str_val = my_malloc (val_alloc_len , MYF (MY_WME ))))
1855
+ die ("Out of memory" );
1856
+
1795
1857
memcpy (tmp_var -> name , name , name_len );
1796
1858
memcpy (tmp_var -> str_val , val , val_len + 1 );
1797
1859
tmp_var -> name_len = name_len ;
@@ -1804,6 +1866,7 @@ static VAR* var_init(const char* name, int name_len, const char* val,
1804
1866
1805
1867
static void var_free (void * v )
1806
1868
{
1869
+ my_free (((VAR * )v )-> str_val , MYF (MY_WME ));
1807
1870
my_free (v , MYF (MY_WME ));
1808
1871
}
1809
1872
@@ -1901,6 +1964,7 @@ int main(int argc, char** argv)
1901
1964
case Q_ECHO : do_echo (q ); break ;
1902
1965
case Q_SYSTEM : do_system (q ); break ;
1903
1966
case Q_LET : do_let (q ); break ;
1967
+ case Q_EVAL_RESULT : eval_result = 1 ; break ;
1904
1968
case Q_EVAL :
1905
1969
if (q -> query == q -> query_buf )
1906
1970
q -> query += q -> first_word_len ;
0 commit comments