aboutsummaryrefslogtreecommitdiff
path: root/mysql/mysql/service_rules_table.h
diff options
context:
space:
mode:
Diffstat (limited to 'mysql/mysql/service_rules_table.h')
-rw-r--r--mysql/mysql/service_rules_table.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/mysql/mysql/service_rules_table.h b/mysql/mysql/service_rules_table.h
new file mode 100644
index 0000000..aca3926
--- /dev/null
+++ b/mysql/mysql/service_rules_table.h
@@ -0,0 +1,192 @@
+#ifdef __cplusplus
+#ifndef SERVICE_RULES_TABLE_INCLUDED
+#define SERVICE_RULES_TABLE_INCLUDED
+
+/* Copyright (c) 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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include <my_global.h>
+#include <my_dbug.h>
+#include <string>
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdlib.h>
+#endif
+
+
+/**
+ @file service_rules_table.h
+
+ Plugin service that provides access to the rewrite rules table that is used
+ by the Rewriter plugin. No other use intended.
+*/
+
+class THD;
+struct TABLE_LIST;
+class Field;
+
+namespace rules_table_service
+{
+
+
+/**
+ There must be one function of this kind in order for the symbols in the
+ server's dynamic library to be visible to plugins.
+*/
+int dummy_function_to_ensure_we_are_linked_into_the_server();
+
+
+/**
+ Frees a const char pointer allocated in the server's dynamic library using
+ new[].
+*/
+void free_string(const char *str);
+
+
+/**
+ Writable cursor that allows reading and updating of rows in a persistent
+ table.
+*/
+class Cursor
+{
+public:
+ typedef int column_id;
+
+ static const column_id ILLEGAL_COLUMN_ID= -1;
+
+ /**
+ Creates a cursor to an already-opened table. The constructor is kept
+ explicit because of implicit conversions from void*.
+ */
+ explicit Cursor(THD *thd);
+
+ /// Creates a past-the-end cursor.
+ Cursor() :
+ m_thd(NULL), m_table_list(NULL), m_is_finished(true)
+ {}
+
+ column_id pattern_column() const { return m_pattern_column; }
+ column_id pattern_database_column() const
+ {
+ return m_pattern_database_column;
+ }
+ column_id replacement_column() const { return m_replacement_column; }
+ column_id enabled_column() const { return m_enabled_column; }
+ column_id message_column() const { return m_message_column; }
+ column_id pattern_digest_column() const { return m_pattern_digest_column; }
+ column_id normalized_pattern_column() const {
+ return m_normalized_pattern_column;
+ }
+
+ /**
+ True if the table does not contain columns named 'pattern', 'replacement',
+ 'enabled' and 'message'. In this case the cursor is equal to any
+ past-the-end Cursor.
+ */
+ bool table_is_malformed() { return m_table_is_malformed; }
+
+ /**
+ Fetches the value of the column with the given number as a C string.
+
+ This interface is meant for crossing dynamic library boundaries, hence the
+ use of C-style const char*. The function casts a column value to a C
+ string and returns a copy, allocated in the callee's DL. The pointer
+ must be freed using free_string().
+
+ @param fieldno One of PATTERN_COLUMN, REPLACEMENT_COLUMN, ENABLED_COLUMN
+ or MESSAGE_COLUMN.
+ */
+ const char *fetch_string(int fieldno);
+
+ /**
+ Equality operator. The only cursors that are equal are past-the-end
+ cursors.
+ */
+ bool operator== (const Cursor &other)
+ {
+ return (m_is_finished == other.m_is_finished);
+ }
+
+ /**
+ Inequality operator. All cursors are considered different except
+ past-the-end cursors.
+ */
+ bool operator!= (const Cursor &other) { return !(*this == other); }
+
+ /**
+ Advances this Cursor. Read errors are kept, and had_serious_read_error()
+ will tell if there was an unexpected error (e.g. not EOF) while reading.
+ */
+ Cursor &operator++ ()
+ {
+ if (!m_is_finished)
+ read();
+ return *this;
+ }
+
+ /// Prepares the write buffer for updating the current row.
+ void make_writeable();
+
+ /**
+ Sets the value of column colno to a string value.
+
+ @param colno The column number.
+ @param str The string.
+ @param length The string's length.
+ */
+ void set(int colno, const char* str, size_t length);
+
+ /// Writes the row in the write buffer to the table at the current row.
+ int write();
+
+ /// True if there was an unexpected error while reading, e.g. other than EOF.
+ bool had_serious_read_error() const;
+
+ /// Closes the table scan if initiated and commits the transaction.
+ ~Cursor();
+
+private:
+ int field_index(const char *field_name);
+
+ int m_pattern_column;
+ int m_pattern_database_column;
+ int m_replacement_column;
+ int m_enabled_column;
+ int m_message_column;
+ int m_pattern_digest_column;
+ int m_normalized_pattern_column;
+
+ THD *m_thd;
+ TABLE_LIST *m_table_list;
+
+ bool m_is_finished;
+ bool m_table_is_malformed;
+ int m_last_read_status;
+
+ int read();
+};
+
+
+/**
+ A past-the-end Cursor. All past-the-end cursors are considered equal
+ when compared with operator ==.
+*/
+Cursor end();
+
+}
+
+#endif // SERVICE_RULES_TABLE_INCLUDED
+#endif // __cplusplus