Kouhei Sutou
null+****@clear*****
Sat Dec 31 00:11:42 JST 2016
Kouhei Sutou 2016-12-31 00:11:42 +0900 (Sat, 31 Dec 2016) New Revision: 0496b93f4c62f07ada1d8efaff0bf5abe5d6fa84 https://github.com/pgroonga/pgroonga/commit/0496b93f4c62f07ada1d8efaff0bf5abe5d6fa84 Message: Add pgroonga-check It checks PGroonga DB on startup. If the DB is broken, it removes the DB. Added files: pgrn-pgxs.mk pgroonga-check-sources.mk pgroonga-check.mk src/pgroonga-check.c Copied files: pgroonga.mk (from Makefile) src/pgroonga-check.rc.in (from src/pgroonga.rc.in) Modified files: CMakeLists.txt Makefile src/pgroonga.rc.in Renamed files: pgroonga-sources.mk (from sources.am) Modified: CMakeLists.txt (+39 -7) =================================================================== --- CMakeLists.txt 2016-12-30 00:17:19 +0900 (4b99ae3) +++ CMakeLists.txt 2016-12-31 00:11:42 +0900 (79c2119) @@ -19,7 +19,11 @@ set(PGRN_POSTGRESQL_DIR "${CMAKE_INSTALL_PREFIX}" set(PGRN_POSTGRESQL_VERSION "unknown" CACHE STRING "PostgreSQL version") -set(PGRN_LIBRARY_NAME "lib${PGRN_PROJECT_ID}") +set(PGRN_DLL_NAME "${PGRN_PROJECT_ID}") +set(PGRN_CHECK_DLL_NAME "${PGRN_PROJECT_ID}-check") + +set(PGRN_LIBRARY_NAME "lib${PGRN_DLL_NAME}") +set(PGRN_CHECK_LIBRARY_NAME "lib${PGRN_CHECK_DLL_NAME}") set(PGRN_EXTENSION_DIR "lib") set(PGRN_EXTENSION_DATA_DIR "share/extension") @@ -62,15 +66,23 @@ include_directories( link_directories( "${PGRN_POSTGRESQL_DIR}/lib") -configure_file( - "src/pgroonga.rc.in" - "${CMAKE_CURRENT_BINARY_DIR}/src/pgroonga.rc" - @ONLY) -file(READ ${CMAKE_CURRENT_SOURCE_DIR}/sources.am PGRN_SOURCES) +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/pgroonga-sources.mk PGRN_SOURCES) string(REGEX REPLACE "^.*=[ \t]*\\\\" "" PGRN_SOURCES "${PGRN_SOURCES}") string(REGEX REPLACE "[ \t\n]" "" PGRN_SOURCES "${PGRN_SOURCES}") string(REGEX REPLACE "\\\\" ";" PGRN_SOURCES "${PGRN_SOURCES}") + +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/pgroonga-check-sources.mk + PGRN_CHECK_SOURCES) +string(REGEX REPLACE "^.*=[ \t]*\\\\" "" + PGRN_CHECK_SOURCES "${PGRN_CHECK_SOURCES}") +string(REGEX REPLACE "[ \t\n]" "" PGRN_CHECK_SOURCES "${PGRN_CHECK_SOURCES}") +string(REGEX REPLACE "\\\\" ";" PGRN_CHECK_SOURCES "${PGRN_CHECK_SOURCES}") + +configure_file( + "src/pgroonga.rc.in" + "${CMAKE_CURRENT_BINARY_DIR}/src/pgroonga.rc" + @ONLY) set(PGRN_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/src/pgroonga.rc" ${PGRN_SOURCES}) @@ -80,7 +92,7 @@ set_source_files_properties(${PGRN_SOURCES} add_library("${PGRN_LIBRARY_NAME}" SHARED ${PGRN_SOURCES}) set_target_properties("${PGRN_LIBRARY_NAME}" PROPERTIES - OUTPUT_NAME "${PGRN_PROJECT_ID}") + OUTPUT_NAME "${PGRN_DLL_NAME}") target_link_libraries("${PGRN_LIBRARY_NAME}" libgroonga msgpackc @@ -88,6 +100,26 @@ target_link_libraries("${PGRN_LIBRARY_NAME}" install(TARGETS "${PGRN_LIBRARY_NAME}" DESTINATION "${PGRN_EXTENSION_DIR}") +configure_file( + "src/pgroonga-check.rc.in" + "${CMAKE_CURRENT_BINARY_DIR}/src/pgroonga-check.rc" + @ONLY) +set(PGRN_CHECK_SOURCES + "${CMAKE_CURRENT_BINARY_DIR}/src/pgroonga-check.rc" + ${PGRN_CHECK_SOURCES}) +set_source_files_properties(${PGRN_CHECK_SOURCES} + PROPERTIES + COMPILE_FLAGS "/EHsc") +add_library("${PGRN_CHECK_LIBRARY_NAME}" SHARED ${PGRN_CHECK_SOURCES}) +set_target_properties("${PGRN_CHECK_LIBRARY_NAME}" + PROPERTIES + OUTPUT_NAME "${PGRN_CHECK_DLL_NAME}") +target_link_libraries("${PGRN_CHECK_LIBRARY_NAME}" + libgroonga + "postgres.lib") +install(TARGETS "${PGRN_CHECK_LIBRARY_NAME}" + DESTINATION "${PGRN_EXTENSION_DIR}") + install(FILES "${PROJECT_SOURCE_DIR}/${PGRN_PROJECT_ID}.control" DESTINATION "${PGRN_EXTENSION_DATA_DIR}") Modified: Makefile (+12 -74) =================================================================== --- Makefile 2016-12-30 00:17:19 +0900 (ef0c8bf) +++ Makefile 2016-12-31 00:11:42 +0900 (93b7f67) @@ -1,77 +1,15 @@ -REQUIRED_GROONGA_VERSION = 6.1.1 -GROONGA_PKG = "groonga >= $(REQUIRED_GROONGA_VERSION)" -PACKAGES = $(GROONGA_PKG) -ifdef HAVE_MSGPACK -PACKAGES += msgpack -endif +all: + $(MAKE) -f pgroonga.mk all + $(MAKE) -f pgroonga-check.mk all -MODULE_big = pgroonga -include sources.am -OBJS = $(SRCS:.c=.o) -EXTENSION = pgroonga -EXTENSION_VERSION = \ - $(shell grep default_version $(EXTENSION).control | \ - sed -e "s/^.*'\([0-9.]*\)'$$/\1/") -ifdef GP -DATA = \ - pgroonga-gpdb.sql -else -DATA = \ - pgroonga--$(EXTENSION_VERSION).sql \ - $(shell echo pgroonga--*--*.sql) -endif +clean: + $(MAKE) -f pgroonga.mk clean + $(MAKE) -f pgroonga-check.mk clean -PG_CPPFLAGS = $(shell pkg-config --cflags $(PACKAGES)) -SHLIB_LINK = $(shell pkg-config --libs $(PACKAGES)) -lm -REGRESS = $(shell find sql -name '*.sql' | sed -e 's,\(^sql/\|\.sql$$\),,g') -REGRESS_OPTS = --load-extension=pgroonga +install: + $(MAKE) -f pgroonga.mk install + $(MAKE) -f pgroonga-check.mk install -COPT += -DPGRN_VERSION="\"${EXTENSION_VERSION}\"" -COPT += -Ivendor/xxHash -ifdef HAVE_MSGPACK -COPT += -DPGRN_HAVE_MSGPACK -endif -ifdef DEBUG -COPT += -O0 -g3 -DPGROONGA_DEBUG=1 -SHLIB_LINK += -Wl,--rpath=$(shell pkg-config --libs-only-L $(PACKAGES) | sed -e 's/^-L//') -endif - -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) - -all: pgroonga--$(EXTENSION_VERSION).sql -pgroonga--$(EXTENSION_VERSION).sql: pgroonga.sql - @cp $< $@ - -RESULT_DIRS = $(shell find sql/* -type d | sed -e 's,^sql/,results/,') -EXPECTED_DIRS = $(shell find sql/* -type d | sed -e 's,^sql/,expected/,') -EXPECTED_FILES = \ - $(shell find sql -name '*.sql' | \ - sed -e 's,^sql/,expected/,' \ - -e 's,sql$$,out,') - -# installcheck: prepare-regress -installcheck: $(RESULT_DIRS) -installcheck: $(EXPECTED_DIRS) -installcheck: $(EXPECTED_FILES) - -TMP_DIR = $(shell pwd)/tmp -SETUP_TMP_DIR = yes -prepare-regress: - @if [ $(SETUP_TMP_DIR) = "yes" ]; then \ - rm -rf $(TMP_DIR)/space && \ - mkdir -p $(TMP_DIR)/space; \ - fi - @sed -e "s, �� TMP_DIR@,$(TMP_DIR),g" \ - sql/vacuum/tablespace.sql.in > \ - sql/vacuum/tablespace.sql - @sed -e "s, �� TMP_DIR@,$(TMP_DIR),g" \ - expected/vacuum/tablespace.out.in > \ - expected/vacuum/tablespace.out - -$(RESULT_DIRS) $(EXPECTED_DIRS): - @mkdir -p $@ - -$(EXPECTED_FILES): - @touch $@ +installcheck: + $(MAKE) -f pgroonga.mk installcheck + #$(MAKE) -f pgroonga-check.mk installcheck Added: pgrn-pgxs.mk (+20 -0) 100644 =================================================================== --- /dev/null +++ pgrn-pgxs.mk 2016-12-31 00:11:42 +0900 (b4d132a) @@ -0,0 +1,20 @@ +REQUIRED_GROONGA_VERSION = 6.1.1 +GROONGA_PKG = "groonga >= $(REQUIRED_GROONGA_VERSION)" +PACKAGES += $(GROONGA_PKG) + +PGRN_VERSION = \ + $(shell grep default_version pgroonga.control | \ + sed -e "s/^.*'\([0-9.]*\)'$$/\1/") + +PG_CPPFLAGS = $(shell pkg-config --cflags $(PACKAGES)) +SHLIB_LINK = $(shell pkg-config --libs $(PACKAGES)) -lm + +COPT += -DPGRN_VERSION="\"${PGRN_VERSION}\"" +ifdef DEBUG +COPT += -O0 -g3 -DPGROONGA_DEBUG=1 +SHLIB_LINK += -Wl,--rpath=$(shell pkg-config --libs-only-L $(PACKAGES) | sed -e 's/^-L//') +endif + +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) Added: pgroonga-check-sources.mk (+2 -0) 100644 =================================================================== --- /dev/null +++ pgroonga-check-sources.mk 2016-12-31 00:11:42 +0900 (b23c111) @@ -0,0 +1,2 @@ +SRCS = \ + src/pgroonga-check.c Added: pgroonga-check.mk (+8 -0) 100644 =================================================================== --- /dev/null +++ pgroonga-check.mk 2016-12-31 00:11:42 +0900 (1ad5cab) @@ -0,0 +1,8 @@ +PACKAGES = + +MODULE_big = pgroonga-check +include pgroonga-check-sources.mk +OBJS = $(SRCS:.c=.o) + +include pgrn-pgxs.mk + Renamed: pgroonga-sources.mk (+0 -0) 100% =================================================================== Copied: pgroonga.mk (+4 -17) 68% =================================================================== --- Makefile 2016-12-30 00:17:19 +0900 (ef0c8bf) +++ pgroonga.mk 2016-12-31 00:11:42 +0900 (ea3d54d) @@ -1,17 +1,13 @@ -REQUIRED_GROONGA_VERSION = 6.1.1 -GROONGA_PKG = "groonga >= $(REQUIRED_GROONGA_VERSION)" -PACKAGES = $(GROONGA_PKG) +PACKAGES = ifdef HAVE_MSGPACK PACKAGES += msgpack endif MODULE_big = pgroonga -include sources.am +include pgroonga-sources.mk OBJS = $(SRCS:.c=.o) EXTENSION = pgroonga -EXTENSION_VERSION = \ - $(shell grep default_version $(EXTENSION).control | \ - sed -e "s/^.*'\([0-9.]*\)'$$/\1/") + ifdef GP DATA = \ pgroonga-gpdb.sql @@ -21,24 +17,15 @@ DATA = \ $(shell echo pgroonga--*--*.sql) endif -PG_CPPFLAGS = $(shell pkg-config --cflags $(PACKAGES)) -SHLIB_LINK = $(shell pkg-config --libs $(PACKAGES)) -lm REGRESS = $(shell find sql -name '*.sql' | sed -e 's,\(^sql/\|\.sql$$\),,g') REGRESS_OPTS = --load-extension=pgroonga -COPT += -DPGRN_VERSION="\"${EXTENSION_VERSION}\"" COPT += -Ivendor/xxHash ifdef HAVE_MSGPACK COPT += -DPGRN_HAVE_MSGPACK endif -ifdef DEBUG -COPT += -O0 -g3 -DPGROONGA_DEBUG=1 -SHLIB_LINK += -Wl,--rpath=$(shell pkg-config --libs-only-L $(PACKAGES) | sed -e 's/^-L//') -endif -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) +include pgrn-pgxs.mk all: pgroonga--$(EXTENSION_VERSION).sql pgroonga--$(EXTENSION_VERSION).sql: pgroonga.sql Added: src/pgroonga-check.c (+170 -0) 100644 =================================================================== --- /dev/null +++ src/pgroonga-check.c 2016-12-31 00:11:42 +0900 (0d9e170) @@ -0,0 +1,170 @@ +#include "pgroonga.h" + +#include "pgrn_portable.h" + +#include <groonga.h> + +#include <sys/types.h> +#include <sys/stat.h> +#ifndef WIN32 +# include <dirent.h> +# include <unistd.h> +#endif + +PG_MODULE_MAGIC; + +extern PGDLLEXPORT void _PG_init(void); + +static uint32_t +PGrnGetThreadLimit(void *data) +{ + return 1; +} + +static void +PGrnRemoveAllRelatedFiles(const char *databaseDirectoryPath) +{ +#ifdef WIN32 + WIN32_FIND_DATA data; + HANDLE finder = FindFirstFile(databaseDirectoryPath, &data); + if (finder != INVALID_HANDLE_VALUE) + { + do + { + if (strncmp(data.cFileName, + PGrnDatabaseBasename, + strlen(PGrnDatabaseBasename)) == 0) + { + unlink(data.cFileName); + } + } while (FindNextFile(finder, &data) != 0); + FindClose(finder); + } +#else + DIR *dir = opendir(databaseDirectoryPath); + if (dir) + { + struct dirent *entry; + while ((entry = readdir(dir))) + { + if (strncmp(entry->d_name, + PGrnDatabaseBasename, + strlen(PGrnDatabaseBasename)) == 0) + { + char path[MAXPGPATH]; + join_path_components(path, + databaseDirectoryPath, + entry->d_name); + unlink(path); + } + } + closedir(dir); + } +#endif +} + +static void +PGrnCheckDatabaseDirectory(grn_ctx *ctx, const char *databaseDirectoryPath) +{ + char databasePath[MAXPGPATH]; + grn_obj *db; + pgrn_stat_buffer fileStatus; + + join_path_components(databasePath, + databaseDirectoryPath, + PGrnDatabaseBasename); + + if (pgrn_stat(databasePath, &fileStatus) != 0) + { + return; + } + + db = grn_db_open(ctx, databasePath); + if (!db) + { + PGrnRemoveAllRelatedFiles(databaseDirectoryPath); + return; + } + + grn_obj_close(ctx, db); +} + +static void +PGrnCheck(grn_ctx *ctx) +{ + /* TODO: Support table space: "pg_tblspc/" */ + const char *baseDirectoryPath = "base"; + +#ifdef WIN32 + WIN32_FIND_DATA data; + HANDLE finder = FindFirstFile(baseDirectoryPath, &data); + if (finder != INVALID_HANDLE_VALUE) + { + do + { + char databaseDirectoryPath[MAXPGPATH]; + + if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + continue; + } + join_path_components(databaseDirectoryPath, + baseDirectoryPath, + data.cFileName); + PGrnCheckDatabaseDirectory(ctx, databaseDirectoryPath); + } while (FindNextFile(finder, &data) != 0); + FindClose(finder); + } +#else + DIR *dir = opendir(baseDirectoryPath); + if (dir) + { + struct dirent *entry; + while ((entry = readdir(dir))) + { + struct stat fileStatus; + char databaseDirectoryPath[MAXPGPATH]; + + if (strcmp(entry->d_name, ".") == 0) + continue; + if (strcmp(entry->d_name, "..") == 0) + continue; + + join_path_components(databaseDirectoryPath, + baseDirectoryPath, + entry->d_name); + PGrnCheckDatabaseDirectory(ctx, databaseDirectoryPath); + } + closedir(dir); + } +#endif +} + +void +_PG_init(void) +{ + grn_ctx ctx_; + grn_ctx *ctx = &ctx_; + + grn_thread_set_get_limit_func(PGrnGetThreadLimit, NULL); + + grn_default_logger_set_flags(grn_default_logger_get_flags() | GRN_LOG_PID); + + if (grn_init() != GRN_SUCCESS) + ereport(ERROR, + (errcode(ERRCODE_SYSTEM_ERROR), + errmsg("pgroonga: failed to initialize Groonga"))); + + if (grn_ctx_init(ctx, 0)) + ereport(ERROR, + (errcode(ERRCODE_SYSTEM_ERROR), + errmsg("pgroonga: failed to initialize Groonga context"))); + + GRN_LOG(ctx, GRN_LOG_NOTICE, "pgroonga: initialize: <%s>", PGRN_VERSION); + + PGrnCheck(ctx); + + grn_ctx_fin(ctx); + + grn_fin(); +} Copied: src/pgroonga-check.rc.in (+2 -2) 86% =================================================================== --- src/pgroonga.rc.in 2016-12-30 00:17:19 +0900 (b730d43) +++ src/pgroonga-check.rc.in 2016-12-31 00:11:42 +0900 (c4af0f7) @@ -15,8 +15,8 @@ BEGIN VALUE "CompanyName", "@PGRN_VENDOR@" VALUE "FileDescription", "@PGRN_DESCRIPTION@" VALUE "FileVersion", "@PGRN_VERSION@" - VALUE "InternalName", "@PGRN_PROJECT_ID@" - VALUE "OriginalFilename", "@PGRN_PROJECT_ID �� .dll" + VALUE "InternalName", "@PGRN_CHECK_DLL_NAME@" + VALUE "OriginalFilename", "@PGRN_CHECK_DLL_NAME �� .dll" VALUE "ProductName", "@PGRN_PROJECT_NAME@" VALUE "ProductVersion", "@PGRN_VERSION@" END Modified: src/pgroonga.rc.in (+2 -2) =================================================================== --- src/pgroonga.rc.in 2016-12-30 00:17:19 +0900 (b730d43) +++ src/pgroonga.rc.in 2016-12-31 00:11:42 +0900 (cb070d1) @@ -15,8 +15,8 @@ BEGIN VALUE "CompanyName", "@PGRN_VENDOR@" VALUE "FileDescription", "@PGRN_DESCRIPTION@" VALUE "FileVersion", "@PGRN_VERSION@" - VALUE "InternalName", "@PGRN_PROJECT_ID@" - VALUE "OriginalFilename", "@PGRN_PROJECT_ID �� .dll" + VALUE "InternalName", "@PGRN_DLL_NAME@" + VALUE "OriginalFilename", "@PGRN_DLL_NAME �� .dll" VALUE "ProductName", "@PGRN_PROJECT_NAME@" VALUE "ProductVersion", "@PGRN_VERSION@" END -------------- next part -------------- HTML����������������������������... Download