2023-04-28 08:09:26 +02:00
/* Copyright (c) 2008, 2023, Oracle and/or its affiliates.
2010-01-11 18:47:27 -07:00
This program is free software ; you can redistribute it and / or modify
2020-01-19 12:52:07 +01:00
it under the terms of the GNU General Public License , version 2.0 ,
as published by the Free Software Foundation .
This program is also distributed with certain software ( including
but not limited to OpenSSL ) that is licensed under separate terms ,
as designated in a particular file or component or in included license
documentation . The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL .
2010-01-11 18:47:27 -07:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
2020-01-19 12:52:07 +01:00
GNU General Public License , version 2.0 , for more details .
2010-01-11 18:47:27 -07:00
You should have received a copy of the GNU General Public License
2010-07-15 17:44:45 -06:00
along with this program ; if not , write to the Free Software Foundation ,
2019-05-11 18:08:32 +03:00
51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1335 USA */
2010-01-11 18:47:27 -07:00
/**
@ file storage / perfschema / table_setup_timers . cc
Table SETUP_TIMERS ( implementation ) .
*/
2010-07-15 17:44:45 -06:00
# include "my_global.h"
2019-12-10 15:35:00 +01:00
# include "my_thread.h"
2010-01-11 18:47:27 -07:00
# include "table_setup_timers.h"
# include "pfs_column_values.h"
# include "pfs_timer.h"
2019-12-10 15:35:00 +01:00
# include "field.h"
# include "derror.h" /* ER_THD */
2010-01-11 18:47:27 -07:00
2019-12-10 15:35:00 +01:00
# define COUNT_SETUP_TIMERS 5
2012-08-01 17:27:34 +03:00
2010-01-11 18:47:27 -07:00
static row_setup_timers all_setup_timers_data [ COUNT_SETUP_TIMERS ] =
{
2012-08-01 17:27:34 +03:00
{
{ C_STRING_WITH_LEN ( " idle " ) } ,
& idle_timer
} ,
2010-01-11 18:47:27 -07:00
{
{ C_STRING_WITH_LEN ( " wait " ) } ,
& wait_timer
2012-08-01 17:27:34 +03:00
} ,
{
{ C_STRING_WITH_LEN ( " stage " ) } ,
& stage_timer
} ,
{
{ C_STRING_WITH_LEN ( " statement " ) } ,
& statement_timer
2019-12-10 15:35:00 +01:00
} ,
{
{ C_STRING_WITH_LEN ( " transaction " ) } ,
& transaction_timer
2010-01-11 18:47:27 -07:00
}
} ;
THR_LOCK table_setup_timers : : m_table_lock ;
2022-07-29 14:48:01 +02:00
PFS_engine_table_share_state
table_setup_timers : : m_share_state = {
false /* m_checked */
} ;
2010-01-11 18:47:27 -07:00
PFS_engine_table_share
table_setup_timers : : m_share =
{
2010-11-03 16:42:33 +01:00
{ C_STRING_WITH_LEN ( " setup_timers " ) } ,
2010-01-11 18:47:27 -07:00
& pfs_updatable_acl ,
2019-12-10 15:35:00 +01:00
table_setup_timers : : create ,
2010-01-11 18:47:27 -07:00
NULL , /* write_row */
NULL , /* delete_all_rows */
2019-12-10 15:35:00 +01:00
table_setup_timers : : get_row_count ,
2010-01-11 18:47:27 -07:00
sizeof ( PFS_simple_index ) ,
& m_table_lock ,
2014-08-19 15:18:18 +04:00
{ C_STRING_WITH_LEN ( " CREATE TABLE setup_timers( "
2021-05-02 15:43:04 -05:00
" NAME VARCHAR(64) not null comment 'Type of instrument the timer is used for.', "
2021-09-10 17:16:18 +03:00
" TIMER_NAME ENUM ('CYCLE', 'NANOSECOND', 'MICROSECOND', 'MILLISECOND', 'TICK') not null comment 'Timer applying to the instrument type. Can be modified.') " ) } ,
2022-07-29 14:48:01 +02:00
false , /* m_perpetual */
false , /* m_optional */
& m_share_state
2010-01-11 18:47:27 -07:00
} ;
PFS_engine_table * table_setup_timers : : create ( void )
{
2019-12-10 15:35:00 +01:00
THD * thd = current_thd ;
push_warning_printf ( thd ,
2020-02-15 18:25:57 +01:00
Sql_condition : : WARN_LEVEL_WARN ,
2019-12-10 15:35:00 +01:00
ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT ,
ER_THD ( thd , ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT ) ,
" performance_schema.setup_timers " ) ;
2010-01-11 18:47:27 -07:00
return new table_setup_timers ( ) ;
}
2019-12-10 15:35:00 +01:00
ha_rows
table_setup_timers : : get_row_count ( void )
{
return COUNT_SETUP_TIMERS ;
}
2010-01-11 18:47:27 -07:00
table_setup_timers : : table_setup_timers ( )
: PFS_engine_table ( & m_share , & m_pos ) ,
m_row ( NULL ) , m_pos ( 0 ) , m_next_pos ( 0 )
{ }
void table_setup_timers : : reset_position ( void )
{
m_pos . m_index = 0 ;
m_next_pos . m_index = 0 ;
}
int table_setup_timers : : rnd_next ( void )
{
int result ;
m_pos . set_at ( & m_next_pos ) ;
if ( m_pos . m_index < COUNT_SETUP_TIMERS )
{
m_row = & all_setup_timers_data [ m_pos . m_index ] ;
m_next_pos . set_after ( & m_pos ) ;
result = 0 ;
}
else
{
m_row = NULL ;
result = HA_ERR_END_OF_FILE ;
}
return result ;
}
int table_setup_timers : : rnd_pos ( const void * pos )
{
set_position ( pos ) ;
2021-05-03 11:21:56 +02:00
assert ( m_pos . m_index < COUNT_SETUP_TIMERS ) ;
2010-01-11 18:47:27 -07:00
m_row = & all_setup_timers_data [ m_pos . m_index ] ;
return 0 ;
}
int table_setup_timers : : read_row_values ( TABLE * table ,
unsigned char * ,
Field * * fields ,
bool read_all )
{
Field * f ;
2021-05-03 11:21:56 +02:00
assert ( m_row ) ;
2010-01-11 18:47:27 -07:00
/* Set the null bits */
2021-05-03 11:21:56 +02:00
assert ( table - > s - > null_bytes = = 0 ) ;
2010-01-11 18:47:27 -07:00
for ( ; ( f = * fields ) ; fields + + )
{
if ( read_all | | bitmap_is_set ( table - > read_set , f - > field_index ) )
{
switch ( f - > field_index )
{
case 0 : /* NAME */
2018-02-06 12:55:58 +00:00
set_field_varchar_utf8 ( f , m_row - > m_name . str , ( uint ) m_row - > m_name . length ) ;
2010-01-11 18:47:27 -07:00
break ;
case 1 : /* TIMER_NAME */
set_field_enum ( f , * ( m_row - > m_timer_name_ptr ) ) ;
break ;
default :
2021-05-03 11:21:56 +02:00
assert ( false ) ;
2010-01-11 18:47:27 -07:00
}
}
}
return 0 ;
}
int table_setup_timers : : update_row_values ( TABLE * table ,
const unsigned char * ,
2017-04-16 22:40:39 +03:00
const unsigned char * ,
2010-01-11 18:47:27 -07:00
Field * * fields )
{
Field * f ;
longlong value ;
2021-05-03 11:21:56 +02:00
assert ( m_row ) ;
2010-01-11 18:47:27 -07:00
for ( ; ( f = * fields ) ; fields + + )
{
if ( bitmap_is_set ( table - > write_set , f - > field_index ) )
{
switch ( f - > field_index )
{
case 0 : /* NAME */
return HA_ERR_WRONG_COMMAND ;
case 1 : /* TIMER_NAME */
value = get_field_enum ( f ) ;
if ( ( value > = FIRST_TIMER_NAME ) & & ( value < = LAST_TIMER_NAME ) )
* ( m_row - > m_timer_name_ptr ) = ( enum_timer_name ) value ;
else
return HA_ERR_WRONG_COMMAND ;
break ;
default :
2021-05-03 11:21:56 +02:00
assert ( false ) ;
2010-01-11 18:47:27 -07:00
}
}
}
return 0 ;
}