提交 3e2eb6932bc171c872ea54a699ede0c694680f3b

作者 LJH 李佳桓
1 个父辈 6a97eccc

add-20211202

正在显示 63 个修改的文件 包含 4632 行增加0 行删除

要显示太多修改。

为保证性能只显示 63 of 1796 个文件。

  1 +build/*
  1 +{
  2 + "files.associations": {
  3 + "*.ipp": "cpp",
  4 + "any": "cpp",
  5 + "array": "cpp",
  6 + "atomic": "cpp",
  7 + "strstream": "cpp",
  8 + "bit": "cpp",
  9 + "*.tcc": "cpp",
  10 + "bitset": "cpp",
  11 + "cctype": "cpp",
  12 + "chrono": "cpp",
  13 + "clocale": "cpp",
  14 + "cmath": "cpp",
  15 + "codecvt": "cpp",
  16 + "complex": "cpp",
  17 + "condition_variable": "cpp",
  18 + "csignal": "cpp",
  19 + "cstdarg": "cpp",
  20 + "cstddef": "cpp",
  21 + "cstdint": "cpp",
  22 + "cstdio": "cpp",
  23 + "cstdlib": "cpp",
  24 + "cstring": "cpp",
  25 + "ctime": "cpp",
  26 + "cwchar": "cpp",
  27 + "cwctype": "cpp",
  28 + "deque": "cpp",
  29 + "list": "cpp",
  30 + "map": "cpp",
  31 + "set": "cpp",
  32 + "unordered_map": "cpp",
  33 + "vector": "cpp",
  34 + "exception": "cpp",
  35 + "algorithm": "cpp",
  36 + "functional": "cpp",
  37 + "iterator": "cpp",
  38 + "memory": "cpp",
  39 + "memory_resource": "cpp",
  40 + "numeric": "cpp",
  41 + "optional": "cpp",
  42 + "random": "cpp",
  43 + "ratio": "cpp",
  44 + "regex": "cpp",
  45 + "source_location": "cpp",
  46 + "string": "cpp",
  47 + "string_view": "cpp",
  48 + "system_error": "cpp",
  49 + "tuple": "cpp",
  50 + "type_traits": "cpp",
  51 + "utility": "cpp",
  52 + "slist": "cpp",
  53 + "fstream": "cpp",
  54 + "future": "cpp",
  55 + "initializer_list": "cpp",
  56 + "iomanip": "cpp",
  57 + "iosfwd": "cpp",
  58 + "iostream": "cpp",
  59 + "istream": "cpp",
  60 + "limits": "cpp",
  61 + "mutex": "cpp",
  62 + "new": "cpp",
  63 + "ostream": "cpp",
  64 + "shared_mutex": "cpp",
  65 + "sstream": "cpp",
  66 + "stdexcept": "cpp",
  67 + "streambuf": "cpp",
  68 + "thread": "cpp",
  69 + "cinttypes": "cpp",
  70 + "typeindex": "cpp",
  71 + "typeinfo": "cpp",
  72 + "variant": "cpp",
  73 + "cfenv": "cpp"
  74 + }
  75 +}
  1 +{
  2 + "tasks": [
  3 + {
  4 + "type": "cppbuild",
  5 + "label": "C/C++: g++ build active file",
  6 + "command": "/usr/bin/g++",
  7 + "args": [
  8 + "-fdiagnostics-color=always",
  9 + "-g",
  10 + "${file}",
  11 + "-o",
  12 + "${fileDirname}/${fileBasenameNoExtension}"
  13 + ],
  14 + "options": {
  15 + "cwd": "${fileDirname}"
  16 + },
  17 + "problemMatcher": [
  18 + "$gcc"
  19 + ],
  20 + "group": {
  21 + "kind": "build",
  22 + "isDefault": true
  23 + },
  24 + "detail": "Task generated by Debugger."
  25 + }
  26 + ],
  27 + "version": "2.0.0"
  28 +}
  1 +CMAKE_MINIMUM_REQUIRED(VERSION 3.6 FATAL_ERROR)
  2 +# set path to additional CMake modules
  3 +SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
  4 +SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
  5 +
  6 +#############################################################
  7 +# Project and version
  8 +SET(CPACK_PACKAGE_VERSION_MAJOR "3")
  9 +SET(CPACK_PACKAGE_VERSION_MINOR "0")
  10 +SET(CPACK_PACKAGE_VERSION_PATCH "0")
  11 +SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
  12 +SET(RELEASE_NAME "Master")
  13 +PROJECT(DMap VERSION ${COMPLETE_VERSION})
  14 +
  15 +# we default to Release build type
  16 +if(NOT CMAKE_BUILD_TYPE)
  17 + SET(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
  18 +endif()
  19 +
  20 +MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
  21 +
  22 +# Note the version no is Mmmpp for Major/minor/patch, 0-padded, thus '10100' for 1.1.0
  23 +MATH(EXPR DMAP_VERSION_INT "${CPACK_PACKAGE_VERSION_MAJOR}*10000+${CPACK_PACKAGE_VERSION_MINOR}*100+${CPACK_PACKAGE_VERSION_PATCH}")
  24 +MESSAGE(STATUS "DMAP version: ${COMPLETE_VERSION} ${RELEASE_NAME} (${DMAP_VERSION_INT})")
  25 +
  26 +SET (WITH_CORE TRUE CACHE BOOL "Determines whether DMap core should be built.")
  27 +MARK_AS_ADVANCED(WITH_CORE)
  28 +
  29 +IF(WITH_CORE)
  30 +
  31 + SET (WITH_BINDINGS FALSE CACHE BOOL "Determines whether python bindings should be built")
  32 + IF (WITH_BINDINGS)
  33 + # By default bindings will be installed only to DMap directory
  34 + # Someone might want to install it to python site-packages directory
  35 + # as otherwise user has to use PYTHONPATH environment variable to add
  36 + # DMap bindings to package search path
  37 + SET (BINDINGS_GLOBAL_INSTALL TRUE CACHE BOOL "Install bindings to global python directory? (might need root)")
  38 + SET (WITH_STAGED_PLUGINS FALSE CACHE BOOL "Stage-install core Python plugins to run from build directory? (utilities and console are always staged)")
  39 + SET (WITH_PY_COMPILE FALSE CACHE BOOL "Determines whether Python modules in staged or installed locations are byte-compiled")
  40 + ADD_DEFINITIONS(-DWITH_BINDINGS)
  41 + ENDIF (WITH_BINDINGS)
  42 +
  43 + SET (WITH_SERVER TRUE CACHE BOOL "Determines whether DMap server should be built")
  44 + IF(WITH_SERVER)
  45 + SET (WITH_SERVER_PLUGINS ${WITH_BINDINGS} CACHE BOOL "Determines whether DMap server support for python plugins should be built")
  46 + IF(WITH_SERVER_PLUGINS AND NOT WITH_BINDINGS)
  47 + MESSAGE(FATAL_ERROR "Server plugins are not supported without python bindings. Enable WITH_BINDINGS or disable WITH_SERVER_PLUGINS")
  48 + ENDIF(WITH_SERVER_PLUGINS AND NOT WITH_BINDINGS)
  49 + IF(WITH_SERVER_PLUGINS)
  50 + SET(HAVE_SERVER_PYTHON_PLUGINS TRUE)
  51 + ENDIF(WITH_SERVER_PLUGINS)
  52 + ENDIF(WITH_SERVER)
  53 +
  54 + # try to configure and build POSTGRESQL support
  55 + SET (WITH_POSTGRESQL TRUE CACHE BOOL "Determines whether POSTGRESQL support should be built")
  56 + IF (WITH_POSTGRESQL)
  57 + SET (POSTGRESQL_PREFIX "" CACHE PATH "Path to POSTGRESQL base directory")
  58 + ENDIF (WITH_POSTGRESQL)
  59 +
  60 + #############################################################
  61 + # search for dependencies
  62 +
  63 + # required
  64 + FIND_PACKAGE(Boost 1.57 REQUIRED COMPONENTS filesystem REQUIRED)
  65 + FIND_PACKAGE(Boost 1.57 COMPONENTS regex REQUIRED)
  66 + FIND_PACKAGE(Boost 1.57 COMPONENTS system REQUIRED)
  67 + #FIND_PACKAGE(Proj)
  68 + #FIND_PACKAGE(GEOS)
  69 + #FIND_PACKAGE(GDAL)
  70 + #FIND_PACKAGE(Spatialindex REQUIRED)
  71 +
  72 + # optional
  73 + IF (WITH_POSTGRESQL)
  74 + FIND_PACKAGE(Postgres) # PostgreSQL provider
  75 + ENDIF (WITH_POSTGRESQL)
  76 +
  77 + #[[
  78 + IF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
  79 + MESSAGE (SEND_ERROR "Some dependencies were not found! Proj: ${PROJ_FOUND}, Geos: ${GEOS_FOUND}, GDAL: ${GDAL_FOUND}")
  80 + ENDIF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
  81 + ]]
  82 + IF (POSTGRES_FOUND)
  83 + SET (HAVE_POSTGRESQL TRUE)
  84 + ENDIF (POSTGRES_FOUND)
  85 +
  86 +ENDIF(WITH_CORE)
  87 +
  88 +#############################################################
  89 +SET(CMAKE_CXX_STANDARD 14)
  90 +SET(CMAKE_CXX_STANDARD_REQUIRED ON)
  91 +# SET(CMAKE_CXX_EXTENSIONS OFF)
  92 +#############################################################
  93 +# platform specific stuff
  94 +IF (WITH_CORE)
  95 + IF (WIN32)
  96 + ADD_DEFINITIONS(-DIS_WIN32)
  97 + SET (DEFAULT_LIB_SUBDIR lib)
  98 + SET (DEFAULT_LIBEXEC_SUBDIR .)
  99 + SET (DEFAULT_DATA_SUBDIR .)
  100 + SET (DEFAULT_PLUGIN_SUBDIR plugins)
  101 + SET (DEFAULT_INCLUDE_SUBDIR include)
  102 + SET (DEFAULT_SERVER_MODULE_SUBDIR server)
  103 +
  104 + IF (MSVC)
  105 + SET (DEFAULT_BIN_SUBDIR bin)
  106 + SET (DEFAULT_CGIBIN_SUBDIR bin)
  107 + # put all the build products into a single directory
  108 + # under build (doesn't affect install target) to make for
  109 + # easier debugging.
  110 +
  111 + # Turn on defines for non standard maths stuff
  112 + ADD_DEFINITIONS(-D_USE_MATH_DEFINES)
  113 +
  114 + # Turn off deprecation warnings
  115 + ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
  116 + ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_WARNINGS)
  117 +
  118 + IF (INSTALL_DEPS)
  119 + INSTALL(DIRECTORY ${INSTALL_DEPS} DESTINATION .)
  120 + ENDIF (INSTALL_DEPS)
  121 + ELSE(MSVC)
  122 + SET (DEFAULT_BIN_SUBDIR .)
  123 + SET (DEFAULT_CGIBIN_SUBDIR .)
  124 + ENDIF(MSVC)
  125 + ELSE (WIN32)
  126 + # UNIX
  127 + ADD_DEFINITIONS(-DIS_LINUX)
  128 + SET (DEFAULT_BIN_SUBDIR bin)
  129 + SET (DEFAULT_CGIBIN_SUBDIR bin)
  130 + SET (DEFAULT_LIB_SUBDIR lib${LIB_SUFFIX})
  131 + SET (DEFAULT_DATA_SUBDIR share/dmap)
  132 + SET (DEFAULT_LIBEXEC_SUBDIR lib${LIB_SUFFIX}/dmap)
  133 + SET (DEFAULT_PLUGIN_SUBDIR lib${LIB_SUFFIX}/dmap/plugins)
  134 + SET (DEFAULT_INCLUDE_SUBDIR include/dmap)
  135 + SET (DEFAULT_SERVER_MODULE_SUBDIR ${DEFAULT_LIBEXEC_SUBDIR}/server)
  136 + ENDIF (WIN32)
  137 + #[[
  138 + if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
  139 + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
  140 + SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
  141 + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
  142 + endif() #"${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
  143 + ]]
  144 + INCLUDE(GenerateExportHeader)
  145 +
  146 +ENDIF (WITH_CORE)
  147 +
  148 +
  149 +#############################################################
  150 +# user-changeable settings which can be used to customize
  151 +# layout of DMAP installation
  152 +# (default values are platform-specific)
  153 +
  154 +SET (DMAP_BIN_SUBDIR ${DEFAULT_BIN_SUBDIR} CACHE STRING "Subdirectory where executables will be installed")
  155 +SET (DMAP_CGIBIN_SUBDIR ${DEFAULT_CGIBIN_SUBDIR} CACHE STRING "Subdirectory where CGI executables will be installed")
  156 +SET (DMAP_LIB_SUBDIR ${DEFAULT_LIB_SUBDIR} CACHE STRING "Subdirectory where libraries will be installed")
  157 +SET (DMAP_LIBEXEC_SUBDIR ${DEFAULT_LIBEXEC_SUBDIR} CACHE STRING "Subdirectory where private executables will be installed")
  158 +SET (DMAP_DATA_SUBDIR ${DEFAULT_DATA_SUBDIR} CACHE STRING "Subdirectory where DMAP data will be installed")
  159 +SET (DMAP_PLUGIN_SUBDIR ${DEFAULT_PLUGIN_SUBDIR} CACHE STRING "Subdirectory where plugins will be installed")
  160 +SET (DMAP_INCLUDE_SUBDIR ${DEFAULT_INCLUDE_SUBDIR} CACHE STRING "Subdirectory where header files will be installed")
  161 +SET (DMAP_SERVER_MODULE_SUBDIR ${DEFAULT_SERVER_MODULE_SUBDIR} CACHE STRING "Subdirectory where server modules will be installed")
  162 +
  163 +# mark *_SUBDIR variables as advanced as this is not something
  164 +# that an average user would use
  165 +MARK_AS_ADVANCED (DMAP_BIN_SUBDIR DMAP_CGIBIN_SUBDIR DMAP_LIB_SUBDIR DMAP_LIBEXEC_SUBDIR DMAP_DATA_SUBDIR DMAP_PLUGIN_SUBDIR DMAP_INCLUDE_SUBDIR)
  166 +
  167 +# full paths for the installation
  168 +SET (DMAP_BIN_DIR ${DMAP_BIN_SUBDIR})
  169 +SET (DMAP_CGIBIN_DIR ${DMAP_CGIBIN_SUBDIR})
  170 +SET (DMAP_LIB_DIR ${DMAP_LIB_SUBDIR})
  171 +SET (DMAP_LIBEXEC_DIR ${DMAP_LIBEXEC_SUBDIR})
  172 +SET (DMAP_DATA_DIR ${DMAP_DATA_SUBDIR})
  173 +SET (DMAP_PLUGIN_DIR ${DMAP_PLUGIN_SUBDIR})
  174 +SET (DMAP_INCLUDE_DIR ${DMAP_INCLUDE_SUBDIR})
  175 +SET (DMAP_SERVER_MODULE_DIR ${DMAP_SERVER_MODULE_SUBDIR})
  176 +
  177 +# set the default locations where the targets (executables, libraries) will land when compiled
  178 +# this is to allow running dmap from the source tree without having to actually do a "make install"
  179 +SET (DMAP_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
  180 +SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DMAP_OUTPUT_DIRECTORY}/${DMAP_BIN_SUBDIR})
  181 +SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DMAP_OUTPUT_DIRECTORY}/${DMAP_LIB_SUBDIR})
  182 +SET (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/testdata")
  183 +
  184 +# write a marker with source directory path into the output's bin directory
  185 +# if run from the build directory DMAP will detect it and alter the paths
  186 +FILE(WRITE ${DMAP_OUTPUT_DIRECTORY}/${DMAP_BIN_SUBDIR}/dmapbuildpath.txt "${CMAKE_SOURCE_DIR}\n${DMAP_OUTPUT_DIRECTORY}")
  187 +
  188 +#############################################################
  189 +# Python build dependency
  190 +
  191 +FIND_PACKAGE(PythonInterp 3 REQUIRED)
  192 +
  193 +#############################################################
  194 +# Python bindings
  195 +
  196 +# IF (WITH_CORE AND WITH_BINDINGS)
  197 +
  198 + FIND_PACKAGE(PythonLibrary ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)
  199 + LIST(
  200 + APPEND _components
  201 + python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}
  202 + python${PYTHON_VERSION_MAJOR}
  203 + python
  204 + )
  205 + SET(DMAP_BOOST_PYTHON_FOUND "")
  206 +
  207 + foreach(_component IN ITEMS ${_components})
  208 + find_package(Boost COMPONENTS ${_component})
  209 + if(Boost_FOUND)
  210 + SET(DMAP_BOOST_PYTHON_FOUND ${_component})
  211 + break()
  212 + endif()
  213 + endforeach()
  214 +
  215 + if(DMAP_BOOST_PYTHON_FOUND STREQUAL "")
  216 + message(FATAL_ERROR "No matching Boost.Python component found")
  217 + endif()
  218 + #MESSAGE(STATUS "XXX python: ${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
  219 +
  220 + IF (NOT BINDINGS_GLOBAL_INSTALL)
  221 + SET(PYTHON_SITE_PACKAGES_DIR ${DMAP_DATA_DIR}/python)
  222 + ENDIF (NOT BINDINGS_GLOBAL_INSTALL)
  223 +
  224 +# ENDIF (WITH_CORE AND WITH_BINDINGS)
  225 +
  226 +#############################################################
  227 +# create dmpconfig.h
  228 +# installed with app target
  229 +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake_templates/dmpconfig.h.in ${CMAKE_BINARY_DIR}/dmpconfig.h)
  230 +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
  231 +
  232 +#[[
  233 +message(STATUS "Project will be installed to ${CMAKE_INSTALL_PREFIX}")
  234 +
  235 +include(GNUInstallDirs)
  236 +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
  237 +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
  238 +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
  239 +
  240 +set(INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
  241 +set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for executables")
  242 +set(INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for header files")
  243 +
  244 +# Report to user
  245 +foreach(p LIB BIN INCLUDE CMAKE)
  246 + file(TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${INSTALL_${p}DIR} _path )
  247 + message(STATUS "Installing ${p} components to ${_path}")
  248 + unset(_path)
  249 +endforeach()
  250 +]]
  251 +#############################################################
  252 +# process subdirs
  253 +
  254 +ADD_SUBDIRECTORY(apache)
  255 +ADD_SUBDIRECTORY(src)
  256 +ADD_SUBDIRECTORY(python)
  257 +
  258 +include(Dart)
  259 +# enable testing and define tests
  260 +enable_testing()
  261 +add_subdirectory(tests)
  262 +
  263 +
  1 +
  2 +option(WITH_APACHE "Build Apache Module" ON)
  3 +
  4 +if(WITH_APACHE)
  5 + add_library(mod_dmapserver MODULE mod_dmapserver.c)
  6 + set_target_properties(mod_dmapserver PROPERTIES PREFIX "")
  7 +
  8 + find_package(APACHE)
  9 + if(APACHE_FOUND)
  10 + include_directories(${APACHE_INCLUDE_DIR})
  11 + target_link_libraries(mod_dmapserver ${APACHE_LIBRARY})
  12 + else(APACHE_FOUND)
  13 + MESSAGE (SEND_ERROR "APACHE dependency was not found!")
  14 + endif(APACHE_FOUND)
  15 +
  16 + find_package(APR)
  17 + if(APR_FOUND)
  18 + include_directories(${APR_INCLUDE_DIR} ${APU_INCLUDE_DIR})
  19 + target_link_libraries(mod_dmapserver ${APR_LIBRARY} ${APU_LIBRARY})
  20 + if(DEFINED APR_CPPFLAGS)
  21 + add_definitions("${APR_CPPFLAGS}")
  22 + endif(DEFINED APR_CPPFLAGS)
  23 + else(APR_FOUND)
  24 + MESSAGE (SEND_ERROR "APR dependency was not found!")
  25 + endif(APR_FOUND)
  26 +
  27 + if(APACHE_MODULE_DIR)
  28 + INSTALL(TARGETS mod_dmapserver DESTINATION ${APACHE_MODULE_DIR})
  29 + endif(APACHE_MODULE_DIR)
  30 +else(WITH_APACHE)
  31 + message(STATUS " * Apache Module support status: DISABLED")
  32 +endif(WITH_APACHE)
  1 +/* Include the required headers from httpd */
  2 +#include "httpd.h"
  3 +#include "http_core.h"
  4 +#include "http_protocol.h"
  5 +#include "http_request.h"
  6 +
  7 +/* Define prototypes of our functions in this module */
  8 +static void register_hooks(apr_pool_t *pool);
  9 +static int example_handler(request_rec *r);
  10 +
  11 +/* Define our module as an entity and assign a function for registering hooks */
  12 +
  13 +module AP_MODULE_DECLARE_DATA example_module =
  14 +{
  15 + STANDARD20_MODULE_STUFF,
  16 + NULL, // Per-directory configuration handler
  17 + NULL, // Merge handler for per-directory configurations
  18 + NULL, // Per-server configuration handler
  19 + NULL, // Merge handler for per-server configurations
  20 + NULL, // Any directives we may have for httpd
  21 + register_hooks // Our hook registering function
  22 +};
  23 +
  24 +
  25 +/* register_hooks: Adds a hook to the httpd process */
  26 +static void register_hooks(apr_pool_t *pool)
  27 +{
  28 +
  29 + /* Hook the request handler */
  30 + ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
  31 +}
  32 +
  33 +/* The handler function for our module.
  34 + * This is where all the fun happens!
  35 + */
  36 +
  37 +static int example_handler(request_rec *r)
  38 +{
  39 + /* First off, we need to check if this is a call for the "example" handler.
  40 + * If it is, we accept it and do our things, it not, we simply return DECLINED,
  41 + * and Apache will try somewhere else.
  42 + */
  43 + if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
  44 +
  45 + // The first thing we will do is write a simple "Hello, world!" back to the client.
  46 + ap_rputs("Hello, world!<br/>", r);
  47 + return OK;
  48 +}
  1 +#
  2 +# APACHE_FOUND - System has APACHE
  3 +# APACHE_INCLUDE_DIR - The APACHE include directory
  4 +#
  5 +# APACHE_LOCATION
  6 +# setting this enables search for apache libraries / headers in this location
  7 +
  8 +#
  9 +# Include directories
  10 +#
  11 +find_path(APACHE_INCLUDE_DIR
  12 + NAMES httpd.h
  13 + PATH_SUFFIXES httpd apache apache2 apache22 apache24
  14 +)
  15 +
  16 +if(NOT DEFINED APACHE_MODULE_DIR)
  17 + find_program(APXS_BIN NAMES apxs apxs2
  18 + PATH_SUFFIXES httpd apache apache2
  19 + )
  20 +
  21 + if(APXS_BIN)
  22 + EXECUTE_PROCESS(COMMAND ${APXS_BIN} -q LIBEXECDIR
  23 + OUTPUT_VARIABLE APACHE_MODULE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
  24 + endif(APXS_BIN)
  25 +endif(NOT DEFINED APACHE_MODULE_DIR)
  26 +
  27 +include(FindPackageHandleStandardArgs)
  28 +# handle the QUIETLY and REQUIRED arguments and set APACHE_FOUND to TRUE if
  29 +# all listed variables are TRUE
  30 +find_package_handle_standard_args(APACHE DEFAULT_MSG APACHE_INCLUDE_DIR )
  31 +mark_as_advanced(APACHE_INCLUDE_DIR)
  1 +# Licensed to the Apache Software Foundation (ASF) under one
  2 +# or more contributor license agreements. See the NOTICE file
  3 +# distributed with this work for additional information
  4 +# regarding copyright ownership. The ASF licenses this file
  5 +# to you under the Apache License, Version 2.0 (the
  6 +# "License"); you may not use this file except in compliance
  7 +# with the License. You may obtain a copy of the License at
  8 +#
  9 +# http://www.apache.org/licenses/LICENSE-2.0
  10 +#
  11 +# Unless required by applicable law or agreed to in writing,
  12 +# software distributed under the License is distributed on an
  13 +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14 +# KIND, either express or implied. See the License for the
  15 +# specific language governing permissions and limitations
  16 +# under the License.
  17 +
  18 +# - Find Apache Portable Runtime
  19 +# Find the APR includes and libraries
  20 +# This module defines
  21 +# APR_INCLUDE_DIR and APRUTIL_INCLUDE_DIR, where to find apr.h, etc.
  22 +# APR_LIBRARIES and APRUTIL_LIBRARIES, the libraries needed to use APR.
  23 +# APR_FOUND and APRUTIL_FOUND, If false, do not try to use APR.
  24 +# also defined, but not for general use are
  25 +# APR_LIBRARY and APRUTIL_LIBRARY, where to find the APR library.
  26 +
  27 +# APR first.
  28 +
  29 +FIND_PROGRAM(APR_CONFIG_BIN
  30 + NAMES apr-config apr-1-config )
  31 +
  32 +if(APR_CONFIG_BIN)
  33 + execute_process(
  34 + COMMAND ${APR_CONFIG_BIN} --includedir
  35 + OUTPUT_VARIABLE HINT_APR_INCLUDE_DIR
  36 + OUTPUT_STRIP_TRAILING_WHITESPACE
  37 + )
  38 + execute_process(
  39 + COMMAND ${APR_CONFIG_BIN} --cppflags
  40 + OUTPUT_VARIABLE APR_CPPFLAGS
  41 + OUTPUT_STRIP_TRAILING_WHITESPACE
  42 + )
  43 +endif(APR_CONFIG_BIN)
  44 +
  45 +FIND_PATH(APR_INCLUDE_DIR
  46 + NAMES apr.h
  47 + HINTS ${HINT_APR_INCLUDE_DIR}
  48 + PATH_SUFFIXES apr-1 apr-1.0 apr
  49 +)
  50 +
  51 +FIND_LIBRARY(APR_LIBRARY
  52 + NAMES apr-1 apr
  53 + PATH_SUFFIXES apr-1 apr-1.0 apr
  54 +)
  55 +
  56 +set(APR_INCLUDE_DIRS ${APR_INCLUDE_DIR})
  57 +set(APR_LIBRARIES ${APR_LIBRARY})
  58 +include(FindPackageHandleStandardArgs)
  59 +find_package_handle_standard_args(APR DEFAULT_MSG APR_LIBRARY APR_INCLUDE_DIR)
  60 +mark_as_advanced(APR_LIBRARY APR_INCLUDE_DIR)
  61 +
  62 +# Next, APRUTIL.
  63 +
  64 +FIND_PATH(APU_INCLUDE_DIR
  65 + NAMES apu.h
  66 + PATH_SUFFIXES apr-1 apr-1.0 apr
  67 +)
  68 +
  69 +FIND_LIBRARY(APU_LIBRARY
  70 + NAMES aprutil-1 aprutil
  71 + PATH_SUFFIXES apr-1 apr-1.0 apr
  72 +)
  73 +
  74 +
  75 +set(APU_INCLUDE_DIRS ${APU_INCLUDE_DIR})
  76 +set(APU_LIBRARIES ${APU_LIBRARY})
  77 +find_package_handle_standard_args(APU DEFAULT_MSG APU_LIBRARY APU_INCLUDE_DIR)
  78 +mark_as_advanced(APU_LIBRARY APU_INCLUDE_DIR)
  1 +# - Try to find the CAIRO library
  2 +# Once done this will define
  3 +#
  4 +# CAIRO_ROOT_DIR - Set this variable to the root installation of CAIRO
  5 +#
  6 +# Read-Only variables:
  7 +# CAIRO_FOUND - system has the CAIRO library
  8 +# CAIRO_INCLUDE_DIR - the CAIRO include directory
  9 +# CAIRO_LIBRARIES - The libraries needed to use CAIRO
  10 +# CAIRO_VERSION - This is set to $major.$minor.$revision (eg. 0.9.8)
  11 +
  12 +#=============================================================================
  13 +# Copyright 2012 Dmitry Baryshnikov <polimax at mail dot ru>
  14 +#
  15 +# Distributed under the OSI-approved BSD License (the "License");
  16 +# see accompanying file Copyright.txt for details.
  17 +#
  18 +# This software is distributed WITHOUT ANY WARRANTY; without even the
  19 +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  20 +# See the License for more information.
  21 +#=============================================================================
  22 +# (To distribute this file outside of CMake, substitute the full
  23 +# License text for the above reference.)
  24 +
  25 +find_package(PkgConfig)
  26 +
  27 +if(PKG_CONFIG_FOUND)
  28 + pkg_check_modules(_CAIRO cairo)
  29 +endif (PKG_CONFIG_FOUND)
  30 +
  31 +SET(_CAIRO_ROOT_HINTS
  32 + $ENV{CAIRO}
  33 + ${CAIRO_ROOT_DIR}
  34 + )
  35 +SET(_CAIRO_ROOT_PATHS
  36 + $ENV{CAIRO}/src
  37 + /usr
  38 + /usr/local
  39 + )
  40 +SET(_CAIRO_ROOT_HINTS_AND_PATHS
  41 + HINTS ${_CAIRO_ROOT_HINTS}
  42 + PATHS ${_CAIRO_ROOT_PATHS}
  43 + )
  44 +
  45 +FIND_PATH(CAIRO_INCLUDE_DIR
  46 + NAMES
  47 + cairo.h
  48 + HINTS
  49 + ${_CAIRO_INCLUDEDIR}
  50 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  51 + PATH_SUFFIXES
  52 + include
  53 + "include/cairo"
  54 +)
  55 +
  56 +IF(NOT PKGCONFIG_FOUND AND WIN32 AND NOT CYGWIN)
  57 + # MINGW should go here too
  58 + IF(MSVC)
  59 + # Implementation details:
  60 + # We are using the libraries located in the VC subdir instead of the parent directory eventhough :
  61 + FIND_LIBRARY(CAIRO_DEBUG
  62 + NAMES
  63 + cairod
  64 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  65 + PATH_SUFFIXES
  66 + "lib"
  67 + "VC"
  68 + "lib/VC"
  69 + )
  70 +
  71 + FIND_LIBRARY(CAIRO_RELEASE
  72 + NAMES
  73 + cairo
  74 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  75 + PATH_SUFFIXES
  76 + "lib"
  77 + "VC"
  78 + "lib/VC"
  79 + )
  80 +
  81 + if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
  82 + if(NOT CAIRO_DEBUG)
  83 + set(CAIRO_DEBUG ${CAIRO_RELEASE})
  84 + endif(NOT CAIRO_DEBUG)
  85 + set( CAIRO_LIBRARIES
  86 + optimized ${CAIRO_RELEASE} debug ${CAIRO_DEBUG}
  87 + )
  88 + else()
  89 + set( CAIRO_LIBRARIES ${CAIRO_RELEASE})
  90 + endif()
  91 + MARK_AS_ADVANCED(CAIRO_DEBUG CAIRO_RELEASE)
  92 + ELSEIF(MINGW)
  93 + # same player, for MingW
  94 + FIND_LIBRARY(CAIRO
  95 + NAMES
  96 + cairo
  97 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  98 + PATH_SUFFIXES
  99 + "lib"
  100 + "lib/MinGW"
  101 + )
  102 +
  103 + MARK_AS_ADVANCED(CAIRO)
  104 + set( CAIRO_LIBRARIES ${CAIRO})
  105 + ELSE(MSVC)
  106 + # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
  107 + FIND_LIBRARY(CAIRO
  108 + NAMES
  109 + cairo
  110 + HINTS
  111 + ${_CAIRO_LIBDIR}
  112 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  113 + PATH_SUFFIXES
  114 + lib
  115 + )
  116 +
  117 + MARK_AS_ADVANCED(CAIRO)
  118 + set( CAIRO_LIBRARIES ${CAIRO} )
  119 + ENDIF(MSVC)
  120 +ELSE()
  121 +
  122 + FIND_LIBRARY(CAIRO_LIBRARY
  123 + NAMES
  124 + cairo
  125 + HINTS
  126 + ${_CAIRO_LIBDIR}
  127 + ${_CAIRO_ROOT_HINTS_AND_PATHS}
  128 + PATH_SUFFIXES
  129 + "lib"
  130 + "local/lib"
  131 + )
  132 +
  133 + MARK_AS_ADVANCED(CAIRO_LIBRARY)
  134 +
  135 + # compat defines
  136 + SET(CAIRO_LIBRARIES ${CAIRO_LIBRARY})
  137 +
  138 +ENDIF()
  139 +
  140 +#message( STATUS "Cairo_FIND_VERSION=${Cairo_FIND_VERSION}.")
  141 +#message( STATUS "CAIRO_INCLUDE_DIR=${CAIRO_INCLUDE_DIR}.")
  142 +
  143 +# Fetch version from cairo-version.h if a version was requested by find_package()
  144 +if(CAIRO_INCLUDE_DIR AND Cairo_FIND_VERSION)
  145 + file(READ "${CAIRO_INCLUDE_DIR}/cairo-version.h" _CAIRO_VERSION_H_CONTENTS)
  146 + string(REGEX REPLACE "^(.*\n)?#define[ \t]+CAIRO_VERSION_MAJOR[ \t]+([0-9]+).*"
  147 + "\\2" CAIRO_VERSION_MAJOR ${_CAIRO_VERSION_H_CONTENTS})
  148 + string(REGEX REPLACE "^(.*\n)?#define[ \t]+CAIRO_VERSION_MINOR[ \t]+([0-9]+).*"
  149 + "\\2" CAIRO_VERSION_MINOR ${_CAIRO_VERSION_H_CONTENTS})
  150 + string(REGEX REPLACE "^(.*\n)?#define[ \t]+CAIRO_VERSION_MICRO[ \t]+([0-9]+).*"
  151 + "\\2" CAIRO_VERSION_MICRO ${_CAIRO_VERSION_H_CONTENTS})
  152 + set(CAIRO_VERSION ${CAIRO_VERSION_MAJOR}.${CAIRO_VERSION_MINOR}.${CAIRO_VERSION_MICRO}
  153 + CACHE INTERNAL "The version number for Cairo libraries")
  154 +endif()
  155 +
  156 +include(FindPackageHandleStandardArgs)
  157 +
  158 +find_package_handle_standard_args(Cairo
  159 + REQUIRED_VARS
  160 + CAIRO_LIBRARIES
  161 + CAIRO_INCLUDE_DIR
  162 + VERSION_VAR
  163 + CAIRO_VERSION
  164 +)
  165 +
  166 +MARK_AS_ADVANCED(CAIRO_INCLUDE_DIR CAIRO_LIBRARIES)
  1 +# CMake module to search for FastCGI headers
  2 +#
  3 +# If it's found it sets FCGI_FOUND to TRUE
  4 +# and following variables are set:
  5 +# FCGI_INCLUDE_DIR
  6 +# FCGI_LIBRARY
  7 +FIND_PATH(FCGI_INCLUDE_DIR
  8 + fcgio.h
  9 + PATHS
  10 + /usr/include
  11 + /usr/local/include
  12 + /usr/include/fastcgi
  13 + "$ENV{LIB_DIR}/include"
  14 + $ENV{INCLUDE}
  15 + )
  16 +FIND_LIBRARY(FCGI_LIBRARY NAMES fcgi libfcgi PATHS
  17 + /usr/local/lib
  18 + /usr/lib
  19 + "$ENV{LIB_DIR}/lib"
  20 + "$ENV{LIB}"
  21 + )
  22 +
  23 +IF (FCGI_INCLUDE_DIR AND FCGI_LIBRARY)
  24 + SET(FCGI_FOUND TRUE)
  25 +ENDIF (FCGI_INCLUDE_DIR AND FCGI_LIBRARY)
  26 +
  27 +IF (FCGI_FOUND)
  28 + IF (NOT FCGI_FIND_QUIETLY)
  29 + MESSAGE(STATUS "Found FCGI: ${FCGI_LIBRARY}")
  30 + ENDIF (NOT FCGI_FIND_QUIETLY)
  31 +ELSE (FCGI_FOUND)
  32 + IF (FCGI_FIND_REQUIRED)
  33 + MESSAGE(FATAL_ERROR "Could not find FCGI")
  34 + ENDIF (FCGI_FIND_REQUIRED)
  35 +ENDIF (FCGI_FOUND)
  1 +# - Find LibEvent (a cross event library)
  2 +# This module defines
  3 +# LIBEVENT_INCLUDE_DIR, where to find LibEvent headers
  4 +# LIBEVENT_LIB, LibEvent libraries
  5 +# LibEvent_FOUND, If false, do not try to use libevent
  6 +
  7 +set(LibEvent_EXTRA_PREFIXES /usr/local /opt/local "$ENV{HOME}")
  8 +foreach(prefix ${LibEvent_EXTRA_PREFIXES})
  9 + list(APPEND LibEvent_INCLUDE_PATHS "${prefix}/include")
  10 + list(APPEND LibEvent_LIB_PATHS "${prefix}/lib")
  11 +endforeach()
  12 +
  13 +find_path(LIBEVENT_INCLUDE_DIR event.h PATHS ${LibEvent_INCLUDE_PATHS})
  14 +find_library(LIBEVENT_LIB NAMES event PATHS ${LibEvent_LIB_PATHS})
  15 +find_library(LIBEVENT_PTHREAD_LIB NAMES event_pthreads PATHS ${LibEvent_LIB_PATHS})
  16 +
  17 +if (LIBEVENT_LIB AND LIBEVENT_INCLUDE_DIR AND LIBEVENT_PTHREAD_LIB)
  18 + set(LibEvent_FOUND TRUE)
  19 + set(LIBEVENT_LIB ${LIBEVENT_LIB} ${LIBEVENT_PTHREAD_LIB})
  20 +else ()
  21 + set(LibEvent_FOUND FALSE)
  22 +endif ()
  23 +
  24 +if (LibEvent_FOUND)
  25 + if (NOT LibEvent_FIND_QUIETLY)
  26 + message(STATUS "Found libevent: ${LIBEVENT_LIB}")
  27 + endif ()
  28 +else ()
  29 + if (LibEvent_FIND_REQUIRED)
  30 + message(FATAL_ERROR "Could NOT find libevent and libevent_pthread.")
  31 + endif ()
  32 + message(STATUS "libevent and libevent_pthread NOT found.")
  33 +endif ()
  34 +
  35 +mark_as_advanced(
  36 + LIBEVENT_LIB
  37 + LIBEVENT_INCLUDE_DIR
  38 + )
  1 +# -*- coding: utf-8 -*-
  2 +#
  3 +# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
  4 +# All rights reserved.
  5 +#
  6 +# Redistribution and use in source and binary forms, with or without
  7 +# modification, are permitted provided that the following conditions are met:
  8 +# * Redistributions of source code must retain the above copyright
  9 +# notice, this list of conditions and the following disclaimer.
  10 +# * Redistributions in binary form must reproduce the above copyright
  11 +# notice, this list of conditions and the following disclaimer in the
  12 +# documentation and/or other materials provided with the distribution.
  13 +# * Neither the name of the Simon Edwards <simon@simonzone.com> nor the
  14 +# names of its contributors may be used to endorse or promote products
  15 +# derived from this software without specific prior written permission.
  16 +#
  17 +# THIS SOFTWARE IS PROVIDED BY Simon Edwards <simon@simonzone.com> ''AS IS'' AND ANY
  18 +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19 +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20 +# DISCLAIMED. IN NO EVENT SHALL Simon Edwards <simon@simonzone.com> BE LIABLE FOR ANY
  21 +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22 +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23 +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24 +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25 +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26 +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27 +#
  28 +# FindLibPython.py
  29 +# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
  30 +# Redistribution and use is allowed according to the terms of the BSD license.
  31 +# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
  32 +
  33 +import sys
  34 +import distutils.sysconfig
  35 +
  36 +print("exec_prefix:%s" % sys.exec_prefix)
  37 +print("short_version:%s" % sys.version[:3])
  38 +print("long_version:%s" % sys.version.split()[0])
  39 +print("py_inc_dir:%s" % distutils.sysconfig.get_python_inc())
  40 +print("site_packages_dir:%s" % distutils.sysconfig.get_python_lib(plat_specific=1))
  1 +# Find PostgreSQL
  2 +# ~~~~~~~~~~~~~~~
  3 +# Copyright (c) 2007, Martin Dobias <wonder.sk at gmail.com>
  4 +# Redistribution and use is allowed according to the terms of the BSD license.
  5 +# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
  6 +#
  7 +# CMake module to search for PostgreSQL library
  8 +#
  9 +# pg_config is searched for in POSTGRES_CONFIG dir,
  10 +# default /usr/bin
  11 +#
  12 +# If it's found it sets POSTGRES_FOUND to TRUE
  13 +# and following variables are set:
  14 +# POSTGRES_INCLUDE_DIR
  15 +# POSTGRES_LIBRARY
  16 +
  17 +IF(ANDROID)
  18 + SET(POSTGRES_INCLUDE_DIR ${POSTGRES_INCLUDE_DIR} CACHE STRING INTERNAL)
  19 + SET(POSTGRES_LIBRARY ${PG_TMP}/libpq.so CACHE STRING INTERNAL)
  20 +ENDIF(ANDROID)
  21 +
  22 +IF(WIN32 AND NOT ANDROID)
  23 + IF (NOT POSTGRES_INCLUDE_DIR)
  24 + FIND_PATH(POSTGRES_INCLUDE_DIR libpq-fe.h
  25 + /usr/local/include
  26 + /usr/include
  27 + c:/msys/local/include
  28 + "$ENV{LIB_DIR}/include/postgresql"
  29 + "$ENV{LIB_DIR}/include"
  30 + )
  31 + ENDIF (NOT POSTGRES_INCLUDE_DIR)
  32 +
  33 + IF (NOT POSTGRES_LIBRARY)
  34 + FIND_LIBRARY(POSTGRES_LIBRARY NAMES pq libpq libpqdll PATHS
  35 + /usr/local/lib
  36 + /usr/lib
  37 + c:/msys/local/lib
  38 + "$ENV{LIB_DIR}/lib"
  39 + )
  40 + ENDIF (NOT POSTGRES_LIBRARY)
  41 +
  42 +ELSE(WIN32)
  43 + IF(UNIX)
  44 +
  45 + SET(POSTGRES_CONFIG_PREFER_PATH "$ENV{POSTGRES_HOME}/bin" CACHE STRING "preferred path to PG (pg_config)")
  46 + FIND_PROGRAM(POSTGRES_CONFIG pg_config
  47 + ${POSTGRES_CONFIG_PREFER_PATH}
  48 + /usr/local/pgsql/bin/
  49 + /usr/local/bin/
  50 + /usr/bin/
  51 + )
  52 + # MESSAGE("DBG POSTGRES_CONFIG ${POSTGRES_CONFIG}")
  53 +
  54 + IF (POSTGRES_CONFIG)
  55 + # set INCLUDE_DIR
  56 + EXEC_PROGRAM(${POSTGRES_CONFIG}
  57 + ARGS --includedir
  58 + OUTPUT_VARIABLE PG_TMP)
  59 + SET(POSTGRES_INCLUDE_DIR ${PG_TMP} CACHE STRING INTERNAL)
  60 +
  61 + # set LIBRARY_DIR
  62 + EXEC_PROGRAM(${POSTGRES_CONFIG}
  63 + ARGS --libdir
  64 + OUTPUT_VARIABLE PG_TMP)
  65 + IF (APPLE)
  66 + SET(POSTGRES_LIBRARY ${PG_TMP}/libpq.dylib CACHE STRING INTERNAL)
  67 + ELSEIF (CYGWIN)
  68 + EXEC_PROGRAM(${POSTGRES_CONFIG}
  69 + ARGS --libs
  70 + OUTPUT_VARIABLE PG_TMP)
  71 +
  72 + STRING(REGEX MATCHALL "[-][L]([^ ;])+" _LDIRS "${PG_TMP}")
  73 + STRING(REGEX MATCHALL "[-][l]([^ ;])+" _LLIBS "${PG_TMP}")
  74 +
  75 + FIND_LIBRARY(POSTGRES_LIBRARY NAMES pq PATHS /usr/lib /usr/local/lib)
  76 +
  77 + SET(_DIRS)
  78 + FOREACH(_DIR ${_LDIRS})
  79 + STRING(REPLACE "-L" "" _DIR ${_DIR})
  80 + SET(_DIRS ${_DIRS} ${_DIR})
  81 + ENDFOREACH(_DIR ${_LDIRS})
  82 +
  83 + SET(_LIBS)
  84 + FOREACH(_LIB ${_LLIBS})
  85 + STRING(REPLACE "-l" "" _LIB ${_LIB})
  86 + SET(_LIBS ${_LIBS} ${_LIB})
  87 + ENDFOREACH(_LIB ${_LDIRS})
  88 +
  89 + FOREACH(_LIBNAME ${_LIBS})
  90 + UNSET(PG_LIB CACHE)
  91 + FIND_LIBRARY(PG_LIB NAMES ${_LIBNAME} PATHS ${_DIRS} /usr/lib /usr/local/lib)
  92 + IF(NOT PG_LIB)
  93 + MESSAGE(FATAL "PostgreSQL dependency library ${_LIBNAME} not found")
  94 + ENDIF(NOT PG_LIB)
  95 + SET(POSTGRES_LIBRARY ${POSTGRES_LIBRARY} ${PG_LIB})
  96 + ENDFOREACH(_LIBNAME ${_LIBS})
  97 +
  98 + ELSE (CYGWIN)
  99 + FIND_LIBRARY(POSTGRES_LIBRARY NAMES pq libpq libpqdll PATHS ${PG_TMP}/lib)
  100 + ENDIF (APPLE)
  101 + ENDIF(POSTGRES_CONFIG)
  102 +
  103 + ENDIF(UNIX)
  104 +ENDIF(WIN32 AND NOT ANDROID)
  105 +
  106 +
  107 +IF (POSTGRES_INCLUDE_DIR AND POSTGRES_LIBRARY)
  108 + SET(POSTGRES_FOUND TRUE)
  109 + IF(EXISTS "${POSTGRES_INCLUDE_DIR}/pg_config.h")
  110 + SET(HAVE_PGCONFIG TRUE)
  111 + ELSE(EXISTS "${POSTGRES_INCLUDE_DIR}/pg_config.h")
  112 + SET(HAVE_PGCONFIG FALSE)
  113 + ENDIF(EXISTS "${POSTGRES_INCLUDE_DIR}/pg_config.h")
  114 +ENDIF (POSTGRES_INCLUDE_DIR AND POSTGRES_LIBRARY)
  115 +
  116 +
  117 +IF (POSTGRES_FOUND)
  118 +
  119 + IF (NOT POSTGRES_FIND_QUIETLY)
  120 + MESSAGE(STATUS "Found PostgreSQL: ${POSTGRES_LIBRARY}")
  121 + ENDIF (NOT POSTGRES_FIND_QUIETLY)
  122 +
  123 +ELSE (POSTGRES_FOUND)
  124 +
  125 + #SET (POSTGRES_INCLUDE_DIR "")
  126 + #SET (POSTGRES_LIBRARY "")
  127 +
  128 + IF (POSTGRES_FIND_REQUIRED)
  129 + MESSAGE(FATAL_ERROR "Could not find PostgreSQL")
  130 + ELSE (POSTGRES_FIND_REQUIRED)
  131 + MESSAGE(STATUS "Could not find PostgreSQL")
  132 + ENDIF (POSTGRES_FIND_REQUIRED)
  133 +
  134 +ENDIF (POSTGRES_FOUND)
  1 +# Find Python
  2 +# ~~~~~~~~~~~
  3 +# Find the Python interpreter and related Python directories.
  4 +#
  5 +# This file defines the following variables:
  6 +#
  7 +# PYTHON_EXECUTABLE - The path and filename of the Python interpreter.
  8 +#
  9 +# PYTHON_SHORT_VERSION - The version of the Python interpreter found,
  10 +# excluding the patch version number. (e.g. 2.5 and not 2.5.1))
  11 +#
  12 +# PYTHON_LONG_VERSION - The version of the Python interpreter found as a human
  13 +# readable string.
  14 +#
  15 +# PYTHON_SITE_PACKAGES_DIR - Location of the Python site-packages directory.
  16 +#
  17 +# PYTHON_INCLUDE_PATH - Directory holding the python.h include file.
  18 +#
  19 +# PYTHON_LIBRARY, PYTHON_LIBRARIES- Location of the Python library.
  20 +
  21 +# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
  22 +# Redistribution and use is allowed according to the terms of the BSD license.
  23 +# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
  24 +
  25 +
  26 +
  27 +INCLUDE(CMakeFindFrameworks)
  28 +
  29 +if(EXISTS "${PYTHON_INCLUDE_PATH}" AND EXISTS "${PYTHON_LIBRARY}" AND EXISTS "${PYTHON_SITE_PACKAGES_DIR}")
  30 + # Already in cache, be silent
  31 + set(PYTHONLIBRARY_FOUND TRUE)
  32 +else(EXISTS "${PYTHON_INCLUDE_PATH}" AND EXISTS "${PYTHON_LIBRARY}" AND EXISTS "${PYTHON_SITE_PACKAGES_DIR}")
  33 +
  34 + FIND_PACKAGE(PythonInterp 3)
  35 +
  36 + if(PYTHONINTERP_FOUND)
  37 + FIND_FILE(_find_lib_python_py FindLibPython.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)
  38 +
  39 + EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_lib_python_py} OUTPUT_VARIABLE python_config)
  40 + if(python_config)
  41 + STRING(REGEX REPLACE ".*exec_prefix:([^\n]+).*$" "\\1" PYTHON_PREFIX ${python_config})
  42 + STRING(REGEX REPLACE ".*\nshort_version:([^\n]+).*$" "\\1" PYTHON_SHORT_VERSION ${python_config})
  43 + STRING(REGEX REPLACE ".*\nlong_version:([^\n]+).*$" "\\1" PYTHON_LONG_VERSION ${python_config})
  44 + STRING(REGEX REPLACE ".*\npy_inc_dir:([^\n]+).*$" "\\1" PYTHON_INCLUDE_PATH ${python_config})
  45 + if(NOT PYTHON_SITE_PACKAGES_DIR)
  46 + if(NOT PYTHON_LIBS_WITH_KDE_LIBS)
  47 + STRING(REGEX REPLACE ".*\nsite_packages_dir:([^\n]+).*$" "\\1" PYTHON_SITE_PACKAGES_DIR ${python_config})
  48 + else(NOT PYTHON_LIBS_WITH_KDE_LIBS)
  49 + set(PYTHON_SITE_PACKAGES_DIR ${KDE4_LIB_INSTALL_DIR}/python${PYTHON_SHORT_VERSION}/site-packages)
  50 + endif(NOT PYTHON_LIBS_WITH_KDE_LIBS)
  51 + endif(NOT PYTHON_SITE_PACKAGES_DIR)
  52 + STRING(REGEX REPLACE "([0-9]+).([0-9]+)" "\\1\\2" PYTHON_SHORT_VERSION_NO_DOT ${PYTHON_SHORT_VERSION})
  53 + set(PYTHON_LIBRARY_NAMES python${PYTHON_SHORT_VERSION} python${PYTHON_SHORT_VERSION_NO_DOT} python${PYTHON_SHORT_VERSION}m python${PYTHON_SHORT_VERSION_NO_DOT}m)
  54 + if(WIN32)
  55 + STRING(REPLACE "\\" "/" PYTHON_SITE_PACKAGES_DIR ${PYTHON_SITE_PACKAGES_DIR})
  56 + FIND_LIBRARY(PYTHON_LIBRARY NAMES ${PYTHON_LIBRARY_NAMES} PATHS ${PYTHON_PREFIX}/lib ${PYTHON_PREFIX}/libs)
  57 + endif(WIN32)
  58 + FIND_LIBRARY(PYTHON_LIBRARY NAMES ${PYTHON_LIBRARY_NAMES})
  59 + set(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE_PATH} CACHE FILEPATH "Directory holding the python.h include file" FORCE)
  60 + set(PYTHONLIBRARY_FOUND TRUE)
  61 + endif(python_config)
  62 +
  63 + # adapted from cmake's builtin FindPythonLibs
  64 + if(APPLE)
  65 + # If a framework has been detected in the include path, make sure
  66 + # framework's versioned library (not any .dylib) is used for linking
  67 + # NOTE: don't rely upon Python.framework/Versions/Current, since that may be 2.7
  68 + if("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework")
  69 + set(PYTHON_LIBRARY "")
  70 + set(PYTHON_DEBUG_LIBRARY "")
  71 + # get clean path to just framework
  72 + STRING(REGEX REPLACE "^(.*/Python\\.framework).*$" "\\1" _py_fw "${PYTHON_INCLUDE_PATH}")
  73 + if("${_py_fw}" MATCHES "Cellar/python")
  74 + # Appears to be a Homebrew Python install; do specific fix ups
  75 + # get Homebrew prefix (may not be /usr/local)
  76 + STRING(REGEX REPLACE "^(.+)/Cellar.*$" "\\1" _hb_prefix "${_py_fw}")
  77 + # prefer the Homebrew prefix framework over only versioned Python keg
  78 + set(_py_fw "${_hb_prefix}/Frameworks/Python.framework")
  79 + # prefer the symlinked-to Homebrew site-packages over only versioned Python keg
  80 + set(PYTHON_SITE_PACKAGES_DIR "${_hb_prefix}/lib/python${PYTHON_SHORT_VERSION}/site-packages")
  81 + endif("${_py_fw}" MATCHES "Cellar/python")
  82 + # prefer the Headers subdirectory for includes
  83 + if(EXISTS "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Headers")
  84 + set(PYTHON_INCLUDE_PATH "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Headers" CACHE FILEPATH "Directory holding the python.h include file" FORCE)
  85 + endif(EXISTS "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Headers")
  86 + endif("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework")
  87 + if(NOT PYTHON_LIBRARY)
  88 + # ensure the versioned framework's library is defined, instead of relying upon -F search paths
  89 + if(EXISTS "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Python")
  90 + set(PYTHON_LIBRARY "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Python" CACHE FILEPATH "Python framework library" FORCE)
  91 + endif(EXISTS "${_py_fw}/Versions/${PYTHON_SHORT_VERSION}/Python")
  92 + endif(NOT PYTHON_LIBRARY)
  93 + if(PYTHON_LIBRARY)
  94 + set(PYTHONLIBRARY_FOUND TRUE)
  95 + endif(PYTHON_LIBRARY)
  96 + endif(APPLE)
  97 + endif(PYTHONINTERP_FOUND)
  98 +
  99 + if(PYTHONLIBRARY_FOUND)
  100 + if(APPLE)
  101 + # keep reference to system or custom python site-packages
  102 + # useful during app-bundling operations
  103 + set(PYTHON_SITE_PACKAGES_SYS ${PYTHON_SITE_PACKAGES_DIR} CACHE FILEPATH "Directory holding Python site packages")
  104 + endif(APPLE)
  105 + set(PYTHON_LIBRARIES ${PYTHON_LIBRARY})
  106 + if(NOT PYTHONLIBRARY_FIND_QUIETLY)
  107 + message(STATUS "Found Python executable: ${PYTHON_EXECUTABLE}")
  108 + message(STATUS "Found Python version: ${PYTHON_LONG_VERSION}")
  109 + message(STATUS "Found Python library: ${PYTHON_LIBRARY}")
  110 + message(STATUS "Found Python site-packages: ${PYTHON_SITE_PACKAGES_DIR}")
  111 + endif(NOT PYTHONLIBRARY_FIND_QUIETLY)
  112 + else(PYTHONLIBRARY_FOUND)
  113 + if(PYTHONLIBRARY_FIND_REQUIRED)
  114 + message(FATAL_ERROR "Could not find Python")
  115 + endif(PYTHONLIBRARY_FIND_REQUIRED)
  116 + endif(PYTHONLIBRARY_FOUND)
  117 +
  118 +endif (EXISTS "${PYTHON_INCLUDE_PATH}" AND EXISTS "${PYTHON_LIBRARY}" AND EXISTS "${PYTHON_SITE_PACKAGES_DIR}")
  1 +# Python macros
  2 +# ~~~~~~~~~~~~~
  3 +# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
  4 +#
  5 +# Redistribution and use is allowed according to the terms of the BSD license.
  6 +# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
  7 +#
  8 +# This file defines the following macros:
  9 +#
  10 +# PYTHON_INSTALL (SOURCE_FILE DESTINATION_DIR)
  11 +# Install the SOURCE_FILE, which is a Python .py file, into the
  12 +# destination directory during install. The file will be byte compiled
  13 +# and both the .py file and .pyc file will be installed.
  14 +
  15 +GET_FILENAME_COMPONENT(PYTHON_MACROS_MODULE_PATH ${CMAKE_CURRENT_LIST_FILE} PATH)
  16 +
  17 +MACRO(PYTHON_INSTALL SOURCE_FILE DESTINATION_DIR)
  18 +
  19 + FIND_FILE(_python_compile_py PythonCompile.py PATHS ${CMAKE_MODULE_PATH})
  20 +
  21 +
  22 + # Install the source file.
  23 + INSTALL(FILES ${SOURCE_FILE} DESTINATION ${DESTINATION_DIR})
  24 +
  25 + # Byte compile and install the .pyc file.
  26 + GET_FILENAME_COMPONENT(_absfilename ${SOURCE_FILE} ABSOLUTE)
  27 + GET_FILENAME_COMPONENT(_filename ${SOURCE_FILE} NAME)
  28 + GET_FILENAME_COMPONENT(_filenamebase ${SOURCE_FILE} NAME_WE)
  29 + GET_FILENAME_COMPONENT(_basepath ${SOURCE_FILE} PATH)
  30 +
  31 + if(WIN32)
  32 + string(REGEX REPLACE ".:/" "/" _basepath "${_basepath}")
  33 + endif(WIN32)
  34 +
  35 + SET(_bin_py ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filename})
  36 + SET(_bin_pyc ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filenamebase}.pyc)
  37 +
  38 + FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_basepath})
  39 +
  40 + SET(_message "-DMESSAGE=Byte-compiling ${_bin_py}")
  41 +
  42 + GET_FILENAME_COMPONENT(_abs_bin_py ${_bin_py} ABSOLUTE)
  43 + IF(_abs_bin_py STREQUAL ${_absfilename}) # Don't copy the file onto itself.
  44 + ADD_CUSTOM_COMMAND(
  45 + TARGET compile_python_files
  46 + COMMAND ${CMAKE_COMMAND} -E echo ${message}
  47 + COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py}
  48 + DEPENDS ${_absfilename}
  49 + )
  50 + ELSE(_abs_bin_py STREQUAL ${_absfilename})
  51 + ADD_CUSTOM_COMMAND(
  52 + TARGET compile_python_files
  53 + COMMAND ${CMAKE_COMMAND} -E echo ${message}
  54 + COMMAND ${CMAKE_COMMAND} -E copy ${_absfilename} ${_bin_py}
  55 + COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py}
  56 + DEPENDS ${_absfilename}
  57 + )
  58 + ENDIF(_abs_bin_py STREQUAL ${_absfilename})
  59 +
  60 + INSTALL(FILES ${_bin_pyc} DESTINATION ${DESTINATION_DIR})
  61 +ENDMACRO(PYTHON_INSTALL)
  1 +/**************************************************************************
  2 +* file: dmpconfig.h.in
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2021-02-24 16:21:32
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +
  10 +#ifndef __dmpconfig_h_in__
  11 +#define __dmpconfig_h_in__
  12 +
  13 +#define VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-${RELEASE_NAME}"
  14 +
  15 +
  16 +#define VERSION_INT ${DMAP_VERSION_INT}
  17 +
  18 +#define RELEASE_NAME "${RELEASE_NAME}"
  19 +
  20 +#define DMAP_PLUGIN_SUBDIR "${DMAP_PLUGIN_SUBDIR}"
  21 +#define DMAP_DATA_SUBDIR "${DMAP_DATA_SUBDIR}"
  22 +#define DMAP_LIBEXEC_SUBDIR "${DMAP_LIBEXEC_SUBDIR}"
  23 +#define DMAP_LIB_SUBDIR "${DMAP_LIB_SUBDIR}"
  24 +#define CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}"
  25 +#define CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}"
  26 +#define DMAP_SERVER_MODULE_SUBDIR "${DMAP_SERVER_MODULE_SUBDIR}"
  27 +
  28 +
  29 +#cmakedefine HAVE_SERVER_PYTHON_PLUGINS
  30 +
  31 +
  32 +
  33 +#endif //__dmpconfig_h_in__
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
  1 +/* src/interfaces/ecpg/include/ecpg_config.h. Generated from ecpg_config.h.in by configure. */
  2 +/* Define to 1 if the system has the type `int64'. */
  3 +/* #undef HAVE_INT64 */
  4 +
  5 +/* Define to 1 if `long int' works and is 64 bits. */
  6 +#define HAVE_LONG_INT_64 1
  7 +
  8 +/* Define to 1 if the system has the type `long long int'. */
  9 +#define HAVE_LONG_LONG_INT 1
  10 +
  11 +/* Define to 1 if `long long int' works and is 64 bits. */
  12 +/* #undef HAVE_LONG_LONG_INT_64 */
  13 +
  14 +/* Define to 1 to build client libraries as thread-safe code.
  15 + * (--enable-thread-safety) */
  16 +#define ENABLE_THREAD_SAFETY 1
  1 +/*
  2 + * This file contains stuff needed to be as compatible to Informix as possible.
  3 + * src/interfaces/ecpg/include/ecpg_informix.h
  4 + */
  5 +#ifndef _ECPG_INFORMIX_H
  6 +#define _ECPG_INFORMIX_H
  7 +
  8 +#include <ecpglib.h>
  9 +#include <pgtypes_date.h>
  10 +#include <pgtypes_interval.h>
  11 +#include <pgtypes_numeric.h>
  12 +#include <pgtypes_timestamp.h>
  13 +
  14 +#define SQLNOTFOUND 100
  15 +
  16 +#define ECPG_INFORMIX_NUM_OVERFLOW -1200
  17 +#define ECPG_INFORMIX_NUM_UNDERFLOW -1201
  18 +#define ECPG_INFORMIX_DIVIDE_ZERO -1202
  19 +#define ECPG_INFORMIX_BAD_YEAR -1204
  20 +#define ECPG_INFORMIX_BAD_MONTH -1205
  21 +#define ECPG_INFORMIX_BAD_DAY -1206
  22 +#define ECPG_INFORMIX_ENOSHORTDATE -1209
  23 +#define ECPG_INFORMIX_DATE_CONVERT -1210
  24 +#define ECPG_INFORMIX_OUT_OF_MEMORY -1211
  25 +#define ECPG_INFORMIX_ENOTDMY -1212
  26 +#define ECPG_INFORMIX_BAD_NUMERIC -1213
  27 +#define ECPG_INFORMIX_BAD_EXPONENT -1216
  28 +#define ECPG_INFORMIX_BAD_DATE -1218
  29 +#define ECPG_INFORMIX_EXTRA_CHARS -1264
  30 +
  31 +#ifdef __cplusplus
  32 +extern "C"
  33 +{
  34 +#endif
  35 +
  36 +extern int rdatestr(date, char *);
  37 +extern void rtoday(date *);
  38 +extern int rjulmdy(date, short *);
  39 +extern int rdefmtdate(date *, const char *, const char *);
  40 +extern int rfmtdate(date, const char *, char *);
  41 +extern int rmdyjul(short *, date *);
  42 +extern int rstrdate(const char *, date *);
  43 +extern int rdayofweek(date);
  44 +
  45 +extern int rfmtlong(long, const char *, char *);
  46 +extern int rgetmsg(int, char *, int);
  47 +extern int risnull(int, const char *);
  48 +extern int rsetnull(int, char *);
  49 +extern int rtypalign(int, int);
  50 +extern int rtypmsize(int, int);
  51 +extern int rtypwidth(int, int);
  52 +extern void rupshift(char *);
  53 +
  54 +extern int byleng(char *, int);
  55 +extern void ldchar(char *, int, char *);
  56 +
  57 +extern void ECPG_informix_set_var(int, void *, int);
  58 +extern void *ECPG_informix_get_var(int);
  59 +extern void ECPG_informix_reset_sqlca(void);
  60 +
  61 +/* Informix defines these in decimal.h */
  62 +int decadd(decimal *, decimal *, decimal *);
  63 +int deccmp(decimal *, decimal *);
  64 +void deccopy(decimal *, decimal *);
  65 +int deccvasc(const char *, int, decimal *);
  66 +int deccvdbl(double, decimal *);
  67 +int deccvint(int, decimal *);
  68 +int deccvlong(long, decimal *);
  69 +int decdiv(decimal *, decimal *, decimal *);
  70 +int decmul(decimal *, decimal *, decimal *);
  71 +int decsub(decimal *, decimal *, decimal *);
  72 +int dectoasc(decimal *, char *, int, int);
  73 +int dectodbl(decimal *, double *);
  74 +int dectoint(decimal *, int *);
  75 +int dectolong(decimal *, long *);
  76 +
  77 +/* Informix defines these in datetime.h */
  78 +extern void dtcurrent(timestamp *);
  79 +extern int dtcvasc(char *, timestamp *);
  80 +extern int dtsub(timestamp *, timestamp *, interval *);
  81 +extern int dttoasc(timestamp *, char *);
  82 +extern int dttofmtasc(timestamp *, char *, int, char *);
  83 +extern int intoasc(interval *, char *);
  84 +extern int dtcvfmtasc(char *, char *, timestamp *);
  85 +
  86 +#ifdef __cplusplus
  87 +}
  88 +#endif
  89 +
  90 +#endif /* ndef _ECPG_INFORMIX_H */
  1 +/* src/interfaces/ecpg/include/ecpgerrno.h */
  2 +
  3 +#ifndef _ECPG_ERRNO_H
  4 +#define _ECPG_ERRNO_H
  5 +
  6 +#include <errno.h>
  7 +
  8 +/* This is a list of all error codes the embedded SQL program can return */
  9 +#define ECPG_NO_ERROR 0
  10 +#define ECPG_NOT_FOUND 100
  11 +
  12 +/* system error codes returned by ecpglib get the correct number,
  13 + * but are made negative
  14 + */
  15 +#define ECPG_OUT_OF_MEMORY -ENOMEM
  16 +
  17 +/* first we have a set of ecpg messages, they start at 200 */
  18 +#define ECPG_UNSUPPORTED -200
  19 +#define ECPG_TOO_MANY_ARGUMENTS -201
  20 +#define ECPG_TOO_FEW_ARGUMENTS -202
  21 +#define ECPG_TOO_MANY_MATCHES -203
  22 +#define ECPG_INT_FORMAT -204
  23 +#define ECPG_UINT_FORMAT -205
  24 +#define ECPG_FLOAT_FORMAT -206
  25 +#define ECPG_NUMERIC_FORMAT -207
  26 +#define ECPG_INTERVAL_FORMAT -208
  27 +#define ECPG_DATE_FORMAT -209
  28 +#define ECPG_TIMESTAMP_FORMAT -210
  29 +#define ECPG_CONVERT_BOOL -211
  30 +#define ECPG_EMPTY -212
  31 +#define ECPG_MISSING_INDICATOR -213
  32 +#define ECPG_NO_ARRAY -214
  33 +#define ECPG_DATA_NOT_ARRAY -215
  34 +#define ECPG_ARRAY_INSERT -216
  35 +
  36 +#define ECPG_NO_CONN -220
  37 +#define ECPG_NOT_CONN -221
  38 +
  39 +#define ECPG_INVALID_STMT -230
  40 +
  41 +/* dynamic SQL related */
  42 +#define ECPG_UNKNOWN_DESCRIPTOR -240
  43 +#define ECPG_INVALID_DESCRIPTOR_INDEX -241
  44 +#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
  45 +#define ECPG_VAR_NOT_NUMERIC -243
  46 +#define ECPG_VAR_NOT_CHAR -244
  47 +
  48 +/* finally the backend error messages, they start at 400 */
  49 +#define ECPG_PGSQL -400
  50 +#define ECPG_TRANS -401
  51 +#define ECPG_CONNECT -402
  52 +#define ECPG_DUPLICATE_KEY -403
  53 +#define ECPG_SUBSELECT_NOT_ONE -404
  54 +
  55 +/* for compatibility we define some different error codes for the same error
  56 + * if adding a new one make sure to not double define it */
  57 +#define ECPG_INFORMIX_DUPLICATE_KEY -239
  58 +#define ECPG_INFORMIX_SUBSELECT_NOT_ONE -284
  59 +
  60 +/* backend WARNINGs, starting at 600 */
  61 +#define ECPG_WARNING_UNRECOGNIZED -600
  62 + /* WARNING: (transaction aborted): queries ignored until END */
  63 +
  64 + /*
  65 + * WARNING: current transaction is aborted, queries ignored until end of
  66 + * transaction block
  67 + */
  68 +#define ECPG_WARNING_QUERY_IGNORED -601
  69 + /* WARNING: PerformPortalClose: portal "*" not found */
  70 +#define ECPG_WARNING_UNKNOWN_PORTAL -602
  71 + /* WARNING: BEGIN: already a transaction in progress */
  72 +#define ECPG_WARNING_IN_TRANSACTION -603
  73 + /* WARNING: AbortTransaction and not in in-progress state */
  74 + /* WARNING: COMMIT: no transaction in progress */
  75 +#define ECPG_WARNING_NO_TRANSACTION -604
  76 + /* WARNING: BlankPortalAssignName: portal * already exists */
  77 +#define ECPG_WARNING_PORTAL_EXISTS -605
  78 +
  79 +#endif /* !_ECPG_ERRNO_H */
  1 +/*
  2 + * this is a small part of c.h since we don't want to leak all postgres
  3 + * definitions into ecpg programs
  4 + * src/interfaces/ecpg/include/ecpglib.h
  5 + */
  6 +
  7 +#ifndef _ECPGLIB_H
  8 +#define _ECPGLIB_H
  9 +
  10 +#include "libpq-fe.h"
  11 +#include "ecpgtype.h"
  12 +#include "sqlca.h"
  13 +#include <string.h>
  14 +
  15 +#ifdef ENABLE_NLS
  16 +extern char *ecpg_gettext(const char *msgid) pg_attribute_format_arg(1);
  17 +#else
  18 +#define ecpg_gettext(x) (x)
  19 +#endif
  20 +
  21 +#ifndef __cplusplus
  22 +#ifndef bool
  23 +#define bool char
  24 +#endif /* ndef bool */
  25 +
  26 +#ifndef true
  27 +#define true ((bool) 1)
  28 +#endif /* ndef true */
  29 +#ifndef false
  30 +#define false ((bool) 0)
  31 +#endif /* ndef false */
  32 +#endif /* not C++ */
  33 +
  34 +#ifndef TRUE
  35 +#define TRUE 1
  36 +#endif /* TRUE */
  37 +
  38 +#ifndef FALSE
  39 +#define FALSE 0
  40 +#endif /* FALSE */
  41 +
  42 +#ifdef __cplusplus
  43 +extern "C"
  44 +{
  45 +#endif
  46 +
  47 +void ECPGdebug(int, FILE *);
  48 +bool ECPGstatus(int, const char *);
  49 +bool ECPGsetcommit(int, const char *, const char *);
  50 +bool ECPGsetconn(int, const char *);
  51 +bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int);
  52 +bool ECPGdo(const int, const int, const int, const char *, const bool, const int, const char *,...);
  53 +bool ECPGtrans(int, const char *, const char *);
  54 +bool ECPGdisconnect(int, const char *);
  55 +bool ECPGprepare(int, const char *, const bool, const char *, const char *);
  56 +bool ECPGdeallocate(int, int, const char *, const char *);
  57 +bool ECPGdeallocate_all(int, int, const char *);
  58 +char *ECPGprepared_statement(const char *, const char *, int);
  59 +PGconn *ECPGget_PGconn(const char *);
  60 +PGTransactionStatusType ECPGtransactionStatus(const char *);
  61 +
  62 +char *ECPGerrmsg(void);
  63 +
  64 + /* print an error message */
  65 +void sqlprint(void);
  66 +
  67 +/* define this for simplicity as well as compatibility */
  68 +
  69 +#define SQLCODE sqlca.sqlcode
  70 +#define SQLSTATE sqlca.sqlstate
  71 +
  72 +/* dynamic SQL */
  73 +
  74 +bool ECPGdo_descriptor(int, const char *, const char *, const char *);
  75 +bool ECPGdeallocate_desc(int, const char *);
  76 +bool ECPGallocate_desc(int, const char *);
  77 +bool ECPGget_desc_header(int, const char *, int *);
  78 +bool ECPGget_desc(int, const char *, int,...);
  79 +bool ECPGset_desc_header(int, const char *, int);
  80 +bool ECPGset_desc(int, const char *, int,...);
  81 +
  82 +void ECPGset_noind_null(enum ECPGttype, void *);
  83 +bool ECPGis_noind_null(enum ECPGttype, const void *);
  84 +bool ECPGdescribe(int, int, bool, const char *, const char *,...);
  85 +
  86 +void ECPGset_var(int, void *, int);
  87 +void *ECPGget_var(int number);
  88 +
  89 +/* dynamic result allocation */
  90 +void ECPGfree_auto_mem(void);
  91 +
  92 +#ifdef ENABLE_THREAD_SAFETY
  93 +void ecpg_pthreads_init(void);
  94 +#endif
  95 +
  96 +#ifdef __cplusplus
  97 +}
  98 +#endif
  99 +
  100 +#endif /* _ECPGLIB_H */
  1 +/*
  2 + * This file implements a data structure that is built and maintained by the
  3 + * preprocessor.
  4 + *
  5 + * All types that can be handled for host variable declarations has to
  6 + * be handled eventually.
  7 + *
  8 + * src/interfaces/ecpg/include/ecpgtype.h
  9 + */
  10 +
  11 +/*
  12 + * Here are all the types that we are to handle. Note that it is the type
  13 + * that is registered and that has nothing whatsoever to do with the storage
  14 + * class.
  15 + *
  16 + * Simple types
  17 + * integers: char, short, int, long (signed and unsigned)
  18 + * floats: float, double
  19 + *
  20 + * Complex types:
  21 + * VARCHAR, VARCHAR2 - Strings with length (maxlen is given in the declaration)
  22 + * Arrays of simple types and of VARCHAR, VARCHAR2 (size given in declaration)
  23 + * Records build of simple types, arrays and other structs.
  24 + *
  25 + * Complicating things:
  26 + * typedefs and struct names!
  27 + *
  28 + * Conclusion:
  29 + * This is a typically recursive definition. A structure of typed list elements
  30 + * would probably work fine:
  31 + */
  32 +
  33 +#ifndef _ECPGTYPE_H
  34 +#define _ECPGTYPE_H
  35 +
  36 +#ifdef __cplusplus
  37 +extern "C"
  38 +{
  39 +#endif
  40 +
  41 +enum ECPGttype
  42 +{
  43 + ECPGt_char = 1, ECPGt_unsigned_char, ECPGt_short, ECPGt_unsigned_short,
  44 + ECPGt_int, ECPGt_unsigned_int, ECPGt_long, ECPGt_unsigned_long,
  45 + ECPGt_long_long, ECPGt_unsigned_long_long,
  46 + ECPGt_bool,
  47 + ECPGt_float, ECPGt_double,
  48 + ECPGt_varchar, ECPGt_varchar2,
  49 + ECPGt_numeric, /* this is a decimal that stores its digits in
  50 + * a malloced array */
  51 + ECPGt_decimal, /* this is a decimal that stores its digits in
  52 + * a fixed array */
  53 + ECPGt_date,
  54 + ECPGt_timestamp,
  55 + ECPGt_interval,
  56 + ECPGt_array,
  57 + ECPGt_struct,
  58 + ECPGt_union,
  59 + ECPGt_descriptor, /* sql descriptor, no C variable */
  60 + ECPGt_char_variable,
  61 + ECPGt_const, /* a constant is needed sometimes */
  62 + ECPGt_EOIT, /* End of insert types. */
  63 + ECPGt_EORT, /* End of result types. */
  64 + ECPGt_NO_INDICATOR, /* no indicator */
  65 + ECPGt_string, /* trimmed (char *) type */
  66 + ECPGt_sqlda /* C struct descriptor */
  67 +};
  68 +
  69 + /* descriptor items */
  70 +enum ECPGdtype
  71 +{
  72 + ECPGd_count = 1,
  73 + ECPGd_data,
  74 + ECPGd_di_code,
  75 + ECPGd_di_precision,
  76 + ECPGd_indicator,
  77 + ECPGd_key_member,
  78 + ECPGd_length,
  79 + ECPGd_name,
  80 + ECPGd_nullable,
  81 + ECPGd_octet,
  82 + ECPGd_precision,
  83 + ECPGd_ret_length,
  84 + ECPGd_ret_octet,
  85 + ECPGd_scale,
  86 + ECPGd_type,
  87 + ECPGd_EODT, /* End of descriptor types. */
  88 + ECPGd_cardinality
  89 +};
  90 +
  91 +#define IS_SIMPLE_TYPE(type) (((type) >= ECPGt_char && (type) <= ECPGt_interval) || ((type) == ECPGt_string))
  92 +
  93 +/* we also have to handle different statement types */
  94 +enum ECPG_statement_type
  95 +{
  96 + ECPGst_normal,
  97 + ECPGst_execute,
  98 + ECPGst_exec_immediate,
  99 + ECPGst_prepnormal
  100 +};
  101 +
  102 +#ifdef __cplusplus
  103 +}
  104 +#endif
  105 +
  106 +#endif /* _ECPGTYPE_H */
  1 +/* src/interfaces/ecpg/include/datetime.h */
  2 +
  3 +#ifndef _ECPG_DATETIME_H
  4 +#define _ECPG_DATETIME_H
  5 +
  6 +#include <ecpg_informix.h>
  7 +
  8 +/* source created by ecpg which defines these symbols */
  9 +#ifndef _ECPGLIB_H
  10 +typedef timestamp dtime_t;
  11 +typedef interval intrvl_t;
  12 +#endif /* ndef _ECPGLIB_H */
  13 +
  14 +#endif /* ndef _ECPG_DATETIME_H */
  1 +/* src/interfaces/ecpg/include/decimal.h */
  2 +
  3 +#ifndef _ECPG_DECIMAL_H
  4 +#define _ECPG_DECIMAL_H
  5 +
  6 +#include <ecpg_informix.h>
  7 +
  8 +/* source created by ecpg which defines this */
  9 +#ifndef _ECPGLIB_H
  10 +typedef decimal dec_t;
  11 +#endif /* ndef _ECPGLIB_H */
  12 +
  13 +#endif /* ndef _ECPG_DECIMAL_H */
  1 +#ifndef ECPG_SQLTYPES_H
  2 +#define ECPG_SQLTYPES_H
  3 +
  4 +#include <limits.h>
  5 +
  6 +#define CCHARTYPE ECPGt_char
  7 +#define CSHORTTYPE ECPGt_short
  8 +#define CINTTYPE ECPGt_int
  9 +#define CLONGTYPE ECPGt_long
  10 +#define CFLOATTYPE ECPGt_float
  11 +#define CDOUBLETYPE ECPGt_double
  12 +#define CDECIMALTYPE ECPGt_decimal
  13 +#define CFIXCHARTYPE 108
  14 +#define CSTRINGTYPE ECPGt_char
  15 +#define CDATETYPE ECPGt_date
  16 +#define CMONEYTYPE 111
  17 +#define CDTIMETYPE ECPGt_timestamp
  18 +#define CLOCATORTYPE 113
  19 +#define CVCHARTYPE ECPGt_varchar
  20 +#define CINVTYPE 115
  21 +#define CFILETYPE 116
  22 +#define CINT8TYPE ECPGt_long_long
  23 +#define CCOLLTYPE 118
  24 +#define CLVCHARTYPE 119
  25 +#define CFIXBINTYPE 120
  26 +#define CVARBINTYPE 121
  27 +#define CBOOLTYPE ECPGt_bool
  28 +#define CROWTYPE 123
  29 +#define CLVCHARPTRTYPE 124
  30 +#define CTYPEMAX 25
  31 +
  32 +/*
  33 + * Values used in sqlda->sqlvar[i]->sqltype
  34 + */
  35 +#define SQLCHAR ECPGt_char
  36 +#define SQLSMINT ECPGt_short
  37 +#define SQLINT ECPGt_int
  38 +#define SQLFLOAT ECPGt_double
  39 +#define SQLSMFLOAT ECPGt_float
  40 +#define SQLDECIMAL ECPGt_decimal
  41 +#define SQLSERIAL ECPGt_int
  42 +#define SQLDATE ECPGt_date
  43 +#define SQLDTIME ECPGt_timestamp
  44 +#define SQLTEXT ECPGt_char
  45 +#define SQLVCHAR ECPGt_char
  46 +#define SQLINTERVAL ECPGt_interval
  47 +#define SQLNCHAR ECPGt_char
  48 +#define SQLNVCHAR ECPGt_char
  49 +#ifdef HAVE_LONG_LONG_INT_64
  50 +#define SQLINT8 ECPGt_long_long
  51 +#define SQLSERIAL8 ECPGt_long_long
  52 +#else
  53 +#define SQLINT8 ECPGt_long
  54 +#define SQLSERIAL8 ECPGt_long
  55 +#endif
  56 +
  57 +#endif /* ndef ECPG_SQLTYPES_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * c.h
  4 + * Fundamental C definitions. This is included by every .c file in
  5 + * PostgreSQL (via either postgres.h or postgres_fe.h, as appropriate).
  6 + *
  7 + * Note that the definitions here are not intended to be exposed to clients
  8 + * of the frontend interface libraries --- so we don't worry much about
  9 + * polluting the namespace with lots of stuff...
  10 + *
  11 + *
  12 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  13 + * Portions Copyright (c) 1994, Regents of the University of California
  14 + *
  15 + * src/include/c.h
  16 + *
  17 + *-------------------------------------------------------------------------
  18 + */
  19 +/*
  20 + *----------------------------------------------------------------
  21 + * TABLE OF CONTENTS
  22 + *
  23 + * When adding stuff to this file, please try to put stuff
  24 + * into the relevant section, or add new sections as appropriate.
  25 + *
  26 + * section description
  27 + * ------- ------------------------------------------------
  28 + * 0) pg_config.h and standard system headers
  29 + * 1) compiler characteristics
  30 + * 2) bool, true, false
  31 + * 3) standard system types
  32 + * 4) IsValid macros for system types
  33 + * 5) offsetof, lengthof, alignment
  34 + * 6) assertions
  35 + * 7) widely useful macros
  36 + * 8) random stuff
  37 + * 9) system-specific hacks
  38 + *
  39 + * NOTE: since this file is included by both frontend and backend modules,
  40 + * it's usually wrong to put an "extern" declaration here, unless it's
  41 + * ifdef'd so that it's seen in only one case or the other.
  42 + * typedefs and macros are the kind of thing that might go here.
  43 + *
  44 + *----------------------------------------------------------------
  45 + */
  46 +#ifndef C_H
  47 +#define C_H
  48 +
  49 +#include "postgres_ext.h"
  50 +
  51 +/* Must undef pg_config_ext.h symbols before including pg_config.h */
  52 +#undef PG_INT64_TYPE
  53 +
  54 +#include "pg_config.h"
  55 +#include "pg_config_manual.h" /* must be after pg_config.h */
  56 +#include "pg_config_os.h" /* must be before any system header files */
  57 +
  58 +/* System header files that should be available everywhere in Postgres */
  59 +#include <stdio.h>
  60 +#include <stdlib.h>
  61 +#include <string.h>
  62 +#include <stddef.h>
  63 +#include <stdarg.h>
  64 +#ifdef HAVE_STRINGS_H
  65 +#include <strings.h>
  66 +#endif
  67 +#ifdef HAVE_STDINT_H
  68 +#include <stdint.h>
  69 +#endif
  70 +#include <sys/types.h>
  71 +#include <errno.h>
  72 +#if defined(WIN32) || defined(__CYGWIN__)
  73 +#include <fcntl.h> /* ensure O_BINARY is available */
  74 +#endif
  75 +#include <locale.h>
  76 +#ifdef ENABLE_NLS
  77 +#include <libintl.h>
  78 +#endif
  79 +
  80 +
  81 +/* ----------------------------------------------------------------
  82 + * Section 1: compiler characteristics
  83 + *
  84 + * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
  85 + * ----------------------------------------------------------------
  86 + */
  87 +
  88 +/*
  89 + * Disable "inline" if PG_FORCE_DISABLE_INLINE is defined.
  90 + * This is used to work around compiler bugs and might also be useful for
  91 + * investigatory purposes.
  92 + */
  93 +#ifdef PG_FORCE_DISABLE_INLINE
  94 +#undef inline
  95 +#define inline
  96 +#endif
  97 +
  98 +/*
  99 + * Attribute macros
  100 + *
  101 + * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
  102 + * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
  103 + * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
  104 + * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html
  105 + * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html
  106 + */
  107 +
  108 +/* only GCC supports the unused attribute */
  109 +#ifdef __GNUC__
  110 +#define pg_attribute_unused() __attribute__((unused))
  111 +#else
  112 +#define pg_attribute_unused()
  113 +#endif
  114 +
  115 +/*
  116 + * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
  117 + * used in assert-enabled builds, to avoid compiler warnings about unused
  118 + * variables in assert-disabled builds.
  119 + */
  120 +#ifdef USE_ASSERT_CHECKING
  121 +#define PG_USED_FOR_ASSERTS_ONLY
  122 +#else
  123 +#define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
  124 +#endif
  125 +
  126 +/* GCC and XLC support format attributes */
  127 +#if defined(__GNUC__) || defined(__IBMC__)
  128 +#define pg_attribute_format_arg(a) __attribute__((format_arg(a)))
  129 +#define pg_attribute_printf(f,a) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
  130 +#else
  131 +#define pg_attribute_format_arg(a)
  132 +#define pg_attribute_printf(f,a)
  133 +#endif
  134 +
  135 +/* GCC, Sunpro and XLC support aligned, packed and noreturn */
  136 +#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
  137 +#define pg_attribute_aligned(a) __attribute__((aligned(a)))
  138 +#define pg_attribute_noreturn() __attribute__((noreturn))
  139 +#define pg_attribute_packed() __attribute__((packed))
  140 +#define HAVE_PG_ATTRIBUTE_NORETURN 1
  141 +#else
  142 +/*
  143 + * NB: aligned and packed are not given default definitions because they
  144 + * affect code functionality; they *must* be implemented by the compiler
  145 + * if they are to be used.
  146 + */
  147 +#define pg_attribute_noreturn()
  148 +#endif
  149 +
  150 +/*
  151 + * Use "pg_attribute_always_inline" in place of "inline" for functions that
  152 + * we wish to force inlining of, even when the compiler's heuristics would
  153 + * choose not to. But, if possible, don't force inlining in unoptimized
  154 + * debug builds.
  155 + */
  156 +#if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) || defined(__IBMC__)
  157 +/* GCC > 3, Sunpro and XLC support always_inline via __attribute__ */
  158 +#define pg_attribute_always_inline __attribute__((always_inline)) inline
  159 +#elif defined(_MSC_VER)
  160 +/* MSVC has a special keyword for this */
  161 +#define pg_attribute_always_inline __forceinline
  162 +#else
  163 +/* Otherwise, the best we can do is to say "inline" */
  164 +#define pg_attribute_always_inline inline
  165 +#endif
  166 +
  167 +/*
  168 + * Forcing a function not to be inlined can be useful if it's the slow path of
  169 + * a performance-critical function, or should be visible in profiles to allow
  170 + * for proper cost attribution. Note that unlike the pg_attribute_XXX macros
  171 + * above, this should be placed before the function's return type and name.
  172 + */
  173 +/* GCC, Sunpro and XLC support noinline via __attribute__ */
  174 +#if (defined(__GNUC__) && __GNUC__ > 2) || defined(__SUNPRO_C) || defined(__IBMC__)
  175 +#define pg_noinline __attribute__((noinline))
  176 +/* msvc via declspec */
  177 +#elif defined(_MSC_VER)
  178 +#define pg_noinline __declspec(noinline)
  179 +#else
  180 +#define pg_noinline
  181 +#endif
  182 +
  183 +/*
  184 + * Mark a point as unreachable in a portable fashion. This should preferably
  185 + * be something that the compiler understands, to aid code generation.
  186 + * In assert-enabled builds, we prefer abort() for debugging reasons.
  187 + */
  188 +#if defined(HAVE__BUILTIN_UNREACHABLE) && !defined(USE_ASSERT_CHECKING)
  189 +#define pg_unreachable() __builtin_unreachable()
  190 +#elif defined(_MSC_VER) && !defined(USE_ASSERT_CHECKING)
  191 +#define pg_unreachable() __assume(0)
  192 +#else
  193 +#define pg_unreachable() abort()
  194 +#endif
  195 +
  196 +/*
  197 + * Hints to the compiler about the likelihood of a branch. Both likely() and
  198 + * unlikely() return the boolean value of the contained expression.
  199 + *
  200 + * These should only be used sparingly, in very hot code paths. It's very easy
  201 + * to mis-estimate likelihoods.
  202 + */
  203 +#if __GNUC__ >= 3
  204 +#define likely(x) __builtin_expect((x) != 0, 1)
  205 +#define unlikely(x) __builtin_expect((x) != 0, 0)
  206 +#else
  207 +#define likely(x) ((x) != 0)
  208 +#define unlikely(x) ((x) != 0)
  209 +#endif
  210 +
  211 +/*
  212 + * CppAsString
  213 + * Convert the argument to a string, using the C preprocessor.
  214 + * CppAsString2
  215 + * Convert the argument to a string, after one round of macro expansion.
  216 + * CppConcat
  217 + * Concatenate two arguments together, using the C preprocessor.
  218 + *
  219 + * Note: There used to be support here for pre-ANSI C compilers that didn't
  220 + * support # and ##. Nowadays, these macros are just for clarity and/or
  221 + * backward compatibility with existing PostgreSQL code.
  222 + */
  223 +#define CppAsString(identifier) #identifier
  224 +#define CppAsString2(x) CppAsString(x)
  225 +#define CppConcat(x, y) x##y
  226 +
  227 +/*
  228 + * dummyret is used to set return values in macros that use ?: to make
  229 + * assignments. gcc wants these to be void, other compilers like char
  230 + */
  231 +#ifdef __GNUC__ /* GNU cc */
  232 +#define dummyret void
  233 +#else
  234 +#define dummyret char
  235 +#endif
  236 +
  237 +/* Which __func__ symbol do we have, if any? */
  238 +#ifdef HAVE_FUNCNAME__FUNC
  239 +#define PG_FUNCNAME_MACRO __func__
  240 +#else
  241 +#ifdef HAVE_FUNCNAME__FUNCTION
  242 +#define PG_FUNCNAME_MACRO __FUNCTION__
  243 +#else
  244 +#define PG_FUNCNAME_MACRO NULL
  245 +#endif
  246 +#endif
  247 +
  248 +
  249 +/* ----------------------------------------------------------------
  250 + * Section 2: bool, true, false
  251 + * ----------------------------------------------------------------
  252 + */
  253 +
  254 +/*
  255 + * bool
  256 + * Boolean value, either true or false.
  257 + *
  258 + * Use stdbool.h if available and its bool has size 1. That's useful for
  259 + * better compiler and debugger output and for compatibility with third-party
  260 + * libraries. But PostgreSQL currently cannot deal with bool of other sizes;
  261 + * there are static assertions around the code to prevent that.
  262 + *
  263 + * For C++ compilers, we assume the compiler has a compatible built-in
  264 + * definition of bool.
  265 + */
  266 +
  267 +#ifndef __cplusplus
  268 +
  269 +#if defined(HAVE_STDBOOL_H) && SIZEOF_BOOL == 1
  270 +#include <stdbool.h>
  271 +#define USE_STDBOOL 1
  272 +#else
  273 +
  274 +#ifndef bool
  275 +typedef char bool;
  276 +#endif
  277 +
  278 +#ifndef true
  279 +#define true ((bool) 1)
  280 +#endif
  281 +
  282 +#ifndef false
  283 +#define false ((bool) 0)
  284 +#endif
  285 +
  286 +#endif
  287 +#endif /* not C++ */
  288 +
  289 +
  290 +/* ----------------------------------------------------------------
  291 + * Section 3: standard system types
  292 + * ----------------------------------------------------------------
  293 + */
  294 +
  295 +/*
  296 + * Pointer
  297 + * Variable holding address of any memory resident object.
  298 + *
  299 + * XXX Pointer arithmetic is done with this, so it can't be void *
  300 + * under "true" ANSI compilers.
  301 + */
  302 +typedef char *Pointer;
  303 +
  304 +/*
  305 + * intN
  306 + * Signed integer, EXACTLY N BITS IN SIZE,
  307 + * used for numerical computations and the
  308 + * frontend/backend protocol.
  309 + */
  310 +#ifndef HAVE_INT8
  311 +typedef signed char int8; /* == 8 bits */
  312 +typedef signed short int16; /* == 16 bits */
  313 +typedef signed int int32; /* == 32 bits */
  314 +#endif /* not HAVE_INT8 */
  315 +
  316 +/*
  317 + * uintN
  318 + * Unsigned integer, EXACTLY N BITS IN SIZE,
  319 + * used for numerical computations and the
  320 + * frontend/backend protocol.
  321 + */
  322 +#ifndef HAVE_UINT8
  323 +typedef unsigned char uint8; /* == 8 bits */
  324 +typedef unsigned short uint16; /* == 16 bits */
  325 +typedef unsigned int uint32; /* == 32 bits */
  326 +#endif /* not HAVE_UINT8 */
  327 +
  328 +/*
  329 + * bitsN
  330 + * Unit of bitwise operation, AT LEAST N BITS IN SIZE.
  331 + */
  332 +typedef uint8 bits8; /* >= 8 bits */
  333 +typedef uint16 bits16; /* >= 16 bits */
  334 +typedef uint32 bits32; /* >= 32 bits */
  335 +
  336 +/*
  337 + * 64-bit integers
  338 + */
  339 +#ifdef HAVE_LONG_INT_64
  340 +/* Plain "long int" fits, use it */
  341 +
  342 +#ifndef HAVE_INT64
  343 +typedef long int int64;
  344 +#endif
  345 +#ifndef HAVE_UINT64
  346 +typedef unsigned long int uint64;
  347 +#endif
  348 +#define INT64CONST(x) (x##L)
  349 +#define UINT64CONST(x) (x##UL)
  350 +#elif defined(HAVE_LONG_LONG_INT_64)
  351 +/* We have working support for "long long int", use that */
  352 +
  353 +#ifndef HAVE_INT64
  354 +typedef long long int int64;
  355 +#endif
  356 +#ifndef HAVE_UINT64
  357 +typedef unsigned long long int uint64;
  358 +#endif
  359 +#define INT64CONST(x) (x##LL)
  360 +#define UINT64CONST(x) (x##ULL)
  361 +#else
  362 +/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */
  363 +#error must have a working 64-bit integer datatype
  364 +#endif
  365 +
  366 +/* snprintf format strings to use for 64-bit integers */
  367 +#define INT64_FORMAT "%" INT64_MODIFIER "d"
  368 +#define UINT64_FORMAT "%" INT64_MODIFIER "u"
  369 +
  370 +/*
  371 + * 128-bit signed and unsigned integers
  372 + * There currently is only limited support for such types.
  373 + * E.g. 128bit literals and snprintf are not supported; but math is.
  374 + * Also, because we exclude such types when choosing MAXIMUM_ALIGNOF,
  375 + * it must be possible to coerce the compiler to allocate them on no
  376 + * more than MAXALIGN boundaries.
  377 + */
  378 +#if defined(PG_INT128_TYPE)
  379 +#if defined(pg_attribute_aligned) || ALIGNOF_PG_INT128_TYPE <= MAXIMUM_ALIGNOF
  380 +#define HAVE_INT128 1
  381 +
  382 +typedef PG_INT128_TYPE int128
  383 +#if defined(pg_attribute_aligned)
  384 +pg_attribute_aligned(MAXIMUM_ALIGNOF)
  385 +#endif
  386 +;
  387 +
  388 +typedef unsigned PG_INT128_TYPE uint128
  389 +#if defined(pg_attribute_aligned)
  390 +pg_attribute_aligned(MAXIMUM_ALIGNOF)
  391 +#endif
  392 +;
  393 +
  394 +#endif
  395 +#endif
  396 +
  397 +/*
  398 + * stdint.h limits aren't guaranteed to be present and aren't guaranteed to
  399 + * have compatible types with our fixed width types. So just define our own.
  400 + */
  401 +#define PG_INT8_MIN (-0x7F-1)
  402 +#define PG_INT8_MAX (0x7F)
  403 +#define PG_UINT8_MAX (0xFF)
  404 +#define PG_INT16_MIN (-0x7FFF-1)
  405 +#define PG_INT16_MAX (0x7FFF)
  406 +#define PG_UINT16_MAX (0xFFFF)
  407 +#define PG_INT32_MIN (-0x7FFFFFFF-1)
  408 +#define PG_INT32_MAX (0x7FFFFFFF)
  409 +#define PG_UINT32_MAX (0xFFFFFFFFU)
  410 +#define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
  411 +#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
  412 +#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
  413 +
  414 +/* Max value of size_t might also be missing if we don't have stdint.h */
  415 +#ifndef SIZE_MAX
  416 +#if SIZEOF_SIZE_T == 8
  417 +#define SIZE_MAX PG_UINT64_MAX
  418 +#else
  419 +#define SIZE_MAX PG_UINT32_MAX
  420 +#endif
  421 +#endif
  422 +
  423 +/*
  424 + * We now always use int64 timestamps, but keep this symbol defined for the
  425 + * benefit of external code that might test it.
  426 + */
  427 +#define HAVE_INT64_TIMESTAMP
  428 +
  429 +/*
  430 + * Size
  431 + * Size of any memory resident object, as returned by sizeof.
  432 + */
  433 +typedef size_t Size;
  434 +
  435 +/*
  436 + * Index
  437 + * Index into any memory resident array.
  438 + *
  439 + * Note:
  440 + * Indices are non negative.
  441 + */
  442 +typedef unsigned int Index;
  443 +
  444 +/*
  445 + * Offset
  446 + * Offset into any memory resident array.
  447 + *
  448 + * Note:
  449 + * This differs from an Index in that an Index is always
  450 + * non negative, whereas Offset may be negative.
  451 + */
  452 +typedef signed int Offset;
  453 +
  454 +/*
  455 + * Common Postgres datatype names (as used in the catalogs)
  456 + */
  457 +typedef float float4;
  458 +typedef double float8;
  459 +
  460 +/*
  461 + * Oid, RegProcedure, TransactionId, SubTransactionId, MultiXactId,
  462 + * CommandId
  463 + */
  464 +
  465 +/* typedef Oid is in postgres_ext.h */
  466 +
  467 +/*
  468 + * regproc is the type name used in the include/catalog headers, but
  469 + * RegProcedure is the preferred name in C code.
  470 + */
  471 +typedef Oid regproc;
  472 +typedef regproc RegProcedure;
  473 +
  474 +typedef uint32 TransactionId;
  475 +
  476 +typedef uint32 LocalTransactionId;
  477 +
  478 +typedef uint32 SubTransactionId;
  479 +
  480 +#define InvalidSubTransactionId ((SubTransactionId) 0)
  481 +#define TopSubTransactionId ((SubTransactionId) 1)
  482 +
  483 +/* MultiXactId must be equivalent to TransactionId, to fit in t_xmax */
  484 +typedef TransactionId MultiXactId;
  485 +
  486 +typedef uint32 MultiXactOffset;
  487 +
  488 +typedef uint32 CommandId;
  489 +
  490 +#define FirstCommandId ((CommandId) 0)
  491 +#define InvalidCommandId (~(CommandId)0)
  492 +
  493 +/*
  494 + * Array indexing support
  495 + */
  496 +#define MAXDIM 6
  497 +typedef struct
  498 +{
  499 + int indx[MAXDIM];
  500 +} IntArray;
  501 +
  502 +/* ----------------
  503 + * Variable-length datatypes all share the 'struct varlena' header.
  504 + *
  505 + * NOTE: for TOASTable types, this is an oversimplification, since the value
  506 + * may be compressed or moved out-of-line. However datatype-specific routines
  507 + * are mostly content to deal with de-TOASTed values only, and of course
  508 + * client-side routines should never see a TOASTed value. But even in a
  509 + * de-TOASTed value, beware of touching vl_len_ directly, as its
  510 + * representation is no longer convenient. It's recommended that code always
  511 + * use macros VARDATA_ANY, VARSIZE_ANY, VARSIZE_ANY_EXHDR, VARDATA, VARSIZE,
  512 + * and SET_VARSIZE instead of relying on direct mentions of the struct fields.
  513 + * See postgres.h for details of the TOASTed form.
  514 + * ----------------
  515 + */
  516 +struct varlena
  517 +{
  518 + char vl_len_[4]; /* Do not touch this field directly! */
  519 + char vl_dat[FLEXIBLE_ARRAY_MEMBER]; /* Data content is here */
  520 +};
  521 +
  522 +#define VARHDRSZ ((int32) sizeof(int32))
  523 +
  524 +/*
  525 + * These widely-used datatypes are just a varlena header and the data bytes.
  526 + * There is no terminating null or anything like that --- the data length is
  527 + * always VARSIZE_ANY_EXHDR(ptr).
  528 + */
  529 +typedef struct varlena bytea;
  530 +typedef struct varlena text;
  531 +typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */
  532 +typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */
  533 +
  534 +/*
  535 + * Specialized array types. These are physically laid out just the same
  536 + * as regular arrays (so that the regular array subscripting code works
  537 + * with them). They exist as distinct types mostly for historical reasons:
  538 + * they have nonstandard I/O behavior which we don't want to change for fear
  539 + * of breaking applications that look at the system catalogs. There is also
  540 + * an implementation issue for oidvector: it's part of the primary key for
  541 + * pg_proc, and we can't use the normal btree array support routines for that
  542 + * without circularity.
  543 + */
  544 +typedef struct
  545 +{
  546 + int32 vl_len_; /* these fields must match ArrayType! */
  547 + int ndim; /* always 1 for int2vector */
  548 + int32 dataoffset; /* always 0 for int2vector */
  549 + Oid elemtype;
  550 + int dim1;
  551 + int lbound1;
  552 + int16 values[FLEXIBLE_ARRAY_MEMBER];
  553 +} int2vector;
  554 +
  555 +typedef struct
  556 +{
  557 + int32 vl_len_; /* these fields must match ArrayType! */
  558 + int ndim; /* always 1 for oidvector */
  559 + int32 dataoffset; /* always 0 for oidvector */
  560 + Oid elemtype;
  561 + int dim1;
  562 + int lbound1;
  563 + Oid values[FLEXIBLE_ARRAY_MEMBER];
  564 +} oidvector;
  565 +
  566 +/*
  567 + * Representation of a Name: effectively just a C string, but null-padded to
  568 + * exactly NAMEDATALEN bytes. The use of a struct is historical.
  569 + */
  570 +typedef struct nameData
  571 +{
  572 + char data[NAMEDATALEN];
  573 +} NameData;
  574 +typedef NameData *Name;
  575 +
  576 +#define NameStr(name) ((name).data)
  577 +
  578 +
  579 +/* ----------------------------------------------------------------
  580 + * Section 4: IsValid macros for system types
  581 + * ----------------------------------------------------------------
  582 + */
  583 +/*
  584 + * BoolIsValid
  585 + * True iff bool is valid.
  586 + */
  587 +#define BoolIsValid(boolean) ((boolean) == false || (boolean) == true)
  588 +
  589 +/*
  590 + * PointerIsValid
  591 + * True iff pointer is valid.
  592 + */
  593 +#define PointerIsValid(pointer) ((const void*)(pointer) != NULL)
  594 +
  595 +/*
  596 + * PointerIsAligned
  597 + * True iff pointer is properly aligned to point to the given type.
  598 + */
  599 +#define PointerIsAligned(pointer, type) \
  600 + (((uintptr_t)(pointer) % (sizeof (type))) == 0)
  601 +
  602 +#define OffsetToPointer(base, offset) \
  603 + ((void *)((char *) base + offset))
  604 +
  605 +#define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))
  606 +
  607 +#define RegProcedureIsValid(p) OidIsValid(p)
  608 +
  609 +
  610 +/* ----------------------------------------------------------------
  611 + * Section 5: offsetof, lengthof, alignment
  612 + * ----------------------------------------------------------------
  613 + */
  614 +/*
  615 + * offsetof
  616 + * Offset of a structure/union field within that structure/union.
  617 + *
  618 + * XXX This is supposed to be part of stddef.h, but isn't on
  619 + * some systems (like SunOS 4).
  620 + */
  621 +#ifndef offsetof
  622 +#define offsetof(type, field) ((long) &((type *)0)->field)
  623 +#endif /* offsetof */
  624 +
  625 +/*
  626 + * lengthof
  627 + * Number of elements in an array.
  628 + */
  629 +#define lengthof(array) (sizeof (array) / sizeof ((array)[0]))
  630 +
  631 +/* ----------------
  632 + * Alignment macros: align a length or address appropriately for a given type.
  633 + * The fooALIGN() macros round up to a multiple of the required alignment,
  634 + * while the fooALIGN_DOWN() macros round down. The latter are more useful
  635 + * for problems like "how many X-sized structures will fit in a page?".
  636 + *
  637 + * NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
  638 + * That case seems extremely unlikely to be needed in practice, however.
  639 + *
  640 + * NOTE: MAXIMUM_ALIGNOF, and hence MAXALIGN(), intentionally exclude any
  641 + * larger-than-8-byte types the compiler might have.
  642 + * ----------------
  643 + */
  644 +
  645 +#define TYPEALIGN(ALIGNVAL,LEN) \
  646 + (((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((uintptr_t) ((ALIGNVAL) - 1)))
  647 +
  648 +#define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))
  649 +#define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))
  650 +#define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))
  651 +#define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))
  652 +#define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))
  653 +/* MAXALIGN covers only built-in types, not buffers */
  654 +#define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN))
  655 +#define CACHELINEALIGN(LEN) TYPEALIGN(PG_CACHE_LINE_SIZE, (LEN))
  656 +
  657 +#define TYPEALIGN_DOWN(ALIGNVAL,LEN) \
  658 + (((uintptr_t) (LEN)) & ~((uintptr_t) ((ALIGNVAL) - 1)))
  659 +
  660 +#define SHORTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_SHORT, (LEN))
  661 +#define INTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_INT, (LEN))
  662 +#define LONGALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_LONG, (LEN))
  663 +#define DOUBLEALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_DOUBLE, (LEN))
  664 +#define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN))
  665 +#define BUFFERALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_BUFFER, (LEN))
  666 +
  667 +/*
  668 + * The above macros will not work with types wider than uintptr_t, like with
  669 + * uint64 on 32-bit platforms. That's not problem for the usual use where a
  670 + * pointer or a length is aligned, but for the odd case that you need to
  671 + * align something (potentially) wider, use TYPEALIGN64.
  672 + */
  673 +#define TYPEALIGN64(ALIGNVAL,LEN) \
  674 + (((uint64) (LEN) + ((ALIGNVAL) - 1)) & ~((uint64) ((ALIGNVAL) - 1)))
  675 +
  676 +/* we don't currently need wider versions of the other ALIGN macros */
  677 +#define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
  678 +
  679 +
  680 +/* ----------------------------------------------------------------
  681 + * Section 6: assertions
  682 + * ----------------------------------------------------------------
  683 + */
  684 +
  685 +/*
  686 + * USE_ASSERT_CHECKING, if defined, turns on all the assertions.
  687 + * - plai 9/5/90
  688 + *
  689 + * It should _NOT_ be defined in releases or in benchmark copies
  690 + */
  691 +
  692 +/*
  693 + * Assert() can be used in both frontend and backend code. In frontend code it
  694 + * just calls the standard assert, if it's available. If use of assertions is
  695 + * not configured, it does nothing.
  696 + */
  697 +#ifndef USE_ASSERT_CHECKING
  698 +
  699 +#define Assert(condition) ((void)true)
  700 +#define AssertMacro(condition) ((void)true)
  701 +#define AssertArg(condition) ((void)true)
  702 +#define AssertState(condition) ((void)true)
  703 +#define AssertPointerAlignment(ptr, bndr) ((void)true)
  704 +#define Trap(condition, errorType) ((void)true)
  705 +#define TrapMacro(condition, errorType) (true)
  706 +
  707 +#elif defined(FRONTEND)
  708 +
  709 +#include <assert.h>
  710 +#define Assert(p) assert(p)
  711 +#define AssertMacro(p) ((void) assert(p))
  712 +#define AssertArg(condition) assert(condition)
  713 +#define AssertState(condition) assert(condition)
  714 +#define AssertPointerAlignment(ptr, bndr) ((void)true)
  715 +
  716 +#else /* USE_ASSERT_CHECKING && !FRONTEND */
  717 +
  718 +/*
  719 + * Trap
  720 + * Generates an exception if the given condition is true.
  721 + */
  722 +#define Trap(condition, errorType) \
  723 + do { \
  724 + if (condition) \
  725 + ExceptionalCondition(CppAsString(condition), (errorType), \
  726 + __FILE__, __LINE__); \
  727 + } while (0)
  728 +
  729 +/*
  730 + * TrapMacro is the same as Trap but it's intended for use in macros:
  731 + *
  732 + * #define foo(x) (AssertMacro(x != 0), bar(x))
  733 + *
  734 + * Isn't CPP fun?
  735 + */
  736 +#define TrapMacro(condition, errorType) \
  737 + ((bool) (! (condition) || \
  738 + (ExceptionalCondition(CppAsString(condition), (errorType), \
  739 + __FILE__, __LINE__), 0)))
  740 +
  741 +#define Assert(condition) \
  742 + Trap(!(condition), "FailedAssertion")
  743 +
  744 +#define AssertMacro(condition) \
  745 + ((void) TrapMacro(!(condition), "FailedAssertion"))
  746 +
  747 +#define AssertArg(condition) \
  748 + Trap(!(condition), "BadArgument")
  749 +
  750 +#define AssertState(condition) \
  751 + Trap(!(condition), "BadState")
  752 +
  753 +/*
  754 + * Check that `ptr' is `bndr' aligned.
  755 + */
  756 +#define AssertPointerAlignment(ptr, bndr) \
  757 + Trap(TYPEALIGN(bndr, (uintptr_t)(ptr)) != (uintptr_t)(ptr), \
  758 + "UnalignedPointer")
  759 +
  760 +#endif /* USE_ASSERT_CHECKING && !FRONTEND */
  761 +
  762 +/*
  763 + * ExceptionalCondition is compiled into the backend whether or not
  764 + * USE_ASSERT_CHECKING is defined, so as to support use of extensions
  765 + * that are built with that #define with a backend that isn't. Hence,
  766 + * we should declare it as long as !FRONTEND.
  767 + */
  768 +#ifndef FRONTEND
  769 +extern void ExceptionalCondition(const char *conditionName,
  770 + const char *errorType,
  771 + const char *fileName, int lineNumber) pg_attribute_noreturn();
  772 +#endif
  773 +
  774 +/*
  775 + * Macros to support compile-time assertion checks.
  776 + *
  777 + * If the "condition" (a compile-time-constant expression) evaluates to false,
  778 + * throw a compile error using the "errmessage" (a string literal).
  779 + *
  780 + * gcc 4.6 and up supports _Static_assert(), but there are bizarre syntactic
  781 + * placement restrictions. These macros make it safe to use as a statement
  782 + * or in an expression, respectively.
  783 + *
  784 + * Otherwise we fall back on a kluge that assumes the compiler will complain
  785 + * about a negative width for a struct bit-field. This will not include a
  786 + * helpful error message, but it beats not getting an error at all.
  787 + */
  788 +#ifndef __cplusplus
  789 +#ifdef HAVE__STATIC_ASSERT
  790 +#define StaticAssertStmt(condition, errmessage) \
  791 + do { _Static_assert(condition, errmessage); } while(0)
  792 +#define StaticAssertExpr(condition, errmessage) \
  793 + ((void) ({ StaticAssertStmt(condition, errmessage); true; }))
  794 +#else /* !HAVE__STATIC_ASSERT */
  795 +#define StaticAssertStmt(condition, errmessage) \
  796 + ((void) sizeof(struct { int static_assert_failure : (condition) ? 1 : -1; }))
  797 +#define StaticAssertExpr(condition, errmessage) \
  798 + StaticAssertStmt(condition, errmessage)
  799 +#endif /* HAVE__STATIC_ASSERT */
  800 +#else /* C++ */
  801 +#if defined(__cpp_static_assert) && __cpp_static_assert >= 200410
  802 +#define StaticAssertStmt(condition, errmessage) \
  803 + static_assert(condition, errmessage)
  804 +#define StaticAssertExpr(condition, errmessage) \
  805 + ({ static_assert(condition, errmessage); })
  806 +#else
  807 +#define StaticAssertStmt(condition, errmessage) \
  808 + do { struct static_assert_struct { int static_assert_failure : (condition) ? 1 : -1; }; } while(0)
  809 +#define StaticAssertExpr(condition, errmessage) \
  810 + ((void) ({ StaticAssertStmt(condition, errmessage); }))
  811 +#endif
  812 +#endif /* C++ */
  813 +
  814 +
  815 +/*
  816 + * Compile-time checks that a variable (or expression) has the specified type.
  817 + *
  818 + * AssertVariableIsOfType() can be used as a statement.
  819 + * AssertVariableIsOfTypeMacro() is intended for use in macros, eg
  820 + * #define foo(x) (AssertVariableIsOfTypeMacro(x, int), bar(x))
  821 + *
  822 + * If we don't have __builtin_types_compatible_p, we can still assert that
  823 + * the types have the same size. This is far from ideal (especially on 32-bit
  824 + * platforms) but it provides at least some coverage.
  825 + */
  826 +#ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P
  827 +#define AssertVariableIsOfType(varname, typename) \
  828 + StaticAssertStmt(__builtin_types_compatible_p(__typeof__(varname), typename), \
  829 + CppAsString(varname) " does not have type " CppAsString(typename))
  830 +#define AssertVariableIsOfTypeMacro(varname, typename) \
  831 + (StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname), typename), \
  832 + CppAsString(varname) " does not have type " CppAsString(typename)))
  833 +#else /* !HAVE__BUILTIN_TYPES_COMPATIBLE_P */
  834 +#define AssertVariableIsOfType(varname, typename) \
  835 + StaticAssertStmt(sizeof(varname) == sizeof(typename), \
  836 + CppAsString(varname) " does not have type " CppAsString(typename))
  837 +#define AssertVariableIsOfTypeMacro(varname, typename) \
  838 + (StaticAssertExpr(sizeof(varname) == sizeof(typename), \
  839 + CppAsString(varname) " does not have type " CppAsString(typename)))
  840 +#endif /* HAVE__BUILTIN_TYPES_COMPATIBLE_P */
  841 +
  842 +
  843 +/* ----------------------------------------------------------------
  844 + * Section 7: widely useful macros
  845 + * ----------------------------------------------------------------
  846 + */
  847 +/*
  848 + * Max
  849 + * Return the maximum of two numbers.
  850 + */
  851 +#define Max(x, y) ((x) > (y) ? (x) : (y))
  852 +
  853 +/*
  854 + * Min
  855 + * Return the minimum of two numbers.
  856 + */
  857 +#define Min(x, y) ((x) < (y) ? (x) : (y))
  858 +
  859 +/*
  860 + * Abs
  861 + * Return the absolute value of the argument.
  862 + */
  863 +#define Abs(x) ((x) >= 0 ? (x) : -(x))
  864 +
  865 +/*
  866 + * StrNCpy
  867 + * Like standard library function strncpy(), except that result string
  868 + * is guaranteed to be null-terminated --- that is, at most N-1 bytes
  869 + * of the source string will be kept.
  870 + * Also, the macro returns no result (too hard to do that without
  871 + * evaluating the arguments multiple times, which seems worse).
  872 + *
  873 + * BTW: when you need to copy a non-null-terminated string (like a text
  874 + * datum) and add a null, do not do it with StrNCpy(..., len+1). That
  875 + * might seem to work, but it fetches one byte more than there is in the
  876 + * text object. One fine day you'll have a SIGSEGV because there isn't
  877 + * another byte before the end of memory. Don't laugh, we've had real
  878 + * live bug reports from real live users over exactly this mistake.
  879 + * Do it honestly with "memcpy(dst,src,len); dst[len] = '\0';", instead.
  880 + */
  881 +#define StrNCpy(dst,src,len) \
  882 + do \
  883 + { \
  884 + char * _dst = (dst); \
  885 + Size _len = (len); \
  886 +\
  887 + if (_len > 0) \
  888 + { \
  889 + strncpy(_dst, (src), _len); \
  890 + _dst[_len-1] = '\0'; \
  891 + } \
  892 + } while (0)
  893 +
  894 +
  895 +/* Get a bit mask of the bits set in non-long aligned addresses */
  896 +#define LONG_ALIGN_MASK (sizeof(long) - 1)
  897 +
  898 +/*
  899 + * MemSet
  900 + * Exactly the same as standard library function memset(), but considerably
  901 + * faster for zeroing small word-aligned structures (such as parsetree nodes).
  902 + * This has to be a macro because the main point is to avoid function-call
  903 + * overhead. However, we have also found that the loop is faster than
  904 + * native libc memset() on some platforms, even those with assembler
  905 + * memset() functions. More research needs to be done, perhaps with
  906 + * MEMSET_LOOP_LIMIT tests in configure.
  907 + */
  908 +#define MemSet(start, val, len) \
  909 + do \
  910 + { \
  911 + /* must be void* because we don't know if it is integer aligned yet */ \
  912 + void *_vstart = (void *) (start); \
  913 + int _val = (val); \
  914 + Size _len = (len); \
  915 +\
  916 + if ((((uintptr_t) _vstart) & LONG_ALIGN_MASK) == 0 && \
  917 + (_len & LONG_ALIGN_MASK) == 0 && \
  918 + _val == 0 && \
  919 + _len <= MEMSET_LOOP_LIMIT && \
  920 + /* \
  921 + * If MEMSET_LOOP_LIMIT == 0, optimizer should find \
  922 + * the whole "if" false at compile time. \
  923 + */ \
  924 + MEMSET_LOOP_LIMIT != 0) \
  925 + { \
  926 + long *_start = (long *) _vstart; \
  927 + long *_stop = (long *) ((char *) _start + _len); \
  928 + while (_start < _stop) \
  929 + *_start++ = 0; \
  930 + } \
  931 + else \
  932 + memset(_vstart, _val, _len); \
  933 + } while (0)
  934 +
  935 +/*
  936 + * MemSetAligned is the same as MemSet except it omits the test to see if
  937 + * "start" is word-aligned. This is okay to use if the caller knows a-priori
  938 + * that the pointer is suitably aligned (typically, because he just got it
  939 + * from palloc(), which always delivers a max-aligned pointer).
  940 + */
  941 +#define MemSetAligned(start, val, len) \
  942 + do \
  943 + { \
  944 + long *_start = (long *) (start); \
  945 + int _val = (val); \
  946 + Size _len = (len); \
  947 +\
  948 + if ((_len & LONG_ALIGN_MASK) == 0 && \
  949 + _val == 0 && \
  950 + _len <= MEMSET_LOOP_LIMIT && \
  951 + MEMSET_LOOP_LIMIT != 0) \
  952 + { \
  953 + long *_stop = (long *) ((char *) _start + _len); \
  954 + while (_start < _stop) \
  955 + *_start++ = 0; \
  956 + } \
  957 + else \
  958 + memset(_start, _val, _len); \
  959 + } while (0)
  960 +
  961 +
  962 +/*
  963 + * MemSetTest/MemSetLoop are a variant version that allow all the tests in
  964 + * MemSet to be done at compile time in cases where "val" and "len" are
  965 + * constants *and* we know the "start" pointer must be word-aligned.
  966 + * If MemSetTest succeeds, then it is okay to use MemSetLoop, otherwise use
  967 + * MemSetAligned. Beware of multiple evaluations of the arguments when using
  968 + * this approach.
  969 + */
  970 +#define MemSetTest(val, len) \
  971 + ( ((len) & LONG_ALIGN_MASK) == 0 && \
  972 + (len) <= MEMSET_LOOP_LIMIT && \
  973 + MEMSET_LOOP_LIMIT != 0 && \
  974 + (val) == 0 )
  975 +
  976 +#define MemSetLoop(start, val, len) \
  977 + do \
  978 + { \
  979 + long * _start = (long *) (start); \
  980 + long * _stop = (long *) ((char *) _start + (Size) (len)); \
  981 + \
  982 + while (_start < _stop) \
  983 + *_start++ = 0; \
  984 + } while (0)
  985 +
  986 +
  987 +/* ----------------------------------------------------------------
  988 + * Section 8: random stuff
  989 + * ----------------------------------------------------------------
  990 + */
  991 +
  992 +/*
  993 + * Invert the sign of a qsort-style comparison result, ie, exchange negative
  994 + * and positive integer values, being careful not to get the wrong answer
  995 + * for INT_MIN. The argument should be an integral variable.
  996 + */
  997 +#define INVERT_COMPARE_RESULT(var) \
  998 + ((var) = ((var) < 0) ? 1 : -(var))
  999 +
  1000 +/*
  1001 + * Use this, not "char buf[BLCKSZ]", to declare a field or local variable
  1002 + * holding a page buffer, if that page might be accessed as a page and not
  1003 + * just a string of bytes. Otherwise the variable might be under-aligned,
  1004 + * causing problems on alignment-picky hardware. (In some places, we use
  1005 + * this to declare buffers even though we only pass them to read() and
  1006 + * write(), because copying to/from aligned buffers is usually faster than
  1007 + * using unaligned buffers.) We include both "double" and "int64" in the
  1008 + * union to ensure that the compiler knows the value must be MAXALIGN'ed
  1009 + * (cf. configure's computation of MAXIMUM_ALIGNOF).
  1010 + */
  1011 +typedef union PGAlignedBlock
  1012 +{
  1013 + char data[BLCKSZ];
  1014 + double force_align_d;
  1015 + int64 force_align_i64;
  1016 +} PGAlignedBlock;
  1017 +
  1018 +/* Same, but for an XLOG_BLCKSZ-sized buffer */
  1019 +typedef union PGAlignedXLogBlock
  1020 +{
  1021 + char data[XLOG_BLCKSZ];
  1022 + double force_align_d;
  1023 + int64 force_align_i64;
  1024 +} PGAlignedXLogBlock;
  1025 +
  1026 +/* msb for char */
  1027 +#define HIGHBIT (0x80)
  1028 +#define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT)
  1029 +
  1030 +/*
  1031 + * Support macros for escaping strings. escape_backslash should be true
  1032 + * if generating a non-standard-conforming string. Prefixing a string
  1033 + * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
  1034 + * Beware of multiple evaluation of the "ch" argument!
  1035 + */
  1036 +#define SQL_STR_DOUBLE(ch, escape_backslash) \
  1037 + ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
  1038 +
  1039 +#define ESCAPE_STRING_SYNTAX 'E'
  1040 +
  1041 +
  1042 +#define STATUS_OK (0)
  1043 +#define STATUS_ERROR (-1)
  1044 +#define STATUS_EOF (-2)
  1045 +#define STATUS_FOUND (1)
  1046 +#define STATUS_WAITING (2)
  1047 +
  1048 +/*
  1049 + * gettext support
  1050 + */
  1051 +
  1052 +#ifndef ENABLE_NLS
  1053 +/* stuff we'd otherwise get from <libintl.h> */
  1054 +#define gettext(x) (x)
  1055 +#define dgettext(d,x) (x)
  1056 +#define ngettext(s,p,n) ((n) == 1 ? (s) : (p))
  1057 +#define dngettext(d,s,p,n) ((n) == 1 ? (s) : (p))
  1058 +#endif
  1059 +
  1060 +#define _(x) gettext(x)
  1061 +
  1062 +/*
  1063 + * Use this to mark string constants as needing translation at some later
  1064 + * time, rather than immediately. This is useful for cases where you need
  1065 + * access to the original string and translated string, and for cases where
  1066 + * immediate translation is not possible, like when initializing global
  1067 + * variables.
  1068 + * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html
  1069 + */
  1070 +#define gettext_noop(x) (x)
  1071 +
  1072 +/*
  1073 + * To better support parallel installations of major PostgreSQL
  1074 + * versions as well as parallel installations of major library soname
  1075 + * versions, we mangle the gettext domain name by appending those
  1076 + * version numbers. The coding rule ought to be that wherever the
  1077 + * domain name is mentioned as a literal, it must be wrapped into
  1078 + * PG_TEXTDOMAIN(). The macros below do not work on non-literals; but
  1079 + * that is somewhat intentional because it avoids having to worry
  1080 + * about multiple states of premangling and postmangling as the values
  1081 + * are being passed around.
  1082 + *
  1083 + * Make sure this matches the installation rules in nls-global.mk.
  1084 + */
  1085 +#ifdef SO_MAJOR_VERSION
  1086 +#define PG_TEXTDOMAIN(domain) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)
  1087 +#else
  1088 +#define PG_TEXTDOMAIN(domain) (domain "-" PG_MAJORVERSION)
  1089 +#endif
  1090 +
  1091 +
  1092 +/* ----------------------------------------------------------------
  1093 + * Section 9: system-specific hacks
  1094 + *
  1095 + * This should be limited to things that absolutely have to be
  1096 + * included in every source file. The port-specific header file
  1097 + * is usually a better place for this sort of thing.
  1098 + * ----------------------------------------------------------------
  1099 + */
  1100 +
  1101 +/*
  1102 + * NOTE: this is also used for opening text files.
  1103 + * WIN32 treats Control-Z as EOF in files opened in text mode.
  1104 + * Therefore, we open files in binary mode on Win32 so we can read
  1105 + * literal control-Z. The other affect is that we see CRLF, but
  1106 + * that is OK because we can already handle those cleanly.
  1107 + */
  1108 +#if defined(WIN32) || defined(__CYGWIN__)
  1109 +#define PG_BINARY O_BINARY
  1110 +#define PG_BINARY_A "ab"
  1111 +#define PG_BINARY_R "rb"
  1112 +#define PG_BINARY_W "wb"
  1113 +#else
  1114 +#define PG_BINARY 0
  1115 +#define PG_BINARY_A "a"
  1116 +#define PG_BINARY_R "r"
  1117 +#define PG_BINARY_W "w"
  1118 +#endif
  1119 +
  1120 +/*
  1121 + * Provide prototypes for routines not present in a particular machine's
  1122 + * standard C library.
  1123 + */
  1124 +
  1125 +#if !HAVE_DECL_SNPRINTF
  1126 +extern int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);
  1127 +#endif
  1128 +
  1129 +#if !HAVE_DECL_VSNPRINTF
  1130 +extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
  1131 +#endif
  1132 +
  1133 +#if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC
  1134 +extern int fdatasync(int fildes);
  1135 +#endif
  1136 +
  1137 +#ifdef HAVE_LONG_LONG_INT
  1138 +/* Older platforms may provide strto[u]ll functionality under other names */
  1139 +#if !defined(HAVE_STRTOLL) && defined(HAVE___STRTOLL)
  1140 +#define strtoll __strtoll
  1141 +#define HAVE_STRTOLL 1
  1142 +#endif
  1143 +
  1144 +#if !defined(HAVE_STRTOLL) && defined(HAVE_STRTOQ)
  1145 +#define strtoll strtoq
  1146 +#define HAVE_STRTOLL 1
  1147 +#endif
  1148 +
  1149 +#if !defined(HAVE_STRTOULL) && defined(HAVE___STRTOULL)
  1150 +#define strtoull __strtoull
  1151 +#define HAVE_STRTOULL 1
  1152 +#endif
  1153 +
  1154 +#if !defined(HAVE_STRTOULL) && defined(HAVE_STRTOUQ)
  1155 +#define strtoull strtouq
  1156 +#define HAVE_STRTOULL 1
  1157 +#endif
  1158 +
  1159 +#if defined(HAVE_STRTOLL) && !HAVE_DECL_STRTOLL
  1160 +extern long long strtoll(const char *str, char **endptr, int base);
  1161 +#endif
  1162 +
  1163 +#if defined(HAVE_STRTOULL) && !HAVE_DECL_STRTOULL
  1164 +extern unsigned long long strtoull(const char *str, char **endptr, int base);
  1165 +#endif
  1166 +#endif /* HAVE_LONG_LONG_INT */
  1167 +
  1168 +#if !defined(HAVE_MEMMOVE) && !defined(memmove)
  1169 +#define memmove(d, s, c) bcopy(s, d, c)
  1170 +#endif
  1171 +
  1172 +/* no special DLL markers on most ports */
  1173 +#ifndef PGDLLIMPORT
  1174 +#define PGDLLIMPORT
  1175 +#endif
  1176 +#ifndef PGDLLEXPORT
  1177 +#define PGDLLEXPORT
  1178 +#endif
  1179 +
  1180 +/*
  1181 + * The following is used as the arg list for signal handlers. Any ports
  1182 + * that take something other than an int argument should override this in
  1183 + * their pg_config_os.h file. Note that variable names are required
  1184 + * because it is used in both the prototypes as well as the definitions.
  1185 + * Note also the long name. We expect that this won't collide with
  1186 + * other names causing compiler warnings.
  1187 + */
  1188 +
  1189 +#ifndef SIGNAL_ARGS
  1190 +#define SIGNAL_ARGS int postgres_signal_arg
  1191 +#endif
  1192 +
  1193 +/*
  1194 + * When there is no sigsetjmp, its functionality is provided by plain
  1195 + * setjmp. Incidentally, nothing provides setjmp's functionality in
  1196 + * that case. We now support the case only on Windows.
  1197 + */
  1198 +#ifdef WIN32
  1199 +#define sigjmp_buf jmp_buf
  1200 +#define sigsetjmp(x,y) setjmp(x)
  1201 +#define siglongjmp longjmp
  1202 +#endif
  1203 +
  1204 +/* EXEC_BACKEND defines */
  1205 +#ifdef EXEC_BACKEND
  1206 +#define NON_EXEC_STATIC
  1207 +#else
  1208 +#define NON_EXEC_STATIC static
  1209 +#endif
  1210 +
  1211 +/* /port compatibility functions */
  1212 +#include "port.h"
  1213 +
  1214 +#endif /* C_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * libpq-int.h
  4 + * This file contains internal definitions meant to be used only by
  5 + * the frontend libpq library, not by applications that call it.
  6 + *
  7 + * An application can include this file if it wants to bypass the
  8 + * official API defined by libpq-fe.h, but code that does so is much
  9 + * more likely to break across PostgreSQL releases than code that uses
  10 + * only the official API.
  11 + *
  12 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  13 + * Portions Copyright (c) 1994, Regents of the University of California
  14 + *
  15 + * src/interfaces/libpq/libpq-int.h
  16 + *
  17 + *-------------------------------------------------------------------------
  18 + */
  19 +
  20 +#ifndef LIBPQ_INT_H
  21 +#define LIBPQ_INT_H
  22 +
  23 +/* We assume libpq-fe.h has already been included. */
  24 +#include "libpq-events.h"
  25 +
  26 +#include <time.h>
  27 +#ifndef WIN32
  28 +#include <sys/time.h>
  29 +#endif
  30 +
  31 +#ifdef ENABLE_THREAD_SAFETY
  32 +#ifdef WIN32
  33 +#include "pthread-win32.h"
  34 +#else
  35 +#include <pthread.h>
  36 +#endif
  37 +#include <signal.h>
  38 +#endif
  39 +
  40 +/* include stuff common to fe and be */
  41 +#include "getaddrinfo.h"
  42 +#include "libpq/pqcomm.h"
  43 +/* include stuff found in fe only */
  44 +#include "pqexpbuffer.h"
  45 +
  46 +#ifdef ENABLE_GSS
  47 +#if defined(HAVE_GSSAPI_H)
  48 +#include <gssapi.h>
  49 +#else
  50 +#include <gssapi/gssapi.h>
  51 +#endif
  52 +#endif
  53 +
  54 +#ifdef ENABLE_SSPI
  55 +#define SECURITY_WIN32
  56 +#if defined(WIN32) && !defined(_MSC_VER)
  57 +#include <ntsecapi.h>
  58 +#endif
  59 +#include <security.h>
  60 +#undef SECURITY_WIN32
  61 +
  62 +#ifndef ENABLE_GSS
  63 +/*
  64 + * Define a fake structure compatible with GSSAPI on Unix.
  65 + */
  66 +typedef struct
  67 +{
  68 + void *value;
  69 + int length;
  70 +} gss_buffer_desc;
  71 +#endif
  72 +#endif /* ENABLE_SSPI */
  73 +
  74 +#ifdef USE_OPENSSL
  75 +#include <openssl/ssl.h>
  76 +#include <openssl/err.h>
  77 +
  78 +#ifndef OPENSSL_NO_ENGINE
  79 +#define USE_SSL_ENGINE
  80 +#endif
  81 +#endif /* USE_OPENSSL */
  82 +
  83 +/*
  84 + * POSTGRES backend dependent Constants.
  85 + */
  86 +#define CMDSTATUS_LEN 64 /* should match COMPLETION_TAG_BUFSIZE */
  87 +
  88 +/*
  89 + * PGresult and the subsidiary types PGresAttDesc, PGresAttValue
  90 + * represent the result of a query (or more precisely, of a single SQL
  91 + * command --- a query string given to PQexec can contain multiple commands).
  92 + * Note we assume that a single command can return at most one tuple group,
  93 + * hence there is no need for multiple descriptor sets.
  94 + */
  95 +
  96 +/* Subsidiary-storage management structure for PGresult.
  97 + * See space management routines in fe-exec.c for details.
  98 + * Note that space[k] refers to the k'th byte starting from the physical
  99 + * head of the block --- it's a union, not a struct!
  100 + */
  101 +typedef union pgresult_data PGresult_data;
  102 +
  103 +union pgresult_data
  104 +{
  105 + PGresult_data *next; /* link to next block, or NULL */
  106 + char space[1]; /* dummy for accessing block as bytes */
  107 +};
  108 +
  109 +/* Data about a single parameter of a prepared statement */
  110 +typedef struct pgresParamDesc
  111 +{
  112 + Oid typid; /* type id */
  113 +} PGresParamDesc;
  114 +
  115 +/*
  116 + * Data for a single attribute of a single tuple
  117 + *
  118 + * We use char* for Attribute values.
  119 + *
  120 + * The value pointer always points to a null-terminated area; we add a
  121 + * null (zero) byte after whatever the backend sends us. This is only
  122 + * particularly useful for text values ... with a binary value, the
  123 + * value might have embedded nulls, so the application can't use C string
  124 + * operators on it. But we add a null anyway for consistency.
  125 + * Note that the value itself does not contain a length word.
  126 + *
  127 + * A NULL attribute is a special case in two ways: its len field is NULL_LEN
  128 + * and its value field points to null_field in the owning PGresult. All the
  129 + * NULL attributes in a query result point to the same place (there's no need
  130 + * to store a null string separately for each one).
  131 + */
  132 +
  133 +#define NULL_LEN (-1) /* pg_result len for NULL value */
  134 +
  135 +typedef struct pgresAttValue
  136 +{
  137 + int len; /* length in bytes of the value */
  138 + char *value; /* actual value, plus terminating zero byte */
  139 +} PGresAttValue;
  140 +
  141 +/* Typedef for message-field list entries */
  142 +typedef struct pgMessageField
  143 +{
  144 + struct pgMessageField *next; /* list link */
  145 + char code; /* field code */
  146 + char contents[FLEXIBLE_ARRAY_MEMBER]; /* value, nul-terminated */
  147 +} PGMessageField;
  148 +
  149 +/* Fields needed for notice handling */
  150 +typedef struct
  151 +{
  152 + PQnoticeReceiver noticeRec; /* notice message receiver */
  153 + void *noticeRecArg;
  154 + PQnoticeProcessor noticeProc; /* notice message processor */
  155 + void *noticeProcArg;
  156 +} PGNoticeHooks;
  157 +
  158 +typedef struct PGEvent
  159 +{
  160 + PGEventProc proc; /* the function to call on events */
  161 + char *name; /* used only for error messages */
  162 + void *passThrough; /* pointer supplied at registration time */
  163 + void *data; /* optional state (instance) data */
  164 + bool resultInitialized; /* T if RESULTCREATE/COPY succeeded */
  165 +} PGEvent;
  166 +
  167 +struct pg_result
  168 +{
  169 + int ntups;
  170 + int numAttributes;
  171 + PGresAttDesc *attDescs;
  172 + PGresAttValue **tuples; /* each PGresTuple is an array of
  173 + * PGresAttValue's */
  174 + int tupArrSize; /* allocated size of tuples array */
  175 + int numParameters;
  176 + PGresParamDesc *paramDescs;
  177 + ExecStatusType resultStatus;
  178 + char cmdStatus[CMDSTATUS_LEN]; /* cmd status from the query */
  179 + int binary; /* binary tuple values if binary == 1,
  180 + * otherwise text */
  181 +
  182 + /*
  183 + * These fields are copied from the originating PGconn, so that operations
  184 + * on the PGresult don't have to reference the PGconn.
  185 + */
  186 + PGNoticeHooks noticeHooks;
  187 + PGEvent *events;
  188 + int nEvents;
  189 + int client_encoding; /* encoding id */
  190 +
  191 + /*
  192 + * Error information (all NULL if not an error result). errMsg is the
  193 + * "overall" error message returned by PQresultErrorMessage. If we have
  194 + * per-field info then it is stored in a linked list.
  195 + */
  196 + char *errMsg; /* error message, or NULL if no error */
  197 + PGMessageField *errFields; /* message broken into fields */
  198 + char *errQuery; /* text of triggering query, if available */
  199 +
  200 + /* All NULL attributes in the query result point to this null string */
  201 + char null_field[1];
  202 +
  203 + /*
  204 + * Space management information. Note that attDescs and error stuff, if
  205 + * not null, point into allocated blocks. But tuples points to a
  206 + * separately malloc'd block, so that we can realloc it.
  207 + */
  208 + PGresult_data *curBlock; /* most recently allocated block */
  209 + int curOffset; /* start offset of free space in block */
  210 + int spaceLeft; /* number of free bytes remaining in block */
  211 +};
  212 +
  213 +/* PGAsyncStatusType defines the state of the query-execution state machine */
  214 +typedef enum
  215 +{
  216 + PGASYNC_IDLE, /* nothing's happening, dude */
  217 + PGASYNC_BUSY, /* query in progress */
  218 + PGASYNC_READY, /* result ready for PQgetResult */
  219 + PGASYNC_COPY_IN, /* Copy In data transfer in progress */
  220 + PGASYNC_COPY_OUT, /* Copy Out data transfer in progress */
  221 + PGASYNC_COPY_BOTH /* Copy In/Out data transfer in progress */
  222 +} PGAsyncStatusType;
  223 +
  224 +/* PGQueryClass tracks which query protocol we are now executing */
  225 +typedef enum
  226 +{
  227 + PGQUERY_SIMPLE, /* simple Query protocol (PQexec) */
  228 + PGQUERY_EXTENDED, /* full Extended protocol (PQexecParams) */
  229 + PGQUERY_PREPARE, /* Parse only (PQprepare) */
  230 + PGQUERY_DESCRIBE /* Describe Statement or Portal */
  231 +} PGQueryClass;
  232 +
  233 +/* PGSetenvStatusType defines the state of the PQSetenv state machine */
  234 +/* (this is used only for 2.0-protocol connections) */
  235 +typedef enum
  236 +{
  237 + SETENV_STATE_CLIENT_ENCODING_SEND, /* About to send an Environment Option */
  238 + SETENV_STATE_CLIENT_ENCODING_WAIT, /* Waiting for above send to complete */
  239 + SETENV_STATE_OPTION_SEND, /* About to send an Environment Option */
  240 + SETENV_STATE_OPTION_WAIT, /* Waiting for above send to complete */
  241 + SETENV_STATE_QUERY1_SEND, /* About to send a status query */
  242 + SETENV_STATE_QUERY1_WAIT, /* Waiting for query to complete */
  243 + SETENV_STATE_QUERY2_SEND, /* About to send a status query */
  244 + SETENV_STATE_QUERY2_WAIT, /* Waiting for query to complete */
  245 + SETENV_STATE_IDLE
  246 +} PGSetenvStatusType;
  247 +
  248 +/* Typedef for the EnvironmentOptions[] array */
  249 +typedef struct PQEnvironmentOption
  250 +{
  251 + const char *envName, /* name of an environment variable */
  252 + *pgName; /* name of corresponding SET variable */
  253 +} PQEnvironmentOption;
  254 +
  255 +/* Typedef for parameter-status list entries */
  256 +typedef struct pgParameterStatus
  257 +{
  258 + struct pgParameterStatus *next; /* list link */
  259 + char *name; /* parameter name */
  260 + char *value; /* parameter value */
  261 + /* Note: name and value are stored in same malloc block as struct is */
  262 +} pgParameterStatus;
  263 +
  264 +/* large-object-access data ... allocated only if large-object code is used. */
  265 +typedef struct pgLobjfuncs
  266 +{
  267 + Oid fn_lo_open; /* OID of backend function lo_open */
  268 + Oid fn_lo_close; /* OID of backend function lo_close */
  269 + Oid fn_lo_creat; /* OID of backend function lo_creat */
  270 + Oid fn_lo_create; /* OID of backend function lo_create */
  271 + Oid fn_lo_unlink; /* OID of backend function lo_unlink */
  272 + Oid fn_lo_lseek; /* OID of backend function lo_lseek */
  273 + Oid fn_lo_lseek64; /* OID of backend function lo_lseek64 */
  274 + Oid fn_lo_tell; /* OID of backend function lo_tell */
  275 + Oid fn_lo_tell64; /* OID of backend function lo_tell64 */
  276 + Oid fn_lo_truncate; /* OID of backend function lo_truncate */
  277 + Oid fn_lo_truncate64; /* OID of function lo_truncate64 */
  278 + Oid fn_lo_read; /* OID of backend function LOread */
  279 + Oid fn_lo_write; /* OID of backend function LOwrite */
  280 +} PGlobjfuncs;
  281 +
  282 +/* PGdataValue represents a data field value being passed to a row processor.
  283 + * It could be either text or binary data; text data is not zero-terminated.
  284 + * A SQL NULL is represented by len < 0; then value is still valid but there
  285 + * are no data bytes there.
  286 + */
  287 +typedef struct pgDataValue
  288 +{
  289 + int len; /* data length in bytes, or <0 if NULL */
  290 + const char *value; /* data value, without zero-termination */
  291 +} PGdataValue;
  292 +
  293 +/* Host address type enum for struct pg_conn_host */
  294 +typedef enum pg_conn_host_type
  295 +{
  296 + CHT_HOST_NAME,
  297 + CHT_HOST_ADDRESS,
  298 + CHT_UNIX_SOCKET
  299 +} pg_conn_host_type;
  300 +
  301 +/*
  302 + * pg_conn_host stores all information about each of possibly several hosts
  303 + * mentioned in the connection string. Most fields are derived by splitting
  304 + * the relevant connection parameter (e.g., pghost) at commas.
  305 + */
  306 +typedef struct pg_conn_host
  307 +{
  308 + pg_conn_host_type type; /* type of host address */
  309 + char *host; /* host name or socket path */
  310 + char *hostaddr; /* host numeric IP address */
  311 + char *port; /* port number (always provided) */
  312 + char *password; /* password for this host, read from the
  313 + * password file; NULL if not sought or not
  314 + * found in password file. */
  315 + struct addrinfo *was_addrlist; /* dummy for ABI compatibility */
  316 +} pg_conn_host;
  317 +
  318 +/*
  319 + * PGconn stores all the state data associated with a single connection
  320 + * to a backend.
  321 + */
  322 +struct pg_conn
  323 +{
  324 + /* Saved values of connection options */
  325 + char *pghost; /* the machine on which the server is running,
  326 + * or a path to a UNIX-domain socket, or a
  327 + * comma-separated list of machines and/or
  328 + * paths; if NULL, use DEFAULT_PGSOCKET_DIR */
  329 + char *pghostaddr; /* the numeric IP address of the machine on
  330 + * which the server is running, or a
  331 + * comma-separated list of same. Takes
  332 + * precedence over pghost. */
  333 + char *pgport; /* the server's communication port number, or
  334 + * a comma-separated list of ports */
  335 + char *pgtty; /* tty on which the backend messages is
  336 + * displayed (OBSOLETE, NOT USED) */
  337 + char *connect_timeout; /* connection timeout (numeric string) */
  338 + char *client_encoding_initial; /* encoding to use */
  339 + char *pgoptions; /* options to start the backend with */
  340 + char *appname; /* application name */
  341 + char *fbappname; /* fallback application name */
  342 + char *dbName; /* database name */
  343 + char *replication; /* connect as the replication standby? */
  344 + char *pguser; /* Postgres username and password, if any */
  345 + char *pgpass;
  346 + char *pgpassfile; /* path to a file containing password(s) */
  347 + char *keepalives; /* use TCP keepalives? */
  348 + char *keepalives_idle; /* time between TCP keepalives */
  349 + char *keepalives_interval; /* time between TCP keepalive
  350 + * retransmits */
  351 + char *keepalives_count; /* maximum number of TCP keepalive
  352 + * retransmits */
  353 + char *sslmode; /* SSL mode (require,prefer,allow,disable) */
  354 + char *sslcompression; /* SSL compression (0 or 1) */
  355 + char *sslkey; /* client key filename */
  356 + char *sslcert; /* client certificate filename */
  357 + char *sslrootcert; /* root certificate filename */
  358 + char *sslcrl; /* certificate revocation list filename */
  359 + char *requirepeer; /* required peer credentials for local sockets */
  360 +
  361 +#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)
  362 + char *krbsrvname; /* Kerberos service name */
  363 +#endif
  364 +
  365 + /* Type of connection to make. Possible values: any, read-write. */
  366 + char *target_session_attrs;
  367 +
  368 + /* Optional file to write trace info to */
  369 + FILE *Pfdebug;
  370 +
  371 + /* Callback procedures for notice message processing */
  372 + PGNoticeHooks noticeHooks;
  373 +
  374 + /* Event procs registered via PQregisterEventProc */
  375 + PGEvent *events; /* expandable array of event data */
  376 + int nEvents; /* number of active events */
  377 + int eventArraySize; /* allocated array size */
  378 +
  379 + /* Status indicators */
  380 + ConnStatusType status;
  381 + PGAsyncStatusType asyncStatus;
  382 + PGTransactionStatusType xactStatus; /* never changes to ACTIVE */
  383 + PGQueryClass queryclass;
  384 + char *last_query; /* last SQL command, or NULL if unknown */
  385 + char last_sqlstate[6]; /* last reported SQLSTATE */
  386 + bool options_valid; /* true if OK to attempt connection */
  387 + bool nonblocking; /* whether this connection is using nonblock
  388 + * sending semantics */
  389 + bool singleRowMode; /* return current query result row-by-row? */
  390 + char copy_is_binary; /* 1 = copy binary, 0 = copy text */
  391 + int copy_already_done; /* # bytes already returned in COPY OUT */
  392 + PGnotify *notifyHead; /* oldest unreported Notify msg */
  393 + PGnotify *notifyTail; /* newest unreported Notify msg */
  394 +
  395 + /* Support for multiple hosts in connection string */
  396 + int nconnhost; /* # of hosts named in conn string */
  397 + int whichhost; /* host we're currently trying/connected to */
  398 + pg_conn_host *connhost; /* details about each named host */
  399 +
  400 + /* Connection data */
  401 + pgsocket sock; /* FD for socket, PGINVALID_SOCKET if
  402 + * unconnected */
  403 + SockAddr laddr; /* Local address */
  404 + SockAddr raddr; /* Remote address */
  405 + ProtocolVersion pversion; /* FE/BE protocol version in use */
  406 + int sversion; /* server version, e.g. 70401 for 7.4.1 */
  407 + bool auth_req_received; /* true if any type of auth req received */
  408 + bool password_needed; /* true if server demanded a password */
  409 + bool sigpipe_so; /* have we masked SIGPIPE via SO_NOSIGPIPE? */
  410 + bool sigpipe_flag; /* can we mask SIGPIPE via MSG_NOSIGNAL? */
  411 +
  412 + /* Transient state needed while establishing connection */
  413 + bool try_next_addr; /* time to advance to next address/host? */
  414 + bool try_next_host; /* time to advance to next connhost[]? */
  415 + struct addrinfo *addr_cur; /* backend address currently being tried */
  416 + PGSetenvStatusType setenv_state; /* for 2.0 protocol only */
  417 + const PQEnvironmentOption *next_eo;
  418 + bool send_appname; /* okay to send application_name? */
  419 +
  420 + /* Miscellaneous stuff */
  421 + int be_pid; /* PID of backend --- needed for cancels */
  422 + int be_key; /* key of backend --- needed for cancels */
  423 + pgParameterStatus *pstatus; /* ParameterStatus data */
  424 + int client_encoding; /* encoding id */
  425 + bool std_strings; /* standard_conforming_strings */
  426 + PGVerbosity verbosity; /* error/notice message verbosity */
  427 + PGContextVisibility show_context; /* whether to show CONTEXT field */
  428 + PGlobjfuncs *lobjfuncs; /* private state for large-object access fns */
  429 +
  430 + /* Buffer for data received from backend and not yet processed */
  431 + char *inBuffer; /* currently allocated buffer */
  432 + int inBufSize; /* allocated size of buffer */
  433 + int inStart; /* offset to first unconsumed data in buffer */
  434 + int inCursor; /* next byte to tentatively consume */
  435 + int inEnd; /* offset to first position after avail data */
  436 +
  437 + /* Buffer for data not yet sent to backend */
  438 + char *outBuffer; /* currently allocated buffer */
  439 + int outBufSize; /* allocated size of buffer */
  440 + int outCount; /* number of chars waiting in buffer */
  441 +
  442 + /* State for constructing messages in outBuffer */
  443 + int outMsgStart; /* offset to msg start (length word); if -1,
  444 + * msg has no length word */
  445 + int outMsgEnd; /* offset to msg end (so far) */
  446 +
  447 + /* Row processor interface workspace */
  448 + PGdataValue *rowBuf; /* array for passing values to rowProcessor */
  449 + int rowBufLen; /* number of entries allocated in rowBuf */
  450 +
  451 + /* Status for asynchronous result construction */
  452 + PGresult *result; /* result being constructed */
  453 + PGresult *next_result; /* next result (used in single-row mode) */
  454 +
  455 + /* Assorted state for SASL, SSL, GSS, etc */
  456 + void *sasl_state;
  457 +
  458 + /* SSL structures */
  459 + bool ssl_in_use;
  460 +
  461 +#ifdef USE_SSL
  462 + bool allow_ssl_try; /* Allowed to try SSL negotiation */
  463 + bool wait_ssl_try; /* Delay SSL negotiation until after
  464 + * attempting normal connection */
  465 +#ifdef USE_OPENSSL
  466 + SSL *ssl; /* SSL status, if have SSL connection */
  467 + X509 *peer; /* X509 cert of server */
  468 +#ifdef USE_SSL_ENGINE
  469 + ENGINE *engine; /* SSL engine, if any */
  470 +#else
  471 + void *engine; /* dummy field to keep struct the same if
  472 + * OpenSSL version changes */
  473 +#endif
  474 +#endif /* USE_OPENSSL */
  475 +#endif /* USE_SSL */
  476 +
  477 +#ifdef ENABLE_GSS
  478 + gss_ctx_id_t gctx; /* GSS context */
  479 + gss_name_t gtarg_nam; /* GSS target name */
  480 +#endif
  481 +
  482 +#ifdef ENABLE_SSPI
  483 +#ifdef ENABLE_GSS
  484 + char *gsslib; /* What GSS library to use ("gssapi" or
  485 + * "sspi") */
  486 +#endif
  487 + CredHandle *sspicred; /* SSPI credentials handle */
  488 + CtxtHandle *sspictx; /* SSPI context */
  489 + char *sspitarget; /* SSPI target name */
  490 + int usesspi; /* Indicate if SSPI is in use on the
  491 + * connection */
  492 +#endif
  493 +
  494 + /* Buffer for current error message */
  495 + PQExpBufferData errorMessage; /* expansible string */
  496 +
  497 + /* Buffer for receiving various parts of messages */
  498 + PQExpBufferData workBuffer; /* expansible string */
  499 +
  500 + /* Placed at the end, in this branch, to minimize ABI breakage */
  501 + struct addrinfo *addrlist; /* list of addresses for current connhost */
  502 + int addrlist_family; /* needed to know how to free addrlist */
  503 +};
  504 +
  505 +/* PGcancel stores all data necessary to cancel a connection. A copy of this
  506 + * data is required to safely cancel a connection running on a different
  507 + * thread.
  508 + */
  509 +struct pg_cancel
  510 +{
  511 + SockAddr raddr; /* Remote address */
  512 + int be_pid; /* PID of backend --- needed for cancels */
  513 + int be_key; /* key of backend --- needed for cancels */
  514 +};
  515 +
  516 +
  517 +/* String descriptions of the ExecStatusTypes.
  518 + * direct use of this array is deprecated; call PQresStatus() instead.
  519 + */
  520 +extern char *const pgresStatus[];
  521 +
  522 +
  523 +#ifdef USE_SSL
  524 +
  525 +#ifndef WIN32
  526 +#define USER_CERT_FILE ".postgresql/postgresql.crt"
  527 +#define USER_KEY_FILE ".postgresql/postgresql.key"
  528 +#define ROOT_CERT_FILE ".postgresql/root.crt"
  529 +#define ROOT_CRL_FILE ".postgresql/root.crl"
  530 +#else
  531 +/* On Windows, the "home" directory is already PostgreSQL-specific */
  532 +#define USER_CERT_FILE "postgresql.crt"
  533 +#define USER_KEY_FILE "postgresql.key"
  534 +#define ROOT_CERT_FILE "root.crt"
  535 +#define ROOT_CRL_FILE "root.crl"
  536 +#endif
  537 +
  538 +#endif /* USE_SSL */
  539 +
  540 +/* ----------------
  541 + * Internal functions of libpq
  542 + * Functions declared here need to be visible across files of libpq,
  543 + * but are not intended to be called by applications. We use the
  544 + * convention "pqXXX" for internal functions, vs. the "PQxxx" names
  545 + * used for application-visible routines.
  546 + * ----------------
  547 + */
  548 +
  549 +/* === in fe-connect.c === */
  550 +
  551 +extern void pqDropConnection(PGconn *conn, bool flushInput);
  552 +extern int pqPacketSend(PGconn *conn, char pack_type,
  553 + const void *buf, size_t buf_len);
  554 +extern bool pqGetHomeDirectory(char *buf, int bufsize);
  555 +
  556 +#ifdef ENABLE_THREAD_SAFETY
  557 +extern pgthreadlock_t pg_g_threadlock;
  558 +
  559 +#define PGTHREAD_ERROR(msg) \
  560 + do { \
  561 + fprintf(stderr, "%s\n", msg); \
  562 + abort(); \
  563 + } while (0)
  564 +
  565 +
  566 +#define pglock_thread() pg_g_threadlock(true)
  567 +#define pgunlock_thread() pg_g_threadlock(false)
  568 +#else
  569 +#define pglock_thread() ((void) 0)
  570 +#define pgunlock_thread() ((void) 0)
  571 +#endif
  572 +
  573 +/* === in fe-exec.c === */
  574 +
  575 +extern void pqSetResultError(PGresult *res, const char *msg);
  576 +extern void pqCatenateResultError(PGresult *res, const char *msg);
  577 +extern void *pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary);
  578 +extern char *pqResultStrdup(PGresult *res, const char *str);
  579 +extern void pqClearAsyncResult(PGconn *conn);
  580 +extern void pqSaveErrorResult(PGconn *conn);
  581 +extern PGresult *pqPrepareAsyncResult(PGconn *conn);
  582 +extern void pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...) pg_attribute_printf(2, 3);
  583 +extern void pqSaveMessageField(PGresult *res, char code,
  584 + const char *value);
  585 +extern void pqSaveParameterStatus(PGconn *conn, const char *name,
  586 + const char *value);
  587 +extern int pqRowProcessor(PGconn *conn, const char **errmsgp);
  588 +extern void pqHandleSendFailure(PGconn *conn);
  589 +
  590 +/* === in fe-protocol2.c === */
  591 +
  592 +extern PostgresPollingStatusType pqSetenvPoll(PGconn *conn);
  593 +
  594 +extern char *pqBuildStartupPacket2(PGconn *conn, int *packetlen,
  595 + const PQEnvironmentOption *options);
  596 +extern void pqParseInput2(PGconn *conn);
  597 +extern int pqGetCopyData2(PGconn *conn, char **buffer, int async);
  598 +extern int pqGetline2(PGconn *conn, char *s, int maxlen);
  599 +extern int pqGetlineAsync2(PGconn *conn, char *buffer, int bufsize);
  600 +extern int pqEndcopy2(PGconn *conn);
  601 +extern PGresult *pqFunctionCall2(PGconn *conn, Oid fnid,
  602 + int *result_buf, int *actual_result_len,
  603 + int result_is_int,
  604 + const PQArgBlock *args, int nargs);
  605 +
  606 +/* === in fe-protocol3.c === */
  607 +
  608 +extern char *pqBuildStartupPacket3(PGconn *conn, int *packetlen,
  609 + const PQEnvironmentOption *options);
  610 +extern void pqParseInput3(PGconn *conn);
  611 +extern int pqGetErrorNotice3(PGconn *conn, bool isError);
  612 +extern void pqBuildErrorMessage3(PQExpBuffer msg, const PGresult *res,
  613 + PGVerbosity verbosity, PGContextVisibility show_context);
  614 +extern int pqGetCopyData3(PGconn *conn, char **buffer, int async);
  615 +extern int pqGetline3(PGconn *conn, char *s, int maxlen);
  616 +extern int pqGetlineAsync3(PGconn *conn, char *buffer, int bufsize);
  617 +extern int pqEndcopy3(PGconn *conn);
  618 +extern PGresult *pqFunctionCall3(PGconn *conn, Oid fnid,
  619 + int *result_buf, int *actual_result_len,
  620 + int result_is_int,
  621 + const PQArgBlock *args, int nargs);
  622 +
  623 +/* === in fe-misc.c === */
  624 +
  625 + /*
  626 + * "Get" and "Put" routines return 0 if successful, EOF if not. Note that for
  627 + * Get, EOF merely means the buffer is exhausted, not that there is
  628 + * necessarily any error.
  629 + */
  630 +extern int pqCheckOutBufferSpace(size_t bytes_needed, PGconn *conn);
  631 +extern int pqCheckInBufferSpace(size_t bytes_needed, PGconn *conn);
  632 +extern int pqGetc(char *result, PGconn *conn);
  633 +extern int pqPutc(char c, PGconn *conn);
  634 +extern int pqGets(PQExpBuffer buf, PGconn *conn);
  635 +extern int pqGets_append(PQExpBuffer buf, PGconn *conn);
  636 +extern int pqPuts(const char *s, PGconn *conn);
  637 +extern int pqGetnchar(char *s, size_t len, PGconn *conn);
  638 +extern int pqSkipnchar(size_t len, PGconn *conn);
  639 +extern int pqPutnchar(const char *s, size_t len, PGconn *conn);
  640 +extern int pqGetInt(int *result, size_t bytes, PGconn *conn);
  641 +extern int pqPutInt(int value, size_t bytes, PGconn *conn);
  642 +extern int pqPutMsgStart(char msg_type, bool force_len, PGconn *conn);
  643 +extern int pqPutMsgEnd(PGconn *conn);
  644 +extern int pqReadData(PGconn *conn);
  645 +extern int pqFlush(PGconn *conn);
  646 +extern int pqWait(int forRead, int forWrite, PGconn *conn);
  647 +extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn,
  648 + time_t finish_time);
  649 +extern int pqReadReady(PGconn *conn);
  650 +extern int pqWriteReady(PGconn *conn);
  651 +
  652 +/* === in fe-secure.c === */
  653 +
  654 +extern int pqsecure_initialize(PGconn *);
  655 +extern void pqsecure_destroy(void);
  656 +extern PostgresPollingStatusType pqsecure_open_client(PGconn *);
  657 +extern void pqsecure_close(PGconn *);
  658 +extern ssize_t pqsecure_read(PGconn *, void *ptr, size_t len);
  659 +extern ssize_t pqsecure_write(PGconn *, const void *ptr, size_t len);
  660 +extern ssize_t pqsecure_raw_read(PGconn *, void *ptr, size_t len);
  661 +extern ssize_t pqsecure_raw_write(PGconn *, const void *ptr, size_t len);
  662 +
  663 +#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
  664 +extern int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending);
  665 +extern void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending,
  666 + bool got_epipe);
  667 +#endif
  668 +
  669 +/* === SSL === */
  670 +
  671 +/*
  672 + * The SSL implementation provides these functions.
  673 + */
  674 +
  675 +/*
  676 + * Implementation of PQinitSSL().
  677 + */
  678 +extern void pgtls_init_library(bool do_ssl, int do_crypto);
  679 +
  680 +/*
  681 + * Initialize SSL library.
  682 + *
  683 + * The conn parameter is only used to be able to pass back an error
  684 + * message - no connection-local setup is made here.
  685 + *
  686 + * Returns 0 if OK, -1 on failure (with a message in conn->errorMessage).
  687 + */
  688 +extern int pgtls_init(PGconn *conn);
  689 +
  690 +/*
  691 + * Begin or continue negotiating a secure session.
  692 + */
  693 +extern PostgresPollingStatusType pgtls_open_client(PGconn *conn);
  694 +
  695 +/*
  696 + * Close SSL connection.
  697 + */
  698 +extern void pgtls_close(PGconn *conn);
  699 +
  700 +/*
  701 + * Read data from a secure connection.
  702 + *
  703 + * On failure, this function is responsible for putting a suitable message
  704 + * into conn->errorMessage. The caller must still inspect errno, but only
  705 + * to determine whether to continue/retry after error.
  706 + */
  707 +extern ssize_t pgtls_read(PGconn *conn, void *ptr, size_t len);
  708 +
  709 +/*
  710 + * Is there unread data waiting in the SSL read buffer?
  711 + */
  712 +extern bool pgtls_read_pending(PGconn *conn);
  713 +
  714 +/*
  715 + * Write data to a secure connection.
  716 + *
  717 + * On failure, this function is responsible for putting a suitable message
  718 + * into conn->errorMessage. The caller must still inspect errno, but only
  719 + * to determine whether to continue/retry after error.
  720 + */
  721 +extern ssize_t pgtls_write(PGconn *conn, const void *ptr, size_t len);
  722 +
  723 +/*
  724 + * Get the hash of the server certificate, for SCRAM channel binding type
  725 + * tls-server-end-point.
  726 + *
  727 + * NULL is sent back to the caller in the event of an error, with an
  728 + * error message for the caller to consume.
  729 + *
  730 + * This is not supported with old versions of OpenSSL that don't have
  731 + * the X509_get_signature_nid() function.
  732 + */
  733 +#if defined(USE_OPENSSL) && defined(HAVE_X509_GET_SIGNATURE_NID)
  734 +#define HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH
  735 +extern char *pgtls_get_peer_certificate_hash(PGconn *conn, size_t *len);
  736 +#endif
  737 +
  738 +/*
  739 + * Verify that the server certificate matches the host name we connected to.
  740 + *
  741 + * The certificate's Common Name and Subject Alternative Names are considered.
  742 + *
  743 + * Returns 1 if the name matches, and 0 if it does not. On error, returns
  744 + * -1, and sets the libpq error message.
  745 + *
  746 + */
  747 +extern int pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn,
  748 + int *names_examined,
  749 + char **first_name);
  750 +
  751 +/* === miscellaneous macros === */
  752 +
  753 +/*
  754 + * this is so that we can check if a connection is non-blocking internally
  755 + * without the overhead of a function call
  756 + */
  757 +#define pqIsnonblocking(conn) ((conn)->nonblocking)
  758 +
  759 +#ifdef ENABLE_NLS
  760 +extern char *libpq_gettext(const char *msgid) pg_attribute_format_arg(1);
  761 +extern char *libpq_ngettext(const char *msgid, const char *msgid_plural, unsigned long n) pg_attribute_format_arg(1) pg_attribute_format_arg(2);
  762 +#else
  763 +#define libpq_gettext(x) (x)
  764 +#define libpq_ngettext(s, p, n) ((n) == 1 ? (s) : (p))
  765 +#endif
  766 +
  767 +/*
  768 + * These macros are needed to let error-handling code be portable between
  769 + * Unix and Windows. (ugh)
  770 + */
  771 +#ifdef WIN32
  772 +#define SOCK_ERRNO (WSAGetLastError())
  773 +#define SOCK_STRERROR winsock_strerror
  774 +#define SOCK_ERRNO_SET(e) WSASetLastError(e)
  775 +#else
  776 +#define SOCK_ERRNO errno
  777 +#define SOCK_STRERROR pqStrerror
  778 +#define SOCK_ERRNO_SET(e) (errno = (e))
  779 +#endif
  780 +
  781 +#endif /* LIBPQ_INT_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * pqcomm.h
  4 + * Definitions common to frontends and backends.
  5 + *
  6 + * NOTE: for historical reasons, this does not correspond to pqcomm.c.
  7 + * pqcomm.c's routines are declared in libpq.h.
  8 + *
  9 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  10 + * Portions Copyright (c) 1994, Regents of the University of California
  11 + *
  12 + * src/include/libpq/pqcomm.h
  13 + *
  14 + *-------------------------------------------------------------------------
  15 + */
  16 +#ifndef PQCOMM_H
  17 +#define PQCOMM_H
  18 +
  19 +#include <sys/socket.h>
  20 +#include <netdb.h>
  21 +#ifdef HAVE_SYS_UN_H
  22 +#include <sys/un.h>
  23 +#endif
  24 +#include <netinet/in.h>
  25 +
  26 +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
  27 +
  28 +#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
  29 +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
  30 +#define ss_family __ss_family
  31 +#else
  32 +#error struct sockaddr_storage does not provide an ss_family member
  33 +#endif
  34 +#endif
  35 +
  36 +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN
  37 +#define ss_len __ss_len
  38 +#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
  39 +#endif
  40 +#else /* !HAVE_STRUCT_SOCKADDR_STORAGE */
  41 +
  42 +/* Define a struct sockaddr_storage if we don't have one. */
  43 +
  44 +struct sockaddr_storage
  45 +{
  46 + union
  47 + {
  48 + struct sockaddr sa; /* get the system-dependent fields */
  49 + int64 ss_align; /* ensures struct is properly aligned */
  50 + char ss_pad[128]; /* ensures struct has desired size */
  51 + } ss_stuff;
  52 +};
  53 +
  54 +#define ss_family ss_stuff.sa.sa_family
  55 +/* It should have an ss_len field if sockaddr has sa_len. */
  56 +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
  57 +#define ss_len ss_stuff.sa.sa_len
  58 +#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
  59 +#endif
  60 +#endif /* HAVE_STRUCT_SOCKADDR_STORAGE */
  61 +
  62 +typedef struct
  63 +{
  64 + struct sockaddr_storage addr;
  65 + ACCEPT_TYPE_ARG3 salen;
  66 +} SockAddr;
  67 +
  68 +/* Configure the UNIX socket location for the well known port. */
  69 +
  70 +#define UNIXSOCK_PATH(path, port, sockdir) \
  71 + snprintf(path, sizeof(path), "%s/.s.PGSQL.%d", \
  72 + ((sockdir) && *(sockdir) != '\0') ? (sockdir) : \
  73 + DEFAULT_PGSOCKET_DIR, \
  74 + (port))
  75 +
  76 +/*
  77 + * The maximum workable length of a socket path is what will fit into
  78 + * struct sockaddr_un. This is usually only 100 or so bytes :-(.
  79 + *
  80 + * For consistency, always pass a MAXPGPATH-sized buffer to UNIXSOCK_PATH(),
  81 + * then complain if the resulting string is >= UNIXSOCK_PATH_BUFLEN bytes.
  82 + * (Because the standard API for getaddrinfo doesn't allow it to complain in
  83 + * a useful way when the socket pathname is too long, we have to test for
  84 + * this explicitly, instead of just letting the subroutine return an error.)
  85 + */
  86 +#define UNIXSOCK_PATH_BUFLEN sizeof(((struct sockaddr_un *) NULL)->sun_path)
  87 +
  88 +
  89 +/*
  90 + * These manipulate the frontend/backend protocol version number.
  91 + *
  92 + * The major number should be incremented for incompatible changes. The minor
  93 + * number should be incremented for compatible changes (eg. additional
  94 + * functionality).
  95 + *
  96 + * If a backend supports version m.n of the protocol it must actually support
  97 + * versions m.[0..n]. Backend support for version m-1 can be dropped after a
  98 + * `reasonable' length of time.
  99 + *
  100 + * A frontend isn't required to support anything other than the current
  101 + * version.
  102 + */
  103 +
  104 +#define PG_PROTOCOL_MAJOR(v) ((v) >> 16)
  105 +#define PG_PROTOCOL_MINOR(v) ((v) & 0x0000ffff)
  106 +#define PG_PROTOCOL(m,n) (((m) << 16) | (n))
  107 +
  108 +/* The earliest and latest frontend/backend protocol version supported. */
  109 +
  110 +#define PG_PROTOCOL_EARLIEST PG_PROTOCOL(2,0)
  111 +#define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0)
  112 +
  113 +typedef uint32 ProtocolVersion; /* FE/BE protocol version number */
  114 +
  115 +typedef ProtocolVersion MsgType;
  116 +
  117 +
  118 +/*
  119 + * Packet lengths are 4 bytes in network byte order.
  120 + *
  121 + * The initial length is omitted from the packet layouts appearing below.
  122 + */
  123 +
  124 +typedef uint32 PacketLen;
  125 +
  126 +
  127 +/*
  128 + * Old-style startup packet layout with fixed-width fields. This is used in
  129 + * protocol 1.0 and 2.0, but not in later versions. Note that the fields
  130 + * in this layout are '\0' terminated only if there is room.
  131 + */
  132 +
  133 +#define SM_DATABASE 64
  134 +#define SM_USER 32
  135 +/* We append database name if db_user_namespace true. */
  136 +#define SM_DATABASE_USER (SM_DATABASE+SM_USER+1) /* +1 for @ */
  137 +#define SM_OPTIONS 64
  138 +#define SM_UNUSED 64
  139 +#define SM_TTY 64
  140 +
  141 +typedef struct StartupPacket
  142 +{
  143 + ProtocolVersion protoVersion; /* Protocol version */
  144 + char database[SM_DATABASE]; /* Database name */
  145 + /* Db_user_namespace appends dbname */
  146 + char user[SM_USER]; /* User name */
  147 + char options[SM_OPTIONS]; /* Optional additional args */
  148 + char unused[SM_UNUSED]; /* Unused */
  149 + char tty[SM_TTY]; /* Tty for debug output */
  150 +} StartupPacket;
  151 +
  152 +extern bool Db_user_namespace;
  153 +
  154 +/*
  155 + * In protocol 3.0 and later, the startup packet length is not fixed, but
  156 + * we set an arbitrary limit on it anyway. This is just to prevent simple
  157 + * denial-of-service attacks via sending enough data to run the server
  158 + * out of memory.
  159 + */
  160 +#define MAX_STARTUP_PACKET_LENGTH 10000
  161 +
  162 +
  163 +/* These are the authentication request codes sent by the backend. */
  164 +
  165 +#define AUTH_REQ_OK 0 /* User is authenticated */
  166 +#define AUTH_REQ_KRB4 1 /* Kerberos V4. Not supported any more. */
  167 +#define AUTH_REQ_KRB5 2 /* Kerberos V5. Not supported any more. */
  168 +#define AUTH_REQ_PASSWORD 3 /* Password */
  169 +#define AUTH_REQ_CRYPT 4 /* crypt password. Not supported any more. */
  170 +#define AUTH_REQ_MD5 5 /* md5 password */
  171 +#define AUTH_REQ_SCM_CREDS 6 /* transfer SCM credentials */
  172 +#define AUTH_REQ_GSS 7 /* GSSAPI without wrap() */
  173 +#define AUTH_REQ_GSS_CONT 8 /* Continue GSS exchanges */
  174 +#define AUTH_REQ_SSPI 9 /* SSPI negotiate without wrap() */
  175 +#define AUTH_REQ_SASL 10 /* Begin SASL authentication */
  176 +#define AUTH_REQ_SASL_CONT 11 /* Continue SASL authentication */
  177 +#define AUTH_REQ_SASL_FIN 12 /* Final SASL message */
  178 +
  179 +typedef uint32 AuthRequest;
  180 +
  181 +
  182 +/*
  183 + * A client can also send a cancel-current-operation request to the postmaster.
  184 + * This is uglier than sending it directly to the client's backend, but it
  185 + * avoids depending on out-of-band communication facilities.
  186 + *
  187 + * The cancel request code must not match any protocol version number
  188 + * we're ever likely to use. This random choice should do.
  189 + */
  190 +#define CANCEL_REQUEST_CODE PG_PROTOCOL(1234,5678)
  191 +
  192 +typedef struct CancelRequestPacket
  193 +{
  194 + /* Note that each field is stored in network byte order! */
  195 + MsgType cancelRequestCode; /* code to identify a cancel request */
  196 + uint32 backendPID; /* PID of client's backend */
  197 + uint32 cancelAuthCode; /* secret key to authorize cancel */
  198 +} CancelRequestPacket;
  199 +
  200 +
  201 +/*
  202 + * A client can also start by sending a SSL negotiation request, to get a
  203 + * secure channel.
  204 + */
  205 +#define NEGOTIATE_SSL_CODE PG_PROTOCOL(1234,5679)
  206 +
  207 +#endif /* PQCOMM_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * port.h
  4 + * Header for src/port/ compatibility functions.
  5 + *
  6 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  7 + * Portions Copyright (c) 1994, Regents of the University of California
  8 + *
  9 + * src/include/port.h
  10 + *
  11 + *-------------------------------------------------------------------------
  12 + */
  13 +#ifndef PG_PORT_H
  14 +#define PG_PORT_H
  15 +
  16 +#include <ctype.h>
  17 +#include <netdb.h>
  18 +#include <pwd.h>
  19 +
  20 +/*
  21 + * Windows has enough specialized port stuff that we push most of it off
  22 + * into another file.
  23 + * Note: Some CYGWIN includes might #define WIN32.
  24 + */
  25 +#if defined(WIN32) && !defined(__CYGWIN__)
  26 +#include "port/win32_port.h"
  27 +#endif
  28 +
  29 +/* socket has a different definition on WIN32 */
  30 +#ifndef WIN32
  31 +typedef int pgsocket;
  32 +
  33 +#define PGINVALID_SOCKET (-1)
  34 +#else
  35 +typedef SOCKET pgsocket;
  36 +
  37 +#define PGINVALID_SOCKET INVALID_SOCKET
  38 +#endif
  39 +
  40 +/* non-blocking */
  41 +extern bool pg_set_noblock(pgsocket sock);
  42 +extern bool pg_set_block(pgsocket sock);
  43 +
  44 +/* Portable path handling for Unix/Win32 (in path.c) */
  45 +
  46 +extern bool has_drive_prefix(const char *filename);
  47 +extern char *first_dir_separator(const char *filename);
  48 +extern char *last_dir_separator(const char *filename);
  49 +extern char *first_path_var_separator(const char *pathlist);
  50 +extern void join_path_components(char *ret_path,
  51 + const char *head, const char *tail);
  52 +extern void canonicalize_path(char *path);
  53 +extern void make_native_path(char *path);
  54 +extern void cleanup_path(char *path);
  55 +extern bool path_contains_parent_reference(const char *path);
  56 +extern bool path_is_relative_and_below_cwd(const char *path);
  57 +extern bool path_is_prefix_of_path(const char *path1, const char *path2);
  58 +extern char *make_absolute_path(const char *path);
  59 +extern const char *get_progname(const char *argv0);
  60 +extern void get_share_path(const char *my_exec_path, char *ret_path);
  61 +extern void get_etc_path(const char *my_exec_path, char *ret_path);
  62 +extern void get_include_path(const char *my_exec_path, char *ret_path);
  63 +extern void get_pkginclude_path(const char *my_exec_path, char *ret_path);
  64 +extern void get_includeserver_path(const char *my_exec_path, char *ret_path);
  65 +extern void get_lib_path(const char *my_exec_path, char *ret_path);
  66 +extern void get_pkglib_path(const char *my_exec_path, char *ret_path);
  67 +extern void get_locale_path(const char *my_exec_path, char *ret_path);
  68 +extern void get_doc_path(const char *my_exec_path, char *ret_path);
  69 +extern void get_html_path(const char *my_exec_path, char *ret_path);
  70 +extern void get_man_path(const char *my_exec_path, char *ret_path);
  71 +extern bool get_home_path(char *ret_path);
  72 +extern void get_parent_directory(char *path);
  73 +
  74 +/* common/pgfnames.c */
  75 +extern char **pgfnames(const char *path);
  76 +extern void pgfnames_cleanup(char **filenames);
  77 +
  78 +/*
  79 + * is_absolute_path
  80 + *
  81 + * By making this a macro we avoid needing to include path.c in libpq.
  82 + */
  83 +#ifndef WIN32
  84 +#define IS_DIR_SEP(ch) ((ch) == '/')
  85 +
  86 +#define is_absolute_path(filename) \
  87 +( \
  88 + IS_DIR_SEP((filename)[0]) \
  89 +)
  90 +#else
  91 +#define IS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\')
  92 +
  93 +/* See path_is_relative_and_below_cwd() for how we handle 'E:abc'. */
  94 +#define is_absolute_path(filename) \
  95 +( \
  96 + IS_DIR_SEP((filename)[0]) || \
  97 + (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \
  98 + IS_DIR_SEP((filename)[2])) \
  99 +)
  100 +#endif
  101 +
  102 +/* Portable locale initialization (in exec.c) */
  103 +extern void set_pglocale_pgservice(const char *argv0, const char *app);
  104 +
  105 +/* Portable way to find binaries (in exec.c) */
  106 +extern int find_my_exec(const char *argv0, char *retpath);
  107 +extern int find_other_exec(const char *argv0, const char *target,
  108 + const char *versionstr, char *retpath);
  109 +
  110 +/* Doesn't belong here, but this is used with find_other_exec(), so... */
  111 +#define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
  112 +
  113 +
  114 +#if defined(WIN32) || defined(__CYGWIN__)
  115 +#define EXE ".exe"
  116 +#else
  117 +#define EXE ""
  118 +#endif
  119 +
  120 +#if defined(WIN32) && !defined(__CYGWIN__)
  121 +#define DEVNULL "nul"
  122 +#else
  123 +#define DEVNULL "/dev/null"
  124 +#endif
  125 +
  126 +/* Portable delay handling */
  127 +extern void pg_usleep(long microsec);
  128 +
  129 +/* Portable SQL-like case-independent comparisons and conversions */
  130 +extern int pg_strcasecmp(const char *s1, const char *s2);
  131 +extern int pg_strncasecmp(const char *s1, const char *s2, size_t n);
  132 +extern unsigned char pg_toupper(unsigned char ch);
  133 +extern unsigned char pg_tolower(unsigned char ch);
  134 +extern unsigned char pg_ascii_toupper(unsigned char ch);
  135 +extern unsigned char pg_ascii_tolower(unsigned char ch);
  136 +
  137 +#ifdef USE_REPL_SNPRINTF
  138 +
  139 +/*
  140 + * Versions of libintl >= 0.13 try to replace printf() and friends with
  141 + * macros to their own versions that understand the %$ format. We do the
  142 + * same, so disable their macros, if they exist.
  143 + */
  144 +#ifdef vsnprintf
  145 +#undef vsnprintf
  146 +#endif
  147 +#ifdef snprintf
  148 +#undef snprintf
  149 +#endif
  150 +#ifdef sprintf
  151 +#undef sprintf
  152 +#endif
  153 +#ifdef vfprintf
  154 +#undef vfprintf
  155 +#endif
  156 +#ifdef fprintf
  157 +#undef fprintf
  158 +#endif
  159 +#ifdef printf
  160 +#undef printf
  161 +#endif
  162 +
  163 +extern int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
  164 +extern int pg_snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);
  165 +extern int pg_sprintf(char *str, const char *fmt,...) pg_attribute_printf(2, 3);
  166 +extern int pg_vfprintf(FILE *stream, const char *fmt, va_list args);
  167 +extern int pg_fprintf(FILE *stream, const char *fmt,...) pg_attribute_printf(2, 3);
  168 +extern int pg_printf(const char *fmt,...) pg_attribute_printf(1, 2);
  169 +
  170 +/*
  171 + * The GCC-specific code below prevents the pg_attribute_printf above from
  172 + * being replaced, and this is required because gcc doesn't know anything
  173 + * about pg_printf.
  174 + */
  175 +#ifdef __GNUC__
  176 +#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__)
  177 +#define snprintf(...) pg_snprintf(__VA_ARGS__)
  178 +#define sprintf(...) pg_sprintf(__VA_ARGS__)
  179 +#define vfprintf(...) pg_vfprintf(__VA_ARGS__)
  180 +#define fprintf(...) pg_fprintf(__VA_ARGS__)
  181 +#define printf(...) pg_printf(__VA_ARGS__)
  182 +#else
  183 +#define vsnprintf pg_vsnprintf
  184 +#define snprintf pg_snprintf
  185 +#define sprintf pg_sprintf
  186 +#define vfprintf pg_vfprintf
  187 +#define fprintf pg_fprintf
  188 +#define printf pg_printf
  189 +#endif
  190 +#endif /* USE_REPL_SNPRINTF */
  191 +
  192 +/* Portable prompt handling */
  193 +extern void simple_prompt(const char *prompt, char *destination, size_t destlen,
  194 + bool echo);
  195 +
  196 +extern int pclose_check(FILE *stream);
  197 +
  198 +/* Global variable holding time zone information. */
  199 +#if defined(WIN32) || defined(__CYGWIN__)
  200 +#define TIMEZONE_GLOBAL _timezone
  201 +#define TZNAME_GLOBAL _tzname
  202 +#else
  203 +#define TIMEZONE_GLOBAL timezone
  204 +#define TZNAME_GLOBAL tzname
  205 +#endif
  206 +
  207 +#if defined(WIN32) || defined(__CYGWIN__)
  208 +/*
  209 + * Win32 doesn't have reliable rename/unlink during concurrent access.
  210 + */
  211 +extern int pgrename(const char *from, const char *to);
  212 +extern int pgunlink(const char *path);
  213 +
  214 +/* Include this first so later includes don't see these defines */
  215 +#ifdef _MSC_VER
  216 +#include <io.h>
  217 +#endif
  218 +
  219 +#define rename(from, to) pgrename(from, to)
  220 +#define unlink(path) pgunlink(path)
  221 +#endif /* defined(WIN32) || defined(__CYGWIN__) */
  222 +
  223 +/*
  224 + * Win32 also doesn't have symlinks, but we can emulate them with
  225 + * junction points on newer Win32 versions.
  226 + *
  227 + * Cygwin has its own symlinks which work on Win95/98/ME where
  228 + * junction points don't, so use those instead. We have no way of
  229 + * knowing what type of system Cygwin binaries will be run on.
  230 + * Note: Some CYGWIN includes might #define WIN32.
  231 + */
  232 +#if defined(WIN32) && !defined(__CYGWIN__)
  233 +extern int pgsymlink(const char *oldpath, const char *newpath);
  234 +extern int pgreadlink(const char *path, char *buf, size_t size);
  235 +extern bool pgwin32_is_junction(const char *path);
  236 +
  237 +#define symlink(oldpath, newpath) pgsymlink(oldpath, newpath)
  238 +#define readlink(path, buf, size) pgreadlink(path, buf, size)
  239 +#endif
  240 +
  241 +extern bool rmtree(const char *path, bool rmtopdir);
  242 +
  243 +#if defined(WIN32) && !defined(__CYGWIN__)
  244 +
  245 +/*
  246 + * open() and fopen() replacements to allow deletion of open files and
  247 + * passing of other special options.
  248 + */
  249 +#define O_DIRECT 0x80000000
  250 +extern int pgwin32_open(const char *, int,...);
  251 +extern FILE *pgwin32_fopen(const char *, const char *);
  252 +
  253 +#ifndef FRONTEND
  254 +#define open(a,b,c) pgwin32_open(a,b,c)
  255 +#define fopen(a,b) pgwin32_fopen(a,b)
  256 +#endif
  257 +
  258 +/*
  259 + * Mingw-w64 headers #define popen and pclose to _popen and _pclose. We want
  260 + * to use our popen wrapper, rather than plain _popen, so override that. For
  261 + * consistency, use our version of pclose, too.
  262 + */
  263 +#ifdef popen
  264 +#undef popen
  265 +#endif
  266 +#ifdef pclose
  267 +#undef pclose
  268 +#endif
  269 +
  270 +/*
  271 + * system() and popen() replacements to enclose the command in an extra
  272 + * pair of quotes.
  273 + */
  274 +extern int pgwin32_system(const char *command);
  275 +extern FILE *pgwin32_popen(const char *command, const char *type);
  276 +
  277 +#define system(a) pgwin32_system(a)
  278 +#define popen(a,b) pgwin32_popen(a,b)
  279 +#define pclose(a) _pclose(a)
  280 +
  281 +/* New versions of MingW have gettimeofday, old mingw and msvc don't */
  282 +#ifndef HAVE_GETTIMEOFDAY
  283 +/* Last parameter not used */
  284 +extern int gettimeofday(struct timeval *tp, struct timezone *tzp);
  285 +#endif
  286 +#else /* !WIN32 */
  287 +
  288 +/*
  289 + * Win32 requires a special close for sockets and pipes, while on Unix
  290 + * close() does them all.
  291 + */
  292 +#define closesocket close
  293 +#endif /* WIN32 */
  294 +
  295 +/*
  296 + * On Windows, setvbuf() does not support _IOLBF mode, and interprets that
  297 + * as _IOFBF. To add insult to injury, setvbuf(file, NULL, _IOFBF, 0)
  298 + * crashes outright if "parameter validation" is enabled. Therefore, in
  299 + * places where we'd like to select line-buffered mode, we fall back to
  300 + * unbuffered mode instead on Windows. Always use PG_IOLBF not _IOLBF
  301 + * directly in order to implement this behavior.
  302 + */
  303 +#ifndef WIN32
  304 +#define PG_IOLBF _IOLBF
  305 +#else
  306 +#define PG_IOLBF _IONBF
  307 +#endif
  308 +
  309 +/*
  310 + * Default "extern" declarations or macro substitutes for library routines.
  311 + * When necessary, these routines are provided by files in src/port/.
  312 + */
  313 +#ifndef HAVE_CRYPT
  314 +extern char *crypt(const char *key, const char *setting);
  315 +#endif
  316 +
  317 +/* WIN32 handled in port/win32_port.h */
  318 +#ifndef WIN32
  319 +#define pgoff_t off_t
  320 +#ifdef __NetBSD__
  321 +extern int fseeko(FILE *stream, off_t offset, int whence);
  322 +extern off_t ftello(FILE *stream);
  323 +#endif
  324 +#endif
  325 +
  326 +extern double pg_erand48(unsigned short xseed[3]);
  327 +extern long pg_lrand48(void);
  328 +extern long pg_jrand48(unsigned short xseed[3]);
  329 +extern void pg_srand48(long seed);
  330 +
  331 +#ifndef HAVE_FLS
  332 +extern int fls(int mask);
  333 +#endif
  334 +
  335 +#ifndef HAVE_FSEEKO
  336 +#define fseeko(a, b, c) fseek(a, b, c)
  337 +#define ftello(a) ftell(a)
  338 +#endif
  339 +
  340 +#if !defined(HAVE_GETPEEREID) && !defined(WIN32)
  341 +extern int getpeereid(int sock, uid_t *uid, gid_t *gid);
  342 +#endif
  343 +
  344 +#ifndef HAVE_ISINF
  345 +extern int isinf(double x);
  346 +#else
  347 +/*
  348 + * Glibc doesn't use the builtin for clang due to a *gcc* bug in a version
  349 + * newer than the gcc compatibility clang claims to have. This would cause a
  350 + * *lot* of superfluous function calls, therefore revert when using clang. In
  351 + * C++ there's issues with libc++ (not libstdc++), so disable as well.
  352 + */
  353 +#if defined(__clang__) && !defined(__cplusplus)
  354 +/* needs to be separate to not confuse other compilers */
  355 +#if __has_builtin(__builtin_isinf)
  356 +/* need to include before, to avoid getting overwritten */
  357 +#include <math.h>
  358 +#undef isinf
  359 +#define isinf __builtin_isinf
  360 +#endif /* __has_builtin(isinf) */
  361 +#endif /* __clang__ && !__cplusplus*/
  362 +#endif /* !HAVE_ISINF */
  363 +
  364 +#ifndef HAVE_MKDTEMP
  365 +extern char *mkdtemp(char *path);
  366 +#endif
  367 +
  368 +#ifndef HAVE_RINT
  369 +extern double rint(double x);
  370 +#endif
  371 +
  372 +#ifndef HAVE_INET_ATON
  373 +#include <netinet/in.h>
  374 +#include <arpa/inet.h>
  375 +extern int inet_aton(const char *cp, struct in_addr *addr);
  376 +#endif
  377 +
  378 +#if !HAVE_DECL_STRLCAT
  379 +extern size_t strlcat(char *dst, const char *src, size_t siz);
  380 +#endif
  381 +
  382 +#if !HAVE_DECL_STRLCPY
  383 +extern size_t strlcpy(char *dst, const char *src, size_t siz);
  384 +#endif
  385 +
  386 +#if !HAVE_DECL_STRNLEN
  387 +extern size_t strnlen(const char *str, size_t maxlen);
  388 +#endif
  389 +
  390 +#if !defined(HAVE_RANDOM)
  391 +extern long random(void);
  392 +#endif
  393 +
  394 +#ifndef HAVE_UNSETENV
  395 +extern void unsetenv(const char *name);
  396 +#endif
  397 +
  398 +#ifndef HAVE_SRANDOM
  399 +extern void srandom(unsigned int seed);
  400 +#endif
  401 +
  402 +#ifndef HAVE_SSL_GET_CURRENT_COMPRESSION
  403 +#define SSL_get_current_compression(x) 0
  404 +#endif
  405 +
  406 +/* thread.h */
  407 +extern char *pqStrerror(int errnum, char *strerrbuf, size_t buflen);
  408 +
  409 +#ifndef WIN32
  410 +extern int pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer,
  411 + size_t buflen, struct passwd **result);
  412 +#endif
  413 +
  414 +extern int pqGethostbyname(const char *name,
  415 + struct hostent *resultbuf,
  416 + char *buffer, size_t buflen,
  417 + struct hostent **result,
  418 + int *herrno);
  419 +
  420 +extern void pg_qsort(void *base, size_t nel, size_t elsize,
  421 + int (*cmp) (const void *, const void *));
  422 +extern int pg_qsort_strcmp(const void *a, const void *b);
  423 +
  424 +#define qsort(a,b,c,d) pg_qsort(a,b,c,d)
  425 +
  426 +typedef int (*qsort_arg_comparator) (const void *a, const void *b, void *arg);
  427 +
  428 +extern void qsort_arg(void *base, size_t nel, size_t elsize,
  429 + qsort_arg_comparator cmp, void *arg);
  430 +
  431 +/* port/chklocale.c */
  432 +extern int pg_get_encoding_from_locale(const char *ctype, bool write_message);
  433 +
  434 +#if defined(WIN32) && !defined(FRONTEND)
  435 +extern int pg_codepage_to_encoding(UINT cp);
  436 +#endif
  437 +
  438 +/* port/inet_net_ntop.c */
  439 +extern char *inet_net_ntop(int af, const void *src, int bits,
  440 + char *dst, size_t size);
  441 +
  442 +/* port/pg_strong_random.c */
  443 +#ifdef HAVE_STRONG_RANDOM
  444 +extern bool pg_strong_random(void *buf, size_t len);
  445 +#endif
  446 +
  447 +/* port/pgcheckdir.c */
  448 +extern int pg_check_dir(const char *dir);
  449 +
  450 +/* port/pgmkdirp.c */
  451 +extern int pg_mkdir_p(char *path, int omode);
  452 +
  453 +/* port/pqsignal.c */
  454 +typedef void (*pqsigfunc) (int signo);
  455 +extern pqsigfunc pqsignal(int signo, pqsigfunc func);
  456 +#ifndef WIN32
  457 +extern pqsigfunc pqsignal_no_restart(int signo, pqsigfunc func);
  458 +#else
  459 +#define pqsignal_no_restart(signo, func) pqsignal(signo, func)
  460 +#endif
  461 +
  462 +/* port/quotes.c */
  463 +extern char *escape_single_quotes_ascii(const char *src);
  464 +
  465 +/* port/wait_error.c */
  466 +extern char *wait_result_to_str(int exit_status);
  467 +
  468 +#endif /* PG_PORT_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * postgres_fe.h
  4 + * Primary include file for PostgreSQL client-side .c files
  5 + *
  6 + * This should be the first file included by PostgreSQL client libraries and
  7 + * application programs --- but not by backend modules, which should include
  8 + * postgres.h.
  9 + *
  10 + *
  11 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  12 + * Portions Copyright (c) 1995, Regents of the University of California
  13 + *
  14 + * src/include/postgres_fe.h
  15 + *
  16 + *-------------------------------------------------------------------------
  17 + */
  18 +#ifndef POSTGRES_FE_H
  19 +#define POSTGRES_FE_H
  20 +
  21 +#ifndef FRONTEND
  22 +#define FRONTEND 1
  23 +#endif
  24 +
  25 +#include "c.h"
  26 +
  27 +#include "common/fe_memutils.h"
  28 +
  29 +#endif /* POSTGRES_FE_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * pqexpbuffer.h
  4 + * Declarations/definitions for "PQExpBuffer" functions.
  5 + *
  6 + * PQExpBuffer provides an indefinitely-extensible string data type.
  7 + * It can be used to buffer either ordinary C strings (null-terminated text)
  8 + * or arbitrary binary data. All storage is allocated with malloc().
  9 + *
  10 + * This module is essentially the same as the backend's StringInfo data type,
  11 + * but it is intended for use in frontend libpq and client applications.
  12 + * Thus, it does not rely on palloc() nor elog().
  13 + *
  14 + * It does rely on vsnprintf(); if configure finds that libc doesn't provide
  15 + * a usable vsnprintf(), then a copy of our own implementation of it will
  16 + * be linked into libpq.
  17 + *
  18 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  19 + * Portions Copyright (c) 1994, Regents of the University of California
  20 + *
  21 + * src/interfaces/libpq/pqexpbuffer.h
  22 + *
  23 + *-------------------------------------------------------------------------
  24 + */
  25 +#ifndef PQEXPBUFFER_H
  26 +#define PQEXPBUFFER_H
  27 +
  28 +/*-------------------------
  29 + * PQExpBufferData holds information about an extensible string.
  30 + * data is the current buffer for the string (allocated with malloc).
  31 + * len is the current string length. There is guaranteed to be
  32 + * a terminating '\0' at data[len], although this is not very
  33 + * useful when the string holds binary data rather than text.
  34 + * maxlen is the allocated size in bytes of 'data', i.e. the maximum
  35 + * string size (including the terminating '\0' char) that we can
  36 + * currently store in 'data' without having to reallocate
  37 + * more space. We must always have maxlen > len.
  38 + *
  39 + * An exception occurs if we failed to allocate enough memory for the string
  40 + * buffer. In that case data points to a statically allocated empty string,
  41 + * and len = maxlen = 0.
  42 + *-------------------------
  43 + */
  44 +typedef struct PQExpBufferData
  45 +{
  46 + char *data;
  47 + size_t len;
  48 + size_t maxlen;
  49 +} PQExpBufferData;
  50 +
  51 +typedef PQExpBufferData *PQExpBuffer;
  52 +
  53 +/*------------------------
  54 + * Test for a broken (out of memory) PQExpBuffer.
  55 + * When a buffer is "broken", all operations except resetting or deleting it
  56 + * are no-ops.
  57 + *------------------------
  58 + */
  59 +#define PQExpBufferBroken(str) \
  60 + ((str) == NULL || (str)->maxlen == 0)
  61 +
  62 +/*------------------------
  63 + * Same, but for use when using a static or local PQExpBufferData struct.
  64 + * For that, a null-pointer test is useless and may draw compiler warnings.
  65 + *------------------------
  66 + */
  67 +#define PQExpBufferDataBroken(buf) \
  68 + ((buf).maxlen == 0)
  69 +
  70 +/*------------------------
  71 + * Initial size of the data buffer in a PQExpBuffer.
  72 + * NB: this must be large enough to hold error messages that might
  73 + * be returned by PQrequestCancel().
  74 + *------------------------
  75 + */
  76 +#define INITIAL_EXPBUFFER_SIZE 256
  77 +
  78 +/*------------------------
  79 + * There are two ways to create a PQExpBuffer object initially:
  80 + *
  81 + * PQExpBuffer stringptr = createPQExpBuffer();
  82 + * Both the PQExpBufferData and the data buffer are malloc'd.
  83 + *
  84 + * PQExpBufferData string;
  85 + * initPQExpBuffer(&string);
  86 + * The data buffer is malloc'd but the PQExpBufferData is presupplied.
  87 + * This is appropriate if the PQExpBufferData is a field of another
  88 + * struct.
  89 + *-------------------------
  90 + */
  91 +
  92 +/*------------------------
  93 + * createPQExpBuffer
  94 + * Create an empty 'PQExpBufferData' & return a pointer to it.
  95 + */
  96 +extern PQExpBuffer createPQExpBuffer(void);
  97 +
  98 +/*------------------------
  99 + * initPQExpBuffer
  100 + * Initialize a PQExpBufferData struct (with previously undefined contents)
  101 + * to describe an empty string.
  102 + */
  103 +extern void initPQExpBuffer(PQExpBuffer str);
  104 +
  105 +/*------------------------
  106 + * To destroy a PQExpBuffer, use either:
  107 + *
  108 + * destroyPQExpBuffer(str);
  109 + * free()s both the data buffer and the PQExpBufferData.
  110 + * This is the inverse of createPQExpBuffer().
  111 + *
  112 + * termPQExpBuffer(str)
  113 + * free()s the data buffer but not the PQExpBufferData itself.
  114 + * This is the inverse of initPQExpBuffer().
  115 + *
  116 + * NOTE: some routines build up a string using PQExpBuffer, and then
  117 + * release the PQExpBufferData but return the data string itself to their
  118 + * caller. At that point the data string looks like a plain malloc'd
  119 + * string.
  120 + */
  121 +extern void destroyPQExpBuffer(PQExpBuffer str);
  122 +extern void termPQExpBuffer(PQExpBuffer str);
  123 +
  124 +/*------------------------
  125 + * resetPQExpBuffer
  126 + * Reset a PQExpBuffer to empty
  127 + *
  128 + * Note: if possible, a "broken" PQExpBuffer is returned to normal.
  129 + */
  130 +extern void resetPQExpBuffer(PQExpBuffer str);
  131 +
  132 +/*------------------------
  133 + * enlargePQExpBuffer
  134 + * Make sure there is enough space for 'needed' more bytes in the buffer
  135 + * ('needed' does not include the terminating null).
  136 + *
  137 + * Returns 1 if OK, 0 if failed to enlarge buffer. (In the latter case
  138 + * the buffer is left in "broken" state.)
  139 + */
  140 +extern int enlargePQExpBuffer(PQExpBuffer str, size_t needed);
  141 +
  142 +/*------------------------
  143 + * printfPQExpBuffer
  144 + * Format text data under the control of fmt (an sprintf-like format string)
  145 + * and insert it into str. More space is allocated to str if necessary.
  146 + * This is a convenience routine that does the same thing as
  147 + * resetPQExpBuffer() followed by appendPQExpBuffer().
  148 + */
  149 +extern void printfPQExpBuffer(PQExpBuffer str, const char *fmt,...) pg_attribute_printf(2, 3);
  150 +
  151 +/*------------------------
  152 + * appendPQExpBuffer
  153 + * Format text data under the control of fmt (an sprintf-like format string)
  154 + * and append it to whatever is already in str. More space is allocated
  155 + * to str if necessary. This is sort of like a combination of sprintf and
  156 + * strcat.
  157 + */
  158 +extern void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...) pg_attribute_printf(2, 3);
  159 +
  160 +/*------------------------
  161 + * appendPQExpBufferStr
  162 + * Append the given string to a PQExpBuffer, allocating more space
  163 + * if necessary.
  164 + */
  165 +extern void appendPQExpBufferStr(PQExpBuffer str, const char *data);
  166 +
  167 +/*------------------------
  168 + * appendPQExpBufferChar
  169 + * Append a single byte to str.
  170 + * Like appendPQExpBuffer(str, "%c", ch) but much faster.
  171 + */
  172 +extern void appendPQExpBufferChar(PQExpBuffer str, char ch);
  173 +
  174 +/*------------------------
  175 + * appendBinaryPQExpBuffer
  176 + * Append arbitrary binary data to a PQExpBuffer, allocating more space
  177 + * if necessary.
  178 + */
  179 +extern void appendBinaryPQExpBuffer(PQExpBuffer str,
  180 + const char *data, size_t datalen);
  181 +
  182 +#endif /* PQEXPBUFFER_H */
  1 +/*-------------------------------------------------------------------------
  2 + *
  3 + * libpq-events.h
  4 + * This file contains definitions that are useful to applications
  5 + * that invoke the libpq "events" API, but are not interesting to
  6 + * ordinary users of libpq.
  7 + *
  8 + * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  9 + * Portions Copyright (c) 1994, Regents of the University of California
  10 + *
  11 + * src/interfaces/libpq/libpq-events.h
  12 + *
  13 + *-------------------------------------------------------------------------
  14 + */
  15 +
  16 +#ifndef LIBPQ_EVENTS_H
  17 +#define LIBPQ_EVENTS_H
  18 +
  19 +#include "libpq-fe.h"
  20 +
  21 +#ifdef __cplusplus
  22 +extern "C"
  23 +{
  24 +#endif
  25 +
  26 +/* Callback Event Ids */
  27 +typedef enum
  28 +{
  29 + PGEVT_REGISTER,
  30 + PGEVT_CONNRESET,
  31 + PGEVT_CONNDESTROY,
  32 + PGEVT_RESULTCREATE,
  33 + PGEVT_RESULTCOPY,
  34 + PGEVT_RESULTDESTROY
  35 +} PGEventId;
  36 +
  37 +typedef struct
  38 +{
  39 + PGconn *conn;
  40 +} PGEventRegister;
  41 +
  42 +typedef struct
  43 +{
  44 + PGconn *conn;
  45 +} PGEventConnReset;
  46 +
  47 +typedef struct
  48 +{
  49 + PGconn *conn;
  50 +} PGEventConnDestroy;
  51 +
  52 +typedef struct
  53 +{
  54 + PGconn *conn;
  55 + PGresult *result;
  56 +} PGEventResultCreate;
  57 +
  58 +typedef struct
  59 +{
  60 + const PGresult *src;
  61 + PGresult *dest;
  62 +} PGEventResultCopy;
  63 +
  64 +typedef struct
  65 +{
  66 + PGresult *result;
  67 +} PGEventResultDestroy;
  68 +
  69 +typedef int (*PGEventProc) (PGEventId evtId, void *evtInfo, void *passThrough);
  70 +
  71 +/* Registers an event proc with the given PGconn. */
  72 +extern int PQregisterEventProc(PGconn *conn, PGEventProc proc,
  73 + const char *name, void *passThrough);
  74 +
  75 +/* Sets the PGconn instance data for the provided proc to data. */
  76 +extern int PQsetInstanceData(PGconn *conn, PGEventProc proc, void *data);
  77 +
  78 +/* Gets the PGconn instance data for the provided proc. */
  79 +extern void *PQinstanceData(const PGconn *conn, PGEventProc proc);
  80 +
  81 +/* Sets the PGresult instance data for the provided proc to data. */
  82 +extern int PQresultSetInstanceData(PGresult *result, PGEventProc proc, void *data);
  83 +
  84 +/* Gets the PGresult instance data for the provided proc. */
  85 +extern void *PQresultInstanceData(const PGresult *result, PGEventProc proc);
  86 +
  87 +/* Fires RESULTCREATE events for an application-created PGresult. */
  88 +extern int PQfireResultCreateEvents(PGconn *conn, PGresult *res);
  89 +
  90 +#ifdef __cplusplus
  91 +}
  92 +#endif
  93 +
  94 +#endif /* LIBPQ_EVENTS_H */
注册登录 后发表评论