mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
6b0853a398
Changed header to GPL version 2 only BUILD/Makefile.am: Changed header to GPL version 2 only Docs/Makefile.am: Changed header to GPL version 2 only Makefile.am: Changed header to GPL version 2 only SSL/Makefile.am: Changed header to GPL version 2 only bdb/Makefile.in: Changed header to GPL version 2 only client/Makefile.am: Changed header to GPL version 2 only client/client_priv.h: Changed header to GPL version 2 only client/completion_hash.cc: Changed header to GPL version 2 only client/completion_hash.h: Changed header to GPL version 2 only client/get_password.c: Changed header to GPL version 2 only client/my_readline.h: Changed header to GPL version 2 only client/mysql.cc: Changed header to GPL version 2 only client/mysql_upgrade.c: Changed header to GPL version 2 only client/mysqladmin.cc: Changed header to GPL version 2 only client/mysqlbinlog.cc: Changed header to GPL version 2 only client/mysqlcheck.c: Changed header to GPL version 2 only client/mysqldump.c: Changed header to GPL version 2 only client/mysqlimport.c: Changed header to GPL version 2 only client/mysqlmanager-pwgen.c: Changed header to GPL version 2 only client/mysqlmanagerc.c: Changed header to GPL version 2 only client/mysqlshow.c: Changed header to GPL version 2 only client/mysqltest.c: Changed header to GPL version 2 only client/readline.cc: Changed header to GPL version 2 only client/sql_string.cc: Changed header to GPL version 2 only client/sql_string.h: Changed header to GPL version 2 only cmd-line-utils/Makefile.am: Changed header to GPL version 2 only dbug/Makefile.am: Changed header to GPL version 2 only extra/Makefile.am: Changed header to GPL version 2 only extra/charset2html.c: Changed header to GPL version 2 only extra/comp_err.c: Changed header to GPL version 2 only extra/innochecksum.c: Changed header to GPL version 2 only extra/my_print_defaults.c: Changed header to GPL version 2 only extra/mysql_waitpid.c: Changed header to GPL version 2 only extra/perror.c: Changed header to GPL version 2 only extra/replace.c: Changed header to GPL version 2 only extra/resolve_stack_dump.c: Changed header to GPL version 2 only extra/resolveip.c: Changed header to GPL version 2 only heap/Makefile.am: Changed header to GPL version 2 only heap/_check.c: Changed header to GPL version 2 only heap/_rectest.c: Changed header to GPL version 2 only heap/heapdef.h: Changed header to GPL version 2 only heap/hp_block.c: Changed header to GPL version 2 only heap/hp_clear.c: Changed header to GPL version 2 only heap/hp_close.c: Changed header to GPL version 2 only heap/hp_create.c: Changed header to GPL version 2 only heap/hp_delete.c: Changed header to GPL version 2 only heap/hp_extra.c: Changed header to GPL version 2 only heap/hp_hash.c: Changed header to GPL version 2 only heap/hp_info.c: Changed header to GPL version 2 only heap/hp_open.c: Changed header to GPL version 2 only heap/hp_panic.c: Changed header to GPL version 2 only heap/hp_rename.c: Changed header to GPL version 2 only heap/hp_rfirst.c: Changed header to GPL version 2 only heap/hp_rkey.c: Changed header to GPL version 2 only heap/hp_rlast.c: Changed header to GPL version 2 only heap/hp_rnext.c: Changed header to GPL version 2 only heap/hp_rprev.c: Changed header to GPL version 2 only heap/hp_rrnd.c: Changed header to GPL version 2 only heap/hp_rsame.c: Changed header to GPL version 2 only heap/hp_scan.c: Changed header to GPL version 2 only heap/hp_static.c: Changed header to GPL version 2 only heap/hp_test1.c: Changed header to GPL version 2 only heap/hp_test2.c: Changed header to GPL version 2 only heap/hp_update.c: Changed header to GPL version 2 only heap/hp_write.c: Changed header to GPL version 2 only include/Makefile.am: Changed header to GPL version 2 only include/base64.h: Changed header to GPL version 2 only include/config-netware.h: Changed header to GPL version 2 only include/config-os2.h: Changed header to GPL version 2 only include/config-win.h: Changed header to GPL version 2 only include/decimal.h: Changed header to GPL version 2 only include/errmsg.h: Changed header to GPL version 2 only include/ft_global.h: Changed header to GPL version 2 only include/hash.h: Changed header to GPL version 2 only include/heap.h: Changed header to GPL version 2 only include/keycache.h: Changed header to GPL version 2 only include/m_ctype.h: Changed header to GPL version 2 only include/m_string.h: Changed header to GPL version 2 only include/md5.h: Changed header to GPL version 2 only include/my_aes.h: Changed header to GPL version 2 only include/my_alarm.h: Changed header to GPL version 2 only include/my_alloc.h: Changed header to GPL version 2 only include/my_base.h: Changed header to GPL version 2 only include/my_bitmap.h: Changed header to GPL version 2 only include/my_dbug.h: Changed header to GPL version 2 only include/my_dir.h: Changed header to GPL version 2 only include/my_getopt.h: Changed header to GPL version 2 only include/my_global.h: Changed header to GPL version 2 only include/my_handler.h: Changed header to GPL version 2 only include/my_libwrap.h: Changed header to GPL version 2 only include/my_list.h: Changed header to GPL version 2 only include/my_net.h: Changed header to GPL version 2 only include/my_no_pthread.h: Changed header to GPL version 2 only include/my_nosys.h: Changed header to GPL version 2 only include/my_pthread.h: Changed header to GPL version 2 only include/my_sys.h: Changed header to GPL version 2 only include/my_time.h: Changed header to GPL version 2 only include/my_tree.h: Changed header to GPL version 2 only include/my_user.h: Changed header to GPL version 2 only include/my_xml.h: Changed header to GPL version 2 only include/myisam.h: Changed header to GPL version 2 only include/myisammrg.h: Changed header to GPL version 2 only include/myisampack.h: Changed header to GPL version 2 only include/mysql.h: Changed header to GPL version 2 only include/mysql_com.h: Changed header to GPL version 2 only include/mysql_embed.h: Changed header to GPL version 2 only include/mysql_time.h: Changed header to GPL version 2 only include/mysys_err.h: Changed header to GPL version 2 only include/queues.h: Changed header to GPL version 2 only include/raid.h: Changed header to GPL version 2 only include/rijndael.h: Changed header to GPL version 2 only include/sha1.h: Changed header to GPL version 2 only include/sql_common.h: Changed header to GPL version 2 only include/sslopt-case.h: Changed header to GPL version 2 only include/sslopt-longopts.h: Changed header to GPL version 2 only include/sslopt-vars.h: Changed header to GPL version 2 only include/t_ctype.h: Changed header to GPL version 2 only include/thr_alarm.h: Changed header to GPL version 2 only include/thr_lock.h: Changed header to GPL version 2 only include/typelib.h: Changed header to GPL version 2 only include/violite.h: Changed header to GPL version 2 only innobase/Makefile.am: Changed header to GPL version 2 only innobase/btr/Makefile.am: Changed header to GPL version 2 only innobase/buf/Makefile.am: Changed header to GPL version 2 only innobase/data/Makefile.am: Changed header to GPL version 2 only innobase/dict/Makefile.am: Changed header to GPL version 2 only innobase/dyn/Makefile.am: Changed header to GPL version 2 only innobase/eval/Makefile.am: Changed header to GPL version 2 only innobase/fil/Makefile.am: Changed header to GPL version 2 only innobase/fsp/Makefile.am: Changed header to GPL version 2 only innobase/fut/Makefile.am: Changed header to GPL version 2 only innobase/ha/Makefile.am: Changed header to GPL version 2 only innobase/ibuf/Makefile.am: Changed header to GPL version 2 only innobase/include/Makefile.am: Changed header to GPL version 2 only innobase/lock/Makefile.am: Changed header to GPL version 2 only innobase/log/Makefile.am: Changed header to GPL version 2 only innobase/mach/Makefile.am: Changed header to GPL version 2 only innobase/mem/Makefile.am: Changed header to GPL version 2 only innobase/mtr/Makefile.am: Changed header to GPL version 2 only innobase/os/Makefile.am: Changed header to GPL version 2 only innobase/page/Makefile.am: Changed header to GPL version 2 only innobase/pars/Makefile.am: Changed header to GPL version 2 only innobase/que/Makefile.am: Changed header to GPL version 2 only innobase/read/Makefile.am: Changed header to GPL version 2 only innobase/rem/Makefile.am: Changed header to GPL version 2 only innobase/row/Makefile.am: Changed header to GPL version 2 only innobase/srv/Makefile.am: Changed header to GPL version 2 only innobase/sync/Makefile.am: Changed header to GPL version 2 only innobase/thr/Makefile.am: Changed header to GPL version 2 only innobase/trx/Makefile.am: Changed header to GPL version 2 only innobase/usr/Makefile.am: Changed header to GPL version 2 only innobase/ut/Makefile.am: Changed header to GPL version 2 only libmysql/client_settings.h: Changed header to GPL version 2 only libmysqld/Makefile.am: Changed header to GPL version 2 only libmysqld/emb_qcache.cc: Changed header to GPL version 2 only libmysqld/emb_qcache.h: Changed header to GPL version 2 only libmysqld/embedded_priv.h: Changed header to GPL version 2 only libmysqld/examples/Makefile.am: Changed header to GPL version 2 only libmysqld/libmysqld.c: Changed header to GPL version 2 only man/Makefile.am: Changed header to GPL version 2 only myisam/Makefile.am: Changed header to GPL version 2 only myisam/ft_boolean_search.c: Changed header to GPL version 2 only myisam/ft_eval.c: Changed header to GPL version 2 only myisam/ft_eval.h: Changed header to GPL version 2 only myisam/ft_nlq_search.c: Changed header to GPL version 2 only myisam/ft_parser.c: Changed header to GPL version 2 only myisam/ft_static.c: Changed header to GPL version 2 only myisam/ft_stem.c: Changed header to GPL version 2 only myisam/ft_stopwords.c: Changed header to GPL version 2 only myisam/ft_test1.c: Changed header to GPL version 2 only myisam/ft_test1.h: Changed header to GPL version 2 only myisam/ft_update.c: Changed header to GPL version 2 only myisam/ftdefs.h: Changed header to GPL version 2 only myisam/fulltext.h: Changed header to GPL version 2 only myisam/mi_cache.c: Changed header to GPL version 2 only myisam/mi_changed.c: Changed header to GPL version 2 only myisam/mi_check.c: Changed header to GPL version 2 only myisam/mi_checksum.c: Changed header to GPL version 2 only myisam/mi_close.c: Changed header to GPL version 2 only myisam/mi_create.c: Changed header to GPL version 2 only myisam/mi_dbug.c: Changed header to GPL version 2 only myisam/mi_delete.c: Changed header to GPL version 2 only myisam/mi_delete_all.c: Changed header to GPL version 2 only myisam/mi_delete_table.c: Changed header to GPL version 2 only myisam/mi_dynrec.c: Changed header to GPL version 2 only myisam/mi_extra.c: Changed header to GPL version 2 only myisam/mi_info.c: Changed header to GPL version 2 only myisam/mi_key.c: Changed header to GPL version 2 only myisam/mi_keycache.c: Changed header to GPL version 2 only myisam/mi_locking.c: Changed header to GPL version 2 only myisam/mi_log.c: Changed header to GPL version 2 only myisam/mi_open.c: Changed header to GPL version 2 only myisam/mi_packrec.c: Changed header to GPL version 2 only myisam/mi_page.c: Changed header to GPL version 2 only myisam/mi_panic.c: Changed header to GPL version 2 only myisam/mi_preload.c: Changed header to GPL version 2 only myisam/mi_range.c: Changed header to GPL version 2 only myisam/mi_rename.c: Changed header to GPL version 2 only myisam/mi_rfirst.c: Changed header to GPL version 2 only myisam/mi_rkey.c: Changed header to GPL version 2 only myisam/mi_rlast.c: Changed header to GPL version 2 only myisam/mi_rnext.c: Changed header to GPL version 2 only myisam/mi_rnext_same.c: Changed header to GPL version 2 only myisam/mi_rprev.c: Changed header to GPL version 2 only myisam/mi_rrnd.c: Changed header to GPL version 2 only myisam/mi_rsame.c: Changed header to GPL version 2 only myisam/mi_rsamepos.c: Changed header to GPL version 2 only myisam/mi_scan.c: Changed header to GPL version 2 only myisam/mi_search.c: Changed header to GPL version 2 only myisam/mi_static.c: Changed header to GPL version 2 only myisam/mi_statrec.c: Changed header to GPL version 2 only myisam/mi_test1.c: Changed header to GPL version 2 only myisam/mi_test2.c: Changed header to GPL version 2 only myisam/mi_test3.c: Changed header to GPL version 2 only myisam/mi_unique.c: Changed header to GPL version 2 only myisam/mi_update.c: Changed header to GPL version 2 only myisam/mi_write.c: Changed header to GPL version 2 only myisam/myisam_ftdump.c: Changed header to GPL version 2 only myisam/myisamchk.c: Changed header to GPL version 2 only myisam/myisamdef.h: Changed header to GPL version 2 only myisam/myisamlog.c: Changed header to GPL version 2 only myisam/myisampack.c: Changed header to GPL version 2 only myisam/rt_index.c: Changed header to GPL version 2 only myisam/rt_index.h: Changed header to GPL version 2 only myisam/rt_key.c: Changed header to GPL version 2 only myisam/rt_key.h: Changed header to GPL version 2 only myisam/rt_mbr.c: Changed header to GPL version 2 only myisam/rt_mbr.h: Changed header to GPL version 2 only myisam/rt_split.c: Changed header to GPL version 2 only myisam/rt_test.c: Changed header to GPL version 2 only myisam/sort.c: Changed header to GPL version 2 only myisam/sp_defs.h: Changed header to GPL version 2 only myisam/sp_key.c: Changed header to GPL version 2 only myisam/sp_test.c: Changed header to GPL version 2 only myisammrg/Makefile.am: Changed header to GPL version 2 only myisammrg/myrg_close.c: Changed header to GPL version 2 only myisammrg/myrg_create.c: Changed header to GPL version 2 only myisammrg/myrg_def.h: Changed header to GPL version 2 only myisammrg/myrg_delete.c: Changed header to GPL version 2 only myisammrg/myrg_extra.c: Changed header to GPL version 2 only myisammrg/myrg_info.c: Changed header to GPL version 2 only myisammrg/myrg_locking.c: Changed header to GPL version 2 only myisammrg/myrg_open.c: Changed header to GPL version 2 only myisammrg/myrg_panic.c: Changed header to GPL version 2 only myisammrg/myrg_queue.c: Changed header to GPL version 2 only myisammrg/myrg_range.c: Changed header to GPL version 2 only myisammrg/myrg_rfirst.c: Changed header to GPL version 2 only myisammrg/myrg_rkey.c: Changed header to GPL version 2 only myisammrg/myrg_rlast.c: Changed header to GPL version 2 only myisammrg/myrg_rnext.c: Changed header to GPL version 2 only myisammrg/myrg_rnext_same.c: Changed header to GPL version 2 only myisammrg/myrg_rprev.c: Changed header to GPL version 2 only myisammrg/myrg_rrnd.c: Changed header to GPL version 2 only myisammrg/myrg_rsame.c: Changed header to GPL version 2 only myisammrg/myrg_static.c: Changed header to GPL version 2 only myisammrg/myrg_update.c: Changed header to GPL version 2 only myisammrg/myrg_write.c: Changed header to GPL version 2 only mysql-test/Makefile.am: Changed header to GPL version 2 only mysys/Makefile.am: Changed header to GPL version 2 only mysys/array.c: Changed header to GPL version 2 only mysys/base64.c: Changed header to GPL version 2 only mysys/charset-def.c: Changed header to GPL version 2 only mysys/charset.c: Changed header to GPL version 2 only mysys/checksum.c: Changed header to GPL version 2 only mysys/default.c: Changed header to GPL version 2 only mysys/default_modify.c: Changed header to GPL version 2 only mysys/errors.c: Changed header to GPL version 2 only mysys/hash.c: Changed header to GPL version 2 only mysys/list.c: Changed header to GPL version 2 only mysys/make-conf.c: Changed header to GPL version 2 only mysys/md5.c: Changed header to GPL version 2 only mysys/mf_brkhant.c: Changed header to GPL version 2 only mysys/mf_cache.c: Changed header to GPL version 2 only mysys/mf_dirname.c: Changed header to GPL version 2 only mysys/mf_fn_ext.c: Changed header to GPL version 2 only mysys/mf_format.c: Changed header to GPL version 2 only mysys/mf_getdate.c: Changed header to GPL version 2 only mysys/mf_iocache.c: Changed header to GPL version 2 only mysys/mf_iocache2.c: Changed header to GPL version 2 only mysys/mf_keycache.c: Changed header to GPL version 2 only mysys/mf_keycaches.c: Changed header to GPL version 2 only mysys/mf_loadpath.c: Changed header to GPL version 2 only mysys/mf_pack.c: Changed header to GPL version 2 only mysys/mf_path.c: Changed header to GPL version 2 only mysys/mf_qsort.c: Changed header to GPL version 2 only mysys/mf_qsort2.c: Changed header to GPL version 2 only mysys/mf_radix.c: Changed header to GPL version 2 only mysys/mf_same.c: Changed header to GPL version 2 only mysys/mf_sort.c: Changed header to GPL version 2 only mysys/mf_soundex.c: Changed header to GPL version 2 only mysys/mf_strip.c: Changed header to GPL version 2 only mysys/mf_tempdir.c: Changed header to GPL version 2 only mysys/mf_tempfile.c: Changed header to GPL version 2 only mysys/mf_unixpath.c: Changed header to GPL version 2 only mysys/mf_util.c: Changed header to GPL version 2 only mysys/mf_wcomp.c: Changed header to GPL version 2 only mysys/mf_wfile.c: Changed header to GPL version 2 only mysys/mulalloc.c: Changed header to GPL version 2 only mysys/my_access.c: Changed header to GPL version 2 only mysys/my_aes.c: Changed header to GPL version 2 only mysys/my_alarm.c: Changed header to GPL version 2 only mysys/my_alloc.c: Changed header to GPL version 2 only mysys/my_append.c: Changed header to GPL version 2 only mysys/my_bit.c: Changed header to GPL version 2 only mysys/my_bitmap.c: Changed header to GPL version 2 only mysys/my_chsize.c: Changed header to GPL version 2 only mysys/my_clock.c: Changed header to GPL version 2 only mysys/my_compress.c: Changed header to GPL version 2 only mysys/my_conio.c: Changed header to GPL version 2 only mysys/my_copy.c: Changed header to GPL version 2 only mysys/my_crc32.c: Changed header to GPL version 2 only mysys/my_create.c: Changed header to GPL version 2 only mysys/my_delete.c: Changed header to GPL version 2 only mysys/my_div.c: Changed header to GPL version 2 only mysys/my_dup.c: Changed header to GPL version 2 only mysys/my_error.c: Changed header to GPL version 2 only mysys/my_file.c: Changed header to GPL version 2 only mysys/my_fopen.c: Changed header to GPL version 2 only mysys/my_fstream.c: Changed header to GPL version 2 only mysys/my_gethostbyname.c: Changed header to GPL version 2 only mysys/my_gethwaddr.c: Changed header to GPL version 2 only mysys/my_getopt.c: Changed header to GPL version 2 only mysys/my_getpagesize.c: Changed header to GPL version 2 only mysys/my_getsystime.c: Changed header to GPL version 2 only mysys/my_getwd.c: Changed header to GPL version 2 only mysys/my_handler.c: Changed header to GPL version 2 only mysys/my_init.c: Changed header to GPL version 2 only mysys/my_largepage.c: Changed header to GPL version 2 only mysys/my_lib.c: Changed header to GPL version 2 only mysys/my_libwrap.c: Changed header to GPL version 2 only mysys/my_lock.c: Changed header to GPL version 2 only mysys/my_lockmem.c: Changed header to GPL version 2 only mysys/my_lread.c: Changed header to GPL version 2 only mysys/my_lwrite.c: Changed header to GPL version 2 only mysys/my_malloc.c: Changed header to GPL version 2 only mysys/my_messnc.c: Changed header to GPL version 2 only mysys/my_mkdir.c: Changed header to GPL version 2 only mysys/my_mmap.c: Changed header to GPL version 2 only mysys/my_net.c: Changed header to GPL version 2 only mysys/my_netware.c: Changed header to GPL version 2 only mysys/my_new.cc: Changed header to GPL version 2 only mysys/my_once.c: Changed header to GPL version 2 only mysys/my_open.c: Changed header to GPL version 2 only mysys/my_os2cond.c: Changed header to GPL version 2 only mysys/my_os2dirsrch.c: Changed header to GPL version 2 only mysys/my_os2dirsrch.h: Changed header to GPL version 2 only mysys/my_os2dlfcn.c: Changed header to GPL version 2 only mysys/my_os2dlfcn.h0: Changed header to GPL version 2 only mysys/my_os2file64.c: Changed header to GPL version 2 only mysys/my_os2thread.c: Changed header to GPL version 2 only mysys/my_os2tls.c: Changed header to GPL version 2 only mysys/my_port.c: Changed header to GPL version 2 only mysys/my_pread.c: Changed header to GPL version 2 only mysys/my_pthread.c: Changed header to GPL version 2 only mysys/my_quick.c: Changed header to GPL version 2 only mysys/my_read.c: Changed header to GPL version 2 only mysys/my_realloc.c: Changed header to GPL version 2 only mysys/my_redel.c: Changed header to GPL version 2 only mysys/my_rename.c: Changed header to GPL version 2 only mysys/my_seek.c: Changed header to GPL version 2 only mysys/my_semaphore.c: Changed header to GPL version 2 only mysys/my_sleep.c: Changed header to GPL version 2 only mysys/my_static.c: Changed header to GPL version 2 only mysys/my_static.h: Changed header to GPL version 2 only mysys/my_symlink.c: Changed header to GPL version 2 only mysys/my_symlink2.c: Changed header to GPL version 2 only mysys/my_sync.c: Changed header to GPL version 2 only mysys/my_thr_init.c: Changed header to GPL version 2 only mysys/my_wincond.c: Changed header to GPL version 2 only mysys/my_windac.c: Changed header to GPL version 2 only mysys/my_winthread.c: Changed header to GPL version 2 only mysys/my_write.c: Changed header to GPL version 2 only mysys/mysys_priv.h: Changed header to GPL version 2 only mysys/ptr_cmp.c: Changed header to GPL version 2 only mysys/queues.c: Changed header to GPL version 2 only mysys/raid.cc: Changed header to GPL version 2 only mysys/raid2.c: Changed header to GPL version 2 only mysys/rijndael.c: Changed header to GPL version 2 only mysys/safemalloc.c: Changed header to GPL version 2 only mysys/sha1.c: Changed header to GPL version 2 only mysys/string.c: Changed header to GPL version 2 only mysys/test_charset.c: Changed header to GPL version 2 only mysys/test_dir.c: Changed header to GPL version 2 only mysys/test_fn.c: Changed header to GPL version 2 only mysys/test_xml.c: Changed header to GPL version 2 only mysys/testhash.c: Changed header to GPL version 2 only mysys/thr_alarm.c: Changed header to GPL version 2 only mysys/thr_lock.c: Changed header to GPL version 2 only mysys/thr_mutex.c: Changed header to GPL version 2 only mysys/thr_rwlock.c: Changed header to GPL version 2 only mysys/tree.c: Changed header to GPL version 2 only mysys/typelib.c: Changed header to GPL version 2 only ndb/include/debugger/DebuggerNames.hpp: Changed header to GPL version 2 only ndb/include/debugger/EventLogger.hpp: Changed header to GPL version 2 only ndb/include/debugger/GrepError.hpp: Changed header to GPL version 2 only ndb/include/debugger/SignalLoggerManager.hpp: Changed header to GPL version 2 only ndb/include/editline/editline.h: Changed header to GPL version 2 only ndb/include/kernel/AttributeDescriptor.hpp: Changed header to GPL version 2 only ndb/include/kernel/AttributeHeader.hpp: Changed header to GPL version 2 only ndb/include/kernel/AttributeList.hpp: Changed header to GPL version 2 only ndb/include/kernel/BlockNumbers.h: Changed header to GPL version 2 only ndb/include/kernel/GlobalSignalNumbers.h: Changed header to GPL version 2 only ndb/include/kernel/GrepEvent.hpp: Changed header to GPL version 2 only ndb/include/kernel/Interpreter.hpp: Changed header to GPL version 2 only ndb/include/kernel/LogLevel.hpp: Changed header to GPL version 2 only ndb/include/kernel/NodeBitmask.hpp: Changed header to GPL version 2 only ndb/include/kernel/NodeInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/NodeState.hpp: Changed header to GPL version 2 only ndb/include/kernel/RefConvert.hpp: Changed header to GPL version 2 only ndb/include/kernel/kernel_types.h: Changed header to GPL version 2 only ndb/include/kernel/ndb_limits.h: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AbortAll.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AccFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AccLock.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AccScan.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AccSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AlterIndx.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AlterTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AlterTable.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AlterTrig.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ApiBroadcast.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ApiRegSignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ApiVersion.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ArbitSignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/trigger_definitions.h: Changed header to GPL version 2 only ndb/include/ndb_constants.h: Changed header to GPL version 2 only ndb/include/ndb_global.h.in: Changed header to GPL version 2 only ndb/include/ndb_init.h: Changed header to GPL version 2 only ndb/include/ndb_types.h.in: Changed header to GPL version 2 only ndb/include/ndb_version.h.in: Changed header to GPL version 2 only ndb/include/kernel/signaldata/AttrInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/BackupContinueB.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/BackupImpl.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/BackupSignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/BlockCommitOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/BuildIndx.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CheckNodeGroups.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CloseComReqConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CmInit.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CmRegSignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CmvmiCfgConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CntrMasterConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CntrMasterReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ConfigParamId.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ContinueFragmented.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CopyActive.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CopyFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CopyGCIReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateEvnt.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateFragmentation.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateIndx.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateTable.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/CreateTrig.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DiAddTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DiGetNodes.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DictLock.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DictSchemaInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DictSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DictStart.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DictTabInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DihAddFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DihContinueB.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DihSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DihStartTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DihSwitchReplica.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DisconnectRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DropIndx.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DropTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DropTabFile.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DropTable.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DropTrig.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/DumpStateOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/EmptyLcp.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/EndTo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/EventReport.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/EventSubscribeReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ExecFragReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FailRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FireTrigOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsAppendReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsCloseReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsOpenReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsReadWriteReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsRef.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/FsRemoveReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/GCPSave.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/GetTabInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/GetTableId.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/GrepImpl.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/HotSpareRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/IndxAttrInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/IndxKeyInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/InvalidateNodeLCPConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/InvalidateNodeLCPReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/KeyInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/LCP.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ListTables.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/LqhFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/LqhKey.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/LqhSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/LqhTransConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ManagementServer.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/MasterGCP.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/MasterLCP.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NFCompleteRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NdbSttor.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NdbfsContinueB.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NextScan.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NodeFailRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/NodeStateSignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/PackedSignal.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/PrepDropTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/PrepFailReqRef.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ReadNodesConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/RelTabMem.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/RepImpl.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ResumeReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ScanFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/ScanTab.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SetLogLevelOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SetVarReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SignalData.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SignalDataPrint.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SignalDroppedRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SrFragidConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartFragReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartMe.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartPerm.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartRec.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StartTo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StopMe.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StopPerm.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/StopReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SumaImpl.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/SystemError.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TamperOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcCommit.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcContinueB.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcHbRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcIndx.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcKeyConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcKeyFailConf.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcKeyRef.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcKeyReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcRollbackRep.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TcSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TestOrd.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TransIdAI.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TrigAttrInfo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TupCommit.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TupFrag.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TupKey.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TupSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TuxBound.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TuxContinueB.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TuxMaint.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/TuxSizeAltReq.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UpdateTo.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilDelete.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilExecute.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilLock.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilPrepare.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilRelease.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/UtilSequence.hpp: Changed header to GPL version 2 only ndb/include/kernel/signaldata/WaitGCP.hpp: Changed header to GPL version 2 only ndb/include/logger/ConsoleLogHandler.hpp: Changed header to GPL version 2 only ndb/include/logger/FileLogHandler.hpp: Changed header to GPL version 2 only ndb/include/logger/LogHandler.hpp: Changed header to GPL version 2 only ndb/include/logger/Logger.hpp: Changed header to GPL version 2 only ndb/include/logger/SysLogHandler.hpp: Changed header to GPL version 2 only ndb/include/mgmapi/mgmapi.h: Changed header to GPL version 2 only ndb/include/mgmapi/mgmapi_debug.h: Changed header to GPL version 2 only ndb/include/mgmapi/ndb_logevent.h: Changed header to GPL version 2 only ndb/include/mgmapi/ndbd_exit_codes.h: Changed header to GPL version 2 only ndb/include/mgmcommon/ConfigRetriever.hpp: Changed header to GPL version 2 only ndb/include/mgmcommon/IPCConfig.hpp: Changed header to GPL version 2 only ndb/include/mgmcommon/MgmtErrorReporter.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/Ndb.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbApi.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbBlob.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbDictionary.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbError.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbEventOperation.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbIndexOperation.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbIndexScanOperation.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbOperation.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbPool.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbRecAttr.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbReceiver.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbScanFilter.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbScanOperation.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/NdbTransaction.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/ndb_cluster_connection.hpp: Changed header to GPL version 2 only ndb/include/ndbapi/ndb_opt_defaults.h: Changed header to GPL version 2 only ndb/include/ndbapi/ndbapi_limits.h: Changed header to GPL version 2 only ndb/include/ndbapi/ndberror.h: Changed header to GPL version 2 only ndb/include/newtonapi/dba.h: Changed header to GPL version 2 only ndb/include/newtonapi/defs/pcn_types.h: Changed header to GPL version 2 only ndb/include/portlib/NdbCondition.h: Changed header to GPL version 2 only ndb/include/portlib/NdbConfig.h: Changed header to GPL version 2 only ndb/include/portlib/NdbDaemon.h: Changed header to GPL version 2 only ndb/include/portlib/NdbEnv.h: Changed header to GPL version 2 only ndb/include/portlib/NdbHost.h: Changed header to GPL version 2 only ndb/include/portlib/NdbMain.h: Changed header to GPL version 2 only ndb/include/portlib/NdbMem.h: Changed header to GPL version 2 only ndb/include/portlib/NdbMutex.h: Changed header to GPL version 2 only ndb/include/portlib/NdbSleep.h: Changed header to GPL version 2 only ndb/include/portlib/NdbTCP.h: Changed header to GPL version 2 only ndb/include/portlib/NdbThread.h: Changed header to GPL version 2 only ndb/include/portlib/NdbTick.h: Changed header to GPL version 2 only ndb/include/portlib/PortDefs.h: Changed header to GPL version 2 only ndb/include/portlib/prefetch.h: Changed header to GPL version 2 only ndb/include/transporter/TransporterCallback.hpp: Changed header to GPL version 2 only ndb/include/transporter/TransporterDefinitions.hpp: Changed header to GPL version 2 only ndb/include/transporter/TransporterRegistry.hpp: Changed header to GPL version 2 only ndb/include/util/BaseString.hpp: Changed header to GPL version 2 only ndb/include/util/Bitmask.hpp: Changed header to GPL version 2 only ndb/include/util/File.hpp: Changed header to GPL version 2 only ndb/include/util/InputStream.hpp: Changed header to GPL version 2 only ndb/include/util/NdbAutoPtr.hpp: Changed header to GPL version 2 only ndb/include/util/NdbOut.hpp: Changed header to GPL version 2 only ndb/include/util/NdbSqlUtil.hpp: Changed header to GPL version 2 only ndb/include/util/OutputStream.hpp: Changed header to GPL version 2 only ndb/include/util/Parser.hpp: Changed header to GPL version 2 only ndb/include/util/Properties.hpp: Changed header to GPL version 2 only ndb/include/util/SimpleProperties.hpp: Changed header to GPL version 2 only ndb/include/util/SocketAuthenticator.hpp: Changed header to GPL version 2 only ndb/include/util/SocketClient.hpp: Changed header to GPL version 2 only ndb/include/util/SocketServer.hpp: Changed header to GPL version 2 only ndb/include/util/UtilBuffer.hpp: Changed header to GPL version 2 only ndb/include/util/Vector.hpp: Changed header to GPL version 2 only ndb/include/util/basestring_vsnprintf.h: Changed header to GPL version 2 only ndb/include/util/md5_hash.hpp: Changed header to GPL version 2 only ndb/include/util/ndb_opts.h: Changed header to GPL version 2 only ndb/include/util/random.h: Changed header to GPL version 2 only ndb/include/util/socket_io.h: Changed header to GPL version 2 only ndb/include/util/uucode.h: Changed header to GPL version 2 only ndb/include/util/version.h: Changed header to GPL version 2 only ndb/ndbapi-examples/mgmapi_logevent_example/mgmapi_logevent.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_async_example/ndbapi_async.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_async_example1/ndbapi_async1.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_event_example/ndbapi_event.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_retries_example/ndbapi_retries.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_scan_example/ndbapi_scan.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_simple_example/ndbapi_simple.cpp: Changed header to GPL version 2 only ndb/ndbapi-examples/ndbapi_simple_index_example/ndbapi_simple_index.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/BlockNames.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/DebuggerNames.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/EventLogger.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/GrepError.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/SignalLoggerManager.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/AccLock.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/AlterIndx.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/AlterTab.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/AlterTable.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/AlterTrig.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/BackupImpl.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/BackupSignalData.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CloseComReqConf.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/ContinueB.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CopyGCI.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CreateEvnt.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CreateFragmentation.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CreateIndx.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/CreateTrig.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DictTabInfo.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DihContinueB.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DihSwitchReplicaReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DisconnectRep.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DropIndx.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DropTab.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/DropTrig.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FailRep.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FireTrigOrd.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsAppendReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsCloseReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsConf.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsOpenReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsReadWriteReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/FsRef.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/GCPSave.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/IndxAttrInfo.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/IndxKeyInfo.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/LCP.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/LqhFrag.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/LqhKey.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/LqhTrans.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/MasterLCP.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/NFCompleteRep.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/NdbSttor.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/NdbfsContinueB.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/PackedSignal.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/PrepDropTab.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/PrepFailReqRef.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/ScanFrag.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/ScanTab.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/SignalDataPrint.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/SignalDroppedRep.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/SignalNames.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/StartRec.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/SumaImpl.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/SystemError.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TcIndx.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TcKeyConf.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TcKeyRef.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TcKeyReq.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TcRollbackRep.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TrigAttrInfo.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TupCommit.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TupKey.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/TuxMaint.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/UtilDelete.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/UtilExecute.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/UtilLock.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/UtilPrepare.cpp: Changed header to GPL version 2 only ndb/src/common/debugger/signaldata/UtilSequence.cpp: Changed header to GPL version 2 only ndb/src/common/logger/ConsoleLogHandler.cpp: Changed header to GPL version 2 only ndb/src/common/logger/FileLogHandler.cpp: Changed header to GPL version 2 only ndb/src/common/logger/LogHandler.cpp: Changed header to GPL version 2 only ndb/src/common/logger/LogHandlerList.cpp: Changed header to GPL version 2 only ndb/src/common/logger/LogHandlerList.hpp: Changed header to GPL version 2 only ndb/src/common/logger/Logger.cpp: Changed header to GPL version 2 only ndb/src/common/logger/SysLogHandler.cpp: Changed header to GPL version 2 only ndb/src/common/logger/listtest/LogHandlerListUnitTest.cpp: Changed header to GPL version 2 only ndb/src/common/logger/listtest/LogHandlerListUnitTest.hpp: Changed header to GPL version 2 only ndb/src/common/logger/loggertest/LoggerUnitTest.cpp: Changed header to GPL version 2 only ndb/src/common/logger/loggertest/LoggerUnitTest.hpp: Changed header to GPL version 2 only ndb/src/common/mgmcommon/ConfigRetriever.cpp: Changed header to GPL version 2 only ndb/src/common/mgmcommon/IPCConfig.cpp: Changed header to GPL version 2 only ndb/src/common/mgmcommon/printConfig/printConfig.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/NdbCondition.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbConfig.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbDaemon.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbEnv.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbHost.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbMem.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbMutex.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbPortLibTest.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/NdbSleep.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbTCP.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/NdbThread.c: Changed header to GPL version 2 only ndb/src/common/portlib/NdbTick.c: Changed header to GPL version 2 only ndb/src/common/portlib/memtest.c: Changed header to GPL version 2 only ndb/src/common/portlib/mmslist.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/mmstest.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/munmaptest.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbCondition.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbConditionOSE.h: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbEnv.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbHost.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbMem.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbMem_SoftOse.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbMutex.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbOut.cpp: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbSleep.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbTCP.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbThread.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/ose/NdbTick.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbCondition.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbDaemon.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbEnv.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbHost.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbMem.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbMutex.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbSleep.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbTCP.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbThread.c: Changed header to GPL version 2 only ndb/src/common/portlib/old_dirs/win32/NdbTick.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbCondition.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbDaemon.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbEnv.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbHost.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbMem.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbMutex.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbSleep.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbTCP.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbThread.c: Changed header to GPL version 2 only ndb/src/common/portlib/win32/NdbTick.c: Changed header to GPL version 2 only ndb/src/common/transporter/OSE_Receiver.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/OSE_Receiver.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/OSE_Signals.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/OSE_Transporter.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/OSE_Transporter.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/Packer.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/Packer.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/SCI_Transporter.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/SCI_Transporter.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/SHM_Buffer.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/SHM_Transporter.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/SHM_Transporter.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/SHM_Transporter.unix.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/SHM_Transporter.win32.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/SendBuffer.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/SendBuffer.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/TCP_Transporter.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/TCP_Transporter.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/Transporter.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/Transporter.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/TransporterInternalDefinitions.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/TransporterRegistry.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/basictest/basicTransporterTest.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/buddy.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/buddy.hpp: Changed header to GPL version 2 only ndb/src/common/transporter/failoverSCI/failoverSCI.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/perftest/perfTransporterTest.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/priotest/prioSCI/prioSCI.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/priotest/prioSHM/prioSHM.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/priotest/prioTCP/prioTCP.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/priotest/prioTransporterTest.cpp: Changed header to GPL version 2 only ndb/src/common/transporter/priotest/prioTransporterTest.hpp: Changed header to GPL version 2 only ndb/src/common/util/BaseString.cpp: Changed header to GPL version 2 only ndb/src/common/util/File.cpp: Changed header to GPL version 2 only ndb/src/common/util/InputStream.cpp: Changed header to GPL version 2 only ndb/src/common/util/NdbErrHnd.cpp: Changed header to GPL version 2 only ndb/src/common/util/NdbOut.cpp: Changed header to GPL version 2 only ndb/src/common/util/NdbSqlUtil.cpp: Changed header to GPL version 2 only ndb/src/common/util/OutputStream.cpp: Changed header to GPL version 2 only ndb/src/common/util/Parser.cpp: Changed header to GPL version 2 only ndb/src/common/util/Properties.cpp: Changed header to GPL version 2 only ndb/src/common/util/SimpleProperties.cpp: Changed header to GPL version 2 only ndb/src/common/util/SocketAuthenticator.cpp: Changed header to GPL version 2 only ndb/src/common/util/SocketClient.cpp: Changed header to GPL version 2 only ndb/src/common/util/SocketServer.cpp: Changed header to GPL version 2 only ndb/src/common/util/basestring_vsnprintf.c: Changed header to GPL version 2 only ndb/src/common/util/filetest/FileUnitTest.cpp: Changed header to GPL version 2 only ndb/src/common/util/filetest/FileUnitTest.hpp: Changed header to GPL version 2 only ndb/src/common/util/md5_hash.cpp: Changed header to GPL version 2 only ndb/src/common/util/ndb_init.c: Changed header to GPL version 2 only ndb/src/common/util/random.c: Changed header to GPL version 2 only ndb/src/common/util/socket_io.cpp: Changed header to GPL version 2 only ndb/src/common/util/strdup.c: Changed header to GPL version 2 only ndb/src/common/util/testProperties/testProperties.cpp: Changed header to GPL version 2 only ndb/src/common/util/testSimpleProperties/sp_test.cpp: Changed header to GPL version 2 only ndb/src/common/util/uucode.c: Changed header to GPL version 2 only ndb/src/common/util/version.c: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/CPC_GUI.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/CPC_GUI.h: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/NdbControls.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/StdAfx.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/StdAfx.h: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/TreeView.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/TreeView.h: Changed header to GPL version 2 only ndb/src/cw/cpcc-win32/C++/resource.h: Changed header to GPL version 2 only ndb/src/cw/cpcd/APIService.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/APIService.hpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/CPCD.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/CPCD.hpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/Monitor.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/Process.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/common.cpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/common.hpp: Changed header to GPL version 2 only ndb/src/cw/cpcd/main.cpp: Changed header to GPL version 2 only ndb/src/cw/test/socketclient/socketClientTest.cpp: Changed header to GPL version 2 only ndb/src/cw/util/ClientInterface.cpp: Changed header to GPL version 2 only ndb/src/cw/util/ClientInterface.hpp: Changed header to GPL version 2 only ndb/src/cw/util/SocketRegistry.cpp: Changed header to GPL version 2 only ndb/src/cw/util/SocketRegistry.hpp: Changed header to GPL version 2 only ndb/src/cw/util/SocketService.cpp: Changed header to GPL version 2 only ndb/src/cw/util/SocketService.hpp: Changed header to GPL version 2 only ndb/src/kernel/SimBlockList.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/Backup.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/Backup.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/BackupFormat.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/BackupInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/FsBuffer.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/backup/read.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/cmvmi/Cmvmi.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbacc/Dbacc.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbacc/DbaccInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbacc/DbaccMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/mutexes.hpp: Changed header to GPL version 2 only ndb/src/kernel/main.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdict/Dbdict.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdict/SchemaFile.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdih/Dbdih.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdih/DbdihInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdih/DbdihMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdih/Sysfile.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/Dblqh.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/DblqhInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/redoLogReader/records.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/redoLogReader/records.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtc/Dbtc.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtc/DbtcInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/AttributeOffset.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/Dbtup.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupDebug.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupGen.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupLCP.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupPagMan.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupPageMap.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupRoutines.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupScan.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupStoredProcDef.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupSystemRestart.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupTabDesMan.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtup/DbtupUndoLog.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/Dbtux.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxCmp.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbtux/DbtuxTree.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbutil/DbUtil.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/dbutil/DbUtil.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbcntr/NdbcntrInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbcntr/NdbcntrSysTable.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/AsyncFileTest/AsyncFileTest.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/CircularIndex.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/CircularIndex.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/Filename.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/Filename.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/MemoryChannel.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/MemoryChannel.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/MemoryChannelOSE.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/MemoryChannelTest/MemoryChannelTest.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/Ndbfs.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/OpenFiles.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/Pool.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/ndbfs/VoidFs.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/qmgr/Qmgr.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/qmgr/QmgrInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/qmgr/QmgrMain.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/qmgr/timer.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/suma/Suma.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/suma/Suma.hpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/suma/SumaInit.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/trix/Trix.cpp: Changed header to GPL version 2 only ndb/src/kernel/blocks/trix/Trix.hpp: Changed header to GPL version 2 only ndb/src/kernel/error/ErrorHandlingMacros.hpp: Changed header to GPL version 2 only ndb/src/kernel/error/ErrorReporter.cpp: Changed header to GPL version 2 only ndb/src/kernel/error/ErrorReporter.hpp: Changed header to GPL version 2 only ndb/src/kernel/error/TimeModule.cpp: Changed header to GPL version 2 only ndb/src/kernel/error/TimeModule.hpp: Changed header to GPL version 2 only ndb/src/kernel/error/ndbd_exit_codes.c: Changed header to GPL version 2 only ndb/src/kernel/vm/Array.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ArrayFifoList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ArrayList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ArrayPool.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/CArray.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Callback.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ClusterConfiguration.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ClusterConfiguration.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Configuration.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Configuration.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/DLFifoList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/DLHashTable.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/DLHashTable2.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/DLList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/DataBuffer.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Emulator.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Emulator.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/FastScheduler.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/FastScheduler.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/GlobalData.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/KeyDescriptor.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/KeyTable.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/KeyTable2.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/LongSignal.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/MetaData.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/MetaData.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Mutex.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Mutex.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/Prio.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/RequestTracker.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SLList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SafeCounter.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SafeCounter.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SectionReader.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SectionReader.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SignalCounter.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SimBlockList.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SimplePropertiesSection.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SimulatedBlock.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SimulatedBlock.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SuperPool.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/SuperPool.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ThreadConfig.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ThreadConfig.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/TimeQueue.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/TimeQueue.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/TransporterCallback.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/VMSignal.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/VMSignal.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/WaitQueue.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/WatchDog.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/WatchDog.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/al_test/arrayListTest.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/al_test/arrayPoolTest.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/al_test/main.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ndbd_malloc.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/ndbd_malloc.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/pc.hpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testCopy/rr.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testCopy/testCopy.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testLongSig/testLongSig.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testSimplePropertiesSection/test.cpp: Changed header to GPL version 2 only ndb/src/kernel/vm/testSuperPool.cpp: Changed header to GPL version 2 only ndb/src/mgmapi/LocalConfig.cpp: Changed header to GPL version 2 only ndb/src/mgmapi/LocalConfig.hpp: Changed header to GPL version 2 only ndb/src/mgmapi/mgmapi.cpp: Changed header to GPL version 2 only ndb/src/mgmapi/mgmapi_configuration.hpp: Changed header to GPL version 2 only ndb/src/mgmapi/mgmapi_internal.h: Changed header to GPL version 2 only ndb/src/mgmapi/ndb_logevent.cpp: Changed header to GPL version 2 only ndb/src/mgmapi/ndb_logevent.hpp: Changed header to GPL version 2 only ndb/src/mgmapi/test/keso.c: Changed header to GPL version 2 only ndb/src/mgmapi/test/mgmSrvApi.cpp: Changed header to GPL version 2 only ndb/src/mgmclient/CommandInterpreter.cpp: Changed header to GPL version 2 only ndb/src/mgmclient/main.cpp: Changed header to GPL version 2 only ndb/src/mgmclient/ndb_mgmclient.hpp: Changed header to GPL version 2 only ndb/src/mgmclient/ndb_mgmclient.h: Changed header to GPL version 2 only ndb/src/mgmclient/test_cpcd/test_cpcd.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/Config.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/Config.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/ConfigInfo.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/ConfigInfo.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/InitConfigFileParser.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/InitConfigFileParser.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/MgmtSrvr.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/MgmtSrvr.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/MgmtSrvrConfig.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/MgmtSrvrGeneralSignalHandling.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/Services.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/Services.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/SignalQueue.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/SignalQueue.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/convertStrToInt.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/convertStrToInt.hpp: Changed header to GPL version 2 only ndb/src/mgmsrv/main.cpp: Changed header to GPL version 2 only ndb/src/mgmsrv/mkconfig/mkconfig.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/API.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/ClusterMgr.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/ClusterMgr.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/DictCache.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/DictCache.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/Ndb.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbApiSignal.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbApiSignal.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbBlob.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbBlobImpl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbDictionary.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbDictionaryImpl.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbDictionaryImpl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbErrorOut.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbEventOperation.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbEventOperationImpl.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbEventOperationImpl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbImpl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbIndexOperation.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbLinHash.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperation.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperationDefine.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperationExec.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperationInt.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperationScan.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbOperationSearch.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbPool.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbPoolImpl.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbPoolImpl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbRecAttr.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbReceiver.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbScanFilter.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbScanOperation.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbTransaction.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbTransactionScan.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbUtil.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbUtil.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/NdbWaiter.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/Ndberr.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/Ndbif.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/Ndbinit.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/Ndblist.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/ObjectMap.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/SignalSender.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/SignalSender.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/TransporterFacade.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/TransporterFacade.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/ndb_cluster_connection.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/ndb_cluster_connection_impl.hpp: Changed header to GPL version 2 only ndb/src/ndbapi/ndberror.c: Changed header to GPL version 2 only ndb/src/ndbapi/signal-sender/SignalSender.cpp: Changed header to GPL version 2 only ndb/src/ndbapi/signal-sender/SignalSender.hpp: Changed header to GPL version 2 only ndb/test/include/CpcClient.hpp: Changed header to GPL version 2 only ndb/test/include/HugoAsynchTransactions.hpp: Changed header to GPL version 2 only ndb/test/include/HugoCalculator.hpp: Changed header to GPL version 2 only ndb/test/include/HugoOperations.hpp: Changed header to GPL version 2 only ndb/test/include/HugoTransactions.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_DataSet.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_DataSetTransaction.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_Error.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_Output.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_ResultRow.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_ReturnCodes.h: Changed header to GPL version 2 only ndb/test/include/NDBT_Stats.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_Table.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_Tables.hpp: Changed header to GPL version 2 only ndb/test/include/NDBT_Test.hpp: Changed header to GPL version 2 only ndb/test/include/NdbBackup.hpp: Changed header to GPL version 2 only ndb/test/include/NdbConfig.hpp: Changed header to GPL version 2 only ndb/test/include/NdbGrep.hpp: Changed header to GPL version 2 only ndb/test/include/NdbRestarter.hpp: Changed header to GPL version 2 only ndb/test/include/NdbRestarts.hpp: Changed header to GPL version 2 only ndb/test/include/NdbSchemaCon.hpp: Changed header to GPL version 2 only ndb/test/include/NdbSchemaOp.hpp: Changed header to GPL version 2 only ndb/test/include/NdbTest.hpp: Changed header to GPL version 2 only ndb/test/include/NdbTimer.hpp: Changed header to GPL version 2 only ndb/test/include/TestNdbEventOperation.hpp: Changed header to GPL version 2 only ndb/test/include/UtilTransactions.hpp: Changed header to GPL version 2 only ndb/test/include/getarg.h: Changed header to GPL version 2 only ndb/test/ndbapi/InsertRecs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ScanFilter.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/ScanFunctions.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/ScanInterpretTest.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/TraceNdbApi.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/VerifyNdbApi.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/acid.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/acid2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/adoInsertRecs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/asyncGenerator.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/benchronja.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bulk_copy.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/cdrserver.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/celloDb.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/create_all_tabs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/create_tab.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/drop_all_tabs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexAsynch.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexBench.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexHammer.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexScan.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexTT.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flexTimedAsynch.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/flex_bench_mysql.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/index.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/index2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/initronja.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/interpreterInTup.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/mainAsyncGenerator.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/msa.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_async1.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_async2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_populate.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction3.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction4.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction5.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/ndb_user_transaction6.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/restarter.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/restarter2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/restarts.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/size.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testBackup.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testBasic.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testBasicAsynch.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testBlobs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testDataBuffers.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testDeadlock.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testDict.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testGrepVerify.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testIndex.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testInterpreter.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testMgm.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testNdbApi.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testNodeRestart.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testOIBasic.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testOperations.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testOrderedIndex.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testPartitioning.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testReadPerf.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testRestartGci.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testSRBank.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testScan.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testScanInterpreter.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testScanPerf.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testSystemRestart.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/Bank.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/Bank.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/BankLoad.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankCreator.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankMakeGL.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankSumAccounts.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankTimer.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankTransactionMaker.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/bankValidateAllGLs.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bank/testBank.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/asyncGenerator.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/dbGenerator.h: Changed header to GPL version 2 only ndb/test/ndbapi/bench/dbPopulate.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/dbPopulate.h: Changed header to GPL version 2 only ndb/test/ndbapi/bench/macros.h: Changed header to GPL version 2 only ndb/test/ndbapi/bench/mainAsyncGenerator.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/mainPopulate.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_async1.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_async2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_error.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_schema.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction2.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction3.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction4.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction5.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/ndb_user_transaction6.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/testData.h: Changed header to GPL version 2 only ndb/test/ndbapi/bench/testDefinitions.h: Changed header to GPL version 2 only ndb/test/ndbapi/bench/userInterface.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/bench/userInterface.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/acid2/TraceNdbApi.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/acid2/VerifyNdbApi.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/async-src/include/dbGenerator.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/async-src/include/testData.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/async-src/include/userInterface.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/async-src/user/macros.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/async-src/user/ndb_error.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/include/ndb_schema.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/include/testDefinitions.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/mainGenerator.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/include/testData.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/include/userInterface.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/populator/dbPopulate.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/populator/dbPopulate.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/populator/mainPopulate.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/localDbPrepare.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/macros.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/ndb_error.hpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/old/userHandle.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/old/userInterface.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/userHandle.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/userInterface.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/userTransaction.c: Changed header to GPL version 2 only ndb/test/ndbapi/testTimeout.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/testTransactions.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/test_event.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/test_event_merge.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/test_event_multi_table.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/userInterface.cpp: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/lmc-bench/src/user/old/userTransaction.c: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/vw_test/bcd.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/vw_test/utv.h: Changed header to GPL version 2 only ndb/test/ndbapi/old_dirs/vw_test/vcdrfunc.h: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/basic/basic.cpp: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/bulk_read/br_test.cpp: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/common.cpp: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/common.hpp: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/ptr_binding/ptr_binding_test.cpp: Changed header to GPL version 2 only ndb/test/newtonapi/basic_test/too_basic.cpp: Changed header to GPL version 2 only ndb/test/newtonapi/perf_test/perf.cpp: Changed header to GPL version 2 only ndb/test/odbc/SQL99_test/SQL99_test.cpp: Changed header to GPL version 2 only ndb/test/odbc/SQL99_test/SQL99_test.h: Changed header to GPL version 2 only ndb/test/odbc/client/NDBT_ALLOCHANDLE.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/NDBT_ALLOCHANDLE_HDBC.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/NDBT_SQLConnect.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/NDBT_SQLPrepare.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLAllocEnvTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLAllocHandleTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLAllocHandleTest_bf.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLBindColTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLBindParameterTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLCancelTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLCloseCursorTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLColAttributeTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLColAttributeTest1.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLColAttributeTest2.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLColAttributeTest3.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLConnectTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLCopyDescTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLDescribeColTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLDisconnectTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLDriverConnectTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLEndTranTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLErrorTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLExecDirectTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLExecuteTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLFetchScrollTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLFetchTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLFreeHandleTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLFreeStmtTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetConnectAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetCursorNameTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDataTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDescFieldTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDescRecTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDiagFieldTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDiagRecSimpleTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetDiagRecTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetEnvAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetFunctionsTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetInfoTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetStmtAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLGetTypeInfoTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLMoreResultsTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLNumResultColsTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLParamDataTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLPrepareTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLPutDataTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLRowCountTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetConnectAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetCursorNameTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetDescFieldTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetDescRecTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetEnvAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLSetStmtAttrTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLTablesTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/SQLTransactTest.cpp: Changed header to GPL version 2 only ndb/test/odbc/client/common.hpp: Changed header to GPL version 2 only ndb/test/odbc/client/main.cpp: Changed header to GPL version 2 only ndb/test/odbc/driver/testOdbcDriver.cpp: Changed header to GPL version 2 only ndb/test/odbc/test_compiler/test_compiler.cpp: Changed header to GPL version 2 only ndb/test/run-test/main.cpp: Changed header to GPL version 2 only ndb/test/run-test/run-test.hpp: Changed header to GPL version 2 only ndb/test/src/CpcClient.cpp: Changed header to GPL version 2 only ndb/test/src/HugoAsynchTransactions.cpp: Changed header to GPL version 2 only ndb/test/src/HugoCalculator.cpp: Changed header to GPL version 2 only ndb/test/src/HugoOperations.cpp: Changed header to GPL version 2 only ndb/test/src/HugoTransactions.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_Error.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_Output.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_ResultRow.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_ReturnCodes.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_Table.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_Tables.cpp: Changed header to GPL version 2 only ndb/test/src/NDBT_Test.cpp: Changed header to GPL version 2 only ndb/test/src/NdbBackup.cpp: Changed header to GPL version 2 only ndb/test/src/NdbConfig.cpp: Changed header to GPL version 2 only ndb/test/src/NdbGrep.cpp: Changed header to GPL version 2 only ndb/test/src/NdbRestarter.cpp: Changed header to GPL version 2 only ndb/test/src/NdbRestarts.cpp: Changed header to GPL version 2 only ndb/test/src/NdbSchemaCon.cpp: Changed header to GPL version 2 only ndb/test/src/NdbSchemaOp.cpp: Changed header to GPL version 2 only ndb/test/src/UtilTransactions.cpp: Changed header to GPL version 2 only ndb/test/tools/copy_tab.cpp: Changed header to GPL version 2 only ndb/test/tools/cpcc.cpp: Changed header to GPL version 2 only ndb/test/tools/create_index.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoCalculator.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoFill.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoLoad.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoLockRecords.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoPkDelete.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoPkRead.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoPkReadRecord.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoPkUpdate.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoScanRead.cpp: Changed header to GPL version 2 only ndb/test/tools/hugoScanUpdate.cpp: Changed header to GPL version 2 only ndb/test/tools/old_dirs/waiter/waiter.cpp: Changed header to GPL version 2 only ndb/test/tools/restart.cpp: Changed header to GPL version 2 only ndb/test/tools/transproxy.cpp: Changed header to GPL version 2 only ndb/test/tools/verify_index.cpp: Changed header to GPL version 2 only ndb/tools/delete_all.cpp: Changed header to GPL version 2 only ndb/tools/desc.cpp: Changed header to GPL version 2 only ndb/tools/drop_index.cpp: Changed header to GPL version 2 only ndb/tools/drop_tab.cpp: Changed header to GPL version 2 only ndb/tools/listTables.cpp: Changed header to GPL version 2 only ndb/tools/ndb_config.cpp: Changed header to GPL version 2 only ndb/tools/ndb_test_platform.cpp: Changed header to GPL version 2 only ndb/tools/ndbsql.cpp: Changed header to GPL version 2 only ndb/tools/restore/Restore.cpp: Changed header to GPL version 2 only ndb/tools/restore/Restore.hpp: Changed header to GPL version 2 only ndb/tools/restore/consumer.cpp: Changed header to GPL version 2 only ndb/tools/restore/consumer.hpp: Changed header to GPL version 2 only ndb/tools/restore/consumer_printer.cpp: Changed header to GPL version 2 only ndb/tools/restore/consumer_printer.hpp: Changed header to GPL version 2 only ndb/tools/restore/consumer_restore.cpp: Changed header to GPL version 2 only ndb/tools/restore/consumer_restore.hpp: Changed header to GPL version 2 only ndb/tools/select_all.cpp: Changed header to GPL version 2 only ndb/tools/select_count.cpp: Changed header to GPL version 2 only ndb/tools/waiter.cpp: Changed header to GPL version 2 only ndb/tools/restore/consumer_restorem.cpp: Changed header to GPL version 2 only ndb/tools/restore/restore_main.cpp: Changed header to GPL version 2 only netware/mysql_fix_privilege_tables.pl: Changed header to GPL version 2 only netware/mysql_secure_installation.pl: Changed header to GPL version 2 only os2/Makefile.am: Changed header to GPL version 2 only os2/include/Makefile.am: Changed header to GPL version 2 only os2/include/sys/Makefile.am: Changed header to GPL version 2 only pstack/Makefile.am: Changed header to GPL version 2 only regex/Makefile.am: Changed header to GPL version 2 only scripts/Makefile.am: Changed header to GPL version 2 only scripts/fill_help_tables.sh: Changed header to GPL version 2 only scripts/mysql_config.sh: Changed header to GPL version 2 only scripts/mysql_secure_installation.sh: Changed header to GPL version 2 only server-tools/instance-manager/Makefile.am: Changed header to GPL version 2 only server-tools/instance-manager/buffer.cc: Changed header to GPL version 2 only server-tools/instance-manager/buffer.h: Changed header to GPL version 2 only server-tools/instance-manager/command.cc: Changed header to GPL version 2 only server-tools/instance-manager/command.h: Changed header to GPL version 2 only server-tools/instance-manager/commands.cc: Changed header to GPL version 2 only server-tools/instance-manager/commands.h: Changed header to GPL version 2 only server-tools/instance-manager/guardian.cc: Changed header to GPL version 2 only server-tools/instance-manager/guardian.h: Changed header to GPL version 2 only server-tools/instance-manager/instance.cc: Changed header to GPL version 2 only server-tools/instance-manager/instance.h: Changed header to GPL version 2 only server-tools/instance-manager/instance_map.cc: Changed header to GPL version 2 only server-tools/instance-manager/instance_map.h: Changed header to GPL version 2 only server-tools/instance-manager/instance_options.cc: Changed header to GPL version 2 only server-tools/instance-manager/instance_options.h: Changed header to GPL version 2 only server-tools/instance-manager/listener.cc: Changed header to GPL version 2 only server-tools/instance-manager/listener.h: Changed header to GPL version 2 only server-tools/instance-manager/log.cc: Changed header to GPL version 2 only server-tools/instance-manager/log.h: Changed header to GPL version 2 only server-tools/instance-manager/manager.cc: Changed header to GPL version 2 only server-tools/instance-manager/manager.h: Changed header to GPL version 2 only server-tools/instance-manager/messages.cc: Changed header to GPL version 2 only server-tools/instance-manager/messages.h: Changed header to GPL version 2 only server-tools/instance-manager/mysql_connection.cc: Changed header to GPL version 2 only server-tools/instance-manager/mysql_connection.h: Changed header to GPL version 2 only server-tools/instance-manager/mysql_manager_error.h: Changed header to GPL version 2 only server-tools/instance-manager/mysqlmanager.cc: Changed header to GPL version 2 only server-tools/instance-manager/options.cc: Changed header to GPL version 2 only server-tools/instance-manager/options.h: Changed header to GPL version 2 only server-tools/instance-manager/parse.cc: Changed header to GPL version 2 only server-tools/instance-manager/parse.h: Changed header to GPL version 2 only server-tools/instance-manager/parse_output.cc: Changed header to GPL version 2 only server-tools/instance-manager/parse_output.h: Changed header to GPL version 2 only server-tools/instance-manager/priv.cc: Changed header to GPL version 2 only server-tools/instance-manager/priv.h: Changed header to GPL version 2 only server-tools/instance-manager/protocol.cc: Changed header to GPL version 2 only server-tools/instance-manager/protocol.h: Changed header to GPL version 2 only server-tools/instance-manager/thread_registry.cc: Changed header to GPL version 2 only server-tools/instance-manager/thread_registry.h: Changed header to GPL version 2 only server-tools/instance-manager/user_map.cc: Changed header to GPL version 2 only server-tools/instance-manager/user_map.h: Changed header to GPL version 2 only sql/Makefile.am: Changed header to GPL version 2 only sql/client_settings.h: Changed header to GPL version 2 only sql/custom_conf.h: Changed header to GPL version 2 only sql/derror.cc: Changed header to GPL version 2 only sql/des_key_file.cc: Changed header to GPL version 2 only sql/discover.cc: Changed header to GPL version 2 only sql/field.cc: Changed header to GPL version 2 only sql/field.h: Changed header to GPL version 2 only sql/field_conv.cc: Changed header to GPL version 2 only sql/filesort.cc: Changed header to GPL version 2 only sql/frm_crypt.cc: Changed header to GPL version 2 only sql/gen_lex_hash.cc: Changed header to GPL version 2 only sql/gstream.cc: Changed header to GPL version 2 only sql/gstream.h: Changed header to GPL version 2 only sql/ha_archive.cc: Changed header to GPL version 2 only sql/ha_archive.h: Changed header to GPL version 2 only sql/ha_berkeley.cc: Changed header to GPL version 2 only sql/ha_berkeley.h: Changed header to GPL version 2 only sql/ha_blackhole.cc: Changed header to GPL version 2 only sql/ha_blackhole.h: Changed header to GPL version 2 only sql/ha_federated.cc: Changed header to GPL version 2 only sql/ha_federated.h: Changed header to GPL version 2 only sql/ha_heap.cc: Changed header to GPL version 2 only sql/ha_heap.h: Changed header to GPL version 2 only sql/ha_innodb.cc: Changed header to GPL version 2 only sql/ha_innodb.h: Changed header to GPL version 2 only sql/ha_myisam.cc: Changed header to GPL version 2 only sql/ha_myisam.h: Changed header to GPL version 2 only sql/ha_myisammrg.cc: Changed header to GPL version 2 only sql/ha_myisammrg.h: Changed header to GPL version 2 only sql/ha_ndbcluster.cc: Changed header to GPL version 2 only sql/ha_ndbcluster.h: Changed header to GPL version 2 only sql/handler.cc: Changed header to GPL version 2 only sql/handler.h: Changed header to GPL version 2 only sql/hash_filo.cc: Changed header to GPL version 2 only sql/hash_filo.h: Changed header to GPL version 2 only sql/hostname.cc: Changed header to GPL version 2 only sql/init.cc: Changed header to GPL version 2 only sql/item.cc: Changed header to GPL version 2 only sql/item.h: Changed header to GPL version 2 only sql/item_buff.cc: Changed header to GPL version 2 only sql/item_cmpfunc.cc: Changed header to GPL version 2 only sql/item_cmpfunc.h: Changed header to GPL version 2 only sql/item_create.cc: Changed header to GPL version 2 only sql/item_create.h: Changed header to GPL version 2 only sql/item_func.cc: Changed header to GPL version 2 only sql/item_func.h: Changed header to GPL version 2 only sql/item_geofunc.cc: Changed header to GPL version 2 only sql/item_geofunc.h: Changed header to GPL version 2 only sql/item_row.cc: Changed header to GPL version 2 only sql/item_row.h: Changed header to GPL version 2 only sql/item_strfunc.cc: Changed header to GPL version 2 only sql/item_strfunc.h: Changed header to GPL version 2 only sql/item_subselect.cc: Changed header to GPL version 2 only sql/item_subselect.h: Changed header to GPL version 2 only sql/item_sum.cc: Changed header to GPL version 2 only sql/item_sum.h: Changed header to GPL version 2 only sql/item_timefunc.cc: Changed header to GPL version 2 only sql/item_timefunc.h: Changed header to GPL version 2 only sql/item_uniq.cc: Changed header to GPL version 2 only sql/item_uniq.h: Changed header to GPL version 2 only sql/key.cc: Changed header to GPL version 2 only sql/lex.h: Changed header to GPL version 2 only sql/lex_symbol.h: Changed header to GPL version 2 only sql/lock.cc: Changed header to GPL version 2 only sql/log.cc: Changed header to GPL version 2 only sql/log_event.cc: Changed header to GPL version 2 only sql/log_event.h: Changed header to GPL version 2 only sql/matherr.c: Changed header to GPL version 2 only sql/mf_iocache.cc: Changed header to GPL version 2 only sql/my_decimal.cc: Changed header to GPL version 2 only sql/my_decimal.h: Changed header to GPL version 2 only sql/my_lock.c: Changed header to GPL version 2 only sql/mysql_priv.h: Changed header to GPL version 2 only sql/mysqld.cc: Changed header to GPL version 2 only sql/mysqld_suffix.h: Changed header to GPL version 2 only sql/net_serv.cc: Changed header to GPL version 2 only sql/opt_range.cc: Changed header to GPL version 2 only sql/opt_range.h: Changed header to GPL version 2 only sql/opt_sum.cc: Changed header to GPL version 2 only sql/parse_file.cc: Changed header to GPL version 2 only sql/parse_file.h: Changed header to GPL version 2 only sql/password.c: Changed header to GPL version 2 only sql/procedure.cc: Changed header to GPL version 2 only sql/procedure.h: Changed header to GPL version 2 only sql/protocol.cc: Changed header to GPL version 2 only sql/protocol.h: Changed header to GPL version 2 only sql/records.cc: Changed header to GPL version 2 only sql/repl_failsafe.cc: Changed header to GPL version 2 only sql/repl_failsafe.h: Changed header to GPL version 2 only sql/set_var.cc: Changed header to GPL version 2 only sql/set_var.h: Changed header to GPL version 2 only sql/slave.cc: Changed header to GPL version 2 only sql/slave.h: Changed header to GPL version 2 only sql/sp.cc: Changed header to GPL version 2 only sql/sp.h: Changed header to GPL version 2 only sql/sp_cache.cc: Changed header to GPL version 2 only sql/sp_cache.h: Changed header to GPL version 2 only sql/sp_head.cc: Changed header to GPL version 2 only sql/sp_head.h: Changed header to GPL version 2 only sql/sp_pcontext.cc: Changed header to GPL version 2 only sql/sp_pcontext.h: Changed header to GPL version 2 only sql/sp_rcontext.cc: Changed header to GPL version 2 only sql/sp_rcontext.h: Changed header to GPL version 2 only sql/spatial.cc: Changed header to GPL version 2 only sql/spatial.h: Changed header to GPL version 2 only sql/sql_acl.cc: Changed header to GPL version 2 only sql/sql_acl.h: Changed header to GPL version 2 only sql/sql_analyse.cc: Changed header to GPL version 2 only sql/sql_analyse.h: Changed header to GPL version 2 only sql/sql_array.h: Changed header to GPL version 2 only sql/sql_base.cc: Changed header to GPL version 2 only sql/sql_bitmap.h: Changed header to GPL version 2 only sql/sql_cache.cc: Changed header to GPL version 2 only sql/sql_cache.h: Changed header to GPL version 2 only sql/sql_class.cc: Changed header to GPL version 2 only sql/sql_class.h: Changed header to GPL version 2 only sql/sql_client.cc: Changed header to GPL version 2 only sql/sql_crypt.cc: Changed header to GPL version 2 only sql/sql_crypt.h: Changed header to GPL version 2 only sql/sql_cursor.cc: Changed header to GPL version 2 only sql/sql_cursor.h: Changed header to GPL version 2 only sql/sql_db.cc: Changed header to GPL version 2 only sql/sql_delete.cc: Changed header to GPL version 2 only sql/sql_derived.cc: Changed header to GPL version 2 only sql/sql_do.cc: Changed header to GPL version 2 only sql/sql_error.cc: Changed header to GPL version 2 only sql/sql_error.h: Changed header to GPL version 2 only sql/sql_handler.cc: Changed header to GPL version 2 only sql/sql_help.cc: Changed header to GPL version 2 only sql/sql_insert.cc: Changed header to GPL version 2 only sql/sql_lex.cc: Changed header to GPL version 2 only sql/sql_lex.h: Changed header to GPL version 2 only sql/sql_list.cc: Changed header to GPL version 2 only sql/sql_list.h: Changed header to GPL version 2 only sql/sql_load.cc: Changed header to GPL version 2 only sql/sql_locale.cc: Changed header to GPL version 2 only sql/sql_manager.cc: Changed header to GPL version 2 only sql/sql_manager.h: Changed header to GPL version 2 only sql/sql_map.cc: Changed header to GPL version 2 only sql/sql_map.h: Changed header to GPL version 2 only sql/sql_olap.cc: Changed header to GPL version 2 only sql/sql_parse.cc: Changed header to GPL version 2 only sql/sql_prepare.cc: Changed header to GPL version 2 only sql/sql_rename.cc: Changed header to GPL version 2 only sql/sql_repl.cc: Changed header to GPL version 2 only sql/sql_repl.h: Changed header to GPL version 2 only sql/sql_select.cc: Changed header to GPL version 2 only sql/sql_select.h: Changed header to GPL version 2 only sql/sql_show.cc: Changed header to GPL version 2 only sql/sql_sort.h: Changed header to GPL version 2 only sql/sql_state.c: Changed header to GPL version 2 only sql/sql_string.cc: Changed header to GPL version 2 only sql/sql_string.h: Changed header to GPL version 2 only sql/sql_table.cc: Changed header to GPL version 2 only sql/sql_test.cc: Changed header to GPL version 2 only sql/sql_trigger.cc: Changed header to GPL version 2 only sql/sql_trigger.h: Changed header to GPL version 2 only sql/sql_udf.cc: Changed header to GPL version 2 only sql/sql_udf.h: Changed header to GPL version 2 only sql/sql_union.cc: Changed header to GPL version 2 only sql/sql_update.cc: Changed header to GPL version 2 only sql-bench/Makefile.am: Changed header to GPL version 2 only sql-bench/as3ap.sh: Changed header to GPL version 2 only sql-bench/bench-count-distinct.sh: Changed header to GPL version 2 only sql-bench/bench-init.pl.sh: Changed header to GPL version 2 only sql-bench/compare-results.sh: Changed header to GPL version 2 only sql-bench/copy-db.sh: Changed header to GPL version 2 only sql-bench/crash-me.sh: Changed header to GPL version 2 only sql-bench/print-limit-table: Changed header to GPL version 2 only sql-bench/run-all-tests.sh: Changed header to GPL version 2 only sql/examples/ha_example.cc: Changed header to GPL version 2 only sql/examples/ha_example.h: Changed header to GPL version 2 only sql/examples/ha_tina.cc: Changed header to GPL version 2 only sql/examples/ha_tina.h: Changed header to GPL version 2 only sql/share/Makefile.am: Changed header to GPL version 2 only sql/share/charsets/Index.xml: Changed header to GPL version 2 only sql/share/charsets/armscii8.xml: Changed header to GPL version 2 only sql/share/charsets/ascii.xml: Changed header to GPL version 2 only sql/share/charsets/cp1250.xml: Changed header to GPL version 2 only sql/share/charsets/cp1251.xml: Changed header to GPL version 2 only sql/share/charsets/cp1256.xml: Changed header to GPL version 2 only sql/share/charsets/cp1257.xml: Changed header to GPL version 2 only sql/share/charsets/cp850.xml: Changed header to GPL version 2 only sql/share/charsets/cp852.xml: Changed header to GPL version 2 only sql/share/charsets/cp866.xml: Changed header to GPL version 2 only sql/share/charsets/dec8.xml: Changed header to GPL version 2 only sql/share/charsets/geostd8.xml: Changed header to GPL version 2 only sql/share/charsets/greek.xml: Changed header to GPL version 2 only sql/share/charsets/hebrew.xml: Changed header to GPL version 2 only sql/share/charsets/hp8.xml: Changed header to GPL version 2 only sql/share/charsets/keybcs2.xml: Changed header to GPL version 2 only sql/share/charsets/koi8r.xml: Changed header to GPL version 2 only sql/share/charsets/koi8u.xml: Changed header to GPL version 2 only sql/share/charsets/latin1.xml: Changed header to GPL version 2 only sql/share/charsets/latin2.xml: Changed header to GPL version 2 only sql/share/charsets/latin5.xml: Changed header to GPL version 2 only sql/share/charsets/latin7.xml: Changed header to GPL version 2 only sql/share/charsets/macce.xml: Changed header to GPL version 2 only sql/share/charsets/macroman.xml: Changed header to GPL version 2 only sql/share/charsets/swe7.xml: Changed header to GPL version 2 only sql/sql_view.cc: Changed header to GPL version 2 only sql/sql_view.h: Changed header to GPL version 2 only sql/sql_yacc.yy: Changed header to GPL version 2 only sql/stacktrace.c: Changed header to GPL version 2 only sql/stacktrace.h: Changed header to GPL version 2 only sql/strfunc.cc: Changed header to GPL version 2 only sql/structs.h: Changed header to GPL version 2 only sql/table.cc: Changed header to GPL version 2 only sql/table.h: Changed header to GPL version 2 only sql/thr_malloc.cc: Changed header to GPL version 2 only sql/time.cc: Changed header to GPL version 2 only sql/tzfile.h: Changed header to GPL version 2 only sql/tztime.cc: Changed header to GPL version 2 only sql/tztime.h: Changed header to GPL version 2 only sql/udf_example.c: Changed header to GPL version 2 only sql/uniques.cc: Changed header to GPL version 2 only sql/unireg.cc: Changed header to GPL version 2 only sql/unireg.h: Changed header to GPL version 2 only sql-bench/server-cfg.sh: Changed header to GPL version 2 only sql-bench/test-ATIS.sh: Changed header to GPL version 2 only sql-bench/test-alter-table.sh: Changed header to GPL version 2 only sql-bench/test-big-tables.sh: Changed header to GPL version 2 only sql-bench/test-connect.sh: Changed header to GPL version 2 only sql-bench/test-create.sh: Changed header to GPL version 2 only sql-bench/test-insert.sh: Changed header to GPL version 2 only sql-bench/test-select.sh: Changed header to GPL version 2 only sql-bench/test-transactions.sh: Changed header to GPL version 2 only sql-bench/test-wisconsin.sh: Changed header to GPL version 2 only sql-common/Makefile.am: Changed header to GPL version 2 only sql-common/client.c: Changed header to GPL version 2 only sql-common/my_time.c: Changed header to GPL version 2 only sql-common/my_user.c: Changed header to GPL version 2 only sql-common/pack.c: Changed header to GPL version 2 only strings/Makefile.am: Changed header to GPL version 2 only strings/bchange.c: Changed header to GPL version 2 only strings/bcmp.c: Changed header to GPL version 2 only strings/bcopy-duff.c: Changed header to GPL version 2 only strings/bfill.c: Changed header to GPL version 2 only strings/bmove.c: Changed header to GPL version 2 only strings/bmove512.c: Changed header to GPL version 2 only strings/bmove_upp-sparc.s: Changed header to GPL version 2 only strings/bmove_upp.c: Changed header to GPL version 2 only strings/bzero.c: Changed header to GPL version 2 only strings/conf_to_src.c: Changed header to GPL version 2 only strings/ctype-big5.c: Changed header to GPL version 2 only strings/ctype-bin.c: Changed header to GPL version 2 only strings/ctype-cp932.c: Changed header to GPL version 2 only strings/ctype-czech.c: Changed header to GPL version 2 only strings/ctype-euc_kr.c: Changed header to GPL version 2 only strings/ctype-eucjpms.c: Changed header to GPL version 2 only strings/ctype-gb2312.c: Changed header to GPL version 2 only strings/ctype-gbk.c: Changed header to GPL version 2 only strings/ctype-latin1.c: Changed header to GPL version 2 only strings/ctype-mb.c: Changed header to GPL version 2 only strings/ctype-simple.c: Changed header to GPL version 2 only strings/ctype-sjis.c: Changed header to GPL version 2 only strings/ctype-tis620.c: Changed header to GPL version 2 only strings/ctype-uca.c: Changed header to GPL version 2 only strings/ctype-ucs2.c: Changed header to GPL version 2 only strings/ctype-ujis.c: Changed header to GPL version 2 only strings/ctype-utf8.c: Changed header to GPL version 2 only strings/ctype-win1250ch.c: Changed header to GPL version 2 only strings/ctype.c: Changed header to GPL version 2 only strings/decimal.c: Changed header to GPL version 2 only strings/do_ctype.c: Changed header to GPL version 2 only strings/int2str.c: Changed header to GPL version 2 only strings/is_prefix.c: Changed header to GPL version 2 only strings/llstr.c: Changed header to GPL version 2 only strings/longlong2str-x86.s: Changed header to GPL version 2 only strings/longlong2str.c: Changed header to GPL version 2 only strings/longlong2str_asm.c: Changed header to GPL version 2 only strings/macros.asm: Changed header to GPL version 2 only strings/memcmp.c: Changed header to GPL version 2 only strings/memcpy.c: Changed header to GPL version 2 only strings/memset.c: Changed header to GPL version 2 only strings/my_strtoll10-x86.s: Changed header to GPL version 2 only strings/my_strtoll10.c: Changed header to GPL version 2 only strings/my_vsnprintf.c: Changed header to GPL version 2 only strings/ptr_cmp.asm: Changed header to GPL version 2 only strings/r_strinstr.c: Changed header to GPL version 2 only strings/str2int.c: Changed header to GPL version 2 only strings/str_alloc.c: Changed header to GPL version 2 only strings/str_test.c: Changed header to GPL version 2 only strings/strappend-sparc.s: Changed header to GPL version 2 only strings/strappend.c: Changed header to GPL version 2 only strings/strcat.c: Changed header to GPL version 2 only strings/strcend.c: Changed header to GPL version 2 only strings/strchr.c: Changed header to GPL version 2 only strings/strcmp.c: Changed header to GPL version 2 only strings/strcont.c: Changed header to GPL version 2 only strings/strend-sparc.s: Changed header to GPL version 2 only strings/strend.c: Changed header to GPL version 2 only strings/strfill.c: Changed header to GPL version 2 only strings/strings-not-used.h: Changed header to GPL version 2 only strings/strings-x86.s: Changed header to GPL version 2 only strings/strings.asm: Changed header to GPL version 2 only strings/strinstr-sparc.s: Changed header to GPL version 2 only strings/strinstr.c: Changed header to GPL version 2 only strings/strlen.c: Changed header to GPL version 2 only strings/strmake-sparc.s: Changed header to GPL version 2 only strings/strmake.c: Changed header to GPL version 2 only strings/strmov-sparc.s: Changed header to GPL version 2 only strings/strmov.c: Changed header to GPL version 2 only strings/strnlen.c: Changed header to GPL version 2 only strings/strnmov-sparc.s: Changed header to GPL version 2 only strings/strnmov.c: Changed header to GPL version 2 only strings/strrchr.c: Changed header to GPL version 2 only strings/strstr-sparc.s: Changed header to GPL version 2 only strings/strstr.c: Changed header to GPL version 2 only strings/strto.c: Changed header to GPL version 2 only strings/strtol.c: Changed header to GPL version 2 only strings/strtoll.c: Changed header to GPL version 2 only strings/strtoul.c: Changed header to GPL version 2 only strings/strtoull.c: Changed header to GPL version 2 only strings/strxmov-sparc.s: Changed header to GPL version 2 only strings/strxmov.asm: Changed header to GPL version 2 only strings/strxmov.c: Changed header to GPL version 2 only strings/strxnmov.c: Changed header to GPL version 2 only strings/t_ctype.h: Changed header to GPL version 2 only strings/udiv.c: Changed header to GPL version 2 only strings/xml.c: Changed header to GPL version 2 only support-files/MacOSX/Makefile.am: Changed header to GPL version 2 only support-files/Makefile.am: Changed header to GPL version 2 only support-files/MySQL-shared-compat.spec.sh: Changed header to GPL version 2 only tests/Makefile.am: Changed header to GPL version 2 only tests/connect_test.c: Changed header to GPL version 2 only tests/deadlock_test.c: Changed header to GPL version 2 only tests/insert_test.c: Changed header to GPL version 2 only tests/list_test.c: Changed header to GPL version 2 only tests/mysql_client_test.c: Changed header to GPL version 2 only tests/select_test.c: Changed header to GPL version 2 only tests/showdb_test.c: Changed header to GPL version 2 only tests/ssl_test.c: Changed header to GPL version 2 only tests/thread_test.c: Changed header to GPL version 2 only tools/Makefile.am: Changed header to GPL version 2 only tools/mysqlmanager.c: Changed header to GPL version 2 only vio/Makefile.am: Changed header to GPL version 2 only vio/test-ssl.c: Changed header to GPL version 2 only vio/test-sslclient.c: Changed header to GPL version 2 only vio/test-sslserver.c: Changed header to GPL version 2 only vio/vio.c: Changed header to GPL version 2 only vio/vio_priv.h: Changed header to GPL version 2 only vio/viosocket.c: Changed header to GPL version 2 only vio/viossl.c: Changed header to GPL version 2 only vio/viosslfactories.c: Changed header to GPL version 2 only vio/viotest-ssl.c: Changed header to GPL version 2 only win/Makefile.am: Changed header to GPL version 2 only zlib/Makefile.am: Changed header to GPL version 2 only
2630 lines
79 KiB
C++
2630 lines
79 KiB
C++
/* Copyright (C) 2004 MySQL AB
|
|
|
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
/*
|
|
|
|
MySQL Federated Storage Engine
|
|
|
|
ha_federated.cc - MySQL Federated Storage Engine
|
|
Patrick Galbraith and Brian Aker, 2004
|
|
|
|
This is a handler which uses a foreign database as the data file, as
|
|
opposed to a handler like MyISAM, which uses .MYD files locally.
|
|
|
|
How this handler works
|
|
----------------------------------
|
|
Normal database files are local and as such: You create a table called
|
|
'users', a file such as 'users.MYD' is created. A handler reads, inserts,
|
|
deletes, updates data in this file. The data is stored in particular format,
|
|
so to read, that data has to be parsed into fields, to write, fields have to
|
|
be stored in this format to write to this data file.
|
|
|
|
With MySQL Federated storage engine, there will be no local files
|
|
for each table's data (such as .MYD). A foreign database will store
|
|
the data that would normally be in this file. This will necessitate
|
|
the use of MySQL client API to read, delete, update, insert this
|
|
data. The data will have to be retrieve via an SQL call "SELECT *
|
|
FROM users". Then, to read this data, it will have to be retrieved
|
|
via mysql_fetch_row one row at a time, then converted from the
|
|
column in this select into the format that the handler expects.
|
|
|
|
The create table will simply create the .frm file, and within the
|
|
"CREATE TABLE" SQL, there SHALL be any of the following :
|
|
|
|
comment=scheme://username:password@hostname:port/database/tablename
|
|
comment=scheme://username@hostname/database/tablename
|
|
comment=scheme://username:password@hostname/database/tablename
|
|
comment=scheme://username:password@hostname/database/tablename
|
|
|
|
An example would be:
|
|
|
|
comment=mysql://username:password@hostname:port/database/tablename
|
|
|
|
***IMPORTANT***
|
|
|
|
This is a first release, conceptual release
|
|
Only 'mysql://' is supported at this release.
|
|
|
|
|
|
This comment connection string is necessary for the handler to be
|
|
able to connect to the foreign server.
|
|
|
|
|
|
The basic flow is this:
|
|
|
|
SQL calls issues locally ->
|
|
mysql handler API (data in handler format) ->
|
|
mysql client API (data converted to SQL calls) ->
|
|
foreign database -> mysql client API ->
|
|
convert result sets (if any) to handler format ->
|
|
handler API -> results or rows affected to local
|
|
|
|
What this handler does and doesn't support
|
|
------------------------------------------
|
|
* Tables MUST be created on the foreign server prior to any action on those
|
|
tables via the handler, first version. IMPORTANT: IF you MUST use the
|
|
federated storage engine type on the REMOTE end, MAKE SURE [ :) ] That
|
|
the table you connect to IS NOT a table pointing BACK to your ORIGNAL
|
|
table! You know and have heard the screaching of audio feedback? You
|
|
know putting two mirror in front of each other how the reflection
|
|
continues for eternity? Well, need I say more?!
|
|
* There will not be support for transactions.
|
|
* There is no way for the handler to know if the foreign database or table
|
|
has changed. The reason for this is that this database has to work like a
|
|
data file that would never be written to by anything other than the
|
|
database. The integrity of the data in the local table could be breached
|
|
if there was any change to the foreign database.
|
|
* Support for SELECT, INSERT, UPDATE , DELETE, indexes.
|
|
* No ALTER TABLE, DROP TABLE or any other Data Definition Language calls.
|
|
* Prepared statements will not be used in the first implementation, it
|
|
remains to to be seen whether the limited subset of the client API for the
|
|
server supports this.
|
|
* This uses SELECT, INSERT, UPDATE, DELETE and not HANDLER for its
|
|
implementation.
|
|
* This will not work with the query cache.
|
|
|
|
Method calls
|
|
|
|
A two column table, with one record:
|
|
|
|
(SELECT)
|
|
|
|
"SELECT * FROM foo"
|
|
ha_federated::info
|
|
ha_federated::scan_time:
|
|
ha_federated::rnd_init: share->select_query SELECT * FROM foo
|
|
ha_federated::extra
|
|
|
|
<for every row of data retrieved>
|
|
ha_federated::rnd_next
|
|
ha_federated::convert_row_to_internal_format
|
|
ha_federated::rnd_next
|
|
</for every row of data retrieved>
|
|
|
|
ha_federated::rnd_end
|
|
ha_federated::extra
|
|
ha_federated::reset
|
|
|
|
(INSERT)
|
|
|
|
"INSERT INTO foo (id, ts) VALUES (2, now());"
|
|
|
|
ha_federated::write_row
|
|
|
|
ha_federated::reset
|
|
|
|
(UPDATE)
|
|
|
|
"UPDATE foo SET ts = now() WHERE id = 1;"
|
|
|
|
ha_federated::index_init
|
|
ha_federated::index_read
|
|
ha_federated::index_read_idx
|
|
ha_federated::rnd_next
|
|
ha_federated::convert_row_to_internal_format
|
|
ha_federated::update_row
|
|
|
|
ha_federated::extra
|
|
ha_federated::extra
|
|
ha_federated::extra
|
|
ha_federated::external_lock
|
|
ha_federated::reset
|
|
|
|
|
|
How do I use this handler?
|
|
--------------------------
|
|
First of all, you need to build this storage engine:
|
|
|
|
./configure --with-federated-storage-engine
|
|
make
|
|
|
|
Next, to use this handler, it's very simple. You must
|
|
have two databases running, either both on the same host, or
|
|
on different hosts.
|
|
|
|
One the server that will be connecting to the foreign
|
|
host (client), you create your table as such:
|
|
|
|
CREATE TABLE test_table (
|
|
id int(20) NOT NULL auto_increment,
|
|
name varchar(32) NOT NULL default '',
|
|
other int(20) NOT NULL default '0',
|
|
PRIMARY KEY (id),
|
|
KEY name (name),
|
|
KEY other_key (other))
|
|
ENGINE="FEDERATED"
|
|
DEFAULT CHARSET=latin1
|
|
COMMENT='root@127.0.0.1:9306/federated/test_federated';
|
|
|
|
Notice the "COMMENT" and "ENGINE" field? This is where you
|
|
respectively set the engine type, "FEDERATED" and foreign
|
|
host information, this being the database your 'client' database
|
|
will connect to and use as the "data file". Obviously, the foreign
|
|
database is running on port 9306, so you want to start up your other
|
|
database so that it is indeed on port 9306, and your federated
|
|
database on a port other than that. In my setup, I use port 5554
|
|
for federated, and port 5555 for the foreign database.
|
|
|
|
Then, on the foreign database:
|
|
|
|
CREATE TABLE test_table (
|
|
id int(20) NOT NULL auto_increment,
|
|
name varchar(32) NOT NULL default '',
|
|
other int(20) NOT NULL default '0',
|
|
PRIMARY KEY (id),
|
|
KEY name (name),
|
|
KEY other_key (other))
|
|
ENGINE="<NAME>" <-- whatever you want, or not specify
|
|
DEFAULT CHARSET=latin1 ;
|
|
|
|
This table is exactly the same (and must be exactly the same),
|
|
except that it is not using the federated handler and does
|
|
not need the URL.
|
|
|
|
|
|
How to see the handler in action
|
|
--------------------------------
|
|
|
|
When developing this handler, I compiled the federated database with
|
|
debugging:
|
|
|
|
./configure --with-federated-storage-engine
|
|
--prefix=/home/mysql/mysql-build/federated/ --with-debug
|
|
|
|
Once compiled, I did a 'make install' (not for the purpose of installing
|
|
the binary, but to install all the files the binary expects to see in the
|
|
diretory I specified in the build with --prefix,
|
|
"/home/mysql/mysql-build/federated".
|
|
|
|
Then, I started the foreign server:
|
|
|
|
/usr/local/mysql/bin/mysqld_safe
|
|
--user=mysql --log=/tmp/mysqld.5555.log -P 5555
|
|
|
|
Then, I went back to the directory containing the newly compiled mysqld,
|
|
<builddir>/sql/, started up gdb:
|
|
|
|
gdb ./mysqld
|
|
|
|
Then, withn the (gdb) prompt:
|
|
(gdb) run --gdb --port=5554 --socket=/tmp/mysqld.5554 --skip-innodb --debug
|
|
|
|
Next, I open several windows for each:
|
|
|
|
1. Tail the debug trace: tail -f /tmp/mysqld.trace|grep ha_fed
|
|
2. Tail the SQL calls to the foreign database: tail -f /tmp/mysqld.5555.log
|
|
3. A window with a client open to the federated server on port 5554
|
|
4. A window with a client open to the federated server on port 5555
|
|
|
|
I would create a table on the client to the foreign server on port
|
|
5555, and then to the federated server on port 5554. At this point,
|
|
I would run whatever queries I wanted to on the federated server,
|
|
just always remembering that whatever changes I wanted to make on
|
|
the table, or if I created new tables, that I would have to do that
|
|
on the foreign server.
|
|
|
|
Another thing to look for is 'show variables' to show you that you have
|
|
support for federated handler support:
|
|
|
|
show variables like '%federat%'
|
|
|
|
and:
|
|
|
|
show storage engines;
|
|
|
|
Both should display the federated storage handler.
|
|
|
|
|
|
Testing
|
|
-------
|
|
|
|
There is a test for MySQL Federated Storage Handler in ./mysql-test/t,
|
|
federatedd.test It starts both a slave and master database using
|
|
the same setup that the replication tests use, with the exception that
|
|
it turns off replication, and sets replication to ignore the test tables.
|
|
After ensuring that you actually do have support for the federated storage
|
|
handler, numerous queries/inserts/updates/deletes are run, many derived
|
|
from the MyISAM tests, plus som other tests which were meant to reveal
|
|
any issues that would be most likely to affect this handler. All tests
|
|
should work! ;)
|
|
|
|
To run these tests, go into ./mysql-test (based in the directory you
|
|
built the server in)
|
|
|
|
./mysql-test-run federatedd
|
|
|
|
To run the test, or if you want to run the test and have debug info:
|
|
|
|
./mysql-test-run --debug federated
|
|
|
|
This will run the test in debug mode, and you can view the trace and
|
|
log files in the ./mysql-test/var/log directory
|
|
|
|
ls -l mysql-test/var/log/
|
|
-rw-r--r-- 1 patg patg 17 4 Dec 12:27 current_test
|
|
-rw-r--r-- 1 patg patg 692 4 Dec 12:52 manager.log
|
|
-rw-rw---- 1 patg patg 21246 4 Dec 12:51 master-bin.000001
|
|
-rw-rw---- 1 patg patg 68 4 Dec 12:28 master-bin.index
|
|
-rw-r--r-- 1 patg patg 1620 4 Dec 12:51 master.err
|
|
-rw-rw---- 1 patg patg 23179 4 Dec 12:51 master.log
|
|
-rw-rw---- 1 patg patg 16696550 4 Dec 12:51 master.trace
|
|
-rw-r--r-- 1 patg patg 0 4 Dec 12:28 mysqltest-time
|
|
-rw-r--r-- 1 patg patg 2024051 4 Dec 12:51 mysqltest.trace
|
|
-rw-rw---- 1 patg patg 94992 4 Dec 12:51 slave-bin.000001
|
|
-rw-rw---- 1 patg patg 67 4 Dec 12:28 slave-bin.index
|
|
-rw-rw---- 1 patg patg 249 4 Dec 12:52 slave-relay-bin.000003
|
|
-rw-rw---- 1 patg patg 73 4 Dec 12:28 slave-relay-bin.index
|
|
-rw-r--r-- 1 patg patg 1349 4 Dec 12:51 slave.err
|
|
-rw-rw---- 1 patg patg 96206 4 Dec 12:52 slave.log
|
|
-rw-rw---- 1 patg patg 15706355 4 Dec 12:51 slave.trace
|
|
-rw-r--r-- 1 patg patg 0 4 Dec 12:51 warnings
|
|
|
|
Of course, again, you can tail the trace log:
|
|
|
|
tail -f mysql-test/var/log/master.trace |grep ha_fed
|
|
|
|
As well as the slave query log:
|
|
|
|
tail -f mysql-test/var/log/slave.log
|
|
|
|
Files that comprise the test suit
|
|
---------------------------------
|
|
mysql-test/t/federated.test
|
|
mysql-test/r/federated.result
|
|
mysql-test/r/have_federated_db.require
|
|
mysql-test/include/have_federated_db.inc
|
|
|
|
|
|
Other tidbits
|
|
-------------
|
|
|
|
These were the files that were modified or created for this
|
|
Federated handler to work:
|
|
|
|
./configure.in
|
|
./sql/Makefile.am
|
|
./config/ac_macros/ha_federated.m4
|
|
./sql/handler.cc
|
|
./sql/mysqld.cc
|
|
./sql/set_var.cc
|
|
./sql/field.h
|
|
./sql/sql_string.h
|
|
./mysql-test/mysql-test-run(.sh)
|
|
./mysql-test/t/federated.test
|
|
./mysql-test/r/federated.result
|
|
./mysql-test/r/have_federated_db.require
|
|
./mysql-test/include/have_federated_db.inc
|
|
./sql/ha_federated.cc
|
|
./sql/ha_federated.h
|
|
|
|
*/
|
|
|
|
|
|
#include "mysql_priv.h"
|
|
#ifdef USE_PRAGMA_IMPLEMENTATION
|
|
#pragma implementation // gcc: Class implementation
|
|
#endif
|
|
|
|
#ifdef HAVE_FEDERATED_DB
|
|
#include "ha_federated.h"
|
|
|
|
#include "m_string.h"
|
|
/* Variables for federated share methods */
|
|
static HASH federated_open_tables; // Hash used to track open
|
|
// tables
|
|
pthread_mutex_t federated_mutex; // This is the mutex we use to
|
|
// init the hash
|
|
static int federated_init= FALSE; // Variable for checking the
|
|
// init state of hash
|
|
|
|
/* Federated storage engine handlerton */
|
|
|
|
handlerton federated_hton= {
|
|
"FEDERATED",
|
|
SHOW_OPTION_YES,
|
|
"Federated MySQL storage engine",
|
|
DB_TYPE_FEDERATED_DB,
|
|
federated_db_init,
|
|
0, /* slot */
|
|
0, /* savepoint size. */
|
|
NULL, /* close_connection */
|
|
NULL, /* savepoint */
|
|
NULL, /* rollback to savepoint */
|
|
NULL, /* release savepoint */
|
|
NULL, /* commit */
|
|
NULL, /* rollback */
|
|
NULL, /* prepare */
|
|
NULL, /* recover */
|
|
NULL, /* commit_by_xid */
|
|
NULL, /* rollback_by_xid */
|
|
NULL, /* create_cursor_read_view */
|
|
NULL, /* set_cursor_read_view */
|
|
NULL, /* close_cursor_read_view */
|
|
HTON_ALTER_NOT_SUPPORTED
|
|
};
|
|
|
|
|
|
/* Function we use in the creation of our hash to get key. */
|
|
|
|
static byte *federated_get_key(FEDERATED_SHARE *share, uint *length,
|
|
my_bool not_used __attribute__ ((unused)))
|
|
{
|
|
*length= share->connect_string_length;
|
|
return (byte*) share->scheme;
|
|
}
|
|
|
|
/*
|
|
Initialize the federated handler.
|
|
|
|
SYNOPSIS
|
|
federated_db_init()
|
|
void
|
|
|
|
RETURN
|
|
FALSE OK
|
|
TRUE Error
|
|
*/
|
|
|
|
bool federated_db_init()
|
|
{
|
|
DBUG_ENTER("federated_db_init");
|
|
if (pthread_mutex_init(&federated_mutex, MY_MUTEX_INIT_FAST))
|
|
goto error;
|
|
if (hash_init(&federated_open_tables, &my_charset_bin, 32, 0, 0,
|
|
(hash_get_key) federated_get_key, 0, 0))
|
|
{
|
|
VOID(pthread_mutex_destroy(&federated_mutex));
|
|
}
|
|
else
|
|
{
|
|
federated_init= TRUE;
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
error:
|
|
have_federated_db= SHOW_OPTION_DISABLED; // If we couldn't use handler
|
|
DBUG_RETURN(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
Release the federated handler.
|
|
|
|
SYNOPSIS
|
|
federated_db_end()
|
|
void
|
|
|
|
RETURN
|
|
FALSE OK
|
|
*/
|
|
|
|
bool federated_db_end()
|
|
{
|
|
if (federated_init)
|
|
{
|
|
hash_free(&federated_open_tables);
|
|
VOID(pthread_mutex_destroy(&federated_mutex));
|
|
}
|
|
federated_init= 0;
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
Check (in create) whether the tables exists, and that it can be connected to
|
|
|
|
SYNOPSIS
|
|
check_foreign_data_source()
|
|
share pointer to FEDERATED share
|
|
table_create_flag tells us that ::create is the caller,
|
|
therefore, return CANT_CREATE_FEDERATED_TABLE
|
|
|
|
DESCRIPTION
|
|
This method first checks that the connection information that parse url
|
|
has populated into the share will be sufficient to connect to the foreign
|
|
table, and if so, does the foreign table exist.
|
|
*/
|
|
|
|
static int check_foreign_data_source(FEDERATED_SHARE *share,
|
|
bool table_create_flag)
|
|
{
|
|
char escaped_table_name[NAME_LEN*2];
|
|
char query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char error_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
uint error_code;
|
|
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
|
|
MYSQL *mysql;
|
|
DBUG_ENTER("ha_federated::check_foreign_data_source");
|
|
|
|
/* Zero the length, otherwise the string will have misc chars */
|
|
query.length(0);
|
|
|
|
/* error out if we can't alloc memory for mysql_init(NULL) (per Georg) */
|
|
if (!(mysql= mysql_init(NULL)))
|
|
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
|
/* check if we can connect */
|
|
if (!mysql_real_connect(mysql,
|
|
share->hostname,
|
|
share->username,
|
|
share->password,
|
|
share->database,
|
|
share->port,
|
|
share->socket, 0))
|
|
{
|
|
/*
|
|
we want the correct error message, but it to return
|
|
ER_CANT_CREATE_FEDERATED_TABLE if called by ::create
|
|
*/
|
|
error_code= (table_create_flag ?
|
|
ER_CANT_CREATE_FEDERATED_TABLE :
|
|
ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
|
|
|
|
my_sprintf(error_buffer,
|
|
(error_buffer,
|
|
"database: '%s' username: '%s' hostname: '%s'",
|
|
share->database, share->username, share->hostname));
|
|
|
|
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0), error_buffer);
|
|
goto error;
|
|
}
|
|
else
|
|
{
|
|
int escaped_table_name_length= 0;
|
|
/*
|
|
Since we do not support transactions at this version, we can let the
|
|
client API silently reconnect. For future versions, we will need more
|
|
logic to deal with transactions
|
|
*/
|
|
mysql->reconnect= 1;
|
|
/*
|
|
Note: I am not using INORMATION_SCHEMA because this needs to work with
|
|
versions prior to 5.0
|
|
|
|
if we can connect, then make sure the table exists
|
|
|
|
the query will be: SELECT * FROM `tablename` WHERE 1=0
|
|
*/
|
|
query.append(FEDERATED_SELECT);
|
|
query.append(FEDERATED_STAR);
|
|
query.append(FEDERATED_FROM);
|
|
query.append(FEDERATED_BTICK);
|
|
escaped_table_name_length=
|
|
escape_string_for_mysql(&my_charset_bin, (char*)escaped_table_name,
|
|
sizeof(escaped_table_name),
|
|
share->table_name,
|
|
share->table_name_length);
|
|
query.append(escaped_table_name, escaped_table_name_length);
|
|
query.append(FEDERATED_BTICK);
|
|
query.append(FEDERATED_WHERE);
|
|
query.append(FEDERATED_FALSE);
|
|
|
|
if (mysql_real_query(mysql, query.ptr(), query.length()))
|
|
{
|
|
error_code= table_create_flag ?
|
|
ER_CANT_CREATE_FEDERATED_TABLE : ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST;
|
|
my_sprintf(error_buffer, (error_buffer, "error: %d '%s'",
|
|
mysql_errno(mysql), mysql_error(mysql)));
|
|
|
|
my_error(error_code, MYF(0), error_buffer);
|
|
goto error;
|
|
}
|
|
}
|
|
error_code=0;
|
|
|
|
error:
|
|
mysql_close(mysql);
|
|
DBUG_RETURN(error_code);
|
|
}
|
|
|
|
|
|
static int parse_url_error(FEDERATED_SHARE *share, TABLE *table, int error_num)
|
|
{
|
|
char buf[FEDERATED_QUERY_BUFFER_SIZE];
|
|
int buf_len;
|
|
DBUG_ENTER("ha_federated parse_url_error");
|
|
|
|
if (share->scheme)
|
|
{
|
|
DBUG_PRINT("info",
|
|
("error: parse_url. Returning error code %d freeing share->scheme 0x%lx",
|
|
error_num, (long) share->scheme));
|
|
my_free((gptr) share->scheme, MYF(0));
|
|
share->scheme= 0;
|
|
}
|
|
buf_len= min(table->s->connect_string.length,
|
|
FEDERATED_QUERY_BUFFER_SIZE-1);
|
|
strmake(buf, table->s->connect_string.str, buf_len);
|
|
my_error(error_num, MYF(0), buf);
|
|
DBUG_RETURN(error_num);
|
|
}
|
|
|
|
/*
|
|
Parse connection info from table->s->connect_string
|
|
|
|
SYNOPSIS
|
|
parse_url()
|
|
share pointer to FEDERATED share
|
|
table pointer to current TABLE class
|
|
table_create_flag determines what error to throw
|
|
|
|
DESCRIPTION
|
|
populates the share with information about the connection
|
|
to the foreign database that will serve as the data source.
|
|
This string must be specified (currently) in the "comment" field,
|
|
listed in the CREATE TABLE statement.
|
|
|
|
This string MUST be in the format of any of these:
|
|
|
|
scheme://username:password@hostname:port/database/table
|
|
scheme://username@hostname/database/table
|
|
scheme://username@hostname:port/database/table
|
|
scheme://username:password@hostname/database/table
|
|
|
|
An Example:
|
|
|
|
mysql://joe:joespass@192.168.1.111:9308/federated/testtable
|
|
|
|
***IMPORTANT***
|
|
Currently, only "mysql://" is supported.
|
|
|
|
'password' and 'port' are both optional.
|
|
|
|
RETURN VALUE
|
|
0 success
|
|
error_num particular error code
|
|
|
|
*/
|
|
|
|
static int parse_url(FEDERATED_SHARE *share, TABLE *table,
|
|
uint table_create_flag)
|
|
{
|
|
uint error_num= (table_create_flag ?
|
|
ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE :
|
|
ER_FOREIGN_DATA_STRING_INVALID);
|
|
DBUG_ENTER("ha_federated::parse_url");
|
|
|
|
share->port= 0;
|
|
share->socket= 0;
|
|
DBUG_PRINT("info", ("Length %d \n", table->s->connect_string.length));
|
|
DBUG_PRINT("info", ("String %.*s \n", table->s->connect_string.length,
|
|
table->s->connect_string.str));
|
|
share->scheme= my_strdup_with_length(table->s->connect_string.str,
|
|
table->s->connect_string.length,
|
|
MYF(0));
|
|
|
|
share->connect_string_length= table->s->connect_string.length;
|
|
DBUG_PRINT("info",("parse_url alloced share->scheme 0x%lx", (long) share->scheme));
|
|
|
|
/*
|
|
remove addition of null terminator and store length
|
|
for each string in share
|
|
*/
|
|
if (!(share->username= strstr(share->scheme, "://")))
|
|
goto error;
|
|
share->scheme[share->username - share->scheme]= '\0';
|
|
|
|
if (strcmp(share->scheme, "mysql") != 0)
|
|
goto error;
|
|
|
|
share->username+= 3;
|
|
|
|
if (!(share->hostname= strchr(share->username, '@')))
|
|
goto error;
|
|
|
|
share->username[share->hostname - share->username]= '\0';
|
|
share->hostname++;
|
|
|
|
if ((share->password= strchr(share->username, ':')))
|
|
{
|
|
share->username[share->password - share->username]= '\0';
|
|
share->password++;
|
|
share->username= share->username;
|
|
/* make sure there isn't an extra / or @ */
|
|
if ((strchr(share->password, '/') || strchr(share->hostname, '@')))
|
|
goto error;
|
|
/*
|
|
Found that if the string is:
|
|
user:@hostname:port/database/table
|
|
Then password is a null string, so set to NULL
|
|
*/
|
|
if ((share->password[0] == '\0'))
|
|
share->password= NULL;
|
|
}
|
|
else
|
|
share->username= share->username;
|
|
|
|
/* make sure there isn't an extra / or @ */
|
|
if ((strchr(share->username, '/')) || (strchr(share->hostname, '@')))
|
|
goto error;
|
|
|
|
if (!(share->database= strchr(share->hostname, '/')))
|
|
goto error;
|
|
share->hostname[share->database - share->hostname]= '\0';
|
|
share->database++;
|
|
|
|
if ((share->sport= strchr(share->hostname, ':')))
|
|
{
|
|
share->hostname[share->sport - share->hostname]= '\0';
|
|
share->sport++;
|
|
if (share->sport[0] == '\0')
|
|
share->sport= NULL;
|
|
else
|
|
share->port= atoi(share->sport);
|
|
}
|
|
|
|
if (!(share->table_name= strchr(share->database, '/')))
|
|
goto error;
|
|
share->database[share->table_name - share->database]= '\0';
|
|
share->table_name++;
|
|
|
|
share->table_name_length= strlen(share->table_name);
|
|
|
|
/* make sure there's not an extra / */
|
|
if ((strchr(share->table_name, '/')))
|
|
goto error;
|
|
|
|
if (share->hostname[0] == '\0')
|
|
share->hostname= NULL;
|
|
|
|
if (!share->port)
|
|
{
|
|
if (strcmp(share->hostname, my_localhost) == 0)
|
|
share->socket= my_strdup(MYSQL_UNIX_ADDR, MYF(0));
|
|
else
|
|
share->port= MYSQL_PORT;
|
|
}
|
|
|
|
DBUG_PRINT("info",
|
|
("scheme %s username %s password %s \
|
|
hostname %s port %d database %s tablename %s\n",
|
|
share->scheme, share->username, share->password,
|
|
share->hostname, share->port, share->database,
|
|
share->table_name));
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
error:
|
|
DBUG_RETURN(parse_url_error(share, table, error_num));
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
** FEDERATED tables
|
|
*****************************************************************************/
|
|
|
|
ha_federated::ha_federated(TABLE *table_arg)
|
|
:handler(&federated_hton, table_arg),
|
|
mysql(0), stored_result(0)
|
|
{}
|
|
|
|
|
|
/*
|
|
Convert MySQL result set row to handler internal format
|
|
|
|
SYNOPSIS
|
|
convert_row_to_internal_format()
|
|
record Byte pointer to record
|
|
row MySQL result set row from fetchrow()
|
|
result Result set to use
|
|
|
|
DESCRIPTION
|
|
This method simply iterates through a row returned via fetchrow with
|
|
values from a successful SELECT , and then stores each column's value
|
|
in the field object via the field object pointer (pointing to the table's
|
|
array of field object pointers). This is how the handler needs the data
|
|
to be stored to then return results back to the user
|
|
|
|
RETURN VALUE
|
|
0 After fields have had field values stored from record
|
|
*/
|
|
|
|
uint ha_federated::convert_row_to_internal_format(byte *record,
|
|
MYSQL_ROW row,
|
|
MYSQL_RES *result)
|
|
{
|
|
ulong *lengths;
|
|
Field **field;
|
|
DBUG_ENTER("ha_federated::convert_row_to_internal_format");
|
|
|
|
lengths= mysql_fetch_lengths(result);
|
|
|
|
for (field= table->field; *field; field++)
|
|
{
|
|
/*
|
|
index variable to move us through the row at the
|
|
same iterative step as the field
|
|
*/
|
|
int x= field - table->field;
|
|
my_ptrdiff_t old_ptr;
|
|
old_ptr= (my_ptrdiff_t) (record - table->record[0]);
|
|
(*field)->move_field(old_ptr);
|
|
if (!row[x])
|
|
(*field)->set_null();
|
|
else
|
|
{
|
|
(*field)->set_notnull();
|
|
(*field)->store(row[x], lengths[x], &my_charset_bin);
|
|
}
|
|
(*field)->move_field(-old_ptr);
|
|
}
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
static bool emit_key_part_name(String *to, KEY_PART_INFO *part)
|
|
{
|
|
DBUG_ENTER("emit_key_part_name");
|
|
if (to->append(FEDERATED_BTICK) ||
|
|
to->append(part->field->field_name) ||
|
|
to->append(FEDERATED_BTICK))
|
|
DBUG_RETURN(1); // Out of memory
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
static bool emit_key_part_element(String *to, KEY_PART_INFO *part,
|
|
bool needs_quotes, bool is_like,
|
|
const byte *ptr, uint len)
|
|
{
|
|
Field *field= part->field;
|
|
DBUG_ENTER("emit_key_part_element");
|
|
|
|
if (needs_quotes && to->append(FEDERATED_SQUOTE))
|
|
DBUG_RETURN(1);
|
|
|
|
if (part->type == HA_KEYTYPE_BIT)
|
|
{
|
|
char buff[STRING_BUFFER_USUAL_SIZE], *buf= buff;
|
|
|
|
*buf++= '0';
|
|
*buf++= 'x';
|
|
buf= octet2hex(buf, (char*) ptr, len);
|
|
if (to->append((char*) buff, (uint)(buf - buff)))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else if (part->key_part_flag & HA_BLOB_PART)
|
|
{
|
|
String blob;
|
|
uint blob_length= uint2korr(ptr);
|
|
blob.set_quick((char*) ptr+HA_KEY_BLOB_LENGTH,
|
|
blob_length, &my_charset_bin);
|
|
if (append_escaped(to, &blob))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else if (part->key_part_flag & HA_VAR_LENGTH_PART)
|
|
{
|
|
String varchar;
|
|
uint var_length= uint2korr(ptr);
|
|
varchar.set_quick((char*) ptr+HA_KEY_BLOB_LENGTH,
|
|
var_length, &my_charset_bin);
|
|
if (append_escaped(to, &varchar))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else
|
|
{
|
|
char strbuff[MAX_FIELD_WIDTH];
|
|
String str(strbuff, sizeof(strbuff), part->field->charset()), *res;
|
|
|
|
res= field->val_str(&str, (char *)ptr);
|
|
|
|
if (field->result_type() == STRING_RESULT)
|
|
{
|
|
if (append_escaped(to, res))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else if (to->append(res->ptr(), res->length()))
|
|
DBUG_RETURN(1);
|
|
}
|
|
|
|
if (is_like && to->append(FEDERATED_PERCENT))
|
|
DBUG_RETURN(1);
|
|
|
|
if (needs_quotes && to->append(FEDERATED_SQUOTE))
|
|
DBUG_RETURN(1);
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
Create a WHERE clause based off of values in keys
|
|
Note: This code was inspired by key_copy from key.cc
|
|
|
|
SYNOPSIS
|
|
create_where_from_key ()
|
|
to String object to store WHERE clause
|
|
key_info KEY struct pointer
|
|
key byte pointer containing key
|
|
key_length length of key
|
|
range_type 0 - no range, 1 - min range, 2 - max range
|
|
(see enum range_operation)
|
|
|
|
DESCRIPTION
|
|
Using iteration through all the keys via a KEY_PART_INFO pointer,
|
|
This method 'extracts' the value of each key in the byte pointer
|
|
*key, and for each key found, constructs an appropriate WHERE clause
|
|
|
|
RETURN VALUE
|
|
0 After all keys have been accounted for to create the WHERE clause
|
|
1 No keys found
|
|
|
|
Range flags Table per Timour:
|
|
|
|
-----------------
|
|
- start_key:
|
|
* ">" -> HA_READ_AFTER_KEY
|
|
* ">=" -> HA_READ_KEY_OR_NEXT
|
|
* "=" -> HA_READ_KEY_EXACT
|
|
|
|
- end_key:
|
|
* "<" -> HA_READ_BEFORE_KEY
|
|
* "<=" -> HA_READ_AFTER_KEY
|
|
|
|
records_in_range:
|
|
-----------------
|
|
- start_key:
|
|
* ">" -> HA_READ_AFTER_KEY
|
|
* ">=" -> HA_READ_KEY_EXACT
|
|
* "=" -> HA_READ_KEY_EXACT
|
|
|
|
- end_key:
|
|
* "<" -> HA_READ_BEFORE_KEY
|
|
* "<=" -> HA_READ_AFTER_KEY
|
|
* "=" -> HA_READ_AFTER_KEY
|
|
|
|
0 HA_READ_KEY_EXACT, Find first record else error
|
|
1 HA_READ_KEY_OR_NEXT, Record or next record
|
|
2 HA_READ_KEY_OR_PREV, Record or previous
|
|
3 HA_READ_AFTER_KEY, Find next rec. after key-record
|
|
4 HA_READ_BEFORE_KEY, Find next rec. before key-record
|
|
5 HA_READ_PREFIX, Key which as same prefix
|
|
6 HA_READ_PREFIX_LAST, Last key with the same prefix
|
|
7 HA_READ_PREFIX_LAST_OR_PREV, Last or prev key with the same prefix
|
|
|
|
Flags that I've found:
|
|
|
|
id, primary key, varchar
|
|
|
|
id = 'ccccc'
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 0 end_key NULL
|
|
|
|
id > 'ccccc'
|
|
records_in_range: start_key 3 end_key NULL
|
|
read_range_first: start_key 3 end_key NULL
|
|
|
|
id < 'ccccc'
|
|
records_in_range: start_key NULL end_key 4
|
|
read_range_first: start_key NULL end_key 4
|
|
|
|
id <= 'ccccc'
|
|
records_in_range: start_key NULL end_key 3
|
|
read_range_first: start_key NULL end_key 3
|
|
|
|
id >= 'ccccc'
|
|
records_in_range: start_key 0 end_key NULL
|
|
read_range_first: start_key 1 end_key NULL
|
|
|
|
id like 'cc%cc'
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 1 end_key 3
|
|
|
|
id > 'aaaaa' and id < 'ccccc'
|
|
records_in_range: start_key 3 end_key 4
|
|
read_range_first: start_key 3 end_key 4
|
|
|
|
id >= 'aaaaa' and id < 'ccccc';
|
|
records_in_range: start_key 0 end_key 4
|
|
read_range_first: start_key 1 end_key 4
|
|
|
|
id >= 'aaaaa' and id <= 'ccccc';
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 1 end_key 3
|
|
|
|
id > 'aaaaa' and id <= 'ccccc';
|
|
records_in_range: start_key 3 end_key 3
|
|
read_range_first: start_key 3 end_key 3
|
|
|
|
numeric keys:
|
|
|
|
id = 4
|
|
index_read_idx: start_key 0 end_key NULL
|
|
|
|
id > 4
|
|
records_in_range: start_key 3 end_key NULL
|
|
read_range_first: start_key 3 end_key NULL
|
|
|
|
id >= 4
|
|
records_in_range: start_key 0 end_key NULL
|
|
read_range_first: start_key 1 end_key NULL
|
|
|
|
id < 4
|
|
records_in_range: start_key NULL end_key 4
|
|
read_range_first: start_key NULL end_key 4
|
|
|
|
id <= 4
|
|
records_in_range: start_key NULL end_key 3
|
|
read_range_first: start_key NULL end_key 3
|
|
|
|
id like 4
|
|
full table scan, select * from
|
|
|
|
id > 2 and id < 8
|
|
records_in_range: start_key 3 end_key 4
|
|
read_range_first: start_key 3 end_key 4
|
|
|
|
id >= 2 and id < 8
|
|
records_in_range: start_key 0 end_key 4
|
|
read_range_first: start_key 1 end_key 4
|
|
|
|
id >= 2 and id <= 8
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 1 end_key 3
|
|
|
|
id > 2 and id <= 8
|
|
records_in_range: start_key 3 end_key 3
|
|
read_range_first: start_key 3 end_key 3
|
|
|
|
multi keys (id int, name varchar, other varchar)
|
|
|
|
id = 1;
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 0 end_key NULL
|
|
|
|
id > 4;
|
|
id > 2 and name = '333'; remote: id > 2
|
|
id > 2 and name > '333'; remote: id > 2
|
|
id > 2 and name > '333' and other < 'ddd'; remote: id > 2 no results
|
|
id > 2 and name >= '333' and other < 'ddd'; remote: id > 2 1 result
|
|
id >= 4 and name = 'eric was here' and other > 'eeee';
|
|
records_in_range: start_key 3 end_key NULL
|
|
read_range_first: start_key 3 end_key NULL
|
|
|
|
id >= 4;
|
|
id >= 2 and name = '333' and other < 'ddd';
|
|
remote: `id` >= 2 AND `name` >= '333';
|
|
records_in_range: start_key 0 end_key NULL
|
|
read_range_first: start_key 1 end_key NULL
|
|
|
|
id < 4;
|
|
id < 3 and name = '222' and other <= 'ccc'; remote: id < 3
|
|
records_in_range: start_key NULL end_key 4
|
|
read_range_first: start_key NULL end_key 4
|
|
|
|
id <= 4;
|
|
records_in_range: start_key NULL end_key 3
|
|
read_range_first: start_key NULL end_key 3
|
|
|
|
id like 4;
|
|
full table scan
|
|
|
|
id > 2 and id < 4;
|
|
records_in_range: start_key 3 end_key 4
|
|
read_range_first: start_key 3 end_key 4
|
|
|
|
id >= 2 and id < 4;
|
|
records_in_range: start_key 0 end_key 4
|
|
read_range_first: start_key 1 end_key 4
|
|
|
|
id >= 2 and id <= 4;
|
|
records_in_range: start_key 0 end_key 3
|
|
read_range_first: start_key 1 end_key 3
|
|
|
|
id > 2 and id <= 4;
|
|
id = 6 and name = 'eric was here' and other > 'eeee';
|
|
remote: (`id` > 6 AND `name` > 'eric was here' AND `other` > 'eeee')
|
|
AND (`id` <= 6) AND ( AND `name` <= 'eric was here')
|
|
no results
|
|
records_in_range: start_key 3 end_key 3
|
|
read_range_first: start_key 3 end_key 3
|
|
|
|
Summary:
|
|
|
|
* If the start key flag is 0 the max key flag shouldn't even be set,
|
|
and if it is, the query produced would be invalid.
|
|
* Multipart keys, even if containing some or all numeric columns,
|
|
are treated the same as non-numeric keys
|
|
|
|
If the query is " = " (quotes or not):
|
|
- records in range start key flag HA_READ_KEY_EXACT,
|
|
end key flag HA_READ_AFTER_KEY (incorrect)
|
|
- any other: start key flag HA_READ_KEY_OR_NEXT,
|
|
end key flag HA_READ_AFTER_KEY (correct)
|
|
|
|
* 'like' queries (of key)
|
|
- Numeric, full table scan
|
|
- Non-numeric
|
|
records_in_range: start_key 0 end_key 3
|
|
other : start_key 1 end_key 3
|
|
|
|
* If the key flag is HA_READ_AFTER_KEY:
|
|
if start_key, append >
|
|
if end_key, append <=
|
|
|
|
* If create_where_key was called by records_in_range:
|
|
|
|
- if the key is numeric:
|
|
start key flag is 0 when end key is NULL, end key flag is 3 or 4
|
|
- if create_where_key was called by any other function:
|
|
start key flag is 1 when end key is NULL, end key flag is 3 or 4
|
|
- if the key is non-numeric, or multipart
|
|
When the query is an exact match, the start key flag is 0,
|
|
end key flag is 3 for what should be a no-range condition where
|
|
you should have 0 and max key NULL, which it is if called by
|
|
read_range_first
|
|
|
|
Conclusion:
|
|
|
|
1. Need logic to determin if a key is min or max when the flag is
|
|
HA_READ_AFTER_KEY, and handle appending correct operator accordingly
|
|
|
|
2. Need a boolean flag to pass to create_where_from_key, used in the
|
|
switch statement. Add 1 to the flag if:
|
|
- start key flag is HA_READ_KEY_EXACT and the end key is NULL
|
|
|
|
*/
|
|
|
|
bool ha_federated::create_where_from_key(String *to,
|
|
KEY *key_info,
|
|
const key_range *start_key,
|
|
const key_range *end_key,
|
|
bool records_in_range)
|
|
{
|
|
bool both_not_null=
|
|
(start_key != NULL && end_key != NULL) ? TRUE : FALSE;
|
|
const byte *ptr;
|
|
uint remainder, length;
|
|
char tmpbuff[FEDERATED_QUERY_BUFFER_SIZE];
|
|
String tmp(tmpbuff, sizeof(tmpbuff), system_charset_info);
|
|
const key_range *ranges[2]= { start_key, end_key };
|
|
DBUG_ENTER("ha_federated::create_where_from_key");
|
|
|
|
tmp.length(0);
|
|
if (start_key == NULL && end_key == NULL)
|
|
DBUG_RETURN(1);
|
|
|
|
for (int i= 0; i <= 1; i++)
|
|
{
|
|
bool needs_quotes;
|
|
KEY_PART_INFO *key_part;
|
|
if (ranges[i] == NULL)
|
|
continue;
|
|
|
|
if (both_not_null)
|
|
{
|
|
if (i > 0)
|
|
tmp.append(FEDERATED_CONJUNCTION);
|
|
else
|
|
tmp.append(FEDERATED_OPENPAREN);
|
|
}
|
|
|
|
for (key_part= key_info->key_part,
|
|
remainder= key_info->key_parts,
|
|
length= ranges[i]->length,
|
|
ptr= ranges[i]->key; ;
|
|
remainder--,
|
|
key_part++)
|
|
{
|
|
Field *field= key_part->field;
|
|
uint store_length= key_part->store_length;
|
|
uint part_length= min(store_length, length);
|
|
needs_quotes= 1;
|
|
DBUG_DUMP("key, start of loop", (char *) ptr, length);
|
|
|
|
if (key_part->null_bit)
|
|
{
|
|
if (*ptr++)
|
|
{
|
|
if (emit_key_part_name(&tmp, key_part) ||
|
|
tmp.append(FEDERATED_ISNULL))
|
|
DBUG_RETURN(1);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (tmp.append(FEDERATED_OPENPAREN))
|
|
DBUG_RETURN(1);
|
|
|
|
switch(ranges[i]->flag) {
|
|
case(HA_READ_KEY_EXACT):
|
|
DBUG_PRINT("info", ("federated HA_READ_KEY_EXACT %d", i));
|
|
if (store_length >= length ||
|
|
!needs_quotes ||
|
|
key_part->type == HA_KEYTYPE_BIT ||
|
|
field->result_type() != STRING_RESULT)
|
|
{
|
|
if (emit_key_part_name(&tmp, key_part))
|
|
DBUG_RETURN(1);
|
|
|
|
if (records_in_range)
|
|
{
|
|
if (tmp.append(FEDERATED_GE))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else
|
|
{
|
|
if (tmp.append(FEDERATED_EQ))
|
|
DBUG_RETURN(1);
|
|
}
|
|
|
|
if (emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
|
|
part_length))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else
|
|
/* LIKE */
|
|
{
|
|
if (emit_key_part_name(&tmp, key_part) ||
|
|
tmp.append(FEDERATED_LIKE) ||
|
|
emit_key_part_element(&tmp, key_part, needs_quotes, 1, ptr,
|
|
part_length))
|
|
DBUG_RETURN(1);
|
|
}
|
|
break;
|
|
case(HA_READ_AFTER_KEY):
|
|
DBUG_PRINT("info", ("federated HA_READ_AFTER_KEY %d", i));
|
|
if (store_length >= length) /* end key */
|
|
{
|
|
if (emit_key_part_name(&tmp, key_part))
|
|
DBUG_RETURN(1);
|
|
|
|
if (i > 0) /* end key */
|
|
{
|
|
if (tmp.append(FEDERATED_LE))
|
|
DBUG_RETURN(1);
|
|
}
|
|
else /* start key */
|
|
{
|
|
if (tmp.append(FEDERATED_GT))
|
|
DBUG_RETURN(1);
|
|
}
|
|
|
|
if (emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
|
|
part_length))
|
|
{
|
|
DBUG_RETURN(1);
|
|
}
|
|
break;
|
|
}
|
|
case(HA_READ_KEY_OR_NEXT):
|
|
DBUG_PRINT("info", ("federated HA_READ_KEY_OR_NEXT %d", i));
|
|
if (emit_key_part_name(&tmp, key_part) ||
|
|
tmp.append(FEDERATED_GE) ||
|
|
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
|
|
part_length))
|
|
DBUG_RETURN(1);
|
|
break;
|
|
case(HA_READ_BEFORE_KEY):
|
|
DBUG_PRINT("info", ("federated HA_READ_BEFORE_KEY %d", i));
|
|
if (store_length >= length)
|
|
{
|
|
if (emit_key_part_name(&tmp, key_part) ||
|
|
tmp.append(FEDERATED_LT) ||
|
|
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
|
|
part_length))
|
|
DBUG_RETURN(1);
|
|
break;
|
|
}
|
|
case(HA_READ_KEY_OR_PREV):
|
|
DBUG_PRINT("info", ("federated HA_READ_KEY_OR_PREV %d", i));
|
|
if (emit_key_part_name(&tmp, key_part) ||
|
|
tmp.append(FEDERATED_LE) ||
|
|
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
|
|
part_length))
|
|
DBUG_RETURN(1);
|
|
break;
|
|
default:
|
|
DBUG_PRINT("info",("cannot handle flag %d", ranges[i]->flag));
|
|
DBUG_RETURN(1);
|
|
}
|
|
if (tmp.append(FEDERATED_CLOSEPAREN))
|
|
DBUG_RETURN(1);
|
|
|
|
if (store_length >= length)
|
|
break;
|
|
DBUG_PRINT("info", ("remainder %d", remainder));
|
|
DBUG_ASSERT(remainder > 1);
|
|
length-= store_length;
|
|
ptr+= store_length;
|
|
if (tmp.append(FEDERATED_AND))
|
|
DBUG_RETURN(1);
|
|
|
|
DBUG_PRINT("info",
|
|
("create_where_from_key WHERE clause: %s",
|
|
tmp.c_ptr_quick()));
|
|
}
|
|
}
|
|
if (both_not_null)
|
|
if (tmp.append(FEDERATED_CLOSEPAREN))
|
|
DBUG_RETURN(1);
|
|
|
|
if (to->append(FEDERATED_WHERE))
|
|
DBUG_RETURN(1);
|
|
|
|
if (to->append(tmp))
|
|
DBUG_RETURN(1);
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
Example of simple lock controls. The "share" it creates is structure we will
|
|
pass to each federated handler. Do you have to have one of these? Well, you
|
|
have pieces that are used for locking, and they are needed to function.
|
|
*/
|
|
|
|
static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
|
|
{
|
|
char *select_query;
|
|
char query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
Field **field;
|
|
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
|
|
FEDERATED_SHARE *share= NULL, tmp_share;
|
|
/*
|
|
In order to use this string, we must first zero it's length,
|
|
or it will contain garbage
|
|
*/
|
|
query.length(0);
|
|
|
|
pthread_mutex_lock(&federated_mutex);
|
|
|
|
if (parse_url(&tmp_share, table, 0))
|
|
goto error;
|
|
|
|
/* TODO: change tmp_share.scheme to LEX_STRING object */
|
|
if (!(share= (FEDERATED_SHARE *) hash_search(&federated_open_tables,
|
|
(byte*) tmp_share.scheme,
|
|
tmp_share.
|
|
connect_string_length)))
|
|
{
|
|
query.set_charset(system_charset_info);
|
|
query.append(FEDERATED_SELECT);
|
|
for (field= table->field; *field; field++)
|
|
{
|
|
query.append(FEDERATED_BTICK);
|
|
query.append((*field)->field_name);
|
|
query.append(FEDERATED_BTICK);
|
|
query.append(FEDERATED_COMMA);
|
|
}
|
|
query.length(query.length()- strlen(FEDERATED_COMMA));
|
|
query.append(FEDERATED_FROM);
|
|
query.append(FEDERATED_BTICK);
|
|
|
|
if (!(share= (FEDERATED_SHARE *)
|
|
my_multi_malloc(MYF(MY_WME),
|
|
&share, sizeof(*share),
|
|
&select_query,
|
|
query.length()+table->s->connect_string.length+1,
|
|
NullS)))
|
|
goto error;
|
|
|
|
memcpy(share, &tmp_share, sizeof(tmp_share));
|
|
|
|
share->table_name_length= strlen(share->table_name);
|
|
/* TODO: share->table_name to LEX_STRING object */
|
|
query.append(share->table_name, share->table_name_length);
|
|
query.append(FEDERATED_BTICK);
|
|
share->select_query= select_query;
|
|
strmov(share->select_query, query.ptr());
|
|
share->use_count= 0;
|
|
DBUG_PRINT("info",
|
|
("share->select_query %s", share->select_query));
|
|
|
|
if (my_hash_insert(&federated_open_tables, (byte*) share))
|
|
goto error;
|
|
thr_lock_init(&share->lock);
|
|
pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST);
|
|
}
|
|
share->use_count++;
|
|
pthread_mutex_unlock(&federated_mutex);
|
|
|
|
return share;
|
|
|
|
error:
|
|
pthread_mutex_unlock(&federated_mutex);
|
|
my_free((gptr) tmp_share.scheme, MYF(MY_ALLOW_ZERO_PTR));
|
|
my_free((gptr) share, MYF(MY_ALLOW_ZERO_PTR));
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
Free lock controls. We call this whenever we close a table.
|
|
If the table had the last reference to the share then we
|
|
free memory associated with it.
|
|
*/
|
|
|
|
static int free_share(FEDERATED_SHARE *share)
|
|
{
|
|
DBUG_ENTER("free_share");
|
|
|
|
pthread_mutex_lock(&federated_mutex);
|
|
if (!--share->use_count)
|
|
{
|
|
hash_delete(&federated_open_tables, (byte*) share);
|
|
my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR));
|
|
my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR));
|
|
thr_lock_delete(&share->lock);
|
|
VOID(pthread_mutex_destroy(&share->mutex));
|
|
my_free((gptr) share, MYF(0));
|
|
}
|
|
pthread_mutex_unlock(&federated_mutex);
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
ha_rows ha_federated::records_in_range(uint inx, key_range *start_key,
|
|
key_range *end_key)
|
|
{
|
|
/*
|
|
|
|
We really want indexes to be used as often as possible, therefore
|
|
we just need to hard-code the return value to a very low number to
|
|
force the issue
|
|
|
|
*/
|
|
DBUG_ENTER("ha_federated::records_in_range");
|
|
DBUG_RETURN(FEDERATED_RECORDS_IN_RANGE);
|
|
}
|
|
/*
|
|
If frm_error() is called then we will use this to to find out
|
|
what file extentions exist for the storage engine. This is
|
|
also used by the default rename_table and delete_table method
|
|
in handler.cc.
|
|
*/
|
|
|
|
const char **ha_federated::bas_ext() const
|
|
{
|
|
static const char *ext[]=
|
|
{
|
|
NullS
|
|
};
|
|
return ext;
|
|
}
|
|
|
|
|
|
/*
|
|
Used for opening tables. The name will be the name of the file.
|
|
A table is opened when it needs to be opened. For instance
|
|
when a request comes in for a select on the table (tables are not
|
|
open and closed for each request, they are cached).
|
|
|
|
Called from handler.cc by handler::ha_open(). The server opens
|
|
all tables by calling ha_open() which then calls the handler
|
|
specific open().
|
|
*/
|
|
|
|
int ha_federated::open(const char *name, int mode, uint test_if_locked)
|
|
{
|
|
DBUG_ENTER("ha_federated::open");
|
|
|
|
if (!(share= get_share(name, table)))
|
|
DBUG_RETURN(1);
|
|
thr_lock_data_init(&share->lock, &lock, NULL);
|
|
|
|
/* Connect to foreign database mysql_real_connect() */
|
|
mysql= mysql_init(0);
|
|
if (!mysql || !mysql_real_connect(mysql,
|
|
share->hostname,
|
|
share->username,
|
|
share->password,
|
|
share->database,
|
|
share->port,
|
|
share->socket, 0))
|
|
{
|
|
free_share(share);
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
/*
|
|
Since we do not support transactions at this version, we can let the client
|
|
API silently reconnect. For future versions, we will need more logic to
|
|
deal with transactions
|
|
*/
|
|
mysql->reconnect= 1;
|
|
|
|
ref_length= (table->s->primary_key != MAX_KEY ?
|
|
table->key_info[table->s->primary_key].key_length :
|
|
table->s->reclength);
|
|
DBUG_PRINT("info", ("ref_length: %u", ref_length));
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
/*
|
|
Closes a table. We call the free_share() function to free any resources
|
|
that we have allocated in the "shared" structure.
|
|
|
|
Called from sql_base.cc, sql_select.cc, and table.cc.
|
|
In sql_select.cc it is only used to close up temporary tables or during
|
|
the process where a temporary table is converted over to being a
|
|
myisam table.
|
|
For sql_base.cc look at close_data_tables().
|
|
*/
|
|
|
|
int ha_federated::close(void)
|
|
{
|
|
int retval;
|
|
DBUG_ENTER("ha_federated::close");
|
|
|
|
/* free the result set */
|
|
if (stored_result)
|
|
{
|
|
mysql_free_result(stored_result);
|
|
stored_result= 0;
|
|
}
|
|
/* Disconnect from mysql */
|
|
if (mysql) // QQ is this really needed
|
|
mysql_close(mysql);
|
|
retval= free_share(share);
|
|
DBUG_RETURN(retval);
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
Checks if a field in a record is SQL NULL.
|
|
|
|
SYNOPSIS
|
|
field_in_record_is_null()
|
|
table TABLE pointer, MySQL table object
|
|
field Field pointer, MySQL field object
|
|
record char pointer, contains record
|
|
|
|
DESCRIPTION
|
|
This method uses the record format information in table to track
|
|
the null bit in record.
|
|
|
|
RETURN VALUE
|
|
1 if NULL
|
|
0 otherwise
|
|
*/
|
|
|
|
inline uint field_in_record_is_null(TABLE *table,
|
|
Field *field,
|
|
char *record)
|
|
{
|
|
int null_offset;
|
|
DBUG_ENTER("ha_federated::field_in_record_is_null");
|
|
|
|
if (!field->null_ptr)
|
|
DBUG_RETURN(0);
|
|
|
|
null_offset= (uint) ((char*)field->null_ptr - (char*)table->record[0]);
|
|
|
|
if (record[null_offset] & field->null_bit)
|
|
DBUG_RETURN(1);
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
write_row() inserts a row. No extra() hint is given currently if a bulk load
|
|
is happeneding. buf() is a byte array of data. You can use the field
|
|
information to extract the data from the native byte array type.
|
|
Example of this would be:
|
|
for (Field **field=table->field ; *field ; field++)
|
|
{
|
|
...
|
|
}
|
|
|
|
Called from item_sum.cc, item_sum.cc, sql_acl.cc, sql_insert.cc,
|
|
sql_insert.cc, sql_select.cc, sql_table.cc, sql_udf.cc, and sql_update.cc.
|
|
*/
|
|
|
|
int ha_federated::write_row(byte *buf)
|
|
{
|
|
char insert_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char values_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char insert_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
Field **field;
|
|
|
|
/* The main insert query string */
|
|
String insert_string(insert_buffer, sizeof(insert_buffer), &my_charset_bin);
|
|
/* The string containing the values to be added to the insert */
|
|
String values_string(values_buffer, sizeof(values_buffer), &my_charset_bin);
|
|
/* The actual value of the field, to be added to the values_string */
|
|
String insert_field_value_string(insert_field_value_buffer,
|
|
sizeof(insert_field_value_buffer),
|
|
&my_charset_bin);
|
|
values_string.length(0);
|
|
insert_string.length(0);
|
|
insert_field_value_string.length(0);
|
|
DBUG_ENTER("ha_federated::write_row");
|
|
|
|
statistic_increment(table->in_use->status_var.ha_write_count, &LOCK_status);
|
|
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
|
|
table->timestamp_field->set_time();
|
|
|
|
/*
|
|
start both our field and field values strings
|
|
*/
|
|
insert_string.append(FEDERATED_INSERT);
|
|
insert_string.append(FEDERATED_BTICK);
|
|
insert_string.append(share->table_name, share->table_name_length);
|
|
insert_string.append(FEDERATED_BTICK);
|
|
insert_string.append(FEDERATED_OPENPAREN);
|
|
|
|
values_string.append(FEDERATED_VALUES);
|
|
values_string.append(FEDERATED_OPENPAREN);
|
|
|
|
/*
|
|
loop through the field pointer array, add any fields to both the values
|
|
list and the fields list that match the current query id
|
|
*/
|
|
for (field= table->field; *field; field++)
|
|
{
|
|
if ((*field)->is_null())
|
|
insert_field_value_string.append(FEDERATED_NULL);
|
|
else
|
|
{
|
|
(*field)->val_str(&insert_field_value_string);
|
|
values_string.append('\'');
|
|
insert_field_value_string.print(&values_string);
|
|
values_string.append('\'');
|
|
|
|
insert_field_value_string.length(0);
|
|
}
|
|
/* append the field name */
|
|
insert_string.append((*field)->field_name);
|
|
|
|
/* append the value */
|
|
values_string.append(insert_field_value_string);
|
|
insert_field_value_string.length(0);
|
|
|
|
/* append commas between both fields and fieldnames */
|
|
/*
|
|
unfortunately, we can't use the logic
|
|
if *(fields + 1) to make the following
|
|
appends conditional because we may not append
|
|
if the next field doesn't match the condition:
|
|
(((*field)->query_id && (*field)->query_id == current_query_id)
|
|
*/
|
|
insert_string.append(FEDERATED_COMMA);
|
|
values_string.append(FEDERATED_COMMA);
|
|
}
|
|
|
|
/*
|
|
remove trailing comma
|
|
*/
|
|
insert_string.length(insert_string.length() - strlen(FEDERATED_COMMA));
|
|
/*
|
|
if there were no fields, we don't want to add a closing paren
|
|
AND, we don't want to chop off the last char '('
|
|
insert will be "INSERT INTO t1 VALUES ();"
|
|
*/
|
|
if (table->s->fields)
|
|
{
|
|
/* chops off leading commas */
|
|
values_string.length(values_string.length() - strlen(FEDERATED_COMMA));
|
|
insert_string.append(FEDERATED_CLOSEPAREN);
|
|
}
|
|
/* we always want to append this, even if there aren't any fields */
|
|
values_string.append(FEDERATED_CLOSEPAREN);
|
|
|
|
/* add the values */
|
|
insert_string.append(values_string);
|
|
|
|
if (mysql_real_query(mysql, insert_string.ptr(), insert_string.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
/*
|
|
If the table we've just written a record to contains an auto_increment
|
|
field, then store the last_insert_id() value from the foreign server
|
|
*/
|
|
if (table->next_number_field)
|
|
update_auto_increment();
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
ha_federated::update_auto_increment
|
|
|
|
This method ensures that last_insert_id() works properly. What it simply does
|
|
is calls last_insert_id() on the foreign database immediately after insert
|
|
(if the table has an auto_increment field) and sets the insert id via
|
|
thd->insert_id(ID) (as well as storing thd->prev_insert_id)
|
|
*/
|
|
void ha_federated::update_auto_increment(void)
|
|
{
|
|
THD *thd= current_thd;
|
|
DBUG_ENTER("ha_federated::update_auto_increment");
|
|
|
|
thd->insert_id(mysql->last_used_con->insert_id);
|
|
DBUG_PRINT("info",("last_insert_id: %ld", (long) auto_increment_value));
|
|
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt)
|
|
{
|
|
char query_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
|
|
DBUG_ENTER("ha_federated::optimize");
|
|
|
|
query.length(0);
|
|
|
|
query.set_charset(system_charset_info);
|
|
query.append(FEDERATED_OPTIMIZE);
|
|
query.append(FEDERATED_BTICK);
|
|
query.append(share->table_name, share->table_name_length);
|
|
query.append(FEDERATED_BTICK);
|
|
|
|
if (mysql_real_query(mysql, query.ptr(), query.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
int ha_federated::repair(THD* thd, HA_CHECK_OPT* check_opt)
|
|
{
|
|
char query_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
|
|
DBUG_ENTER("ha_federated::repair");
|
|
|
|
query.length(0);
|
|
|
|
query.set_charset(system_charset_info);
|
|
query.append(FEDERATED_REPAIR);
|
|
query.append(FEDERATED_BTICK);
|
|
query.append(share->table_name, share->table_name_length);
|
|
query.append(FEDERATED_BTICK);
|
|
if (check_opt->flags & T_QUICK)
|
|
query.append(FEDERATED_QUICK);
|
|
if (check_opt->flags & T_EXTEND)
|
|
query.append(FEDERATED_EXTENDED);
|
|
if (check_opt->sql_flags & TT_USEFRM)
|
|
query.append(FEDERATED_USE_FRM);
|
|
|
|
if (mysql_real_query(mysql, query.ptr(), query.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
/*
|
|
Yes, update_row() does what you expect, it updates a row. old_data will have
|
|
the previous row record in it, while new_data will have the newest data in
|
|
it.
|
|
|
|
Keep in mind that the server can do updates based on ordering if an ORDER BY
|
|
clause was used. Consecutive ordering is not guarenteed.
|
|
Currently new_data will not have an updated auto_increament record, or
|
|
and updated timestamp field. You can do these for federated by doing these:
|
|
if (table->timestamp_on_update_now)
|
|
update_timestamp(new_row+table->timestamp_on_update_now-1);
|
|
if (table->next_number_field && record == table->record[0])
|
|
update_auto_increment();
|
|
|
|
Called from sql_select.cc, sql_acl.cc, sql_update.cc, and sql_insert.cc.
|
|
*/
|
|
|
|
int ha_federated::update_row(const byte *old_data, byte *new_data)
|
|
{
|
|
/*
|
|
This used to control how the query was built. If there was a
|
|
primary key, the query would be built such that there was a where
|
|
clause with only that column as the condition. This is flawed,
|
|
because if we have a multi-part primary key, it would only use the
|
|
first part! We don't need to do this anyway, because
|
|
read_range_first will retrieve the correct record, which is what
|
|
is used to build the WHERE clause. We can however use this to
|
|
append a LIMIT to the end if there is NOT a primary key. Why do
|
|
this? Because we only are updating one record, and LIMIT enforces
|
|
this.
|
|
*/
|
|
bool has_a_primary_key= (table->s->primary_key == 0 ? TRUE : FALSE);
|
|
/*
|
|
buffers for following strings
|
|
*/
|
|
char field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
|
|
/* Work area for field values */
|
|
String field_value(field_value_buffer, sizeof(field_value_buffer),
|
|
&my_charset_bin);
|
|
/* stores the update query */
|
|
String update_string(update_buffer,
|
|
sizeof(update_buffer),
|
|
&my_charset_bin);
|
|
/* stores the WHERE clause */
|
|
String where_string(where_buffer,
|
|
sizeof(where_buffer),
|
|
&my_charset_bin);
|
|
DBUG_ENTER("ha_federated::update_row");
|
|
/*
|
|
set string lengths to 0 to avoid misc chars in string
|
|
*/
|
|
field_value.length(0);
|
|
update_string.length(0);
|
|
where_string.length(0);
|
|
|
|
update_string.append(FEDERATED_UPDATE);
|
|
update_string.append(FEDERATED_BTICK);
|
|
update_string.append(share->table_name);
|
|
update_string.append(FEDERATED_BTICK);
|
|
update_string.append(FEDERATED_SET);
|
|
|
|
/*
|
|
In this loop, we want to match column names to values being inserted
|
|
(while building INSERT statement).
|
|
|
|
Iterate through table->field (new data) and share->old_field (old_data)
|
|
using the same index to create an SQL UPDATE statement. New data is
|
|
used to create SET field=value and old data is used to create WHERE
|
|
field=oldvalue
|
|
*/
|
|
|
|
for (Field **field= table->field; *field; field++)
|
|
{
|
|
where_string.append((*field)->field_name);
|
|
update_string.append((*field)->field_name);
|
|
update_string.append(FEDERATED_EQ);
|
|
|
|
if ((*field)->is_null())
|
|
update_string.append(FEDERATED_NULL);
|
|
else
|
|
{
|
|
/* otherwise = */
|
|
(*field)->val_str(&field_value);
|
|
update_string.append('\'');
|
|
field_value.print(&update_string);
|
|
update_string.append('\'');
|
|
field_value.length(0);
|
|
}
|
|
|
|
if (field_in_record_is_null(table, *field, (char*) old_data))
|
|
where_string.append(FEDERATED_ISNULL);
|
|
else
|
|
{
|
|
where_string.append(FEDERATED_EQ);
|
|
(*field)->val_str(&field_value,
|
|
(char*) (old_data + (*field)->offset()));
|
|
where_string.append('\'');
|
|
field_value.print(&where_string);
|
|
where_string.append('\'');
|
|
field_value.length(0);
|
|
}
|
|
|
|
/*
|
|
Only append conjunctions if we have another field in which
|
|
to iterate
|
|
*/
|
|
if (*(field + 1))
|
|
{
|
|
update_string.append(FEDERATED_COMMA);
|
|
where_string.append(FEDERATED_AND);
|
|
}
|
|
}
|
|
update_string.append(FEDERATED_WHERE);
|
|
update_string.append(where_string);
|
|
/*
|
|
If this table has not a primary key, then we could possibly
|
|
update multiple rows. We want to make sure to only update one!
|
|
*/
|
|
if (!has_a_primary_key)
|
|
update_string.append(FEDERATED_LIMIT1);
|
|
|
|
if (mysql_real_query(mysql, update_string.ptr(), update_string.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
This will delete a row. 'buf' will contain a copy of the row to be =deleted.
|
|
The server will call this right after the current row has been called (from
|
|
either a previous rnd_next() or index call).
|
|
If you keep a pointer to the last row or can access a primary key it will
|
|
make doing the deletion quite a bit easier.
|
|
Keep in mind that the server does no guarentee consecutive deletions.
|
|
ORDER BY clauses can be used.
|
|
|
|
Called in sql_acl.cc and sql_udf.cc to manage internal table information.
|
|
Called in sql_delete.cc, sql_insert.cc, and sql_select.cc. In sql_select
|
|
it is used for removing duplicates while in insert it is used for REPLACE
|
|
calls.
|
|
*/
|
|
|
|
int ha_federated::delete_row(const byte *buf)
|
|
{
|
|
char delete_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char data_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
|
|
String delete_string(delete_buffer, sizeof(delete_buffer), &my_charset_bin);
|
|
String data_string(data_buffer, sizeof(data_buffer), &my_charset_bin);
|
|
DBUG_ENTER("ha_federated::delete_row");
|
|
|
|
delete_string.length(0);
|
|
delete_string.append(FEDERATED_DELETE);
|
|
delete_string.append(FEDERATED_FROM);
|
|
delete_string.append(FEDERATED_BTICK);
|
|
delete_string.append(share->table_name);
|
|
delete_string.append(FEDERATED_BTICK);
|
|
delete_string.append(FEDERATED_WHERE);
|
|
|
|
for (Field **field= table->field; *field; field++)
|
|
{
|
|
Field *cur_field= *field;
|
|
data_string.length(0);
|
|
delete_string.append(cur_field->field_name);
|
|
|
|
if (cur_field->is_null())
|
|
{
|
|
delete_string.append(FEDERATED_ISNULL);
|
|
}
|
|
else
|
|
{
|
|
delete_string.append(FEDERATED_EQ);
|
|
cur_field->val_str(&data_string);
|
|
delete_string.append('\'');
|
|
data_string.print(&delete_string);
|
|
delete_string.append('\'');
|
|
}
|
|
|
|
delete_string.append(FEDERATED_AND);
|
|
}
|
|
delete_string.length(delete_string.length()-5); // Remove trailing AND
|
|
|
|
delete_string.append(FEDERATED_LIMIT1);
|
|
DBUG_PRINT("info",
|
|
("Delete sql: %s", delete_string.c_ptr_quick()));
|
|
if (mysql_real_query(mysql, delete_string.ptr(), delete_string.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
deleted+= (ha_rows) mysql->affected_rows;
|
|
records-= (ha_rows) mysql->affected_rows;
|
|
DBUG_PRINT("info",
|
|
("rows deleted %ld rows deleted for all time %ld",
|
|
(long) mysql->affected_rows, (long) deleted));
|
|
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
/*
|
|
Positions an index cursor to the index specified in the handle. Fetches the
|
|
row if available. If the key value is null, begin at the first key of the
|
|
index. This method, which is called in the case of an SQL statement having
|
|
a WHERE clause on a non-primary key index, simply calls index_read_idx.
|
|
*/
|
|
|
|
int ha_federated::index_read(byte *buf, const byte *key,
|
|
uint key_len, ha_rkey_function find_flag)
|
|
{
|
|
DBUG_ENTER("ha_federated::index_read");
|
|
|
|
if (stored_result)
|
|
mysql_free_result(stored_result);
|
|
DBUG_RETURN(index_read_idx_with_result_set(buf, active_index, key,
|
|
key_len, find_flag,
|
|
&stored_result));
|
|
}
|
|
|
|
|
|
/*
|
|
Positions an index cursor to the index specified in key. Fetches the
|
|
row if any. This is only used to read whole keys.
|
|
|
|
This method is called via index_read in the case of a WHERE clause using
|
|
a primary key index OR is called DIRECTLY when the WHERE clause
|
|
uses a PRIMARY KEY index.
|
|
|
|
NOTES
|
|
This uses an internal result set that is deleted before function
|
|
returns. We need to be able to be calable from ha_rnd_pos()
|
|
*/
|
|
|
|
int ha_federated::index_read_idx(byte *buf, uint index, const byte *key,
|
|
uint key_len, enum ha_rkey_function find_flag)
|
|
{
|
|
int retval;
|
|
MYSQL_RES *mysql_result;
|
|
DBUG_ENTER("ha_federated::index_read_idx");
|
|
|
|
if ((retval= index_read_idx_with_result_set(buf, index, key,
|
|
key_len, find_flag,
|
|
&mysql_result)))
|
|
DBUG_RETURN(retval);
|
|
mysql_free_result(mysql_result);
|
|
DBUG_RETURN(retval);
|
|
}
|
|
|
|
|
|
/*
|
|
Create result set for rows matching query and return first row
|
|
|
|
RESULT
|
|
0 ok In this case *result will contain the result set
|
|
table->status == 0
|
|
# error In this case *result will contain 0
|
|
table->status == STATUS_NOT_FOUND
|
|
*/
|
|
|
|
int ha_federated::index_read_idx_with_result_set(byte *buf, uint index,
|
|
const byte *key,
|
|
uint key_len,
|
|
ha_rkey_function find_flag,
|
|
MYSQL_RES **result)
|
|
{
|
|
int retval;
|
|
char error_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char index_value[STRING_BUFFER_USUAL_SIZE];
|
|
char sql_query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
String index_string(index_value,
|
|
sizeof(index_value),
|
|
&my_charset_bin);
|
|
String sql_query(sql_query_buffer,
|
|
sizeof(sql_query_buffer),
|
|
&my_charset_bin);
|
|
key_range range;
|
|
DBUG_ENTER("ha_federated::index_read_idx_with_result_set");
|
|
|
|
*result= 0; // In case of errors
|
|
index_string.length(0);
|
|
sql_query.length(0);
|
|
statistic_increment(table->in_use->status_var.ha_read_key_count,
|
|
&LOCK_status);
|
|
|
|
sql_query.append(share->select_query);
|
|
|
|
range.key= key;
|
|
range.length= key_len;
|
|
range.flag= find_flag;
|
|
create_where_from_key(&index_string,
|
|
&table->key_info[index],
|
|
&range,
|
|
NULL, 0);
|
|
sql_query.append(index_string);
|
|
|
|
if (mysql_real_query(mysql, sql_query.ptr(), sql_query.length()))
|
|
{
|
|
my_sprintf(error_buffer, (error_buffer, "error: %d '%s'",
|
|
mysql_errno(mysql), mysql_error(mysql)));
|
|
retval= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
|
|
goto error;
|
|
}
|
|
if (!(*result= mysql_store_result(mysql)))
|
|
{
|
|
retval= HA_ERR_END_OF_FILE;
|
|
goto error;
|
|
}
|
|
if (!(retval= read_next(buf, *result)))
|
|
DBUG_RETURN(retval);
|
|
|
|
mysql_free_result(*result);
|
|
*result= 0;
|
|
table->status= STATUS_NOT_FOUND;
|
|
DBUG_RETURN(retval);
|
|
|
|
error:
|
|
table->status= STATUS_NOT_FOUND;
|
|
my_error(retval, MYF(0), error_buffer);
|
|
DBUG_RETURN(retval);
|
|
}
|
|
|
|
|
|
/* Initialized at each key walk (called multiple times unlike rnd_init()) */
|
|
|
|
int ha_federated::index_init(uint keynr)
|
|
{
|
|
DBUG_ENTER("ha_federated::index_init");
|
|
DBUG_PRINT("info", ("table: '%s' key: %u", table->s->table_name, keynr));
|
|
active_index= keynr;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
/*
|
|
Read first range
|
|
*/
|
|
|
|
int ha_federated::read_range_first(const key_range *start_key,
|
|
const key_range *end_key,
|
|
bool eq_range, bool sorted)
|
|
{
|
|
char sql_query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
int retval;
|
|
String sql_query(sql_query_buffer,
|
|
sizeof(sql_query_buffer),
|
|
&my_charset_bin);
|
|
DBUG_ENTER("ha_federated::read_range_first");
|
|
|
|
DBUG_ASSERT(!(start_key == NULL && end_key == NULL));
|
|
|
|
sql_query.length(0);
|
|
sql_query.append(share->select_query);
|
|
create_where_from_key(&sql_query,
|
|
&table->key_info[active_index],
|
|
start_key, end_key, 0);
|
|
|
|
if (stored_result)
|
|
{
|
|
mysql_free_result(stored_result);
|
|
stored_result= 0;
|
|
}
|
|
if (mysql_real_query(mysql, sql_query.ptr(), sql_query.length()))
|
|
{
|
|
retval= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
|
|
goto error;
|
|
}
|
|
sql_query.length(0);
|
|
|
|
if (!(stored_result= mysql_store_result(mysql)))
|
|
{
|
|
retval= HA_ERR_END_OF_FILE;
|
|
goto error;
|
|
}
|
|
|
|
retval= read_next(table->record[0], stored_result);
|
|
DBUG_RETURN(retval);
|
|
|
|
error:
|
|
table->status= STATUS_NOT_FOUND;
|
|
DBUG_RETURN(retval);
|
|
}
|
|
|
|
|
|
int ha_federated::read_range_next()
|
|
{
|
|
int retval;
|
|
DBUG_ENTER("ha_federated::read_range_next");
|
|
retval= rnd_next(table->record[0]);
|
|
DBUG_RETURN(retval);
|
|
}
|
|
|
|
|
|
/* Used to read forward through the index. */
|
|
int ha_federated::index_next(byte *buf)
|
|
{
|
|
DBUG_ENTER("ha_federated::index_next");
|
|
statistic_increment(table->in_use->status_var.ha_read_next_count,
|
|
&LOCK_status);
|
|
DBUG_RETURN(read_next(buf, stored_result));
|
|
}
|
|
|
|
|
|
/*
|
|
rnd_init() is called when the system wants the storage engine to do a table
|
|
scan.
|
|
|
|
This is the method that gets data for the SELECT calls.
|
|
|
|
See the federated in the introduction at the top of this file to see when
|
|
rnd_init() is called.
|
|
|
|
Called from filesort.cc, records.cc, sql_handler.cc, sql_select.cc,
|
|
sql_table.cc, and sql_update.cc.
|
|
*/
|
|
|
|
int ha_federated::rnd_init(bool scan)
|
|
{
|
|
DBUG_ENTER("ha_federated::rnd_init");
|
|
/*
|
|
The use of the 'scan' flag is incredibly important for this handler
|
|
to work properly, especially with updates containing WHERE clauses
|
|
using indexed columns.
|
|
|
|
When the initial query contains a WHERE clause of the query using an
|
|
indexed column, it's index_read_idx that selects the exact record from
|
|
the foreign database.
|
|
|
|
When there is NO index in the query, either due to not having a WHERE
|
|
clause, or the WHERE clause is using columns that are not indexed, a
|
|
'full table scan' done by rnd_init, which in this situation simply means
|
|
a 'select * from ...' on the foreign table.
|
|
|
|
In other words, this 'scan' flag gives us the means to ensure that if
|
|
there is an index involved in the query, we want index_read_idx to
|
|
retrieve the exact record (scan flag is 0), and do not want rnd_init
|
|
to do a 'full table scan' and wipe out that result set.
|
|
|
|
Prior to using this flag, the problem was most apparent with updates.
|
|
|
|
An initial query like 'UPDATE tablename SET anything = whatever WHERE
|
|
indexedcol = someval', index_read_idx would get called, using a query
|
|
constructed with a WHERE clause built from the values of index ('indexcol'
|
|
in this case, having a value of 'someval'). mysql_store_result would
|
|
then get called (this would be the result set we want to use).
|
|
|
|
After this rnd_init (from sql_update.cc) would be called, it would then
|
|
unecessarily call "select * from table" on the foreign table, then call
|
|
mysql_store_result, which would wipe out the correct previous result set
|
|
from the previous call of index_read_idx's that had the result set
|
|
containing the correct record, hence update the wrong row!
|
|
|
|
*/
|
|
|
|
if (scan)
|
|
{
|
|
if (stored_result)
|
|
{
|
|
mysql_free_result(stored_result);
|
|
stored_result= 0;
|
|
}
|
|
|
|
if (mysql_real_query(mysql,
|
|
share->select_query,
|
|
strlen(share->select_query)))
|
|
goto error;
|
|
|
|
stored_result= mysql_store_result(mysql);
|
|
if (!stored_result)
|
|
goto error;
|
|
}
|
|
DBUG_RETURN(0);
|
|
|
|
error:
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
|
|
|
|
int ha_federated::rnd_end()
|
|
{
|
|
DBUG_ENTER("ha_federated::rnd_end");
|
|
DBUG_RETURN(index_end());
|
|
}
|
|
|
|
|
|
int ha_federated::index_end(void)
|
|
{
|
|
DBUG_ENTER("ha_federated::index_end");
|
|
if (stored_result)
|
|
{
|
|
mysql_free_result(stored_result);
|
|
stored_result= 0;
|
|
}
|
|
active_index= MAX_KEY;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
/*
|
|
This is called for each row of the table scan. When you run out of records
|
|
you should return HA_ERR_END_OF_FILE. Fill buff up with the row information.
|
|
The Field structure for the table is the key to getting data into buf
|
|
in a manner that will allow the server to understand it.
|
|
|
|
Called from filesort.cc, records.cc, sql_handler.cc, sql_select.cc,
|
|
sql_table.cc, and sql_update.cc.
|
|
*/
|
|
|
|
int ha_federated::rnd_next(byte *buf)
|
|
{
|
|
DBUG_ENTER("ha_federated::rnd_next");
|
|
|
|
if (stored_result == 0)
|
|
{
|
|
/*
|
|
Return value of rnd_init is not always checked (see records.cc),
|
|
so we can get here _even_ if there is _no_ pre-fetched result-set!
|
|
TODO: fix it. We can delete this in 5.1 when rnd_init() is checked.
|
|
*/
|
|
DBUG_RETURN(1);
|
|
}
|
|
DBUG_RETURN(read_next(buf, stored_result));
|
|
}
|
|
|
|
|
|
/*
|
|
ha_federated::read_next
|
|
|
|
reads from a result set and converts to mysql internal
|
|
format
|
|
|
|
SYNOPSIS
|
|
field_in_record_is_null()
|
|
buf byte pointer to record
|
|
result mysql result set
|
|
|
|
DESCRIPTION
|
|
This method is a wrapper method that reads one record from a result
|
|
set and converts it to the internal table format
|
|
|
|
RETURN VALUE
|
|
1 error
|
|
0 no error
|
|
*/
|
|
|
|
int ha_federated::read_next(byte *buf, MYSQL_RES *result)
|
|
{
|
|
int retval;
|
|
MYSQL_ROW row;
|
|
DBUG_ENTER("ha_federated::read_next");
|
|
|
|
table->status= STATUS_NOT_FOUND; // For easier return
|
|
|
|
/* Fetch a row, insert it back in a row format. */
|
|
if (!(row= mysql_fetch_row(result)))
|
|
DBUG_RETURN(HA_ERR_END_OF_FILE);
|
|
|
|
if (!(retval= convert_row_to_internal_format(buf, row, result)))
|
|
table->status= 0;
|
|
|
|
DBUG_RETURN(retval);
|
|
}
|
|
|
|
|
|
/*
|
|
store reference to current row so that we can later find it for
|
|
a re-read, update or delete.
|
|
|
|
In case of federated, a reference is either a primary key or
|
|
the whole record.
|
|
|
|
Called from filesort.cc, sql_select.cc, sql_delete.cc and sql_update.cc.
|
|
*/
|
|
|
|
void ha_federated::position(const byte *record)
|
|
{
|
|
DBUG_ENTER("ha_federated::position");
|
|
if (table->s->primary_key != MAX_KEY)
|
|
key_copy(ref, (byte *)record, table->key_info + table->s->primary_key,
|
|
ref_length);
|
|
else
|
|
memcpy(ref, record, ref_length);
|
|
DBUG_VOID_RETURN;
|
|
}
|
|
|
|
|
|
/*
|
|
This is like rnd_next, but you are given a position to use to determine the
|
|
row. The position will be of the type that you stored in ref.
|
|
|
|
This method is required for an ORDER BY
|
|
|
|
Called from filesort.cc records.cc sql_insert.cc sql_select.cc sql_update.cc.
|
|
*/
|
|
|
|
int ha_federated::rnd_pos(byte *buf, byte *pos)
|
|
{
|
|
int result;
|
|
DBUG_ENTER("ha_federated::rnd_pos");
|
|
statistic_increment(table->in_use->status_var.ha_read_rnd_count,
|
|
&LOCK_status);
|
|
if (table->s->primary_key != MAX_KEY)
|
|
{
|
|
/* We have a primary key, so use index_read_idx to find row */
|
|
result= index_read_idx(buf, table->s->primary_key, pos,
|
|
ref_length, HA_READ_KEY_EXACT);
|
|
}
|
|
else
|
|
{
|
|
/* otherwise, get the old record ref as obtained in ::position */
|
|
memcpy(buf, pos, ref_length);
|
|
result= 0;
|
|
}
|
|
table->status= result ? STATUS_NOT_FOUND : 0;
|
|
DBUG_RETURN(result);
|
|
}
|
|
|
|
|
|
/*
|
|
::info() is used to return information to the optimizer.
|
|
Currently this table handler doesn't implement most of the fields
|
|
really needed. SHOW also makes use of this data
|
|
Another note, you will probably want to have the following in your
|
|
code:
|
|
if (records < 2)
|
|
records = 2;
|
|
The reason is that the server will optimize for cases of only a single
|
|
record. If in a table scan you don't know the number of records
|
|
it will probably be better to set records to two so you can return
|
|
as many records as you need.
|
|
Along with records a few more variables you may wish to set are:
|
|
records
|
|
deleted
|
|
data_file_length
|
|
index_file_length
|
|
delete_length
|
|
check_time
|
|
Take a look at the public variables in handler.h for more information.
|
|
|
|
Called in:
|
|
filesort.cc
|
|
ha_heap.cc
|
|
item_sum.cc
|
|
opt_sum.cc
|
|
sql_delete.cc
|
|
sql_delete.cc
|
|
sql_derived.cc
|
|
sql_select.cc
|
|
sql_select.cc
|
|
sql_select.cc
|
|
sql_select.cc
|
|
sql_select.cc
|
|
sql_show.cc
|
|
sql_show.cc
|
|
sql_show.cc
|
|
sql_show.cc
|
|
sql_table.cc
|
|
sql_union.cc
|
|
sql_update.cc
|
|
|
|
*/
|
|
|
|
int ha_federated::info(uint flag)
|
|
{
|
|
char error_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char status_buf[FEDERATED_QUERY_BUFFER_SIZE];
|
|
char escaped_table_name[FEDERATED_QUERY_BUFFER_SIZE];
|
|
int error;
|
|
uint error_code;
|
|
MYSQL_RES *result= 0;
|
|
MYSQL_ROW row;
|
|
String status_query_string(status_buf, sizeof(status_buf), &my_charset_bin);
|
|
DBUG_ENTER("ha_federated::info");
|
|
|
|
error_code= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
|
|
/* we want not to show table status if not needed to do so */
|
|
if (flag & (HA_STATUS_VARIABLE | HA_STATUS_CONST))
|
|
{
|
|
status_query_string.length(0);
|
|
status_query_string.append(FEDERATED_INFO);
|
|
status_query_string.append(FEDERATED_SQUOTE);
|
|
|
|
escape_string_for_mysql(&my_charset_bin, (char *)escaped_table_name,
|
|
sizeof(escaped_table_name),
|
|
share->table_name,
|
|
share->table_name_length);
|
|
status_query_string.append(escaped_table_name);
|
|
status_query_string.append(FEDERATED_SQUOTE);
|
|
|
|
if (mysql_real_query(mysql, status_query_string.ptr(),
|
|
status_query_string.length()))
|
|
goto error;
|
|
|
|
status_query_string.length(0);
|
|
|
|
result= mysql_store_result(mysql);
|
|
if (!result)
|
|
goto error;
|
|
|
|
if (!mysql_num_rows(result))
|
|
goto error;
|
|
|
|
if (!(row= mysql_fetch_row(result)))
|
|
goto error;
|
|
|
|
if (flag & HA_STATUS_VARIABLE | HA_STATUS_CONST)
|
|
{
|
|
/*
|
|
deleted is set in ha_federated::info
|
|
*/
|
|
/*
|
|
need to figure out what this means as far as federated is concerned,
|
|
since we don't have a "file"
|
|
|
|
data_file_length = ?
|
|
index_file_length = ?
|
|
delete_length = ?
|
|
*/
|
|
if (row[4] != NULL)
|
|
records= (ha_rows) my_strtoll10(row[4], (char**) 0, &error);
|
|
|
|
mean_rec_length= table->s->reclength;
|
|
data_file_length= records * mean_rec_length;
|
|
|
|
if (row[12] != NULL)
|
|
update_time= (ha_rows) my_strtoll10(row[12], (char**) 0, &error);
|
|
if (row[13] != NULL)
|
|
check_time= (ha_rows) my_strtoll10(row[13], (char**) 0, &error);
|
|
}
|
|
|
|
/*
|
|
size of IO operations (This is based on a good guess, no high science
|
|
involved)
|
|
*/
|
|
block_size= 4096;
|
|
}
|
|
|
|
if (result)
|
|
mysql_free_result(result);
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
error:
|
|
if (result)
|
|
mysql_free_result(result);
|
|
|
|
my_sprintf(error_buffer, (error_buffer, ": %d : %s",
|
|
mysql_errno(mysql), mysql_error(mysql)));
|
|
my_error(error_code, MYF(0), error_buffer);
|
|
DBUG_RETURN(error_code);
|
|
}
|
|
|
|
|
|
/*
|
|
Used to delete all rows in a table. Both for cases of truncate and
|
|
for cases where the optimizer realizes that all rows will be
|
|
removed as a result of a SQL statement.
|
|
|
|
Called from item_sum.cc by Item_func_group_concat::clear(),
|
|
Item_sum_count_distinct::clear(), and Item_func_group_concat::clear().
|
|
Called from sql_delete.cc by mysql_delete().
|
|
Called from sql_select.cc by JOIN::reinit().
|
|
Called from sql_union.cc by st_select_lex_unit::exec().
|
|
*/
|
|
|
|
int ha_federated::delete_all_rows()
|
|
{
|
|
char query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
|
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
|
|
DBUG_ENTER("ha_federated::delete_all_rows");
|
|
|
|
query.length(0);
|
|
|
|
query.set_charset(system_charset_info);
|
|
query.append(FEDERATED_TRUNCATE);
|
|
query.append(FEDERATED_BTICK);
|
|
query.append(share->table_name);
|
|
query.append(FEDERATED_BTICK);
|
|
|
|
/*
|
|
TRUNCATE won't return anything in mysql_affected_rows
|
|
*/
|
|
if (mysql_real_query(mysql, query.ptr(), query.length()))
|
|
{
|
|
DBUG_RETURN(stash_remote_error());
|
|
}
|
|
deleted+= records;
|
|
records= 0;
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
|
|
/*
|
|
The idea with handler::store_lock() is the following:
|
|
|
|
The statement decided which locks we should need for the table
|
|
for updates/deletes/inserts we get WRITE locks, for SELECT... we get
|
|
read locks.
|
|
|
|
Before adding the lock into the table lock handler (see thr_lock.c)
|
|
mysqld calls store lock with the requested locks. Store lock can now
|
|
modify a write lock to a read lock (or some other lock), ignore the
|
|
lock (if we don't want to use MySQL table locks at all) or add locks
|
|
for many tables (like we do when we are using a MERGE handler).
|
|
|
|
Berkeley DB for federated changes all WRITE locks to TL_WRITE_ALLOW_WRITE
|
|
(which signals that we are doing WRITES, but we are still allowing other
|
|
reader's and writer's.
|
|
|
|
When releasing locks, store_lock() are also called. In this case one
|
|
usually doesn't have to do anything.
|
|
|
|
In some exceptional cases MySQL may send a request for a TL_IGNORE;
|
|
This means that we are requesting the same lock as last time and this
|
|
should also be ignored. (This may happen when someone does a flush
|
|
table when we have opened a part of the tables, in which case mysqld
|
|
closes and reopens the tables and tries to get the same locks at last
|
|
time). In the future we will probably try to remove this.
|
|
|
|
Called from lock.cc by get_lock_data().
|
|
*/
|
|
|
|
THR_LOCK_DATA **ha_federated::store_lock(THD *thd,
|
|
THR_LOCK_DATA **to,
|
|
enum thr_lock_type lock_type)
|
|
{
|
|
DBUG_ENTER("ha_federated::store_lock");
|
|
if (lock_type != TL_IGNORE && lock.type == TL_UNLOCK)
|
|
{
|
|
/*
|
|
Here is where we get into the guts of a row level lock.
|
|
If TL_UNLOCK is set
|
|
If we are not doing a LOCK TABLE or DISCARD/IMPORT
|
|
TABLESPACE, then allow multiple writers
|
|
*/
|
|
|
|
if ((lock_type >= TL_WRITE_CONCURRENT_INSERT &&
|
|
lock_type <= TL_WRITE) && !thd->in_lock_tables)
|
|
lock_type= TL_WRITE_ALLOW_WRITE;
|
|
|
|
/*
|
|
In queries of type INSERT INTO t1 SELECT ... FROM t2 ...
|
|
MySQL would use the lock TL_READ_NO_INSERT on t2, and that
|
|
would conflict with TL_WRITE_ALLOW_WRITE, blocking all inserts
|
|
to t2. Convert the lock to a normal read lock to allow
|
|
concurrent inserts to t2.
|
|
*/
|
|
|
|
if (lock_type == TL_READ_NO_INSERT && !thd->in_lock_tables)
|
|
lock_type= TL_READ;
|
|
|
|
lock.type= lock_type;
|
|
}
|
|
|
|
*to++= &lock;
|
|
|
|
DBUG_RETURN(to);
|
|
}
|
|
|
|
/*
|
|
create() does nothing, since we have no local setup of our own.
|
|
FUTURE: We should potentially connect to the foreign database and
|
|
*/
|
|
|
|
int ha_federated::create(const char *name, TABLE *table_arg,
|
|
HA_CREATE_INFO *create_info)
|
|
{
|
|
int retval;
|
|
FEDERATED_SHARE tmp_share; // Only a temporary share, to test the url
|
|
DBUG_ENTER("ha_federated::create");
|
|
|
|
if (!(retval= parse_url(&tmp_share, table_arg, 1)))
|
|
retval= check_foreign_data_source(&tmp_share, 1);
|
|
|
|
my_free((gptr) tmp_share.scheme, MYF(MY_ALLOW_ZERO_PTR));
|
|
DBUG_RETURN(retval);
|
|
|
|
}
|
|
|
|
|
|
int ha_federated::stash_remote_error()
|
|
{
|
|
DBUG_ENTER("ha_federated::stash_remote_error()");
|
|
remote_error_number= mysql_errno(mysql);
|
|
strmake(remote_error_buf, mysql_error(mysql), sizeof(remote_error_buf)-1);
|
|
DBUG_RETURN(HA_FEDERATED_ERROR_WITH_REMOTE_SYSTEM);
|
|
}
|
|
|
|
|
|
bool ha_federated::get_error_message(int error, String* buf)
|
|
{
|
|
DBUG_ENTER("ha_federated::get_error_message");
|
|
DBUG_PRINT("enter", ("error: %d", error));
|
|
if (error == HA_FEDERATED_ERROR_WITH_REMOTE_SYSTEM)
|
|
{
|
|
buf->append(STRING_WITH_LEN("Error on remote system: "));
|
|
buf->qs_append(remote_error_number);
|
|
buf->append(STRING_WITH_LEN(": "));
|
|
buf->append(remote_error_buf);
|
|
|
|
remote_error_number= 0;
|
|
remote_error_buf[0]= '\0';
|
|
}
|
|
DBUG_PRINT("exit", ("message: %s", buf->ptr()));
|
|
DBUG_RETURN(FALSE);
|
|
}
|
|
|
|
#endif /* HAVE_FEDERATED_DB */
|