From ed43300dab14e50d2925dc78a9eb5fc5f2e9ae98 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 25 Aug 2021 09:58:58 +0200 Subject: initial package, version 1.0.0 (stable) open https://github.com/SeasX/SeasSnowflake/pull/3 - fix test open https://github.com/SeasX/SeasSnowflake/pull/4 - exec perm open https://github.com/SeasX/SeasSnowflake/pull/5 - PHP 5 open https://github.com/SeasX/SeasSnowflake/pull/6 - arginfo --- .gitignore | 9 ++ 3.patch | 22 +++++ 5.patch | 66 ++++++++++++++ 6.patch | 57 ++++++++++++ Makefile | 4 + PHPINFO | 6 ++ REFLECTION | 50 ++++++++++ php-pecl-seassnowflake.spec | 217 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 431 insertions(+) create mode 100644 .gitignore create mode 100644 3.patch create mode 100644 5.patch create mode 100644 6.patch create mode 100644 Makefile create mode 100644 PHPINFO create mode 100644 REFLECTION create mode 100644 php-pecl-seassnowflake.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01f0400 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +clog +package-*.xml +*.tgz +*.tar.bz2 +*.tar.gz +*.tar.xz +*.tar.xz.asc +*.src.rpm +*/*rpm diff --git a/3.patch b/3.patch new file mode 100644 index 0000000..0179b31 --- /dev/null +++ b/3.patch @@ -0,0 +1,22 @@ +From 43315f54e2382a344092f5327b0b3c05bb830d36 Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 25 Aug 2021 08:49:08 +0200 +Subject: [PATCH] Fix test expectation + +--- + tests/benchmark.phpt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/benchmark.phpt b/tests/benchmark.phpt +index 20e9007..64b5fa3 100644 +--- a/tests/benchmark.phpt ++++ b/tests/benchmark.phpt +@@ -7,7 +7,7 @@ SeasSnowflake testBenchmark + $config=['worker_id'=>10,'datacenter_id'=>1]; + $client = new SeasSnowflake($config); + +-echo "\nmake 100000 id=================\n"; ++//echo "\nmake 100000 id=================\n"; + $start = microtime(true); + for($i=0;$i<100000;$i++){ + $id= $client->generate(); diff --git a/5.patch b/5.patch new file mode 100644 index 0000000..35f8676 --- /dev/null +++ b/5.patch @@ -0,0 +1,66 @@ +From a0a028b2987b030153e21510ffd90a8eaf17b0ba Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 25 Aug 2021 09:28:36 +0200 +Subject: [PATCH 1/2] fix for PHP 5 + +--- + SeasSnowflake.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/SeasSnowflake.cpp b/SeasSnowflake.cpp +index 1a3282e..06b3f5f 100755 +--- a/SeasSnowflake.cpp ++++ b/SeasSnowflake.cpp +@@ -270,7 +270,11 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, generate) + PHP_METHOD(SEASSNOWFLAKE_RES_NAME, degenerate) + { + char *id = NULL; ++#if PHP_VERSION_ID < 70000 ++ int l_id = 0; ++#else + size_t l_id = 0; ++#endif + // zval* params = NULL; + + auto &idWorker = Singleton::instance(); +@@ -284,7 +288,7 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, degenerate) + idWorker.setWorkerId(Z_LVAL_P(datacenter_id)); + + #ifndef FAST_ZPP +- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &id, &l_id, ¶ms) == FAILURE) ++ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &l_id) == FAILURE) + { + return; + } + +From bfe79ed7abdfb65a0b1ab9b12723f1b717d63306 Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 25 Aug 2021 09:46:34 +0200 +Subject: [PATCH 2/2] fix for 5.4 (lvalue required) + +--- + SeasSnowflake.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/SeasSnowflake.cpp b/SeasSnowflake.cpp +index 06b3f5f..be2b846 100755 +--- a/SeasSnowflake.cpp ++++ b/SeasSnowflake.cpp +@@ -313,7 +313,7 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, degenerate) + uint dataCenterId=idWorker.degenerateDataCenterId(id_i); + uint64_t beginTimestamp=idWorker.degenerateBeginTimestamp(id_i); + uint64_t timestamp= idWorker.degenerateTimestamp(id_i); +- zval arr; ++ zval arr, *parr = &arr; + + array_init(&arr); + add_assoc_long_ex(&arr, "worker_id", strlen("worker_id"), workerId); +@@ -323,7 +323,7 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, degenerate) + add_assoc_long_ex(&arr, "begin_timestamp", strlen("begin_timestamp"), beginTimestamp); + add_assoc_long_ex(&arr, "interval", strlen("interval"), interval); + +- RETURN_ZVAL(&arr, 0, 1); ++ RETURN_ZVAL(parr, 0, 1); + } catch (const std::exception& e){ + #if PHP_VERSION_ID < 80000 + sc_zend_throw_exception(NULL, e.what(), 0 TSRMLS_CC); diff --git a/6.patch b/6.patch new file mode 100644 index 0000000..3b0c26f --- /dev/null +++ b/6.patch @@ -0,0 +1,57 @@ +From b5df08afb79b6fa8071420ec096a0c75d02d682e Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 25 Aug 2021 09:34:34 +0200 +Subject: [PATCH 1/2] generate have no arg + +--- + SeasSnowflake.cpp | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/SeasSnowflake.cpp b/SeasSnowflake.cpp +index 1a3282e..ccc04a1 100755 +--- a/SeasSnowflake.cpp ++++ b/SeasSnowflake.cpp +@@ -59,8 +59,7 @@ ZEND_BEGIN_ARG_INFO_EX(SeasSnowflake_construct, 0, 0, 1) + ZEND_ARG_INFO(0, parames) + ZEND_END_ARG_INFO() + +-ZEND_BEGIN_ARG_INFO_EX(SeasSnowflake_generate, 0, 0, 1) +-ZEND_ARG_INFO(0, id) ++ZEND_BEGIN_ARG_INFO_EX(SeasSnowflake_generate, 0, 0, 0) + ZEND_END_ARG_INFO() + + ZEND_BEGIN_ARG_INFO_EX(SeasSnowflake_degenerate, 0, 0, 1) +@@ -244,6 +243,10 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, generate) + zval *worker_id = sc_zend_read_property(SeasSnowflake_ce, this_obj, "worker_id", sizeof("worker_id") - 1, 0); + zval *datacenter_id = sc_zend_read_property(SeasSnowflake_ce, this_obj, "datacenter_id", sizeof("datacenter_id") - 1, 0); + ++ if (zend_parse_parameters_none() == FAILURE) ++ { ++ return; ++ } + + idWorker.setDatacenterId(Z_LVAL_P(worker_id)); + idWorker.setWorkerId(Z_LVAL_P(datacenter_id)); + +From a0b25161727f7346f8120f9e0161e498451e0b0e Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Wed, 25 Aug 2021 09:37:39 +0200 +Subject: [PATCH 2/2] degenerate have a single arg + +--- + SeasSnowflake.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/SeasSnowflake.cpp b/SeasSnowflake.cpp +index ccc04a1..c36197b 100755 +--- a/SeasSnowflake.cpp ++++ b/SeasSnowflake.cpp +@@ -294,7 +294,7 @@ PHP_METHOD(SEASSNOWFLAKE_RES_NAME, degenerate) + #else + #undef IS_UNDEF + #define IS_UNDEF Z_EXPECTED_LONG +- ZEND_PARSE_PARAMETERS_START(1, 2) ++ ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_STRING(id, l_id) + Z_PARAM_OPTIONAL + // Z_PARAM_ARRAY(params) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..13af741 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +SRCDIR := $(shell pwd) +NAME := $(shell basename $(SRCDIR)) +include ../../../common/Makefile + diff --git a/PHPINFO b/PHPINFO new file mode 100644 index 0000000..0d0153c --- /dev/null +++ b/PHPINFO @@ -0,0 +1,6 @@ + +SeasSnowflake + +SeasSnowflake support => enabled +Version => 1.0.0 +Author => SeasX Group[email: rock@php.net] diff --git a/REFLECTION b/REFLECTION new file mode 100644 index 0000000..83e5165 --- /dev/null +++ b/REFLECTION @@ -0,0 +1,50 @@ +Extension [ extension #66 SeasSnowflake version 1.0.0 ] { + + - Functions { + Function [ function SeasSnowflake_version ] { + + - Parameters [0] { + } + } + } + + - Classes [1] { + Class [ final class SeasSnowflake ] { + + - Constants [0] { + } + + - Static properties [0] { + } + + - Static methods [0] { + } + + - Properties [0] { + } + + - Methods [3] { + Method [ public method __construct ] { + + - Parameters [1] { + Parameter #0 [ $parames ] + } + } + + Method [ public method generate ] { + + - Parameters [0] { + } + } + + Method [ public method degenerate ] { + + - Parameters [1] { + Parameter #0 [ $id ] + } + } + } + } + } +} + diff --git a/php-pecl-seassnowflake.spec b/php-pecl-seassnowflake.spec new file mode 100644 index 0000000..475919f --- /dev/null +++ b/php-pecl-seassnowflake.spec @@ -0,0 +1,217 @@ +# remirepo spec file for php-pecl-seassnowflake +# +# Copyright (c) 2021 Remi Collet +# License: CC-BY-SA +# http://creativecommons.org/licenses/by-sa/4.0/ +# +# Please, preserve the changelog entries +# +%if 0%{?scl:1} +%scl_package php-pecl-seassnowflake +%else +%global _root_libdir %{_libdir} +%endif + +%global with_zts 0%{!?_without_zts:%{?__ztsphp:1}} +%global proj_name SeasSnowflake +%global pecl_name SeasSnowflake +%global rpm_name seassnowflake +%global with_tests 0%{!?_without_tests:1} +%global ini_name 40-%{pecl_name}.ini + +Summary: PHP Extension for Distributed unique ID generator +Name: %{?scl_prefix}php-pecl-%{rpm_name} +Version: 1.0.0 +Release: 1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +License: PHP +URL: https://pecl.php.net/package/%{proj_name} +Source0: https://pecl.php.net/get/%{proj_name}-%{version}.tgz + +Patch0: https://patch-diff.githubusercontent.com/raw/SeasX/SeasSnowflake/pull/3.patch +Patch1: https://patch-diff.githubusercontent.com/raw/SeasX/SeasSnowflake/pull/5.patch +Patch2: https://patch-diff.githubusercontent.com/raw/SeasX/SeasSnowflake/pull/6.patch + +BuildRequires: make +BuildRequires: %{?dtsprefix}gcc +# Upstream states 5.4 but seems badly supported +BuildRequires: %{?scl_prefix}php-devel >= 7.0 +BuildRequires: %{?scl_prefix}php-pear + +Requires: %{?scl_prefix}php(zend-abi) = %{php_zend_api} +Requires: %{?scl_prefix}php(api) = %{php_core_api} +%{?_sclreq:Requires: %{?scl_prefix}runtime%{?_sclreq}%{?_isa}} + +Provides: %{?scl_prefix}php-%{pecl_name} = %{version} +Provides: %{?scl_prefix}php-%{pecl_name}%{?_isa} = %{version} +Provides: %{?scl_prefix}php-pecl(%{proj_name}) = %{version} +Provides: %{?scl_prefix}php-pecl(%{proj_name})%{?_isa} = %{version} + +%if "%{?packager}" == "Remi Collet" && 0%{!?scl:1} && 0%{?rhel} +# Other third party repo stuff +%if "%{php_version}" > "7.3" +Obsoletes: php73-pecl-%{pecl_name} <= %{version} +%endif +%if "%{php_version}" > "7.4" +Obsoletes: php74-pecl-%{pecl_name} <= %{version} +%endif +%if "%{php_version}" > "8.0" +Obsoletes: php80-pecl-%{pecl_name} <= %{version} +%endif +%if "%{php_version}" > "8.1" +Obsoletes: php81-pecl-%{pecl_name} <= %{version} +%endif +%endif + + +%description +SeasSnowflake is a distributed unique ID generator inspired by +Twitter's Snowflake [1]. + +[1] https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake + +Package built for PHP %(%{__php} -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')%{?scl: as Software Collection (%{scl} by %{?scl_vendor}%{!?scl_vendor:rh})}. + + +%prep +%setup -q -c +mv %{proj_name}-%{version} NTS + +# Don't install tests +sed -e 's/role="test"/role="src"/' \ + %{?_licensedir:-e '/LICENSE/s/role="doc"/role="src"/' } \ + -i package.xml + +cd NTS +find . -type f -exec chmod -x {} \; +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 + +: Sanity check, really often broken +extver=$(sed -n '/#define PHP_SEASSNOWFLAKE_VERSION /{s/.* "//;s/".*$//;p}' php_SeasSnowflake.h) +if test "x${extver}" != "x%{version}"; then + : Error: Upstream extension version is ${extver}, expecting %{version}. + exit 1 +fi +cd .. + +%if %{with_zts} +# Duplicate source tree for NTS / ZTS build +cp -pr NTS ZTS +%endif + +# Create configuration file +cat << 'EOF' | tee %{ini_name} +; Enable %{pecl_name} extension module +extension=%{pecl_name}.so +EOF + + +%build +%{?dtsenable} + +cd NTS +%{_bindir}/phpize +%configure \ + --enable-SeasSnowflake \ + --with-php-config=%{_bindir}/php-config +make %{?_smp_mflags} + +%if %{with_zts} +cd ../ZTS +%{_bindir}/zts-phpize +%configure \ + --enable-SeasSnowflake \ + --with-php-config=%{_bindir}/zts-php-config +make %{?_smp_mflags} +%endif + + +%install +%{?dtsenable} + +make -C NTS install INSTALL_ROOT=%{buildroot} + +# install config file +install -D -m 644 %{ini_name} %{buildroot}%{php_inidir}/%{ini_name} + +# Install XML package description +install -D -m 644 package.xml %{buildroot}%{pecl_xmldir}/%{name}.xml + +%if %{with_zts} +make -C ZTS install INSTALL_ROOT=%{buildroot} + +install -D -m 644 %{ini_name} %{buildroot}%{php_ztsinidir}/%{ini_name} +%endif + +# Documentation +for i in $(grep 'role="doc"' package.xml | sed -e 's/^.*name="//;s/".*$//') +do install -Dpm 644 NTS/$i %{buildroot}%{pecl_docdir}/%{pecl_name}/$i +done + + +%check +# No useful test in tests directory + +cd NTS +: Minimal load test for NTS extension +%{__php} --no-php-ini \ + --define extension=%{buildroot}%{php_extdir}/%{pecl_name}.so \ + --modules | grep -i '^%{pecl_name}$' + +: Upstream test suite for NTS extension +TEST_PHP_EXECUTABLE=%{__php} \ +TEST_PHP_ARGS="-n -d extension=$PWD/modules/%{pecl_name}.so" \ +REPORT_EXIT_STATUS=1 \ +%{__php} -n run-tests.php -q --show-diff + +%if %{with_zts} +cd ../ZTS +: Minimal load test for ZTS extension +%{__ztsphp} --no-php-ini \ + --define extension=%{buildroot}%{php_ztsextdir}/%{pecl_name}.so \ + --modules | grep -i '^%{pecl_name}$' +%endif + + +%if 0%{?fedora} < 24 && 0%{?rhel} < 8 +# when pear installed alone, after us +%triggerin -- %{?scl_prefix}php-pear +if [ -x %{__pecl} ] ; then + %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : +fi + +# posttrans as pear can be installed after us +%posttrans +if [ -x %{__pecl} ] ; then + %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : +fi + +%postun +if [ $1 -eq 0 -a -x %{__pecl} ] ; then + %{pecl_uninstall} %{proj_name} >/dev/null || : +fi +%endif + + +%files +%doc %{pecl_docdir}/%{pecl_name} +%{?_licensedir:%license NTS/LICENSE} + +%{pecl_xmldir}/%{name}.xml +%config(noreplace) %{php_inidir}/%{ini_name} +%{php_extdir}/%{pecl_name}.so + +%if %{with_zts} +%config(noreplace) %{php_ztsinidir}/%{ini_name} +%{php_ztsextdir}/%{pecl_name}.so +%endif + + +%changelog +* Wed Aug 25 2021 Remi Collet - 1.0.0-1 +- initial package, version 1.0.0 (stable) +- open https://github.com/SeasX/SeasSnowflake/pull/3 - fix test +- open https://github.com/SeasX/SeasSnowflake/pull/4 - exec perm +- open https://github.com/SeasX/SeasSnowflake/pull/5 - PHP 5 +- open https://github.com/SeasX/SeasSnowflake/pull/6 - arginfo -- cgit