From 1c2b72f9a670b6683bde1e1b22d89882f3570dd2 Mon Sep 17 00:00:00 2001 From: yuqing Date: Fri, 17 Jun 2016 10:09:41 +0800 Subject: [PATCH] add function id_generator_get_timestamp --- HISTORY | 3 +- php-fastcommon/fastcommon.c | 54 +++++++++++++++++++++++++++ php-fastcommon/fastcommon.h | 1 + php-fastcommon/php-fastcommon.spec.in | 6 +-- php-fastcommon/test.php | 20 +++++++--- src/id_generator.h | 16 +++++++- 6 files changed, 90 insertions(+), 10 deletions(-) diff --git a/HISTORY b/HISTORY index bbbd818..afe186a 100644 --- a/HISTORY +++ b/HISTORY @@ -1,7 +1,8 @@ -Version 1.28 2016-06-15 +Version 1.29 2016-06-17 * ini_file_reader support #@if * ini_file_reader support #@for + * add function id_generator_get_timestamp Version 1.28 2016-06-08 * id generator support extra bits diff --git a/php-fastcommon/fastcommon.c b/php-fastcommon/fastcommon.c index 9f40be2..61fd4f9 100644 --- a/php-fastcommon/fastcommon.c +++ b/php-fastcommon/fastcommon.c @@ -52,6 +52,7 @@ const zend_fcall_info empty_fcall_info = { 0, NULL, NULL, NULL, NULL, 0, NULL, N ZEND_FE(fastcommon_id_generator_init, NULL) ZEND_FE(fastcommon_id_generator_next, NULL) ZEND_FE(fastcommon_id_generator_get_extra, NULL) + ZEND_FE(fastcommon_id_generator_get_timestamp, NULL) ZEND_FE(fastcommon_id_generator_destroy, NULL) {NULL, NULL, NULL} /* Must be the last line */ }; @@ -627,3 +628,56 @@ ZEND_FUNCTION(fastcommon_id_generator_destroy) RETURN_BOOL(true); } +/* +long fastcommon_id_generator_get_timestamp(long id [, $handle = NULL]) +return the timestamp +*/ +ZEND_FUNCTION(fastcommon_id_generator_get_timestamp) +{ + int argc; + long id; + zval *zhandle; + PHPIDGContext *php_idg_context; + struct idg_context *context; + + argc = ZEND_NUM_ARGS(); + if (argc > 2) { + logError("file: "__FILE__", line: %d, " + "fastcommon_id_generator_get_timestamp parameters count: %d is invalid", + __LINE__, argc); + RETURN_BOOL(false); + } + + zhandle = NULL; + if (zend_parse_parameters(argc TSRMLS_CC, "l|z", &id, &zhandle) == FAILURE) + { + logError("file: "__FILE__", line: %d, " + "zend_parse_parameters fail!", __LINE__); + RETURN_BOOL(false); + } + + if (zhandle != NULL && !ZVAL_IS_NULL(zhandle)) + { + ZEND_FETCH_RESOURCE(php_idg_context, PHPIDGContext *, &zhandle, -1, + PHP_IDG_RESOURCE_NAME, le_consumer); + context = &php_idg_context->idg_context; + } + else + { + if (last_idg_context == NULL) { + logError("file: "__FILE__", line: %d, " + "must call fastcommon_id_generator_init first", __LINE__); + RETURN_BOOL(false); + } + context = &last_idg_context->idg_context; + } + + if (context->fd < 0) { + logError("file: "__FILE__", line: %d, " + "must call fastcommon_id_generator_init first", __LINE__); + RETURN_BOOL(false); + } + + RETURN_LONG(id_generator_get_timestamp(context, id)); +} + diff --git a/php-fastcommon/fastcommon.h b/php-fastcommon/fastcommon.h index f297065..830eb1c 100644 --- a/php-fastcommon/fastcommon.h +++ b/php-fastcommon/fastcommon.h @@ -29,6 +29,7 @@ ZEND_FUNCTION(fastcommon_is_private_ip); ZEND_FUNCTION(fastcommon_id_generator_init); ZEND_FUNCTION(fastcommon_id_generator_next); ZEND_FUNCTION(fastcommon_id_generator_get_extra); +ZEND_FUNCTION(fastcommon_id_generator_get_timestamp); ZEND_FUNCTION(fastcommon_id_generator_destroy); #ifdef __cplusplus diff --git a/php-fastcommon/php-fastcommon.spec.in b/php-fastcommon/php-fastcommon.spec.in index 053efca..36c7294 100644 --- a/php-fastcommon/php-fastcommon.spec.in +++ b/php-fastcommon/php-fastcommon.spec.in @@ -1,7 +1,7 @@ %define php_inidir %(php --ini | head -n 1 | awk -F ':' '{print $2;}' | sed 's/ //g') %define php_extdir %(php-config --extension-dir 2>/dev/null) Name: php-fastcommon -Version: 1.0.7 +Version: 1.0.8 Release: 1%{?dist} Summary: The php extension for libfastcommon License: GPL @@ -11,8 +11,8 @@ Source: http://perso.orange.fr/sebastien.godard/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -BuildRequires: libfastcommon-devel >= 1.0.28 -Requires: libfastcommon >= 1.0.28 +BuildRequires: libfastcommon-devel >= 1.0.29 +Requires: libfastcommon >= 1.0.29 %description This package provides the php extension for libfastcommon diff --git a/php-fastcommon/test.php b/php-fastcommon/test.php index f2fc96d..7ab2efd 100644 --- a/php-fastcommon/test.php +++ b/php-fastcommon/test.php @@ -19,25 +19,35 @@ while (($next_ip=fastcommon_get_next_local_ip($next_ip))) $handle = fastcommon_id_generator_init(); $id = fastcommon_id_generator_next(1); -printf("id: %d %X, extra: %d\n", $id, $id, fastcommon_id_generator_get_extra($id)); +printf("id: %d %X, extra: %d, timestamp: %d\n", $id, $id, + fastcommon_id_generator_get_extra($id), + fastcommon_id_generator_get_timestamp($id)); unset($handle); $handle1 = fastcommon_id_generator_init("/tmp/sn1.txt", 0, 8, 10, 14); $handle2 = fastcommon_id_generator_init("/tmp/sn2.txt", 0, 8, 8, 16); $id = fastcommon_id_generator_next(1, $handle1); -printf("id1: %d %X, extra: %d\n", $id, $id, fastcommon_id_generator_get_extra($id, $handle1)); +printf("id1: %d %X, extra: %d, timestamp: %d\n", $id, $id, + fastcommon_id_generator_get_extra($id, $handle1), + fastcommon_id_generator_get_timestamp($id, $handle1)); $id = fastcommon_id_generator_next(2, $handle2); -printf("id2: %d %X, extra: %d\n", $id, $id, fastcommon_id_generator_get_extra($id, $handle2)); +printf("id2: %d %X, extra: %d, timestamp: %d\n", $id, $id, + fastcommon_id_generator_get_extra($id, $handle2), + fastcommon_id_generator_get_timestamp($id, $handle2)); $handle = fastcommon_id_generator_init("/tmp/sn.txt", 0, 8, 10, 14); $id = fastcommon_id_generator_next(512, $handle); -printf("%d %X, extra: %d\n", $id, $id, fastcommon_id_generator_get_extra($id, $handle)); +printf("%d %X, extra: %d, timestamp: %d\n", $id, $id, + fastcommon_id_generator_get_extra($id, $handle), + fastcommon_id_generator_get_timestamp($id, $handle)); for ($i=0; $i<10; $i++) { $id = fastcommon_id_generator_next($i, $handle); - printf("%d %X, extra: %d\n", $id, $id, fastcommon_id_generator_get_extra($id, $handle)); + printf("%d %X, extra: %d, timestamp: %d\n", $id, $id, + fastcommon_id_generator_get_extra($id, $handle), + fastcommon_id_generator_get_timestamp($id, $handle)); } fastcommon_id_generator_destroy($handle); diff --git a/src/id_generator.h b/src/id_generator.h index 831af2f..765b227 100644 --- a/src/id_generator.h +++ b/src/id_generator.h @@ -132,11 +132,25 @@ static inline int id_generator_next(struct idg_context *context, int64_t *id) * id: the id * return the extra data */ -static inline int id_generator_get_extra(struct idg_context *context, const int64_t id) +static inline int id_generator_get_extra(struct idg_context *context, + const int64_t id) { return (int)((id & context->extra_mask) >> context->sn_bits); } +/** +* get timestamp from id +* parameter: +* context: the id generator context +* id: the id +* return the timestamp +*/ +static inline long id_generator_get_timestamp(struct idg_context *context, + const int64_t id) +{ + return (long)(id >> context->mes_bits_sum); +} + #ifdef __cplusplus } #endif