From 6be47ea0e40e5ede06643e5591cf59d5eafb8222 Mon Sep 17 00:00:00 2001 From: Masakazu Kitajo Date: Fri, 16 Dec 2022 11:08:36 -0700 Subject: [PATCH] Remove mysql_remap plugin --- configure.ac | 5 - doc/.tx/config | 5 - doc/admin-guide/plugins/index.en.rst | 4 - doc/admin-guide/plugins/mysql_remap.en.rst | 91 --- .../admin-guide/plugins/index.en.po | 8 - .../admin-guide/plugins/mysql_remap.en.po | 125 ---- plugins/Makefile.am | 4 - plugins/experimental/mysql_remap/AUTHORS | 7 - plugins/experimental/mysql_remap/Makefile.inc | 29 - plugins/experimental/mysql_remap/README | 74 -- plugins/experimental/mysql_remap/default.h | 22 - .../experimental/mysql_remap/lib/dictionary.c | 450 ------------ .../experimental/mysql_remap/lib/dictionary.h | 189 ----- .../experimental/mysql_remap/lib/iniparser.c | 694 ------------------ .../experimental/mysql_remap/lib/iniparser.h | 295 -------- .../experimental/mysql_remap/mysql_remap.cc | 246 ------- plugins/experimental/mysql_remap/sample.ini | 24 - .../mysql_remap/schema/import.sql | 134 ---- 18 files changed, 2406 deletions(-) delete mode 100644 doc/admin-guide/plugins/mysql_remap.en.rst delete mode 100644 doc/locale/ja/LC_MESSAGES/admin-guide/plugins/mysql_remap.en.po delete mode 100644 plugins/experimental/mysql_remap/AUTHORS delete mode 100644 plugins/experimental/mysql_remap/Makefile.inc delete mode 100644 plugins/experimental/mysql_remap/README delete mode 100644 plugins/experimental/mysql_remap/default.h delete mode 100644 plugins/experimental/mysql_remap/lib/dictionary.c delete mode 100644 plugins/experimental/mysql_remap/lib/dictionary.h delete mode 100644 plugins/experimental/mysql_remap/lib/iniparser.c delete mode 100644 plugins/experimental/mysql_remap/lib/iniparser.h delete mode 100644 plugins/experimental/mysql_remap/mysql_remap.cc delete mode 100644 plugins/experimental/mysql_remap/sample.ini delete mode 100644 plugins/experimental/mysql_remap/schema/import.sql diff --git a/configure.ac b/configure.ac index 8762986f938..969f961e2cb 100644 --- a/configure.ac +++ b/configure.ac @@ -1886,11 +1886,6 @@ AM_CONDITIONAL([BUILD_HTTP_LOAD], [test x"$ac_cv_func_epoll_ctl" = x"yes"]) # We should only build traffic_top if we have curses AM_CONDITIONAL([BUILD_TRAFFIC_TOP], [test "x$ax_cv_curses" = "xyes"]) -AC_CHECK_HEADERS([mysql/mysql.h], [has_mysql=1],[has_mysql=0]) -AC_CHECK_LIB([mysqlclient],[mysql_info],[AC_SUBST([LIB_MYSQLCLIENT],["-lmysqlclient"])],[has_mysql=0]) -AC_SUBST(has_mysql) -AM_CONDITIONAL([HAS_MYSQL], [ test "x${has_mysql}" = "x1" ]) - AC_CHECK_HEADERS([kclangc.h], [ AC_CHECK_LIB([kyotocabinet], [kcdbopen], [ AC_SUBST([LIB_KYOTOCABINET], ["-lkyotocabinet"]) diff --git a/doc/.tx/config b/doc/.tx/config index b3e1f737f4e..c7baab4394a 100644 --- a/doc/.tx/config +++ b/doc/.tx/config @@ -427,11 +427,6 @@ file_filter = locale//LC_MESSAGES/admin-guide/plugins/mp4.en.po source_file = _build/locale/pot/admin-guide/plugins/mp4.en.pot source_lang = en -[apache-traffic-server-6x.admin-guide--plugins--mysql_remap_en] -file_filter = locale//LC_MESSAGES/admin-guide/plugins/mysql_remap.en.po -source_file = _build/locale/pot/admin-guide/plugins/mysql_remap.en.pot -source_lang = en - [apache-traffic-server-6x.admin-guide--plugins--regex_remap_en] file_filter = locale//LC_MESSAGES/admin-guide/plugins/regex_remap.en.po source_file = _build/locale/pot/admin-guide/plugins/regex_remap.en.pot diff --git a/doc/admin-guide/plugins/index.en.rst b/doc/admin-guide/plugins/index.en.rst index 59308431b28..eb53b1f36e6 100644 --- a/doc/admin-guide/plugins/index.en.rst +++ b/doc/admin-guide/plugins/index.en.rst @@ -168,7 +168,6 @@ directory of the |TS| source tree. Experimental plugins can be compiled by passi Money Trace MP4 Multiplexer - MySQL Remap OpenTelemetry Tracer Parent Select Rate Limit @@ -234,9 +233,6 @@ directory of the |TS| source tree. Experimental plugins can be compiled by passi this can be used to do A/B testing by sending a duplicated slice of inbound production traffic to experimental upstreams. -:doc:`MySQL Remap ` - Allows dynamic remaps from a MySQL database. - :doc:`OpenTelemetry Tracer ` Allows Trafficserver to participate in OpenTelemetry distributed tracing system diff --git a/doc/admin-guide/plugins/mysql_remap.en.rst b/doc/admin-guide/plugins/mysql_remap.en.rst deleted file mode 100644 index 39ff9bf1d76..00000000000 --- a/doc/admin-guide/plugins/mysql_remap.en.rst +++ /dev/null @@ -1,91 +0,0 @@ -.. _admin-plugins-mysql-remap: - -MySQL Remap Plugin -****************** - -.. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -.. Note:: - - This plugin is *deprecated* as of v9.0.0, and should not be used! The issue - is around the blocking APIs used here; If this functionality is needed, you - will need to implement it using something non-blocking, such as REDIS. - - -This is a basic plugin for doing dynamic "remaps" from a database. It -essentially rewrites the incoming request's Host header / origin server -connection to one retrieved from a database. - -The generic proxying setup is the following:: - - UA ----> Traffic Server ----> Origin Server - -Without the plugin a request like:: - - GET /path/to/something HTTP/1.1 - Host: original.host.com - -Ends up requesting ``http://original.host.com/path/to/something`` - -With this plugin enabled, you can easily change that to anywhere you -desire. Imagine the many possibilities.... - -We have benchmarked the plugin with ab at about 9200 requests/sec (1.7k -object) on a commodity hardware with a local setup of both, MySQL and -Traffic Server local. Real performance is likely to be substantially -higher, up to the MySQL's max queries / second. - -Installation -============ - -This plugin is only built if the configure option :: - - --enable-experimental-plugins - -is given at build time. - -Configuration -============= - -Import the default schema to a database you create:: - - mysql -u root -p -e "CREATE DATABASE mysql_remap;" # create a new database - mysql -u root -p mysql_remap < schema/import.sql # import the provided schema - -insert some interesting values in mysql_remap.hostname & -mysql_remap.map - -Traffic Server plugin configuration is done inside a global -configuration file: ``/etc/trafficserver/plugin.config``:: - - mysql_remap.so /etc/trafficserver/mysql_remap.ini - -The INI file should contain the following values:: - - [mysql_remap] - mysql_host = localhost #default - mysql_port = 3306 #default - mysql_username = remap_user - mysql_password = - mysql_database = mysql_remap #default - -To debug errors, start trafficserver manually using:: - - traffic_server -T "mysql_remap" - -And resolve any errors or warnings displayed. diff --git a/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/index.en.po b/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/index.en.po index 187dd3eed86..c583db958c2 100644 --- a/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/index.en.po +++ b/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/index.en.po @@ -280,14 +280,6 @@ msgstr "" msgid "MP4 streaming media." msgstr "" -#: ../../../admin-guide/plugins/index.en.rst:177 -msgid ":doc:`MySQL Remap `" -msgstr "" - -#: ../../../admin-guide/plugins/index.en.rst:177 -msgid "Allows dynamic remaps from a MySQL database." -msgstr "" - #: ../../../admin-guide/plugins/index.en.rst:180 msgid ":doc:`Regex Revalidate `" msgstr "" diff --git a/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/mysql_remap.en.po b/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/mysql_remap.en.po deleted file mode 100644 index 4bbd60e970e..00000000000 --- a/doc/locale/ja/LC_MESSAGES/admin-guide/plugins/mysql_remap.en.po +++ /dev/null @@ -1,125 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Apache Traffic Server 6.2\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-02 21:32+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: ja_JP\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:57 -msgid "Configuration" -msgstr "設定" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:4 -msgid "MySQL Remap Plugin" -msgstr "MySQL リマッププラグイン" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:28 -msgid "The generic proxying setup is the following::" -msgstr "一般的なプロキシーのセットアップは次のとおりです ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:24 -msgid "" -"This is a basic plugin for doing dynamic \"remaps\" from a database. It " -"essentially rewrites the incoming request's Host header / origin server " -"connection to one retrieved from a database." -msgstr "" -"これはデータベースをもとに動的な\"リマップ\"を行うための基本的なプラグインで" -"す。本質的には届いたリクエストの Host ヘッダーを書き換えます / オリジンサー" -"バーの接続をデータベースから取得したものに。" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:85 -msgid "And resolve any errors or warnings displayed." -msgstr "そして表示されたエラーや警告を解決してください。" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:37 -msgid "Ends up requesting ``http://original.host.com/path/to/something``" -msgstr "" -"最終的には ``http://original.host.com/path/to/something`` にリクエストしま" -"す。" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:48 -msgid "Installation" -msgstr "インストール" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:42 -msgid "" -"We have benchmarked the plugin with ab at about 9200 requests/sec (1.7k " -"object) on a commodity hardware with a local setup of both, MySQL and " -"Traffic Server local. Real performance is likely to be substantially " -"higher, up to the MySQL's max queries / second." -msgstr "" -"私たちは ab でこのプラグインのベンチマークを行い、汎用のハードウェアに " -"MySQL と Traffic Server をどちらもローカルにセットアップした環境で 約 9200 " -"リクエスト / 秒 (1.7k オブジェクト ) となりました。実際のパフォーマンスは十" -"分に高く、MySQL の最大クエリー / 秒次第です。" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:59 -msgid "Import the default schema to a database you create::" -msgstr "作成したデータベースへのデフォルトスキーマを取り込みます ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:72 -msgid "The INI file should contain the following values::" -msgstr "INI ファイルは次の値を含むべきです ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:50 -msgid "This plugin is only built if the configure option ::" -msgstr "このプラグインはビルド時の設定オプションに ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:81 -msgid "To debug errors, start trafficserver manually using::" -msgstr "" -"エラーをデバッグするために、Traffic Server を手動で次のように開始してくださ" -"い::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:39 -msgid "" -"With this plugin enabled, you can easily change that to anywhere you " -"desire. Imagine the many possibilities...." -msgstr "" -"このプラグインを有効化すると、どこでも望んだ場所に簡単に変更できます。多くの" -"可能性を想像してください...." - -#: ../../admin-guide/plugins/mysql_remap.en.rst:67 -msgid "" -"Traffic Server plugin configuration is done inside a global configuration " -"file: ``/etc/trafficserver/plugin.config``::" -msgstr "" -"Traffic Server プラグイン設定はグローバル設定ファイル :file: ``/etc/" -"trafficserver/plugin.config`` で完了します ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:32 -msgid "Without the plugin a request like::" -msgstr "このプラグインを使わない場合のリクエストはこの様になります ::" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:64 -msgid "" -"insert some interesting values in mysql_remap.hostname & mysql_remap.map" -msgstr "mysql_remap.hostname と mysql_remap.map に興味深い値を入れます" - -#: ../../admin-guide/plugins/mysql_remap.en.rst:54 -msgid "is given at build time." -msgstr "が与えられている場合にのみビルドされます。" diff --git a/plugins/Makefile.am b/plugins/Makefile.am index b842d47577d..3eb809266e3 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -129,10 +129,6 @@ include experimental/webp_transform/Makefile.inc include experimental/magick/Makefile.inc endif -if HAS_MYSQL -include experimental/mysql_remap/Makefile.inc -endif - endif TESTS_ENVIRONMENT = LSAN_OPTIONS=suppressions=$(top_srcdir)/plugins/suppression.txt diff --git a/plugins/experimental/mysql_remap/AUTHORS b/plugins/experimental/mysql_remap/AUTHORS deleted file mode 100644 index 3c25016d6ff..00000000000 --- a/plugins/experimental/mysql_remap/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -Author: Eric Balsa -Original concept and code - -==== - -Author: Nicolas Devillard -INI parsing library diff --git a/plugins/experimental/mysql_remap/Makefile.inc b/plugins/experimental/mysql_remap/Makefile.inc deleted file mode 100644 index f15cead9832..00000000000 --- a/plugins/experimental/mysql_remap/Makefile.inc +++ /dev/null @@ -1,29 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -pkglib_LTLIBRARIES += experimental/mysql_remap/mysql_remap.la - -experimental_mysql_remap_mysql_remap_la_SOURCES = \ - experimental/mysql_remap/mysql_remap.cc \ - experimental/mysql_remap/lib/dictionary.c \ - experimental/mysql_remap/lib/dictionary.h \ - experimental/mysql_remap/lib/iniparser.c \ - experimental/mysql_remap/lib/iniparser.h - -experimental_mysql_remap_mysql_remap_la_LDFLAGS = \ - $(AM_LDFLAGS) $(LIB_MYSQLCLIENT) - -# vim: ft=make ts=8 sw=8 et: diff --git a/plugins/experimental/mysql_remap/README b/plugins/experimental/mysql_remap/README deleted file mode 100644 index 2817fe11e0f..00000000000 --- a/plugins/experimental/mysql_remap/README +++ /dev/null @@ -1,74 +0,0 @@ -Apache Traffic Server MySQL-based remap plugin -============================================== - -== Description == - This is a basic plugin for doing dynamic "remaps" from a database. It essentially rewrites the incoming request's Host header / origin server connection -to one retrieved from a database. - -The generic proxying setup is the following: - -UA ----> Traffic Server ----> Origin Server - -Without the plugin a request like: - -GET /path/to/something HTTP/1.1 -Host: original.host.com - -Ends up requesting http://original.host.com/path/to/something - -With this plugin enabled, you can easily change that to anywhere you desire. Imagine the many possibilities.... - -I have benchmarked this at about 9200 requests/sec (1.7k object) on a junky imac with mysql, ab & trafficserver local. Real performance -is likely substantially higher up to your mysql's max queries / second. - -== Build == - A simple - -% make install - -should do it, assuming that you have the tsxs script in your search path. -This script is installed with your installation of Apache Traffic Server. - -NOTE: you may need to open the Makefile and adjust the paths to MySQL client includes & libraries - -== Configuration == -Import the default schema to a database you create: - -mysql -u root -p -e "CREATE DATABASE mysql_remap;" # create a new database -mysql -u root -p mysql_remap < schema/import.sql # import the provided schema - -insert some interesting values in mysql_remap.hostname & mysql_remap.map - -Traffic Server plugin configuration is done inside a global configuration file: /path/to/etc/trafficserver/plugin.config: - - mysql_remap.so /path/to/sample.ini - -The INI file should contain the following values: - -[mysql_remap] -mysql_host = localhost #default -mysql_port = 3306 #default -mysql_username = root -mysql_password = -mysql_database = mysql_remap #default - -To debug errors, start trafficserver manually using: - -/path/to/traffic_server -T "mysql_remap" - -And resolve any errors or warnings displayed. - -== Credits == - * Eric Balsa - * ericb@apache.org / eric@ericbalsa.com - * http://www.ericbalsa.com - -== TODO == - * some stupid bug in the ini parsing requiring a blank trailing \n - * make db backend pluggable - * handle mysql connections a bit more intelligently - * define a fallback host for missing remaps (instead of blindly issuing a 404) - * handle rewriting paths - * handle regexp in paths & hosts - * verify scheme switching - * ... many more ideas ... diff --git a/plugins/experimental/mysql_remap/default.h b/plugins/experimental/mysql_remap/default.h deleted file mode 100644 index 7cd5a8444a5..00000000000 --- a/plugins/experimental/mysql_remap/default.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -static const char *PLUGIN_NAME = "mysql_remap"; -#define QSIZE 2048 diff --git a/plugins/experimental/mysql_remap/lib/dictionary.c b/plugins/experimental/mysql_remap/lib/dictionary.c deleted file mode 100644 index 4cc1d0f5acc..00000000000 --- a/plugins/experimental/mysql_remap/lib/dictionary.c +++ /dev/null @@ -1,450 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -/*-------------------------------------------------------------------------*/ -/** - @file dictionary.c - @author N. Devillard - @date Sep 2007 - @version $Revision: 1.27 $ - @brief Implements a dictionary for string variables. - - This module implements a simple dictionary object, i.e. a list - of string/string associations. This object is useful to store e.g. - information retrieved from a configuration file (ini files). -*/ -/*--------------------------------------------------------------------------*/ - -/* - $Id: dictionary.c,v 1.27 2007-11-23 21:39:18 ndevilla Exp $ - $Revision: 1.27 $ -*/ -/*--------------------------------------------------------------------------- - Includes - ---------------------------------------------------------------------------*/ -#include "dictionary.h" - -#include -#include -#include -#include - -/** Maximum value size for integers and doubles. */ -#define MAXVALSZ 1024 - -/** Minimal allocated number of entries in a dictionary */ -#define DICTMINSZ 128 - -/** Invalid key token */ -#define DICT_INVALID_KEY ((char *)-1) - -/*--------------------------------------------------------------------------- - Private functions - ---------------------------------------------------------------------------*/ - -/* Doubles the allocated size associated to a pointer */ -/* 'size' is the current allocated size. */ -static void * -mem_double(void *ptr, int size) -{ - void *newptr; - - newptr = calloc(2 * size, 1); - if (newptr == NULL) { - return NULL; - } - memcpy(newptr, ptr, size); - free(ptr); - return newptr; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Duplicate a string - @param s String to duplicate - @return Pointer to a newly allocated string, to be freed with free() - - This is a replacement for strdup(). This implementation is provided - for systems that do not have it. - */ -/*--------------------------------------------------------------------------*/ -static char * -xstrdup(char *s) -{ - char *t; - if (!s) { - return NULL; - } - t = (char *)malloc(strlen(s) + 1); - if (t) { - strcpy(t, s); - } - return t; -} - -/*--------------------------------------------------------------------------- - Function codes - ---------------------------------------------------------------------------*/ -/*-------------------------------------------------------------------------*/ -/** - @brief Compute the hash key for a string. - @param key Character string to use for key. - @return 1 unsigned int on at least 32 bits. - - This hash function has been taken from an Article in Dr Dobbs Journal. - This is normally a collision-free function, distributing keys evenly. - The key is stored anyway in the struct so that collision can be avoided - by comparing the key itself in last resort. - */ -/*--------------------------------------------------------------------------*/ -unsigned -dictionary_hash(char *key) -{ - int len; - unsigned hash; - int i; - - len = strlen(key); - for (hash = 0, i = 0; i < len; i++) { - hash += (unsigned)key[i]; - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Create a new dictionary object. - @param size Optional initial size of the dictionary. - @return 1 newly allocated dictionary object. - - This function allocates a new dictionary object of given size and returns - it. If you do not know in advance (roughly) the number of entries in the - dictionary, give size=0. - */ -/*--------------------------------------------------------------------------*/ -dictionary * -dictionary_new(int size) -{ - dictionary *d; - - /* If no size was specified, allocate space for DICTMINSZ */ - if (size < DICTMINSZ) { - size = DICTMINSZ; - } - - if (!(d = (dictionary *)calloc(1, sizeof(dictionary)))) { - return NULL; - } - d->size = size; - d->val = (char **)calloc(size, sizeof(char *)); - d->key = (char **)calloc(size, sizeof(char *)); - d->hash = (unsigned int *)calloc(size, sizeof(unsigned)); - return d; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete a dictionary object - @param d dictionary object to deallocate. - @return void - - Deallocate a dictionary object and all memory associated to it. - */ -/*--------------------------------------------------------------------------*/ -void -dictionary_del(dictionary *d) -{ - int i; - - if (d == NULL) { - return; - } - for (i = 0; i < d->size; i++) { - if (d->key[i] != NULL) { - free(d->key[i]); - } - if (d->val[i] != NULL) { - free(d->val[i]); - } - } - free(d->val); - free(d->key); - free(d->hash); - free(d); - return; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get a value from a dictionary. - @param d dictionary object to search. - @param key Key to look for in the dictionary. - @param def Default value to return if key not found. - @return 1 pointer to internally allocated character string. - - This function locates a key in a dictionary and returns a pointer to its - value, or the passed 'def' pointer if no such key can be found in - dictionary. The returned character pointer points to data internal to the - dictionary object, you should not try to free it or modify it. - */ -/*--------------------------------------------------------------------------*/ -char * -dictionary_get(dictionary *d, char *key, char *def) -{ - unsigned hash; - int i; - - hash = dictionary_hash(key); - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - /* Compare hash */ - if (hash == d->hash[i]) { - /* Compare string, to avoid hash collisions */ - if (!strcmp(key, d->key[i])) { - return d->val[i]; - } - } - } - return def; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Set a value in a dictionary. - @param d dictionary object to modify. - @param key Key to modify or add. - @param val Value to add. - @return int 0 if Ok, anything else otherwise - - If the given key is found in the dictionary, the associated value is - replaced by the provided one. If the key cannot be found in the - dictionary, it is added to it. - - It is Ok to provide a NULL value for val, but NULL values for the dictionary - or the key are considered as errors: the function will return immediately - in such a case. - - Notice that if you dictionary_set a variable to NULL, a call to - dictionary_get will return a NULL value: the variable will be found, and - its value (NULL) is returned. In other words, setting the variable - content to NULL is equivalent to deleting the variable from the - dictionary. It is not possible (in this implementation) to have a key in - the dictionary without value. - - This function returns non-zero in case of failure. - */ -/*--------------------------------------------------------------------------*/ -int -dictionary_set(dictionary *d, char *key, char *val) -{ - int i; - unsigned hash; - - if (d == NULL || key == NULL) { - return -1; - } - - /* Compute hash for this key */ - hash = dictionary_hash(key); - /* Find if value is already in dictionary */ - if (d->n > 0) { - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - if (hash == d->hash[i]) { /* Same hash value */ - if (!strcmp(key, d->key[i])) { /* Same key */ - /* Found a value: modify and return */ - if (d->val[i] != NULL) { - free(d->val[i]); - } - d->val[i] = val ? xstrdup(val) : NULL; - /* Value has been modified: return */ - return 0; - } - } - } - } - /* Add a new value */ - /* See if dictionary needs to grow */ - if (d->n == d->size) { - /* Reached maximum size: reallocate dictionary */ - d->val = (char **)mem_double(d->val, d->size * sizeof(char *)); - d->key = (char **)mem_double(d->key, d->size * sizeof(char *)); - d->hash = (unsigned int *)mem_double(d->hash, d->size * sizeof(unsigned)); - if ((d->val == NULL) || (d->key == NULL) || (d->hash == NULL)) { - /* Cannot grow dictionary */ - return -1; - } - /* Double size */ - d->size *= 2; - } - - /* Insert key in the first empty slot */ - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - /* Add key here */ - break; - } - } - /* Copy key */ - d->key[i] = xstrdup(key); - d->val[i] = val ? xstrdup(val) : NULL; - d->hash[i] = hash; - d->n++; - return 0; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete a key in a dictionary - @param d dictionary object to modify. - @param key Key to remove. - @return void - - This function deletes a key in a dictionary. Nothing is done if the - key cannot be found. - */ -/*--------------------------------------------------------------------------*/ -void -dictionary_unset(dictionary *d, char *key) -{ - unsigned hash; - int i; - - if (key == NULL) { - return; - } - - hash = dictionary_hash(key); - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - /* Compare hash */ - if (hash == d->hash[i]) { - /* Compare string, to avoid hash collisions */ - if (!strcmp(key, d->key[i])) { - /* Found key */ - break; - } - } - } - if (i >= d->size) { - /* Key not found */ - return; - } - - free(d->key[i]); - d->key[i] = NULL; - if (d->val[i] != NULL) { - free(d->val[i]); - d->val[i] = NULL; - } - d->hash[i] = 0; - d->n--; - return; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Dump a dictionary to an opened file pointer. - @param d Dictionary to dump - @param f Opened file pointer. - @return void - - Dumps a dictionary onto an opened file pointer. Key pairs are printed out - as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as - output file pointers. - */ -/*--------------------------------------------------------------------------*/ -void -dictionary_dump(dictionary *d, FILE *out) -{ - int i; - - if (d == NULL || out == NULL) { - return; - } - if (d->n < 1) { - fprintf(out, "empty dictionary\n"); - return; - } - for (i = 0; i < d->size; i++) { - if (d->key[i]) { - fprintf(out, "%20s\t[%s]\n", d->key[i], d->val[i] ? d->val[i] : "UNDEF"); - } - } - return; -} - -/* Test code */ -#ifdef TESTDIC -#define NVALS 20000 -int -main(int argc, char *argv[]) -{ - dictionary *d; - char *val; - int i; - char cval[90]; - - /* Allocate dictionary */ - printf("allocating...\n"); - d = dictionary_new(0); - - /* Set values in dictionary */ - printf("setting %d values...\n", NVALS); - for (i = 0; i < NVALS; i++) { - sprintf(cval, "%04d", i); - dictionary_set(d, cval, "salut"); - } - printf("getting %d values...\n", NVALS); - for (i = 0; i < NVALS; i++) { - sprintf(cval, "%04d", i); - val = dictionary_get(d, cval, DICT_INVALID_KEY); - if (val == DICT_INVALID_KEY) { - printf("cannot get value for key [%s]\n", cval); - } - } - printf("unsetting %d values...\n", NVALS); - for (i = 0; i < NVALS; i++) { - sprintf(cval, "%04d", i); - dictionary_unset(d, cval); - } - if (d->n != 0) { - printf("error deleting values\n"); - } - printf("deallocating...\n"); - dictionary_del(d); - return 0; -} -#endif -/* vim: set ts=4 et sw=4 tw=75 */ diff --git a/plugins/experimental/mysql_remap/lib/dictionary.h b/plugins/experimental/mysql_remap/lib/dictionary.h deleted file mode 100644 index 4acdcec54d9..00000000000 --- a/plugins/experimental/mysql_remap/lib/dictionary.h +++ /dev/null @@ -1,189 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -/*-------------------------------------------------------------------------*/ -/** - @file dictionary.h - @author N. Devillard - @date Sep 2007 - @version $Revision: 1.12 $ - @brief Implements a dictionary for string variables. - - This module implements a simple dictionary object, i.e. a list - of string/string associations. This object is useful to store e.g. - information retrieved from a configuration file (ini files). -*/ -/*--------------------------------------------------------------------------*/ - -/* - $Id: dictionary.h,v 1.12 2007-11-23 21:37:00 ndevilla Exp $ - $Author: ndevilla $ - $Date: 2007-11-23 21:37:00 $ - $Revision: 1.12 $ -*/ - -#pragma once - -/*--------------------------------------------------------------------------- - Includes - ---------------------------------------------------------------------------*/ - -#include -#include -#include -#include - -/*--------------------------------------------------------------------------- - New types - ---------------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------------*/ -/** - @brief Dictionary object - - This object contains a list of string/string associations. Each - association is identified by a unique string key. Looking up values - in the dictionary is speeded up by the use of a (hopefully collision-free) - hash function. - */ -/*-------------------------------------------------------------------------*/ -typedef struct _dictionary_ { - int n; /** Number of entries in dictionary */ - int size; /** Storage size */ - char **val; /** List of string values */ - char **key; /** List of string keys */ - unsigned *hash; /** List of hash values for keys */ -} dictionary; - -/*--------------------------------------------------------------------------- - Function prototypes - ---------------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------------*/ -/** - @brief Compute the hash key for a string. - @param key Character string to use for key. - @return 1 unsigned int on at least 32 bits. - - This hash function has been taken from an Article in Dr Dobbs Journal. - This is normally a collision-free function, distributing keys evenly. - The key is stored anyway in the struct so that collision can be avoided - by comparing the key itself in last resort. - */ -/*--------------------------------------------------------------------------*/ -unsigned dictionary_hash(char *key); - -/*-------------------------------------------------------------------------*/ -/** - @brief Create a new dictionary object. - @param size Optional initial size of the dictionary. - @return 1 newly allocated dictionary object. - - This function allocates a new dictionary object of given size and returns - it. If you do not know in advance (roughly) the number of entries in the - dictionary, give size=0. - */ -/*--------------------------------------------------------------------------*/ -dictionary *dictionary_new(int size); - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete a dictionary object - @param d dictionary object to deallocate. - @return void - - Deallocate a dictionary object and all memory associated to it. - */ -/*--------------------------------------------------------------------------*/ -void dictionary_del(dictionary *vd); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get a value from a dictionary. - @param d dictionary object to search. - @param key Key to look for in the dictionary. - @param def Default value to return if key not found. - @return 1 pointer to internally allocated character string. - - This function locates a key in a dictionary and returns a pointer to its - value, or the passed 'def' pointer if no such key can be found in - dictionary. The returned character pointer points to data internal to the - dictionary object, you should not try to free it or modify it. - */ -/*--------------------------------------------------------------------------*/ -char *dictionary_get(dictionary *d, char *key, char *def); - -/*-------------------------------------------------------------------------*/ -/** - @brief Set a value in a dictionary. - @param d dictionary object to modify. - @param key Key to modify or add. - @param val Value to add. - @return int 0 if Ok, anything else otherwise - - If the given key is found in the dictionary, the associated value is - replaced by the provided one. If the key cannot be found in the - dictionary, it is added to it. - - It is Ok to provide a NULL value for val, but NULL values for the dictionary - or the key are considered as errors: the function will return immediately - in such a case. - - Notice that if you dictionary_set a variable to NULL, a call to - dictionary_get will return a NULL value: the variable will be found, and - its value (NULL) is returned. In other words, setting the variable - content to NULL is equivalent to deleting the variable from the - dictionary. It is not possible (in this implementation) to have a key in - the dictionary without value. - - This function returns non-zero in case of failure. - */ -/*--------------------------------------------------------------------------*/ -int dictionary_set(dictionary *vd, char *key, char *val); - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete a key in a dictionary - @param d dictionary object to modify. - @param key Key to remove. - @return void - - This function deletes a key in a dictionary. Nothing is done if the - key cannot be found. - */ -/*--------------------------------------------------------------------------*/ -void dictionary_unset(dictionary *d, char *key); - -/*-------------------------------------------------------------------------*/ -/** - @brief Dump a dictionary to an opened file pointer. - @param d Dictionary to dump - @param f Opened file pointer. - @return void - - Dumps a dictionary onto an opened file pointer. Key pairs are printed out - as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as - output file pointers. - */ -/*--------------------------------------------------------------------------*/ -void dictionary_dump(dictionary *d, FILE *out); diff --git a/plugins/experimental/mysql_remap/lib/iniparser.c b/plugins/experimental/mysql_remap/lib/iniparser.c deleted file mode 100644 index a06b6d0a495..00000000000 --- a/plugins/experimental/mysql_remap/lib/iniparser.c +++ /dev/null @@ -1,694 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -/*-------------------------------------------------------------------------*/ -/** - @file iniparser.c - @author N. Devillard - @date Sep 2007 - @version 3.0 - @brief Parser for ini files. -*/ -/*--------------------------------------------------------------------------*/ -/* - $Id: iniparser.c,v 2.18 2008-01-03 18:35:39 ndevilla Exp $ - $Revision: 2.18 $ - $Date: 2008-01-03 18:35:39 $ -*/ -/*---------------------------- Includes ------------------------------------*/ -#include -#include "iniparser.h" - -/*---------------------------- Defines -------------------------------------*/ -#define ASCIILINESZ (1024) -#define INI_INVALID_KEY ((char *)-1) - -/*--------------------------------------------------------------------------- - Private to this module - ---------------------------------------------------------------------------*/ -/** - * This enum stores the status for each parsed line (internal use only). - */ -typedef enum _line_status_ { - LINE_UNPROCESSED, - LINE_ERROR, - LINE_EMPTY, - LINE_COMMENT, - LINE_SECTION, - LINE_VALUE, -} line_status; - -/*-------------------------------------------------------------------------*/ -/** - @brief Convert a string to lowercase. - @param s String to convert. - @return ptr to statically allocated string. - - This function returns a pointer to a statically allocated string - containing a lowercased version of the input string. Do not free - or modify the returned string! Since the returned string is statically - allocated, it will be modified at each function call (not re-entrant). - */ -/*--------------------------------------------------------------------------*/ -static char * -strlwc(const char *s) -{ - static char l[ASCIILINESZ + 1]; - int i; - - if (s == NULL) { - return NULL; - } - memset(l, 0, ASCIILINESZ + 1); - i = 0; - while (s[i] && i < ASCIILINESZ) { - l[i] = (char)tolower((int)s[i]); - i++; - } - l[ASCIILINESZ] = (char)0; - return l; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Remove blanks at the beginning and the end of a string. - @param s String to parse. - @return ptr to statically allocated string. - - This function returns a pointer to a statically allocated string, - which is identical to the input string, except that all blank - characters at the end and the beg. of the string have been removed. - Do not free or modify the returned string! Since the returned string - is statically allocated, it will be modified at each function call - (not re-entrant). - */ -/*--------------------------------------------------------------------------*/ -static char * -strstrip(char *s) -{ - static char l[ASCIILINESZ + 1]; - char *last; - - if (s == NULL) { - return NULL; - } - - while (isspace((int)*s) && *s) { - s++; - } - memset(l, 0, ASCIILINESZ + 1); - strcpy(l, s); - last = l + strlen(l); - while (last > l) { - if (!isspace((int)*(last - 1))) { - break; - } - last--; - } - *last = (char)0; - return (char *)l; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get number of sections in a dictionary - @param d Dictionary to examine - @return int Number of sections found in dictionary - - This function returns the number of sections found in a dictionary. - The test to recognize sections is done on the string stored in the - dictionary: a section name is given as "section" whereas a key is - stored as "section:key", thus the test looks for entries that do not - contain a colon. - - This clearly fails in the case a section name contains a colon, but - this should simply be avoided. - - This function returns -1 in case of error. - */ -/*--------------------------------------------------------------------------*/ -int -iniparser_getnsec(dictionary *d) -{ - int i; - int nsec; - - if (d == NULL) { - return -1; - } - nsec = 0; - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - if (strchr(d->key[i], ':') == NULL) { - nsec++; - } - } - return nsec; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get name for section n in a dictionary. - @param d Dictionary to examine - @param n Section number (from 0 to nsec-1). - @return Pointer to char string - - This function locates the n-th section in a dictionary and returns - its name as a pointer to a string statically allocated inside the - dictionary. Do not free or modify the returned string! - - This function returns NULL in case of error. - */ -/*--------------------------------------------------------------------------*/ -char * -iniparser_getsecname(dictionary *d, int n) -{ - int i; - int foundsec; - - if (d == NULL || n < 0) { - return NULL; - } - foundsec = 0; - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - if (strchr(d->key[i], ':') == NULL) { - foundsec++; - if (foundsec > n) { - break; - } - } - } - if (foundsec <= n) { - return NULL; - } - return d->key[i]; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Dump a dictionary to an opened file pointer. - @param d Dictionary to dump. - @param f Opened file pointer to dump to. - @return void - - This function prints out the contents of a dictionary, one element by - line, onto the provided file pointer. It is OK to specify @c stderr - or @c stdout as output files. This function is meant for debugging - purposes mostly. - */ -/*--------------------------------------------------------------------------*/ -void -iniparser_dump(dictionary *d, FILE *f) -{ - int i; - - if (d == NULL || f == NULL) { - return; - } - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - if (d->val[i] != NULL) { - fprintf(f, "[%s]=[%s]\n", d->key[i], d->val[i]); - } else { - fprintf(f, "[%s]=UNDEF\n", d->key[i]); - } - } - return; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Save a dictionary to a loadable ini file - @param d Dictionary to dump - @param f Opened file pointer to dump to - @return void - - This function dumps a given dictionary into a loadable ini file. - It is Ok to specify @c stderr or @c stdout as output files. - */ -/*--------------------------------------------------------------------------*/ -void -iniparser_dump_ini(dictionary *d, FILE *f) -{ - int i, j; - char keym[ASCIILINESZ + 1]; - int nsec; - char *secname; - int seclen; - - if (d == NULL || f == NULL) { - return; - } - - nsec = iniparser_getnsec(d); - if (nsec < 1) { - /* No section in file: dump all keys as they are */ - for (i = 0; i < d->size; i++) { - if (d->key[i] == NULL) { - continue; - } - fprintf(f, "%s = %s\n", d->key[i], d->val[i]); - } - return; - } - for (i = 0; i < nsec; i++) { - secname = iniparser_getsecname(d, i); - seclen = (int)strlen(secname); - fprintf(f, "\n[%s]\n", secname); - sprintf(keym, "%s:", secname); - for (j = 0; j < d->size; j++) { - if (d->key[j] == NULL) { - continue; - } - if (!strncmp(d->key[j], keym, seclen + 1)) { - fprintf(f, "%-30s = %s\n", d->key[j] + seclen + 1, d->val[j] ? d->val[j] : ""); - } - } - } - fprintf(f, "\n"); - return; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key - @param d Dictionary to search - @param key Key string to look for - @param def Default value to return if key not found. - @return pointer to statically allocated character string - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the pointer passed as 'def' is returned. - The returned char pointer is pointing to a string allocated in - the dictionary, do not free or modify it. - */ -/*--------------------------------------------------------------------------*/ -char * -iniparser_getstring(dictionary *d, const char *key, char *def) -{ - char *lc_key; - char *sval; - - if (d == NULL || key == NULL) { - return def; - } - - lc_key = strlwc(key); - sval = dictionary_get(d, lc_key, def); - return sval; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to an int - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return integer - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - - Supported values for integers include the usual C notation - so decimal, octal (starting with 0) and hexadecimal (starting with 0x) - are supported. Examples: - - "42" -> 42 - "042" -> 34 (octal -> decimal) - "0x42" -> 66 (hexa -> decimal) - - Warning: the conversion may overflow in various ways. Conversion is - totally outsourced to strtol(), see the associated man page for overflow - handling. - - Credits: Thanks to A. Becker for suggesting strtol() - */ -/*--------------------------------------------------------------------------*/ -int -iniparser_getint(dictionary *d, const char *key, int notfound) -{ - char *str; - - str = iniparser_getstring(d, key, INI_INVALID_KEY); - if (str == INI_INVALID_KEY) { - return notfound; - } - return (int)strtol(str, NULL, 0); -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to a double - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return double - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - */ -/*--------------------------------------------------------------------------*/ -double -iniparser_getdouble(dictionary *d, char *key, double notfound) -{ - char *str; - - str = iniparser_getstring(d, key, INI_INVALID_KEY); - if (str == INI_INVALID_KEY) { - return notfound; - } - return atof(str); -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to a boolean - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return integer - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - - A true boolean is found if one of the following is matched: - - - A string starting with 'y' - - A string starting with 'Y' - - A string starting with 't' - - A string starting with 'T' - - A string starting with '1' - - A false boolean is found if one of the following is matched: - - - A string starting with 'n' - - A string starting with 'N' - - A string starting with 'f' - - A string starting with 'F' - - A string starting with '0' - - The notfound value returned if no boolean is identified, does not - necessarily have to be 0 or 1. - */ -/*--------------------------------------------------------------------------*/ -int -iniparser_getboolean(dictionary *d, const char *key, int notfound) -{ - char *c; - int ret; - - c = iniparser_getstring(d, key, INI_INVALID_KEY); - if (c == INI_INVALID_KEY) { - return notfound; - } - if (c[0] == 'y' || c[0] == 'Y' || c[0] == '1' || c[0] == 't' || c[0] == 'T') { - ret = 1; - } else if (c[0] == 'n' || c[0] == 'N' || c[0] == '0' || c[0] == 'f' || c[0] == 'F') { - ret = 0; - } else { - ret = notfound; - } - return ret; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Finds out if a given entry exists in a dictionary - @param ini Dictionary to search - @param entry Name of the entry to look for - @return integer 1 if entry exists, 0 otherwise - - Finds out if a given entry exists in the dictionary. Since sections - are stored as keys with NULL associated values, this is the only way - of querying for the presence of sections in a dictionary. - */ -/*--------------------------------------------------------------------------*/ -int -iniparser_find_entry(dictionary *ini, char *entry) -{ - int found = 0; - if (iniparser_getstring(ini, entry, INI_INVALID_KEY) != INI_INVALID_KEY) { - found = 1; - } - return found; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Set an entry in a dictionary. - @param ini Dictionary to modify. - @param entry Entry to modify (entry name) - @param val New value to associate to the entry. - @return int 0 if Ok, -1 otherwise. - - If the given entry can be found in the dictionary, it is modified to - contain the provided value. If it cannot be found, -1 is returned. - It is Ok to set val to NULL. - */ -/*--------------------------------------------------------------------------*/ -int -iniparser_set(dictionary *ini, char *entry, char *val) -{ - return dictionary_set(ini, strlwc(entry), val); -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete an entry in a dictionary - @param ini Dictionary to modify - @param entry Entry to delete (entry name) - @return void - - If the given entry can be found, it is deleted from the dictionary. - */ -/*--------------------------------------------------------------------------*/ -void -iniparser_unset(dictionary *ini, char *entry) -{ - dictionary_unset(ini, strlwc(entry)); -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Load a single line from an INI file - @param input_line Input line, may be concatenated multi-line input - @param section Output space to store section - @param key Output space to store key - @param value Output space to store value - @return line_status value - */ -/*--------------------------------------------------------------------------*/ -static line_status -iniparser_line(char *input_line, char *section, char *key, char *value) -{ - line_status sta; - char line[ASCIILINESZ + 1]; - int len; - - strcpy(line, strstrip(input_line)); - len = (int)strlen(line); - - sta = LINE_UNPROCESSED; - if (len < 1) { - /* Empty line */ - sta = LINE_EMPTY; - } else if (line[0] == '#') { - /* Comment line */ - sta = LINE_COMMENT; - } else if (line[0] == '[' && line[len - 1] == ']') { - /* Section name */ - sscanf(line, "[%[^]]", section); - strcpy(section, strstrip(section)); - strcpy(section, strlwc(section)); - sta = LINE_SECTION; - } else if (sscanf(line, "%[^=] = \"%[^\"]\"", key, value) == 2 || sscanf(line, "%[^=] = '%[^\']'", key, value) == 2 || - sscanf(line, "%[^=] = %[^;#]", key, value) == 2) { - /* Usual key=value, with or without comments */ - strcpy(key, strstrip(key)); - strcpy(key, strlwc(key)); - strcpy(value, strstrip(value)); - /* - * sscanf cannot handle '' or "" as empty values - * this is done here - */ - if (!strcmp(value, "\"\"") || (!strcmp(value, "''"))) { - value[0] = 0; - } - sta = LINE_VALUE; - } else if (sscanf(line, "%[^=] = %[;#]", key, value) == 2 || sscanf(line, "%[^=] %[=]", key, value) == 2) { - /* - * Special cases: - * key= - * key=; - * key=# - */ - strcpy(key, strstrip(key)); - strcpy(key, strlwc(key)); - value[0] = 0; - sta = LINE_VALUE; - } else { - /* Generate syntax error */ - sta = LINE_ERROR; - } - return sta; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Parse an ini file and return an allocated dictionary object - @param ininame Name of the ini file to read. - @return Pointer to newly allocated dictionary - - This is the parser for ini files. This function is called, providing - the name of the file to be read. It returns a dictionary object that - should not be accessed directly, but through accessor functions - instead. - - The returned dictionary must be freed using iniparser_freedict(). - */ -/*--------------------------------------------------------------------------*/ -dictionary * -iniparser_load(const char *ininame) -{ - FILE *in; - - char line[ASCIILINESZ + 1]; - char section[ASCIILINESZ + 1]; - char key[ASCIILINESZ + 1]; - char tmp[ASCIILINESZ + 1]; - char val[ASCIILINESZ + 1]; - - int last = 0; - int len; - int lineno = 0; - int errs = 0; - - dictionary *dict; - - if ((in = fopen(ininame, "r")) == NULL) { - fprintf(stderr, "iniparser: cannot open %s\n", ininame); - return NULL; - } - - dict = dictionary_new(0); - if (!dict) { - fclose(in); - return NULL; - } - - memset(line, 0, ASCIILINESZ); - memset(section, 0, ASCIILINESZ); - memset(key, 0, ASCIILINESZ); - memset(val, 0, ASCIILINESZ); - last = 0; - - while (fgets(line + last, ASCIILINESZ - last, in) != NULL) { - lineno++; - len = (int)strlen(line) - 1; - /* Safety check against buffer overflows */ - if (line[len] != '\n') { - fprintf(stderr, "iniparser: input line too long in %s (%d)\n", ininame, lineno); - dictionary_del(dict); - fclose(in); - return NULL; - } - /* Get rid of \n and spaces at end of line */ - while ((len >= 0) && ((line[len] == '\n') || (isspace(line[len])))) { - line[len] = 0; - len--; - } - /* Detect multi-line */ - if (line[len] == '\\') { - /* Multi-line value */ - last = len; - continue; - } else { - last = 0; - } - switch (iniparser_line(line, section, key, val)) { - case LINE_EMPTY: - case LINE_COMMENT: - break; - - case LINE_SECTION: - errs = dictionary_set(dict, section, NULL); - break; - - case LINE_VALUE: - snprintf(tmp, sizeof(tmp), "%s:%s", section, key); - errs = dictionary_set(dict, tmp, val); - break; - - case LINE_ERROR: - fprintf(stderr, "iniparser: syntax error in %s (%d):\n", ininame, lineno); - fprintf(stderr, "-> %s\n", line); - errs++; - break; - - default: - break; - } - memset(line, 0, ASCIILINESZ); - last = 0; - if (errs < 0) { - fprintf(stderr, "iniparser: memory allocation failure\n"); - break; - } - } - if (errs) { - dictionary_del(dict); - dict = NULL; - } - fclose(in); - return dict; -} - -/*-------------------------------------------------------------------------*/ -/** - @brief Free all memory associated to an ini dictionary - @param d Dictionary to free - @return void - - Free all memory associated to an ini dictionary. - It is mandatory to call this function before the dictionary object - gets out of the current context. - */ -/*--------------------------------------------------------------------------*/ -void -iniparser_freedict(dictionary *d) -{ - dictionary_del(d); -} - -/* vim: set ts=4 et sw=4 tw=75 */ diff --git a/plugins/experimental/mysql_remap/lib/iniparser.h b/plugins/experimental/mysql_remap/lib/iniparser.h deleted file mode 100644 index ca415becc42..00000000000 --- a/plugins/experimental/mysql_remap/lib/iniparser.h +++ /dev/null @@ -1,295 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -/*-------------------------------------------------------------------------*/ -/** - @file iniparser.h - @author N. Devillard - @date Sep 2007 - @version 3.0 - @brief Parser for ini files. -*/ -/*--------------------------------------------------------------------------*/ - -/* - $Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $ - $Revision: 1.24 $ -*/ - -#pragma once - -/*--------------------------------------------------------------------------- - Includes - ---------------------------------------------------------------------------*/ - -#include // NOLINT(modernize-deprecated-headers) -#include // NOLINT(modernize-deprecated-headers) -#include // NOLINT(modernize-deprecated-headers) - -/* - * The following #include is necessary on many Unixes but not Linux. - * It is not needed for Windows platforms. - * Uncomment it if needed. - */ -/* #include */ - -#include "dictionary.h" - -/*--------------------------------------------------------------------------- - Macros - ---------------------------------------------------------------------------*/ -/** For backwards compatibility only */ -#define iniparser_getstr(d, k) iniparser_getstring(d, k, NULL) -#define iniparser_setstr iniparser_setstring - -/*-------------------------------------------------------------------------*/ -/** - @brief Get number of sections in a dictionary - @param d Dictionary to examine - @return int Number of sections found in dictionary - - This function returns the number of sections found in a dictionary. - The test to recognize sections is done on the string stored in the - dictionary: a section name is given as "section" whereas a key is - stored as "section:key", thus the test looks for entries that do not - contain a colon. - - This clearly fails in the case a section name contains a colon, but - this should simply be avoided. - - This function returns -1 in case of error. - */ -/*--------------------------------------------------------------------------*/ - -int iniparser_getnsec(dictionary *d); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get name for section n in a dictionary. - @param d Dictionary to examine - @param n Section number (from 0 to nsec-1). - @return Pointer to char string - - This function locates the n-th section in a dictionary and returns - its name as a pointer to a string statically allocated inside the - dictionary. Do not free or modify the returned string! - - This function returns NULL in case of error. - */ -/*--------------------------------------------------------------------------*/ - -char *iniparser_getsecname(dictionary *d, int n); - -/*-------------------------------------------------------------------------*/ -/** - @brief Save a dictionary to a loadable ini file - @param d Dictionary to dump - @param f Opened file pointer to dump to - @return void - - This function dumps a given dictionary into a loadable ini file. - It is Ok to specify @c stderr or @c stdout as output files. - */ -/*--------------------------------------------------------------------------*/ - -void iniparser_dump_ini(dictionary *d, FILE *f); - -/*-------------------------------------------------------------------------*/ -/** - @brief Dump a dictionary to an opened file pointer. - @param d Dictionary to dump. - @param f Opened file pointer to dump to. - @return void - - This function prints out the contents of a dictionary, one element by - line, onto the provided file pointer. It is OK to specify @c stderr - or @c stdout as output files. This function is meant for debugging - purposes mostly. - */ -/*--------------------------------------------------------------------------*/ -void iniparser_dump(dictionary *d, FILE *f); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key - @param d Dictionary to search - @param key Key string to look for - @param def Default value to return if key not found. - @return pointer to statically allocated character string - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the pointer passed as 'def' is returned. - The returned char pointer is pointing to a string allocated in - the dictionary, do not free or modify it. - */ -/*--------------------------------------------------------------------------*/ -char *iniparser_getstring(dictionary *d, const char *key, char *def); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to an int - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return integer - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - - Supported values for integers include the usual C notation - so decimal, octal (starting with 0) and hexadecimal (starting with 0x) - are supported. Examples: - - - "42" -> 42 - - "042" -> 34 (octal -> decimal) - - "0x42" -> 66 (hexa -> decimal) - - Warning: the conversion may overflow in various ways. Conversion is - totally outsourced to strtol(), see the associated man page for overflow - handling. - - Credits: Thanks to A. Becker for suggesting strtol() - */ -/*--------------------------------------------------------------------------*/ -int iniparser_getint(dictionary *d, const char *key, int notfound); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to a double - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return double - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - */ -/*--------------------------------------------------------------------------*/ -double iniparser_getdouble(dictionary *d, char *key, double notfound); - -/*-------------------------------------------------------------------------*/ -/** - @brief Get the string associated to a key, convert to a boolean - @param d Dictionary to search - @param key Key string to look for - @param notfound Value to return in case of error - @return integer - - This function queries a dictionary for a key. A key as read from an - ini file is given as "section:key". If the key cannot be found, - the notfound value is returned. - - A true boolean is found if one of the following is matched: - - - A string starting with 'y' - - A string starting with 'Y' - - A string starting with 't' - - A string starting with 'T' - - A string starting with '1' - - A false boolean is found if one of the following is matched: - - - A string starting with 'n' - - A string starting with 'N' - - A string starting with 'f' - - A string starting with 'F' - - A string starting with '0' - - The notfound value returned if no boolean is identified, does not - necessarily have to be 0 or 1. - */ -/*--------------------------------------------------------------------------*/ -int iniparser_getboolean(dictionary *d, const char *key, int notfound); - -/*-------------------------------------------------------------------------*/ -/** - @brief Set an entry in a dictionary. - @param ini Dictionary to modify. - @param entry Entry to modify (entry name) - @param val New value to associate to the entry. - @return int 0 if Ok, -1 otherwise. - - If the given entry can be found in the dictionary, it is modified to - contain the provided value. If it cannot be found, -1 is returned. - It is Ok to set val to NULL. - */ -/*--------------------------------------------------------------------------*/ -int iniparser_setstring(dictionary *ini, char *entry, char *val); - -/*-------------------------------------------------------------------------*/ -/** - @brief Delete an entry in a dictionary - @param ini Dictionary to modify - @param entry Entry to delete (entry name) - @return void - - If the given entry can be found, it is deleted from the dictionary. - */ -/*--------------------------------------------------------------------------*/ -void iniparser_unset(dictionary *ini, char *entry); - -/*-------------------------------------------------------------------------*/ -/** - @brief Finds out if a given entry exists in a dictionary - @param ini Dictionary to search - @param entry Name of the entry to look for - @return integer 1 if entry exists, 0 otherwise - - Finds out if a given entry exists in the dictionary. Since sections - are stored as keys with NULL associated values, this is the only way - of querying for the presence of sections in a dictionary. - */ -/*--------------------------------------------------------------------------*/ -int iniparser_find_entry(dictionary *ini, char *entry); - -/*-------------------------------------------------------------------------*/ -/** - @brief Parse an ini file and return an allocated dictionary object - @param ininame Name of the ini file to read. - @return Pointer to newly allocated dictionary - - This is the parser for ini files. This function is called, providing - the name of the file to be read. It returns a dictionary object that - should not be accessed directly, but through accessor functions - instead. - - The returned dictionary must be freed using iniparser_freedict(). - */ -/*--------------------------------------------------------------------------*/ -dictionary *iniparser_load(const char *ininame); - -/*-------------------------------------------------------------------------*/ -/** - @brief Free all memory associated to an ini dictionary - @param d Dictionary to free - @return void - - Free all memory associated to an ini dictionary. - It is mandatory to call this function before the dictionary object - gets out of the current context. - */ -/*--------------------------------------------------------------------------*/ -void iniparser_freedict(dictionary *d); diff --git a/plugins/experimental/mysql_remap/mysql_remap.cc b/plugins/experimental/mysql_remap/mysql_remap.cc deleted file mode 100644 index 95cd1343756..00000000000 --- a/plugins/experimental/mysql_remap/mysql_remap.cc +++ /dev/null @@ -1,246 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include -#include -#include - -#include - -#include "lib/iniparser.h" -#include "default.h" - -MYSQL mysql; - -using my_data = struct { - char *query; -}; - -bool -do_mysql_remap(TSCont contp, TSHttpTxn txnp) -{ - TSMBuffer reqp; - TSMLoc hdr_loc, url_loc, field_loc; - bool ret_val = false; - - const char *request_host; - int request_host_length = 0; - const char *request_scheme; - int request_scheme_length = 0; - int request_port = 80; - char *query; - - MYSQL_ROW row; - MYSQL_RES *res; - - my_data *data = static_cast(TSContDataGet(contp)); - query = data->query; - - if (TSHttpTxnClientReqGet(txnp, &reqp, &hdr_loc) != TS_SUCCESS) { - TSDebug(PLUGIN_NAME, "could not get request data"); - return false; - } - - TSHttpHdrUrlGet(reqp, hdr_loc, &url_loc); - - if (!url_loc) { - TSDebug(PLUGIN_NAME, "couldn't retrieve request url"); - goto release_hdr; - } - - field_loc = TSMimeHdrFieldFind(reqp, hdr_loc, TS_MIME_FIELD_HOST, TS_MIME_LEN_HOST); - - if (!field_loc) { - TSDebug(PLUGIN_NAME, "couldn't retrieve request HOST header"); - goto release_url; - } - - request_host = TSMimeHdrFieldValueStringGet(reqp, hdr_loc, field_loc, -1, &request_host_length); - if (!request_host_length) { - TSDebug(PLUGIN_NAME, "couldn't find request HOST header"); - goto release_field; - } - - request_scheme = TSUrlSchemeGet(reqp, url_loc, &request_scheme_length); - request_port = TSUrlPortGet(reqp, url_loc); - - TSDebug(PLUGIN_NAME, " +++++MYSQL REMAP+++++ "); - - TSDebug(PLUGIN_NAME, "\nINCOMING REQUEST ->\n ::: from_scheme_desc: %.*s\n ::: from_hostname: %.*s\n ::: from_port: %d", - request_scheme_length, request_scheme, request_host_length, request_host, request_port); - - snprintf(query, QSIZE, " \ - SELECT \ - t_scheme.scheme_desc, \ - t_host.hostname, \ - to_port \ - FROM map \ - INNER JOIN scheme as t_scheme ON (map.to_scheme_id = t_scheme.id) \ - INNER JOIN scheme as f_scheme ON (map.from_scheme_id = f_scheme.id) \ - INNER JOIN hostname as t_host ON (map.to_hostname_id = t_host.id) \ - INNER JOIN hostname as f_host ON (map.from_hostname_id = f_host.id) \ - WHERE \ - is_enabled=1 \ - AND f_host.hostname = '%.*s' \ - AND f_scheme.id = %d \ - AND from_port = %d \ - LIMIT 1", - request_host_length, request_host, (strcmp(request_scheme, "https") == 0) ? 2 : 1, request_port); - - mysql_real_query(&mysql, query, (unsigned int)strlen(query)); - res = mysql_use_result(&mysql); - - if (!res) - goto not_found; // TODO: define a fallback - - do { - row = mysql_fetch_row(res); - if (!row) - goto not_found; - TSDebug(PLUGIN_NAME, "\nOUTGOING REQUEST ->\n ::: to_scheme_desc: %s\n ::: to_hostname: %s\n ::: to_port: %s", row[0], row[1], - row[2]); - TSMimeHdrFieldValueStringSet(reqp, hdr_loc, field_loc, 0, row[1], -1); - TSUrlHostSet(reqp, url_loc, row[1], -1); - TSUrlSchemeSet(reqp, url_loc, row[0], -1); - TSUrlPortSet(reqp, url_loc, atoi(row[2])); - } while (false); - - ret_val = true; - -not_found: - if (!ret_val) { - // lets build up a nice 404 message for someone - TSHttpHdrStatusSet(reqp, hdr_loc, TS_HTTP_STATUS_NOT_FOUND); - TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_NOT_FOUND); - } - if (res) { - mysql_free_result(res); - } -release_field: - if (field_loc) { - TSHandleMLocRelease(reqp, hdr_loc, field_loc); - } -release_url: - if (url_loc) { - TSHandleMLocRelease(reqp, hdr_loc, url_loc); - } -release_hdr: - if (hdr_loc) { - TSHandleMLocRelease(reqp, TS_NULL_MLOC, hdr_loc); - } - - return ret_val; -} - -static int -mysql_remap(TSCont contp, TSEvent event, void *edata) -{ - TSHttpTxn txnp = static_cast(edata); - TSEvent reenable = TS_EVENT_HTTP_CONTINUE; - - switch (event) { - case TS_EVENT_HTTP_READ_REQUEST_HDR: - TSDebug(PLUGIN_NAME, "Reading Request"); - TSHttpTxnCntlSet(txnp, TS_HTTP_CNTL_SKIP_REMAPPING, true); - if (!do_mysql_remap(contp, txnp)) { - reenable = TS_EVENT_HTTP_ERROR; - } - break; - default: - break; - } - - TSHttpTxnReenable(txnp, reenable); - return 1; -} - -void -TSPluginInit(int argc, const char *argv[]) -{ - dictionary *ini; - const char *host; - int port; - const char *username; - const char *password; - const char *db; - - my_data *data = static_cast(malloc(1 * sizeof(my_data))); - - TSPluginRegistrationInfo info; - bool reconnect = true; - - info.plugin_name = const_cast(PLUGIN_NAME); - info.vendor_name = const_cast("Apache Software Foundation"); - info.support_email = const_cast("dev@trafficserver.apache.org"); - - if (TSPluginRegister(&info) != TS_SUCCESS) { - TSError("[mysql_remap] Plugin registration failed"); - } - - if (argc != 2) { - TSError("[mysql_remap] Usage: %s /path/to/sample.ini", argv[0]); - return; - } - - ini = iniparser_load(argv[1]); - if (!ini) { - TSError("[mysql_remap] Error with ini file (1)"); - TSDebug(PLUGIN_NAME, "Error parsing ini file(1)"); - return; - } - - host = iniparser_getstring(ini, "mysql_remap:mysql_host", (char *)"localhost"); - port = iniparser_getint(ini, "mysql_remap:mysql_port", 3306); - username = iniparser_getstring(ini, "mysql_remap:mysql_username", nullptr); - password = iniparser_getstring(ini, "mysql_remap:mysql_password", nullptr); - db = iniparser_getstring(ini, "mysql_remap:mysql_database", (char *)"mysql_remap"); - - if (mysql_library_init(0, NULL, NULL)) { - TSError("[mysql_remap] Error initializing mysql client library"); - TSDebug(PLUGIN_NAME, "Error initializing mysql client library"); - return; - } - - if (!mysql_init(&mysql)) { - TSError("[mysql_remap] Could not initialize MySQL"); - TSDebug(PLUGIN_NAME, "Could not initialize MySQL"); - return; - } - - mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect); - - if (!mysql_real_connect(&mysql, host, username, password, db, port, NULL, 0)) { - TSError("[mysql_remap] Could not connect to mysql"); - TSDebug(PLUGIN_NAME, "Could not connect to mysql: %s", mysql_error(&mysql)); - return; - } - - data->query = static_cast(TSmalloc(QSIZE * sizeof(char))); // TODO: malloc smarter sizes - - TSDebug(PLUGIN_NAME, "h: %s; u: %s; p: %s; p:%d; d:%s", host, username, password, port, db); - TSCont cont = TSContCreate(mysql_remap, TSMutexCreate()); - - TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont); - - TSContDataSet(cont, (void *)data); - - TSDebug(PLUGIN_NAME, "plugin is successfully initialized [plugin mode]"); - iniparser_freedict(ini); - return; -} diff --git a/plugins/experimental/mysql_remap/sample.ini b/plugins/experimental/mysql_remap/sample.ini deleted file mode 100644 index 912090c1b37..00000000000 --- a/plugins/experimental/mysql_remap/sample.ini +++ /dev/null @@ -1,24 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -[mysql_remap] -mysql_host = localhost #default -mysql_port = 3306 #default -mysql_username = root -mysql_password = -mysql_database = mysql_remap #default diff --git a/plugins/experimental/mysql_remap/schema/import.sql b/plugins/experimental/mysql_remap/schema/import.sql deleted file mode 100644 index cbe331b732e..00000000000 --- a/plugins/experimental/mysql_remap/schema/import.sql +++ /dev/null @@ -1,134 +0,0 @@ --- --- Licensed to the Apache Software Foundation (ASF) under one --- or more contributor license agreements. See the NOTICE file --- distributed with this work for additional information --- regarding copyright ownership. The ASF licenses this file --- to you under the Apache License, Version 2.0 (the --- "License"); you may not use this file except in compliance --- with the License. You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- - --- MySQL dump 10.13 Distrib 5.1.48, for apple-darwin10.4.0 (i386) --- --- Host: localhost Database: mysql_remap --- ------------------------------------------------------ --- Server version 5.1.48-log - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `hostname` --- - -DROP TABLE IF EXISTS `hostname`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `hostname` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `hostname` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `hostname` (`hostname`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `hostname` --- - -LOCK TABLES `hostname` WRITE; -/*!40000 ALTER TABLE `hostname` DISABLE KEYS */; -INSERT INTO `hostname` VALUES (1,'www.ericbalsa.com'),(2,'www.google.com'); -/*!40000 ALTER TABLE `hostname` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `map` --- - -DROP TABLE IF EXISTS `map`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `map` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `from_scheme_id` int(10) unsigned NOT NULL DEFAULT '1', - `from_hostname_id` int(10) unsigned NOT NULL, - `from_port` int(5) unsigned NOT NULL, - `to_scheme_id` int(10) unsigned NOT NULL DEFAULT '1', - `to_hostname_id` int(10) unsigned NOT NULL, - `to_port` int(5) unsigned NOT NULL DEFAULT '80', - `is_enabled` tinyint(1) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `from_unique` (`from_scheme_id`,`from_hostname_id`,`from_port`), - UNIQUE KEY `to_unique` (`to_scheme_id`,`to_hostname_id`,`to_port`), - UNIQUE KEY `unique_across_everything` (`from_scheme_id`,`from_hostname_id`,`from_port`,`to_scheme_id`,`to_hostname_id`,`to_port`), - KEY `to_hostname_id` (`to_hostname_id`), - KEY `from_hostname_id` (`from_hostname_id`), - CONSTRAINT `map_ibfk_1` FOREIGN KEY (`from_scheme_id`) REFERENCES `scheme` (`id`) ON UPDATE CASCADE, - CONSTRAINT `map_ibfk_3` FOREIGN KEY (`to_scheme_id`) REFERENCES `scheme` (`id`) ON UPDATE CASCADE, - CONSTRAINT `map_ibfk_4` FOREIGN KEY (`to_hostname_id`) REFERENCES `hostname` (`id`) ON UPDATE CASCADE, - CONSTRAINT `map_ibfk_5` FOREIGN KEY (`from_hostname_id`) REFERENCES `hostname` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `map` --- - -LOCK TABLES `map` WRITE; -/*!40000 ALTER TABLE `map` DISABLE KEYS */; -INSERT INTO `map` VALUES (1,1,2,80,1,1,80,1); -/*!40000 ALTER TABLE `map` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `scheme` --- - -DROP TABLE IF EXISTS `scheme`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `scheme` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `scheme_desc` varchar(5) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `desc` (`scheme_desc`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `scheme` --- - -LOCK TABLES `scheme` WRITE; -/*!40000 ALTER TABLE `scheme` DISABLE KEYS */; -INSERT INTO `scheme` VALUES (1,'http'),(2,'https'); -/*!40000 ALTER TABLE `scheme` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2010-11-15 21:08:43