Skip to content

Commit 8bb73f7

Browse files
authored
Merge pull request #59 from php/win-build
CI: Windows (build + test + release assets)
2 parents 9b1fc2d + 4ec5c18 commit 8bb73f7

15 files changed

+274
-91
lines changed

.github/workflows/ci.yml renamed to .github/workflows/linux-tests.yml

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1-
name: CI
2-
on: [push, pull_request]
1+
name: Linux (tests)
2+
on:
3+
pull_request:
4+
branches:
5+
- "master"
6+
push:
7+
tags:
8+
- "*"
9+
branches:
10+
- "master"
311

412
jobs:
513
test:
614
runs-on: ubuntu-latest
7-
continue-on-error: false
815
strategy:
16+
fail-fast: false
917
matrix:
10-
php: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
18+
php: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
1119
steps:
1220
- name: Checkout
1321
uses: actions/checkout@v3
@@ -31,9 +39,12 @@ jobs:
3139
make
3240
# Run tests (we add the -q flag to skip the "send report?" question at the end)
3341
- name: Run tests
42+
env:
43+
SOLR_SERVER_CONFIGURED: 1
3444
run: TEST_PHP_ARGS="$TEST_PHP_ARGS -q" make test
45+
3546
services:
3647
solr:
37-
image: stefna/pecl-solr
48+
image: omars44/pecl-solr-test:latest
3849
ports:
3950
- 8983:8983
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
name: Windows (tests)
2+
on:
3+
pull_request:
4+
branches:
5+
- "master"
6+
push:
7+
tags:
8+
- "*"
9+
branches:
10+
- "master"
11+
12+
jobs:
13+
windows:
14+
defaults:
15+
run:
16+
shell: cmd
17+
strategy:
18+
fail-fast: false
19+
matrix:
20+
version: ["7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3"]
21+
arch: [x64, x86]
22+
ts: [ts, nts]
23+
experimental: [false]
24+
25+
runs-on: windows-2019
26+
steps:
27+
- name: Checkout the code
28+
uses: actions/checkout@v2
29+
30+
- name: Setup PHP
31+
id: setup-php
32+
33+
with:
34+
version: ${{matrix.version}}
35+
arch: ${{matrix.arch}}
36+
ts: ${{matrix.ts}}
37+
deps: 'libxml2,libcurl,libiconv,libssh2,openssl,nghttp2'
38+
39+
- name: Enable Developer Command Prompt
40+
uses: ilammy/msvc-dev-cmd@v1
41+
with:
42+
arch: ${{matrix.arch}}
43+
toolset: ${{steps.setup-php.outputs.toolset}}
44+
45+
# install extra package deps (zlib) (static: _a.lib, and dynamic .lib)
46+
- name: cache vcpkg libraries
47+
id: cache-vcpkg
48+
uses: actions/cache@v2
49+
with:
50+
path: |
51+
${{github.workspace}}/vcpkg
52+
${{github.workspace}}/vcpkg/installed
53+
key: vcpkg-${{matrix.version}}-${{matrix.arch}}-${{ hashFiles('**/vcpkg.json') }}
54+
restore-keys: |
55+
vcpkg-${{matrix.version}}-${{matrix.arch}}-
56+
57+
- name: install zlib with vcpkg
58+
uses: omars44/pecl-windows-deps-installer@master
59+
with:
60+
cache-hit: ${{ steps.cache-vcpkg.outputs.cache-hit }}
61+
libraries: 'zlib'
62+
arch: ${{matrix.arch}}
63+
64+
65+
# start compiling
66+
- name: phpize
67+
run: |
68+
phpize
69+
- name: configure
70+
run: |
71+
configure --enable-solr --with-php-build=.\..\deps --with-prefix=${{steps.setup-php.outputs.prefix}}
72+
73+
- name: extract variables from Makefile (build_dir and dll_file)
74+
shell: powershell
75+
run: |
76+
$makefileContent = Get-Content -Path ./Makefile -Raw
77+
$buildDirsSub = [regex]::Match($makefileContent, "BUILD_DIRS_SUB=(.*)").Groups[1].Value.Trim()
78+
$dllFullPath = Join-Path -Path $buildDirsSub -ChildPath "php_solr.dll"
79+
80+
echo "dll_full_path=$dllFullPath" | Out-File -Append -Encoding utf8 -FilePath $env:GITHUB_ENV
81+
82+
- name: make
83+
run: nmake
84+
85+
- name: Did it compile successfully?
86+
shell: powershell
87+
run: |
88+
$dll = $env:dll_full_path
89+
Write-Host "`"Full DLL path:`" $dll`""
90+
if (!(Test-Path $dll)) {
91+
Write-Host "The path '$dll' does not exist."
92+
exit 1
93+
}
94+
95+
- name: test
96+
env:
97+
SOLR_SERVER_CONFIGURED: 0
98+
run: nmake test TESTS="--show-diff -g FAIL,BORK,WARN,LEAK tests"
99+
100+
- name: Copy DLL to CWD and sign it
101+
if: startsWith(github.ref, 'refs/tags/')
102+
shell: powershell
103+
run: |
104+
Copy-Item -Path $env:dll_full_path -Destination "."
105+
$checksum = Get-FileHash -Path "php_solr.dll" -Algorithm SHA256
106+
$checksumHashLowercase = $checksum.Hash.ToLower()
107+
[System.IO.File]::WriteAllText("php_solr.dll.sha256", $checksumHashLowercase)
108+
Write-Host "SHA256: $checksumHashLowercase"
109+
110+
111+
- name: Upload DLL to release
112+
if: startsWith(github.ref, 'refs/tags/')
113+
uses: svenstaro/upload-release-action@v2
114+
with:
115+
repo_token: ${{ secrets.GITHUB_TOKEN }}
116+
file: php_solr.dll
117+
asset_name: php_solr-dll-${{ matrix.version }}-${{ matrix.ts }}-${{ matrix.arch }}.dll
118+
tag: ${{ github.ref }}
119+
overwrite: true
120+
121+
- name: Upload SHA256 Checksum to release
122+
if: startsWith(github.ref, 'refs/tags/')
123+
uses: svenstaro/upload-release-action@v2
124+
with:
125+
repo_token: ${{ secrets.GITHUB_TOKEN }}
126+
file: php_solr.dll.sha256
127+
asset_name: php_solr-dll-${{ matrix.version }}-${{ matrix.ts }}-${{ matrix.arch }}.sha256
128+
tag: ${{ github.ref }}
129+
overwrite: true
130+

NEWS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
- Fix compile error: libcurl on linux multiarch support (#46)
22
- Fix SegFault in SolrClient::optimize() (debug mode)
33
- Fix parsed parameter types (#37)
4+
- Fix Missing Windows DLLs (#51)
5+
6+
7+
Internals:
8+
- ci: build on windows
9+
- parse_int macros

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ It contains the fixture file definitions and other configurations for the Solr S
5555

5656
To run the type 2 tests, you'll need docker to run the test server using the following command:
5757

58-
```docker run -p 8983:8983 --name pecl-solr -t stefna/pecl-solr```
58+
```bash
59+
docker-compose up -d
60+
export SOLR_SERVER_CONFIGURED=1
61+
php run-tests.php -q -d extension=$PWD/modules/solr.so --show-diff
62+
# or make test
63+
```
5964

6065
PHPQA Guide: https://qa.php.net/write-test.php
6166

config.w32

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,24 @@ if(PHP_SOLR != 'no')
4646
WARNING('solr not enabled; ldap libraries not found');
4747
PHP_SOLR = "no";
4848
}
49-
if(!((PHP_ZLIB == 'no' && CHECK_LIB('zlib_a.lib;zlib.lib', 'solr', PHP_SOLR))
50-
|| (PHP_ZLIB_SHARED && CHECK_LIB('zlib.lib', 'solr', PHP_SOLR))
51-
|| (PHP_ZLIB == 'yes' && !PHP_ZLIB_SHARED))) {
52-
WARNING('solr not enabled; zlib libraries not found');
53-
PHP_SOLR = "no";
49+
50+
if (PHP_ZLIB == 'true') {
51+
var zlib_files_found = false;
52+
var require_dynamic_zlib = PHP_ZLIB_SHARED == 'true';
53+
if (require_dynamic_zlib) {
54+
zlib_files_found = CHECK_LIB('zlib.lib', 'solr', PHP_SOLR);
55+
} else {
56+
// statically built zlib
57+
zlib_files_found = CHECK_LIB('zlib_a.lib', 'solr', PHP_SOLR);
58+
}
59+
if (!zlib_files_found) {
60+
WARNING("zlibs not found");
61+
WARNING('solr not enabled; zlib libraries not found, ensure zlib.lib, zlib_a.lib are present.');
62+
PHP_SOLR = "no";
63+
}
5464
}
65+
66+
5567
if(PHP_LIBXML == 'no' || !ADD_EXTENSION_DEP('solr', 'libxml')) {
5668
WARNING('solr was not enabled; libxml is not enabled');
5769
PHP_SOLR = "no";

src/php7/php_solr.h

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -742,14 +742,14 @@ PHP_SOLR_API solr_param_t *solr_create_new_param(const solr_char_t *param_name,
742742

743743
PHP_SOLR_API int solr_params_insert_param_value(solr_param_t *param, solr_param_value_t *param_value);
744744
PHP_SOLR_API int solr_params_delete_param_value(solr_param_t *param, const solr_param_value_t *target_value);
745-
PHP_SOLR_API int solr_delete_solr_parameter(zval *objptr, solr_char_t *name, int name_length);
745+
PHP_SOLR_API int solr_delete_solr_parameter(zval *objptr, solr_char_t *name, size_t name_length);
746746

747-
PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length, zend_bool allow_multiple);
748-
PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length);
749-
PHP_SOLR_API int solr_add_simple_list_param_ex(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length, solr_char_t *separator);
750-
PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length, solr_char_t *avalue, int avalue_length, solr_char_t delimiter, solr_char_t arg_separator);
751-
PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length, solr_char_t *avalue, int avalue_length, solr_char_t delimiter, solr_char_t arg_separator, solr_char_t delimiter_override);
752-
PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t *pvalue, int pvalue_length, solr_char_t *avalue, int avalue_length, solr_char_t *delimiter_override, solr_bool delimiter_overriden);
747+
PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, zend_bool allow_multiple);
748+
PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length);
749+
PHP_SOLR_API int solr_add_simple_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *separator);
750+
PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator);
751+
PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator, solr_char_t delimiter_override);
752+
PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t *delimiter_override, solr_bool delimiter_overriden);
753753

754754
#define solr_set_normal_param(objptr, pname, pname_length, pvalue, pvalue_length) solr_add_or_set_normal_param((objptr), (pname), (pname_length), (pvalue), (pvalue_length), 0)
755755
#define solr_add_normal_param(objptr, pname, pname_length, pvalue, pvalue_length) solr_add_or_set_normal_param((objptr), (pname), (pname_length), (pvalue), (pvalue_length), 1)
@@ -773,7 +773,7 @@ PHP_SOLR_API void solr_normal_param_value_display_double(solr_param_t *solr_para
773773
PHP_SOLR_API void solr_normal_param_value_display_boolean(solr_param_t *solr_param, zval *param_value);
774774
PHP_SOLR_API void solr_normal_param_value_display_sort_type(solr_param_t *solr_param, zval *param_value);
775775

776-
PHP_SOLR_API int solr_param_find(zval *objptr, solr_char_t *pname, int pname_length, solr_param_t **solr_param);
776+
PHP_SOLR_API int solr_param_find(zval *objptr, solr_char_t *pname, size_t pname_length, solr_param_t **solr_param);
777777
PHP_SOLR_API solr_string_t solr_params_to_string(solr_params_t * solr_params, zend_bool url_encode);
778778

779779
PHP_SOLR_API void solr_normal_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode);
@@ -785,9 +785,9 @@ PHP_SOLR_API void solr_simple_list_param_value_free(solr_param_value_t *param_va
785785
PHP_SOLR_API void solr_arg_list_param_value_free(solr_param_value_t *param_value);
786786

787787
/* Used for removing parameter values from the list of values for that param */
788-
PHP_SOLR_API int solr_delete_normal_param_value(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length);
789-
PHP_SOLR_API int solr_delete_simple_list_param_value(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length);
790-
PHP_SOLR_API int solr_delete_arg_list_param_value(zval *objptr, solr_char_t *pname, int pname_length, solr_char_t *pvalue, int pvalue_length);
788+
PHP_SOLR_API int solr_delete_normal_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length);
789+
PHP_SOLR_API int solr_delete_simple_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length);
790+
PHP_SOLR_API int solr_delete_arg_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length);
791791

792792
/* }}} */
793793

@@ -813,8 +813,8 @@ PHP_SOLR_API void solr_document_get_field_names(INTERNAL_FUNCTION_PARAMETERS);
813813
/* {{{ Utility functions */
814814
PHP_SOLR_API long solr_get_json_last_error(void);
815815
PHP_SOLR_API solr_char_t *solr_get_json_error_msg(solr_json_error_codes_t error_code);
816-
PHP_SOLR_API int solr_json_to_php_native(solr_string_t *buffer, const solr_char_t *json_string, int json_string_length);
817-
PHP_SOLR_API int solr_is_supported_response_writer(const solr_char_t * response_writer, int length);
816+
PHP_SOLR_API int solr_json_to_php_native(solr_string_t *buffer, const solr_char_t *json_string, size_t json_string_length);
817+
PHP_SOLR_API int solr_is_supported_response_writer(const solr_char_t * response_writer, size_t length);
818818
PHP_SOLR_API int solr_hashtable_get_new_index(HashTable *ht);
819819
#if PHP_VERSION_ID < 80000
820820
PHP_SOLR_API int solr_fetch_document_entry(zval *objptr, solr_document_t **doc_entry);
@@ -824,9 +824,9 @@ PHP_SOLR_API int solr_fetch_document_entry(zend_object *objptr, solr_document_t
824824
PHP_SOLR_API int solr_fetch_client_entry(zval *objptr, solr_client_t **solr_client);
825825
PHP_SOLR_API int solr_fetch_params_entry(zval *objptr, solr_params_t **solr_params);
826826
PHP_SOLR_API int solr_fetch_function_entry(zval *objptr, solr_function_t **solr_params);
827-
PHP_SOLR_API void solr_encode_generic_xml_response(solr_string_t *buffer, const solr_char_t *serialized, int size, long int parse_mode);
827+
PHP_SOLR_API void solr_encode_generic_xml_response(solr_string_t *buffer, const solr_char_t *serialized, size_t size, long int parse_mode);
828828
PHP_SOLR_API void solr_set_return_solr_params_object(zval *return_value_ptr, zval *current_objptr);
829-
PHP_SOLR_API void solr_escape_query_chars(solr_string_t *sbuilder, solr_char_t *unescaped, long int unescaped_length);
829+
PHP_SOLR_API void solr_escape_query_chars(solr_string_t *sbuilder, solr_char_t *unescaped, size_t unescaped_length);
830830

831831
/* serialized array to serialized SolrObject */
832832
PHP_SOLR_API int solr_sarray_to_sobject(solr_string_t *buffer);
@@ -835,11 +835,11 @@ PHP_SOLR_API void solr_response_get_response_impl(INTERNAL_FUNCTION_PARAMETERS,
835835
/* }}} */
836836

837837
/* {{{ SolrFunction Helpers (solrfunc to avoid confusion with solr_function) */
838-
PHP_SOLR_API int solr_solrfunc_update_string(zval *obj, solr_char_t *key, int key_len, solr_char_t *value, int value_len);
839-
PHP_SOLR_API int solr_solrfunc_fetch_string(zval *obj, solr_char_t *key, int key_len, solr_string_t **string);
840-
PHP_SOLR_API int solr_solrfunc_return_string(zval *obj, solr_char_t *key, int key_len, zval **return_value);
838+
PHP_SOLR_API int solr_solrfunc_update_string(zval *obj, solr_char_t *key, size_t key_len, solr_char_t *value, size_t value_len);
839+
PHP_SOLR_API int solr_solrfunc_fetch_string(zval *obj, solr_char_t *key, size_t key_len, solr_string_t **string);
840+
PHP_SOLR_API int solr_solrfunc_return_string(zval *obj, solr_char_t *key, size_t key_len, zval **return_value);
841841
PHP_SOLR_API void solr_solrfunc_to_string(solr_function_t *function, solr_string_t **dest);
842-
PHP_SOLR_API int solr_solrfunc_display_string(zval *obj, solr_char_t *key, int key_len, zval **return_value);
842+
PHP_SOLR_API int solr_solrfunc_display_string(zval *obj, solr_char_t *key, size_t key_len, zval **return_value);
843843

844844
#if PHP_VERSION_ID < 80000
845845
zend_object *solr_collapse_function_object_handler_clone(zval *object);
@@ -892,6 +892,19 @@ PHP_SOLR_API void solr_document_field_unset_property(zend_object *object, zend_s
892892

893893
int add_phrase_field(zval *obj, solr_char_t *pname, zval *boost, zval *slop, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_len);
894894

895+
896+
#define ZVAL_LONG_ASSIGN_TO_LONG(long_var,zval_in) \
897+
do { \
898+
zend_long zl_input = Z_LVAL_P(zval_in); \
899+
if (zl_input >= LONG_MIN && zl_input <= LONG_MAX) { \
900+
long_var = (long int) zl_input; \
901+
} else { \
902+
solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, "Internal Error: zend long conversion failed."); \
903+
} \
904+
} while(0)
905+
906+
907+
895908
#include "solr_macros.h"
896909
#include "php_solr_dismax_query.h"
897910

src/php7/php_solr_client.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ PHP_METHOD(SolrClient, __construct)
183183

184184
size_t num_options = 0;
185185

186-
long int secure = 0L;
186+
zend_long secure = 0L;
187187
long int verify_peer = 0L;
188188
long int verify_host = 2L;
189189
long int timeout = 30L;
@@ -243,7 +243,7 @@ PHP_METHOD(SolrClient, __construct)
243243
{
244244
if (Z_TYPE_P(tmp1) == IS_TRUE)
245245
{
246-
secure = (long int) 1L;
246+
secure = (zend_long) 1L;
247247
} else if (Z_TYPE_P(tmp1) == IS_LONG) {
248248
secure = Z_LVAL_P(tmp1);
249249
}
@@ -307,7 +307,7 @@ PHP_METHOD(SolrClient, __construct)
307307
// port
308308
if (solr_opt_check(options_ht, "port", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_LONG)
309309
{
310-
client_options->host_port = Z_LVAL_P(tmp1);
310+
ZVAL_LONG_ASSIGN_TO_LONG(client_options->host_port, tmp1);
311311
} else if (solr_opt_check(options_ht, "port", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) {
312312

313313
long int host_port = atol(Z_STRVAL_P(tmp1));
@@ -393,7 +393,7 @@ PHP_METHOD(SolrClient, __construct)
393393

394394
if (Z_TYPE_P(tmp1) == IS_LONG)
395395
{
396-
proxy_port_value = Z_LVAL_P(tmp1);
396+
ZVAL_LONG_ASSIGN_TO_LONG(proxy_port_value, tmp1);
397397
} else if (Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) {
398398
proxy_port_value = atol(Z_STRVAL_P(tmp1));
399399
}
@@ -1565,7 +1565,14 @@ PHP_METHOD(SolrClient, optimize)
15651565
zend_bool success = 1;
15661566

15671567
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zbb", &maxSegmentsZval, &softCommit, &waitSearcher) == FAILURE) {
1568+
#if PHP_MAJOR_VERSION >= 8
15681569
RETURN_THROWS();
1570+
#else
1571+
php_error_docref(NULL, E_WARNING, "Invalid parameter");
1572+
1573+
return;
1574+
#endif
1575+
15691576
}
15701577

15711578
SOLR_PARSE_PARAM_INT(maxSegmentsZval, maxSegments, maxSegmentsLen, "maxSegments");

0 commit comments

Comments
 (0)