summaryrefslogtreecommitdiff
path: root/mysql-test/include/wait_show_condition.inc
blob: 68e05ce4644cd130a0b91f6d2c2273dea2f6760c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# include/wait_show_condition.inc
#
# SUMMARY
#
#    Waits until the show statement ($show_statement) has one or all of the
#    rows of the result set for the field ($field) a value which fulfils
#    a condition ($condition), or the operation times out.
#    
#
# USAGE
#
#    All rows of the result must fulfil the condition if $all_rows_fulfil is 1
#    else at least one of the result must fulfil the condition.
#    let $wait_for_all= 1; 
#    let $show_statement= SHOW PROCESSLIST;
#    let $field= State;
#    let $condition= = 'Updating';
#    --source include/wait_show_condition.inc
#
#   OR
#
#    let $wait_timeout= 60; # Override default of 30 seconds with 60.
#    let $show_statement= SHOW PROCESSLIST;
#    let $field= State;
#    let $condition= = 'Updating';
#    --source include/wait_show_condition.inc
#
# Please do not use this use routine if you can replace the SHOW statement
# with a select. In such a case include/wait_condition.inc is recommended.
#
# Created: 2009-02-18 mleich
#

let $max_run_time= 30;
if ($wait_timeout)
{
  let $max_run_time= $wait_timeout;
}
# Reset $wait_timeout so that its value won't be used on subsequent
# calls, and default will be used instead.
let $wait_timeout= 0;

# The smallest timespan till UNIX_TIMESTAMP() gets incremented is ~0 seconds.
# We add one second to avoid the case that somebody measures timespans on a
# real clock with fractions of seconds, detects that n seconds are sufficient,
# assigns n to this routine and suffers because he sometimes gets n - 1
# seconds in reality.
inc $max_run_time;

let $found= 0;
let $max_end_time= `SELECT UNIX_TIMESTAMP() + $max_run_time`;

if ($wait_for_all != 1)
{
  while (`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`)
  {
     # Sleep a bit to avoid too heavy load.
     real_sleep 0.2;
     let $rowno= 1;
     let $process_result= 1;
     let $do_loop= 1;
     while ($do_loop)
     {
        let $field_value= query_get_value($show_statement, $field, $rowno);
        if (`SELECT '$field_value' $condition`)
        {
           let $found= 1;
	   let $do_loop= 0;
        }
        if ($field_value == No such row)
        {
           # We are behind the last row of the result set.
           let $process_result= 0;
	   let $do_loop= 0;
        }
        inc $rowno;
     }
  }
}

if ($wait_for_all == 1)
{
  while (`SELECT UNIX_TIMESTAMP() <= $max_end_time AND $found = 0`)
  {
     # Sleep a bit to avoid too heavy load.
     real_sleep 0.2;
     let $rowno= 1;
     let $process_result= 1;
     let $do_loop= 1;
     while ($do_loop)
     {
        let $field_value= query_get_value($show_statement, $field, $rowno);
        if ($field_value == No such row)
        {
           let $found= 1;
	   let $do_loop= 0;
        }
        if (`SELECT $found = 0 AND NOT '$field_value' $condition`)
        {
           let process_result= 0;
	   let $do_loop= 0;
        }
        inc $rowno;
     }
  }
}

if (!$found)
{
  echo # Timeout in include/wait_show_condition.inc for $condition;
  echo #         show_statement : $show_statement;
  echo #         field          : $field;
  echo #         condition      : $condition;
  echo #         max_run_time   : $max_run_time;
}