diff --git a/.gitignore b/.gitignore index caadb07..bd39199 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,37 @@ *.pyc +*.o +src/ybinlogp .*.swp -build/ logs/ + +# autotools stuff +*.in +*.la +*.lo +.deps/ +.libs/ +Makefile +aclocal.m4 +autom4te.cache +autoscan.log +compile +config.guess +config.h +config.h.in~ +config.log +config.status +config.sub +configure +configure.scan +depcomp +install-sh +libtool +ltmain.sh +m4/ +missing +stamp* +*.tar.gz +py-compile +*.log +*.trs +test-driver diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..c3e7bc4 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +James Brown +Daniel Nephin diff --git a/license.txt b/COPYING similarity index 100% rename from license.txt rename to COPYING diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..007e939 --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/Makefile b/Makefile deleted file mode 100644 index ed22e8d..0000000 --- a/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - - -.PHONY: flakes tests clean docs build - - -all: build - -build: - make -C build all - -debug: - make -C build debug - -flakes: - find -name "*.py" -print0 | xargs -0 pyflakes - -test: tests - -tests: all - LD_LIBRARY_PATH=build \ - PYTHONPATH=src \ - testify --summary --exclude-suite=disabled --verbose tests - -clean: - make -C build clean - find . -iname '*.pyc' -delete - diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..fd80f3c --- /dev/null +++ b/Makefile.am @@ -0,0 +1,4 @@ +ACLOCAL_AMFLAGS = -I m4 +EXTRA_DIST = README.md +SUBDIRS = include libybinlogp src py +TESTS = py.test diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e5f40f6 --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +News can be found in NEWS.md diff --git a/README b/README new file mode 100644 index 0000000..163142a --- /dev/null +++ b/README @@ -0,0 +1 @@ +README can be found in README.md diff --git a/README.md b/README.md index 8d1c1c7..6c287fc 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,20 @@ below which uses this library, and a python-ctypes wrapper that exposes some critical functionality (namely, opening a binlog, reading from it, and handling query, xid, and rotate events). +Building +-------- +This package is built with autotools. If you downloaded a tarball, it should be ready to go. +If you've cloned with git, you should be able to build with the standard sequence: + + autoreconf -i + ./configure --prefix=/path/to/somewhere + make + sudo make install + +Maintaining +----------- +To release a new version, bump the version string in [NEWS.md](NEWS.md), [ybinlogp.spec](ybinlogp.spec) and [configure.ac](configure.ac), then run `make dist` to prepare a distribution tarball. + Usage ----- ybinlogp [options] binlog-file @@ -43,4 +57,4 @@ It's Github... Fork away! License ------- This work is available under the ISC (OpenBSD) license. The full contents are available -as license.txt +as COPYING diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index 5213d69..0000000 --- a/build/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -VPATH := ../src -SOURCES := $(wildcard *.c *.h) -TARGETS := libybinlogp.so.1 libybinlogp.so ybinlogp - -prefix := /usr - -CFLAGS += -Wall -ggdb -Wextra --std=c99 -pedantic -LDFLAGS += -L. - -# Enable for debugging -debug: CFLAGS += -DDEBUG -debug: all - -all: $(TARGETS) - -ybinlogp: ybinlogp.o libybinlogp.so - gcc $(CFLAGS) $(LDFLAGS) -o $@ -lybinlogp $< - -libybinlogp.so: libybinlogp.so.1 - ln -fs $< $@ - -libybinlogp.so.1: libybinlogp.o - gcc $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname,$@ -o $@ $^ - -libybinlogp.o: libybinlogp.c ybinlogp-private.h - gcc $(CFLAGS) $(LDFLAGS) -c -fPIC -o $@ $< - -clean: - rm -f $(TARGETS) *.o - -ybinlogp.o: ybinlogp.c ybinlogp.h diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..7a50bd9 --- /dev/null +++ b/configure.ac @@ -0,0 +1,57 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.65]) +AC_INIT([ybinlogp], [0.6], [yelplabs@yelp.com]) +AC_USE_SYSTEM_EXTENSIONS +AM_INIT_AUTOMAKE +AC_CONFIG_HEADERS([config.h]) + +LT_PREREQ([2.2]) +LT_INIT([dlopen], [shared]) + +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_CC_C99 +AM_PROG_CC_C_O +AC_PROG_CXX +AC_PROG_LN_S +AC_PROG_INSTALL + +# Checks for libraries. +# FIXME: Replace `main' with a function in `-lybinlogp': +AC_CHECK_LIB([ybinlogp], [main]) + +# Checks for header files. +AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_OFF_T +AC_C_RESTRICT +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T +AC_SYS_LARGEFILE + +# Checks for library functions. +AC_FUNC_MALLOC +AC_CHECK_FUNCS([memmove memset strdup strerror strndup]) + +# python stuff +AM_PATH_PYTHON + +# options +AC_ARG_ENABLE(debug, + [ --enable-debug build with tons of debugging], + [if test x$enableval = xyes ; then + AC_DEFINE([DEBUG], 1, [debugging enabled]) + fi] + ) + +AC_CONFIG_FILES([Makefile include/Makefile libybinlogp/Makefile src/Makefile py/Makefile]) +AC_OUTPUT diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..6b60aac --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1 @@ +include_HEADERS = ybinlogp.h diff --git a/src/ybinlogp.h b/include/ybinlogp.h similarity index 96% rename from src/ybinlogp.h rename to include/ybinlogp.h index 509df4e..18c42c0 100644 --- a/src/ybinlogp.h +++ b/include/ybinlogp.h @@ -70,7 +70,7 @@ struct ybp_event { uint32_t next_position; uint16_t flags; char* data; - off64_t offset; + off_t offset; }; struct ybp_format_description_event { @@ -154,7 +154,7 @@ void ybp_update_bp(struct ybp_binlog_parser*); /** * Get the offset in the bp **/ -off64_t ybp_tell_bp(struct ybp_binlog_parser*); +off_t ybp_tell_bp(struct ybp_binlog_parser*); /** * Rewind the ybp_binlog_parser to the given offset @@ -280,9 +280,9 @@ void ybp_dispose_safe_xe(struct ybp_xid_event*); /** * Search tools! **/ -off64_t ybp_nearest_offset(struct ybp_binlog_parser* restrict, off64_t); +off_t ybp_nearest_offset(struct ybp_binlog_parser* restrict, off_t); -off64_t ybp_nearest_time(struct ybp_binlog_parser* restrict, time_t target); +off_t ybp_nearest_time(struct ybp_binlog_parser* restrict, time_t target); /* vim: set sts=0 sw=4 ts=4 noexpandtab: */ diff --git a/src/debugs.h b/include/ydebugs.h similarity index 95% rename from src/debugs.h rename to include/ydebugs.h index 35d4472..3dea7b0 100644 --- a/src/debugs.h +++ b/include/ydebugs.h @@ -1,6 +1,9 @@ #ifndef DEBUGS_H #define DEBUGS_H +#if HAVE_CONFIG_H + #include +#endif #include #include #include diff --git a/libybinlogp/Makefile.am b/libybinlogp/Makefile.am new file mode 100644 index 0000000..33c7413 --- /dev/null +++ b/libybinlogp/Makefile.am @@ -0,0 +1,3 @@ +lib_LTLIBRARIES = libybinlogp.la +libybinlogp_la_SOURCES = libybinlogp.c +libybinlogp_la_CPPFLAGS = -I$(top_srcdir)/include diff --git a/src/libybinlogp.c b/libybinlogp/libybinlogp.c similarity index 96% rename from src/libybinlogp.c rename to libybinlogp/libybinlogp.c index 939f97b..c1c3bbc 100644 --- a/src/libybinlogp.c +++ b/libybinlogp/libybinlogp.c @@ -13,8 +13,9 @@ * Functions starting with ybpi_ are internal-only and should be static */ -#define _XOPEN_SOURCE 600 -#define _GNU_SOURCE +#if HAVE_CONFIG_H + #include +#endif #include #include @@ -27,7 +28,7 @@ #include #include -#include "debugs.h" +#include "ydebugs.h" #include "ybinlogp.h" /******* binlog parameters ********/ @@ -54,8 +55,8 @@ static int ybpi_read_fde(struct ybp_binlog_parser* restrict); static int ybpi_read_event(struct ybp_binlog_parser* restrict, off_t, struct ybp_event* restrict); static bool ybpi_check_event(struct ybp_event*, struct ybp_binlog_parser*); -static off64_t ybpi_next_after(struct ybp_event* restrict); -static off64_t ybpi_nearest_offset(struct ybp_binlog_parser* restrict, off64_t, struct ybp_event* restrict, int); +static off_t ybpi_next_after(struct ybp_event* restrict); +static off_t ybpi_nearest_offset(struct ybp_binlog_parser* restrict, off_t, struct ybp_event* restrict, int); /******** implementation begins here ********/ @@ -83,7 +84,7 @@ void ybp_rewind_bp(struct ybp_binlog_parser* p, off_t offset) p->offset = offset; } -off64_t ybp_tell_bp(struct ybp_binlog_parser* p) +off_t ybp_tell_bp(struct ybp_binlog_parser* p) { return p->offset; } @@ -179,7 +180,7 @@ static bool ybpi_check_event(struct ybp_event* e, struct ybp_binlog_parser* p) * Find the offset of the next event after the one passed in. * Uses the built-in event chaining. **/ -static off64_t ybpi_next_after(struct ybp_event *evbuf) { +static off_t ybpi_next_after(struct ybp_event *evbuf) { /* Can't actually use next_position, because it will vary between * messages that are from master and messages that are from slave. * Usually, only the FDE is from the slave. But, still... @@ -192,15 +193,15 @@ static off64_t ybpi_next_after(struct ybp_event *evbuf) { * * If evbuf is non-null, copy it into there */ -off64_t ybp_nearest_offset(struct ybp_binlog_parser* p, off64_t starting_offset) +off_t ybp_nearest_offset(struct ybp_binlog_parser* p, off_t starting_offset) { return ybpi_nearest_offset(p, starting_offset, NULL, 1); } -off64_t ybpi_nearest_offset(struct ybp_binlog_parser* restrict p, off64_t starting_offset, struct ybp_event* restrict outbuf, int direction) +off_t ybpi_nearest_offset(struct ybp_binlog_parser* restrict p, off_t starting_offset, struct ybp_event* restrict outbuf, int direction) { unsigned int num_increments = 0; - off64_t offset; + off_t offset; struct ybp_event *evbuf = ybp_get_event(); offset = starting_offset; Dprintf("In nearest offset mode, got fd=%d, starting_offset=%llu, direction=%d\n", p->fd, (long long)starting_offset, direction); @@ -231,14 +232,14 @@ off64_t ybpi_nearest_offset(struct ybp_binlog_parser* restrict p, off64_t starti /** * Binary-search to find the record closest to the requested time **/ -off64_t ybp_nearest_time(struct ybp_binlog_parser* restrict p, time_t target) +off_t ybp_nearest_time(struct ybp_binlog_parser* restrict p, time_t target) { - off64_t file_size = p->file_size; + off_t file_size = p->file_size; struct ybp_event *evbuf = ybp_get_event(); - off64_t offset = file_size / 2; - off64_t next_increment = file_size / 4; + off_t offset = file_size / 2; + off_t next_increment = file_size / 4; int directionality = 1; - off64_t found, last_found = 0; + off_t found, last_found = 0; Dprintf("Starting nearest_time with next_increment=%d\n", next_increment); while (next_increment > 2) { long long delta; @@ -338,7 +339,7 @@ static int ybpi_read_event(struct ybp_binlog_parser* restrict p, off_t offset, s static int ybpi_read_fde(struct ybp_binlog_parser* p) { struct ybp_event* evbuf; - off64_t offset; + off_t offset; bool esi = p->enforce_server_id; int fd = p->fd; time_t fde_time; diff --git a/src/ybinlogp-private.h b/libybinlogp/ybinlogp-private.h similarity index 100% rename from src/ybinlogp-private.h rename to libybinlogp/ybinlogp-private.h diff --git a/m4/.dir b/m4/.dir new file mode 100644 index 0000000..e69de29 diff --git a/py.test b/py.test new file mode 100755 index 0000000..b15029c --- /dev/null +++ b/py.test @@ -0,0 +1,17 @@ +#!/bin/sh +if test -z "$srcdir"; then + srcdir=`echo "$0" | sed 's,[^/]*$,,'` + test "$srcdir" = "$0" && srcdir=. + test -z "$srcdir" && srcdir=. +fi +LD_LIBRARY_PATH=$srcdir/libybinlogp/.libs/ +PYTHONPATH=$srcdir/py/ +export PYTHONPATH +if [ `uname` = 'Darwin' ] ; then + DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH + export DYLD_LIBRARY_PATH +else + export LD_LIBRARY_PATH +fi + +testify -v tests diff --git a/py/Makefile.am b/py/Makefile.am new file mode 100644 index 0000000..e4a7865 --- /dev/null +++ b/py/Makefile.am @@ -0,0 +1,2 @@ +ybinlogp_PYTHON = ybinlogp/__init__.py ybinlogp/parser.py +ybinlogpdir = $(pythondir)/ybinlogp/ diff --git a/src/ybinlogp/__init__.py b/py/ybinlogp/__init__.py similarity index 100% rename from src/ybinlogp/__init__.py rename to py/ybinlogp/__init__.py diff --git a/src/ybinlogp/parser.py b/py/ybinlogp/parser.py similarity index 97% rename from src/ybinlogp/parser.py rename to py/ybinlogp/parser.py index c8901f1..598bf5e 100644 --- a/src/ybinlogp/parser.py +++ b/py/ybinlogp/parser.py @@ -12,11 +12,18 @@ import errno import logging import time +import sys log = logging.getLogger('ybinlogp') -library = ctypes.CDLL("libybinlogp.so.1", use_errno=True) +if sys.platform == 'darwin': + ldname = 'libybinlogp.dylib' +elif sys.platform == 'linux2': + ldname = 'libybinlogp.so' +else: + raise ValueError('this module requires either darwin or linux2') +library = ctypes.CDLL(ldname, use_errno=True) class EventStruct(ctypes.Structure): diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..08c0852 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,4 @@ +bin_PROGRAMS = ybinlogp +ybinlogp_SOURCES = ybinlogp.c +ybinlogp_CPPFLAGS = -I$(top_srcdir)/include +ybinlogp_LDADD = ../libybinlogp/libybinlogp.la diff --git a/src/ybinlogp.c b/src/ybinlogp.c index 6eafa92..29310f8 100644 --- a/src/ybinlogp.c +++ b/src/ybinlogp.c @@ -7,8 +7,9 @@ * contents of that license can be found under license.txt */ -#define _XOPEN_SOURCE 600 -#define _GNU_SOURCE +#if HAVE_CONFIG_H + #include +#endif #include #include @@ -18,8 +19,8 @@ #include #include -#include "debugs.h" -#include "ybinlogp.h" +#include +#include void usage(void) { fprintf(stderr, "ybinlogp_test [options] binlog\n"); @@ -90,7 +91,7 @@ int main(int argc, char** argv) { usage(); return 2; } - if ((fd = open(argv[optind], O_RDONLY|O_LARGEFILE)) <= 0) { + if ((fd = open(argv[optind], O_RDONLY)) <= 0) { perror("Error opening file"); return 1; } @@ -105,7 +106,7 @@ int main(int argc, char** argv) { } ybp_init_event(evbuf); if (starting_offset >= 0) { - off64_t offset = ybp_nearest_offset(bp, starting_offset); + off_t offset = ybp_nearest_offset(bp, starting_offset); if (offset == -2) { fprintf(stderr, "Unable to find anything after offset %ld\n", starting_offset); return 1; @@ -119,7 +120,7 @@ int main(int argc, char** argv) { } } if (starting_time >= 0) { - off64_t offset = ybp_nearest_time(bp, starting_time); + off_t offset = ybp_nearest_time(bp, starting_time); if (offset == -2) { fprintf(stderr, "Unable to find anything after time %ld\n", starting_time); return 1; diff --git a/ybinlogp.pth b/ybinlogp.pth deleted file mode 100644 index 8eba6c8..0000000 --- a/ybinlogp.pth +++ /dev/null @@ -1 +0,0 @@ -src/ diff --git a/ybinlogp.spec b/ybinlogp.spec index b985248..708f739 100644 --- a/ybinlogp.spec +++ b/ybinlogp.spec @@ -24,11 +24,7 @@ Library, program, and python bindings for parsing MySQL binlogs make %install -install -D -m 444 src/ybinlogp.h $RPM_BUILD_ROOT/usr/include/ybinlogp.h -install -D -m 755 build/ybinlogp $RPM_BUILD_ROOT/usr/sbin/ybinlogp -install -D -m 555 build/libybinlogp.so.1 $RPM_BUILD_ROOT/usr/lib64/libybinlogp.so.1 -install -D -m 555 build/libybinlogp.so $RPM_BUILD_ROOT/usr/lib64/libybinlogp.so -install -D -d src/ybinlogp $RPM_BUILD_ROOT/usr/lib64/python2.6/site-packages/ybinlogp +make install %clean rm -rf $RPM_BUILD_ROOT @@ -38,5 +34,6 @@ rm -rf $RPM_BUILD_ROOT /usr/sbin/ybinlogp /usr/lib64/libybinlogp.so.1 /usr/lib64/libybinlogp.so +/usr/lib64/libybinlogp.la /usr/lib64/python2.6/site-packages/ybinlogp %defattr(-,root,root)