@@ -139,11 +139,13 @@ typedef struct
139
139
int int_val ;
140
140
int alloced_len ;
141
141
int int_dirty ; /* do not update string if int is updated until first read */
142
+ int alloced ;
142
143
} VAR ;
143
144
144
145
VAR var_reg [10 ];
145
146
/*Perl/shell-like variable registers */
146
147
HASH var_hash ;
148
+ int disable_query_log = 0 ;
147
149
148
150
struct connection cons [MAX_CONS ];
149
151
struct connection * cur_con , * next_con , * cons_end ;
@@ -165,6 +167,7 @@ Q_DIRTY_CLOSE, Q_REPLACE,
165
167
Q_PING , Q_EVAL ,
166
168
Q_RPL_PROBE , Q_ENABLE_RPL_PARSE ,
167
169
Q_DISABLE_RPL_PARSE , Q_EVAL_RESULT ,
170
+ Q_ENABLE_QUERY_LOG , Q_DISABLE_QUERY_LOG ,
168
171
Q_UNKNOWN , /* Unknown command. */
169
172
Q_COMMENT , /* Comments, ignored. */
170
173
Q_COMMENT_WITH_COMMAND
@@ -196,6 +199,7 @@ const char *command_names[] = {
196
199
"ping" , "eval" ,
197
200
"rpl_probe" , "enable_rpl_parse" ,
198
201
"disable_rpl_parse" , "eval_result" ,
202
+ "enable_query_log" , "disable_query_log" ,
199
203
0
200
204
};
201
205
@@ -619,14 +623,26 @@ int var_query_set(VAR* v, const char* p, const char** p_end)
619
623
return 0 ;
620
624
}
621
625
626
+ void var_copy (VAR * dest , VAR * src )
627
+ {
628
+ dest -> int_val = src -> int_val ;
629
+ dest -> int_dirty = src -> int_dirty ;
630
+ if (dest -> alloced_len < src -> alloced_len &&
631
+ !(dest -> str_val = my_realloc (dest -> str_val ,src -> alloced_len ,
632
+ MYF (MY_WME ))))
633
+ die ("Out of memory" );
634
+ dest -> str_val_len = src -> str_val_len ;
635
+ memcpy (dest -> str_val ,src -> str_val ,src -> str_val_len );
636
+ }
637
+
622
638
int eval_expr (VAR * v , const char * p , const char * * p_end )
623
639
{
624
640
VAR * vp ;
625
641
if (* p == '$' )
626
642
{
627
643
if ((vp = var_get (p ,p_end ,0 )))
628
644
{
629
- memcpy (v , vp , sizeof ( * v ) );
645
+ var_copy (v , vp );
630
646
return 0 ;
631
647
}
632
648
}
@@ -699,6 +715,7 @@ int do_system(struct st_query* q)
699
715
if (system (expr_buf ) && q -> abort_on_error )
700
716
die ("system command '%s' failed" , expr_buf );
701
717
}
718
+ var_free (& v );
702
719
return 0 ;
703
720
}
704
721
@@ -714,6 +731,7 @@ int do_echo(struct st_query* q)
714
731
write (1 , v .str_val , v .str_val_len );
715
732
}
716
733
write (1 , "\n" , 1 );
734
+ var_free (& v );
717
735
return 0 ;
718
736
}
719
737
@@ -1190,10 +1208,10 @@ int do_done(struct st_query* q)
1190
1208
parser .current_line = * -- cur_block ;
1191
1209
}
1192
1210
else
1193
- {
1194
- ++ parser .current_line ;
1195
- -- cur_block ;
1196
- }
1211
+ {
1212
+ ++ parser .current_line ;
1213
+ -- cur_block ;
1214
+ }
1197
1215
return 0 ;
1198
1216
}
1199
1217
@@ -1202,7 +1220,6 @@ int do_while(struct st_query* q)
1202
1220
char * p = q -> first_argument ;
1203
1221
const char * expr_start , * expr_end ;
1204
1222
VAR v ;
1205
- var_init (& v ,0 ,0 ,0 ,0 );
1206
1223
if (cur_block == block_stack_end )
1207
1224
die ("Nesting too deeply" );
1208
1225
if (!* block_ok )
@@ -1219,6 +1236,7 @@ int do_while(struct st_query* q)
1219
1236
expr_end = strrchr (expr_start , ')' );
1220
1237
if (!expr_end )
1221
1238
die ("missing ')' in while" );
1239
+ var_init (& v ,0 ,0 ,0 ,0 );
1222
1240
eval_expr (& v , ++ expr_start , & expr_end );
1223
1241
* cur_block ++ = parser .current_line ++ ;
1224
1242
if (!v .int_val )
@@ -1228,6 +1246,7 @@ int do_while(struct st_query* q)
1228
1246
}
1229
1247
else
1230
1248
* ++ block_ok = 1 ;
1249
+ var_free (& v );
1231
1250
return 0 ;
1232
1251
}
1233
1252
@@ -1727,6 +1746,11 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
1727
1746
1728
1747
if ((flags & QUERY_SEND ) && mysql_send_query (mysql , query , query_len ))
1729
1748
die ("At line %u: unable to send query '%s'" , start_lineno , query );
1749
+ if ((flags & QUERY_SEND ) && !disable_query_log )
1750
+ {
1751
+ dynstr_append_mem (ds ,query ,query_len );
1752
+ dynstr_append_mem (ds ,";\n" ,2 );
1753
+ }
1730
1754
if (!(flags & QUERY_REAP ))
1731
1755
return 0 ;
1732
1756
@@ -1743,7 +1767,11 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
1743
1767
for (i = 0 ; q -> expected_errno [i ] ; i ++ )
1744
1768
{
1745
1769
if ((q -> expected_errno [i ] == mysql_errno (mysql )))
1770
+ {
1771
+ dynstr_append (ds ,mysql_error (mysql ));
1772
+ dynstr_append_mem (ds ,"\n" ,1 );
1746
1773
goto end ; /* Ok */
1774
+ }
1747
1775
}
1748
1776
if (i )
1749
1777
{
@@ -1887,6 +1915,7 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val,
1887
1915
die ("Out of memory" );
1888
1916
1889
1917
tmp_var -> name = (name ) ? (char * )tmp_var + sizeof (* tmp_var ) : 0 ;
1918
+ tmp_var -> alloced = (v == 0 );
1890
1919
1891
1920
if (!(tmp_var -> str_val = my_malloc (val_alloc_len , MYF (MY_WME ))))
1892
1921
die ("Out of memory" );
@@ -1905,7 +1934,8 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val,
1905
1934
static void var_free (void * v )
1906
1935
{
1907
1936
my_free (((VAR * ) v )-> str_val , MYF (MY_WME ));
1908
- my_free ((char * ) v , MYF (MY_WME ));
1937
+ if (((VAR * )v )-> alloced )
1938
+ my_free ((char * ) v , MYF (MY_WME ));
1909
1939
}
1910
1940
1911
1941
@@ -2008,6 +2038,8 @@ int main(int argc, char** argv)
2008
2038
case Q_RPL_PROBE : do_rpl_probe (q ); break ;
2009
2039
case Q_ENABLE_RPL_PARSE : do_enable_rpl_parse (q ); break ;
2010
2040
case Q_DISABLE_RPL_PARSE : do_disable_rpl_parse (q ); break ;
2041
+ case Q_ENABLE_QUERY_LOG : disable_query_log = 0 ; break ;
2042
+ case Q_DISABLE_QUERY_LOG : disable_query_log = 1 ; break ;
2011
2043
case Q_SOURCE : do_source (q ); break ;
2012
2044
case Q_SLEEP : do_sleep (q ); break ;
2013
2045
case Q_INC : do_inc (q ); break ;
0 commit comments