mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
 | 
						|
 | 
						|
  This program is free software; you can redistribute it and/or modify
 | 
						|
  it under the terms of the GNU General Public License as published by
 | 
						|
  the Free Software Foundation; version 2 of the License.
 | 
						|
 | 
						|
  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
 | 
						|
  GNU General Public License for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU General Public License
 | 
						|
  along with this program; if not, write to the Free Software Foundation,
 | 
						|
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
 | 
						|
 | 
						|
#ifndef SQL_DIGEST_H
 | 
						|
#define SQL_DIGEST_H
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
class String;
 | 
						|
#include "my_md5.h"
 | 
						|
 | 
						|
#define MAX_DIGEST_STORAGE_SIZE (1024*1024)
 | 
						|
 | 
						|
/**
 | 
						|
  Structure to store token count/array for a statement
 | 
						|
  on which digest is to be calculated.
 | 
						|
*/
 | 
						|
struct sql_digest_storage
 | 
						|
{
 | 
						|
  bool m_full;
 | 
						|
  uint m_byte_count;
 | 
						|
  unsigned char m_md5[MD5_HASH_SIZE];
 | 
						|
  /** Character set number. */
 | 
						|
  uint m_charset_number;
 | 
						|
  /**
 | 
						|
    Token array.
 | 
						|
    Token array is an array of bytes to store tokens received during parsing.
 | 
						|
    Following is the way token array is formed.
 | 
						|
    ... <non-id-token> <non-id-token> <id-token> <id_len> <id_text> ...
 | 
						|
    For Example:
 | 
						|
    SELECT * FROM T1;
 | 
						|
    <SELECT_TOKEN> <*> <FROM_TOKEN> <ID_TOKEN> <2> <T1>
 | 
						|
 | 
						|
    @note Only the first @c m_byte_count bytes are initialized,
 | 
						|
      out of @c m_token_array_length.
 | 
						|
  */
 | 
						|
  unsigned char *m_token_array;
 | 
						|
  /* Length of the token array to be considered for DIGEST_TEXT calculation. */
 | 
						|
  uint m_token_array_length;
 | 
						|
 | 
						|
  sql_digest_storage()
 | 
						|
  {
 | 
						|
    reset(NULL, 0);
 | 
						|
  }
 | 
						|
 | 
						|
  inline void reset(unsigned char *token_array, size_t length)
 | 
						|
  {
 | 
						|
    m_token_array= token_array;
 | 
						|
    m_token_array_length= (uint)length;
 | 
						|
    reset();
 | 
						|
  }
 | 
						|
 | 
						|
  inline void reset()
 | 
						|
  {
 | 
						|
    m_full= false;
 | 
						|
    m_byte_count= 0;
 | 
						|
    m_charset_number= 0;
 | 
						|
    memset(m_md5, 0, MD5_HASH_SIZE);
 | 
						|
  }
 | 
						|
 | 
						|
  inline bool is_empty()
 | 
						|
  {
 | 
						|
    return (m_byte_count == 0);
 | 
						|
  }
 | 
						|
 | 
						|
  inline void copy(const sql_digest_storage *from)
 | 
						|
  {
 | 
						|
    /*
 | 
						|
      Keep in mind this is a dirty copy of something that may change,
 | 
						|
      as the thread producing the digest is executing concurrently,
 | 
						|
      without any lock enforced.
 | 
						|
    */
 | 
						|
    uint byte_count_copy= m_token_array_length < from->m_byte_count ?
 | 
						|
                          m_token_array_length : from->m_byte_count;
 | 
						|
 | 
						|
    if (byte_count_copy > 0)
 | 
						|
    {
 | 
						|
      m_full= from->m_full;
 | 
						|
      m_byte_count= byte_count_copy;
 | 
						|
      m_charset_number= from->m_charset_number;
 | 
						|
      memcpy(m_token_array, from->m_token_array, m_byte_count);
 | 
						|
      memcpy(m_md5, from->m_md5, MD5_HASH_SIZE);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      m_full= false;
 | 
						|
      m_byte_count= 0;
 | 
						|
      m_charset_number= 0;
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 | 
						|
typedef struct sql_digest_storage sql_digest_storage;
 | 
						|
 | 
						|
/**
 | 
						|
  Compute a digest hash.
 | 
						|
  @param digest_storage The digest
 | 
						|
  @param [out] md5 The computed digest hash. This parameter is a buffer of size @c MD5_HASH_SIZE.
 | 
						|
*/
 | 
						|
void compute_digest_md5(const sql_digest_storage *digest_storage, unsigned char *md5);
 | 
						|
 | 
						|
/**
 | 
						|
  Compute a digest text.
 | 
						|
  A 'digest text' is a textual representation of a query,
 | 
						|
  where:
 | 
						|
  - comments are removed,
 | 
						|
  - non significant spaces are removed,
 | 
						|
  - literal values are replaced with a special '?' marker,
 | 
						|
  - lists of values are collapsed using a shorter notation
 | 
						|
  @param digest_storage The digest
 | 
						|
  @param [out] digest_text
 | 
						|
  @param digest_text_length Size of @c digest_text.
 | 
						|
  @param [out] truncated true if the text representation was truncated
 | 
						|
*/
 | 
						|
void compute_digest_text(const sql_digest_storage *digest_storage,
 | 
						|
                         String *digest_text);
 | 
						|
 | 
						|
#endif
 | 
						|
 |