[Groonga-commit] pgroonga/pgroonga at 0496b93 [master] Add pgroonga-check

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index