From 0bf4e2bb8d5437ab68d2e3cb1233b3e086f175fe Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Wed, 24 Sep 2025 12:16:29 -0700 Subject: [PATCH 1/7] Alter Rust bindings to make investigation easier, reproduce issue 63 This patch introduces a PHP script in DEBUG-sfalvo where I am able to reproduce the OP's issue. To do this, I needed to make a small adjustment to the Rust binding code. After speaking with Khosrow, he recommended adding a few utility methods to the Expiration class ("We probably need a few methods in there, including neverExpire() -> bool, serverDefault() -> bool in addition to inSeconds() (in seconds should be an i64 that can be negative for the two above values.)). For now, this is just a research branch; DO NOT merge into main. --- DEBUG-sfalvo/put.php | 97 ++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 8 ++++ 2 files changed, 105 insertions(+) create mode 100644 DEBUG-sfalvo/put.php diff --git a/DEBUG-sfalvo/put.php b/DEBUG-sfalvo/put.php new file mode 100644 index 0000000..1e5f663 --- /dev/null +++ b/DEBUG-sfalvo/put.php @@ -0,0 +1,97 @@ +truncate +// +//////////////////////////////////////////////////////////////////////////////// + +// $ip = new InfoPolicy(); +// $client->truncate($ip, "test", "test"); + +//////////////////////////////////////////////////////////////////////////////// +// +// client->put +// +//////////////////////////////////////////////////////////////////////////////// + +echo "============= PUT ===============\n"; + +$wp = new WritePolicy(); +$wp->setExpiration(Expiration::Seconds(10)); + +$bin1 = new Bin("bin1", 111); + +for ($x = 0; $x < 10; $x++) { + $key = new Key("test", "test", $x); + $bin1 = new Bin("bin1", $x); + echo "/"; + $client->put($wp, $key, [$bin1]); +} +echo "\n"; + +//////////////////////////////////////////////////////////////////////////////// +// +// client->get +// +//////////////////////////////////////////////////////////////////////////////// + +echo "============= GET ===============\n"; + +$rp = new ReadPolicy(); + +$rp->setMaxRetries(3); +$timeInMillis = 3000; +$rp->timeout = $timeInMillis; + +var_dump($rp); + +for ($x = 0; $x <= 10; $x++) { + sleep(1); + $record = $client->get($rp, $key, ["bin1"]); + if ($record) { + echo "RECORD " . $x . " TTL = " . ($record->getTtl()) . "\n"; + echo "RECORD " . $x . " EXP = " . ($record->getExpiration()->inSeconds()) . "\n"; + } + else { + echo "Record " . $x . " expired.\n"; + } +} + +$record = $client->get($rp, $key); +var_dump($record->bins); +var_dump($record->generation); +var_dump($record->key); + +//////////////////////////////////////////////////////////////////////////////// +// +// $client->delete +// +//////////////////////////////////////////////////////////////////////////////// + +$deleted = $client->delete($wp, $key); +var_dump($deleted); + +$exists = $client->exists($rp, $key); +var_dump($exists); + diff --git a/src/lib.rs b/src/lib.rs index 044bdf8..6e3ee39 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1657,6 +1657,12 @@ impl Expiration { _as: _Expiration::DontUpdate, } } + + /// Answers with the expiration's configured value in units of seconds. + #[getter] + pub fn in_seconds(&self) -> u32 { + self.into() + } } impl From<&Expiration> for u32 { @@ -9744,6 +9750,7 @@ impl Client { /// Write record bin(s). The policy specifies the transaction timeout, record expiration and /// how the transaction is handled when the record already exists. pub fn put(&self, policy: &WritePolicy, key: &Key, bins: Vec<&Bin>) -> PhpResult<()> { + eprintln!("LBPUT001 put() entered"); let bins: Vec = bins.into_iter().map(|b| b.into()).collect(); let request = tonic::Request::new(proto::AerospikePutRequest { @@ -9761,6 +9768,7 @@ impl Client { } => Ok(()), pe => { let error: AerospikeException = pe.into(); + eprintln!("LBPUT002 Error detected: {:?}", error); throw_object(error.into_zval(true)?)?; Ok(()) } From 941d6e120c7678fcf59fc29f33975a086694a4d0 Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Thu, 25 Sep 2025 19:20:23 -0700 Subject: [PATCH 2/7] CLIENT-3777 Fix anomalous getTtl() behavior This patch greatly simplifies the getTtl() logic in the original PHP Rust bindings. It turns out that the Aerospike server itself maintains the TTL on behalf of the client; there is no need for the PHP client to maintain CITRUSLEAF_EPOCH-relative timestamps. This is in line with both the C and Java clients, thus implying consistent behavior with Javascript and Python clients as well. The Expiration interface has been upgraded as well; it is fully backward compatible with previous code, but now has getters which allows software to query its current state. In addition to this change, a number of PHPUnit tests have been added which exercises the new behavior along with the Expiration type's new interface. --- DEBUG-sfalvo/put.php | 97 ---------------------- php_stubs/libaerospike-php-stubsv1.0.0.php | 40 ++++++++- src/lib.rs | 85 +++++++++++-------- tests/ClientTest.php | 52 +++++++++++- 4 files changed, 136 insertions(+), 138 deletions(-) delete mode 100644 DEBUG-sfalvo/put.php diff --git a/DEBUG-sfalvo/put.php b/DEBUG-sfalvo/put.php deleted file mode 100644 index 1e5f663..0000000 --- a/DEBUG-sfalvo/put.php +++ /dev/null @@ -1,97 +0,0 @@ -truncate -// -//////////////////////////////////////////////////////////////////////////////// - -// $ip = new InfoPolicy(); -// $client->truncate($ip, "test", "test"); - -//////////////////////////////////////////////////////////////////////////////// -// -// client->put -// -//////////////////////////////////////////////////////////////////////////////// - -echo "============= PUT ===============\n"; - -$wp = new WritePolicy(); -$wp->setExpiration(Expiration::Seconds(10)); - -$bin1 = new Bin("bin1", 111); - -for ($x = 0; $x < 10; $x++) { - $key = new Key("test", "test", $x); - $bin1 = new Bin("bin1", $x); - echo "/"; - $client->put($wp, $key, [$bin1]); -} -echo "\n"; - -//////////////////////////////////////////////////////////////////////////////// -// -// client->get -// -//////////////////////////////////////////////////////////////////////////////// - -echo "============= GET ===============\n"; - -$rp = new ReadPolicy(); - -$rp->setMaxRetries(3); -$timeInMillis = 3000; -$rp->timeout = $timeInMillis; - -var_dump($rp); - -for ($x = 0; $x <= 10; $x++) { - sleep(1); - $record = $client->get($rp, $key, ["bin1"]); - if ($record) { - echo "RECORD " . $x . " TTL = " . ($record->getTtl()) . "\n"; - echo "RECORD " . $x . " EXP = " . ($record->getExpiration()->inSeconds()) . "\n"; - } - else { - echo "Record " . $x . " expired.\n"; - } -} - -$record = $client->get($rp, $key); -var_dump($record->bins); -var_dump($record->generation); -var_dump($record->key); - -//////////////////////////////////////////////////////////////////////////////// -// -// $client->delete -// -//////////////////////////////////////////////////////////////////////////////// - -$deleted = $client->delete($wp, $key); -var_dump($deleted); - -$exists = $client->exists($rp, $key); -var_dump($exists); - diff --git a/php_stubs/libaerospike-php-stubsv1.0.0.php b/php_stubs/libaerospike-php-stubsv1.0.0.php index e2b0d76..05d99a6 100644 --- a/php_stubs/libaerospike-php-stubsv1.0.0.php +++ b/php_stubs/libaerospike-php-stubsv1.0.0.php @@ -3205,26 +3205,58 @@ public static function getByValueRelativeRankRangeCount(string $bin_name, mixed */ class Expiration { /** - * Set the record to expire X seconds from now + * Set the record to expire X seconds from now. See also `getTtl()`. */ public static function Seconds(int $seconds): \Aerospike\Expiration {} /** - * Set the record's expiry time using the default time-to-live (TTL) value for the namespace + * Answers with the expiration's current time to live in units of + * seconds, excluding any special values. If the expiration is set to + * the namespace default, is configured to never update, or is configured + * to never expire, this method returns null. See also `Seconds()`. + */ + public function get_ttl(): ?int {} + + /** + * Set the record's expiry time using the default time-to-live (TTL) value + * for the namespace. See also `isNamespaceDefault()`. */ public static function NamespaceDefault(): \Aerospike\Expiration {} + /** + * Answers true only if the expiration is set to use the namespace default. + * See also `NamespaceDefault()`. + */ + public function isNamespaceDefault(): bool {} + /** * Set the record to never expire. Requires Aerospike 2 server version 2.7.2 or later or * Aerospike 3 server version 3.1.4 or later. Do not use with older servers. + * See also `willNeverExpire()`. */ public static function Never(): \Aerospike\Expiration {} /** - * Do not change the record's expiry time when updating the record; requires Aerospike server - * version 3.10.1 or later. + * Answers true only if the expiration is set to never expire. + * See also `Never()`. + */ + public function willNeverExpire(): bool {} + + /** + * Do not change the record's expiry time when updating the record; + * requires Aerospike server version 3.10.1 or later. + * See also `willUpdateExpiration()`. */ public static function DontUpdate(): \Aerospike\Expiration {} + + /** + * Answers *true* if the expiration is configured to somehow change during + * a record update. This can be as simple as an explicit time-to-live, or + * an instruction to use the namespace's default expiration, etc. Answers + * *false* if the expiration will *not* be changed during a record update + * (e.g., the expiration was constructed with DontUpdate().) + */ + public function willUpdateExpiration(): bool {} } /** diff --git a/src/lib.rs b/src/lib.rs index 6e3ee39..d27ffbc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,6 @@ use std::hash::{Hash, Hasher}; use std::io::Cursor; use std::sync::Arc; use std::sync::Mutex; -use std::time::SystemTime; use byteorder::{ByteOrder, NetworkEndian}; use ripemd160::digest::Digest; @@ -67,7 +66,6 @@ pub type AsResult = std::result::Result; const VERSION: &str = env!("CARGO_PKG_VERSION"); const PARTITIONS: u16 = 4096; -const CITRUSLEAF_EPOCH: u64 = 1262304000; //////////////////////////////////////////////////////////////////////////////////////////// // @@ -1602,7 +1600,7 @@ const NEVER_EXPIRE: u32 = 0xFFFF_FFFF; // -1 as i32 const DONT_UPDATE: u32 = 0xFFFF_FFFE; /// Record expiration, also known as time-to-live (TTL). -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum _Expiration { Seconds(u32), NamespaceDefault, @@ -1628,41 +1626,73 @@ impl FromZval<'_> for Expiration { #[php_impl] #[derive(ZvalConvert)] impl Expiration { - /// Set the record to expire X seconds from now + /// Set the record to expire X seconds from now. See also `getTtl()`. pub fn Seconds(seconds: u32) -> Self { Expiration { _as: _Expiration::Seconds(seconds), } } - /// Set the record's expiry time using the default time-to-live (TTL) value for the namespace + /// Answers with the expiration's current time to live in units of + /// seconds, excluding any special values. If the expiration is set to + /// the namespace default, is configured to never update, or is configured + /// to never expire, this method returns null. See also `Seconds()`. + #[getter] + pub fn get_ttl(&self) -> Option { + match self._as { + _Expiration::Seconds(secs) => Some(secs), + _ => None, + } + } + + /// Set the record's expiry time using the default time-to-live (TTL) value + /// for the namespace. See also `isNamespaceDefault()`. pub fn Namespace_Default() -> Self { Expiration { _as: _Expiration::NamespaceDefault, } } + /// Answers true only if the expiration is set to use the namespace default. + /// See also `NamespaceDefault()`. + #[getter] + pub fn is_namespace_default(&self) -> bool { + self._as == _Expiration::NamespaceDefault + } + /// Set the record to never expire. Requires Aerospike 2 server version 2.7.2 or later or /// Aerospike 3 server version 3.1.4 or later. Do not use with older servers. + /// See also `willNeverExpire()`. pub fn Never() -> Self { Expiration { _as: _Expiration::Never, } } - /// Do not change the record's expiry time when updating the record; requires Aerospike server - /// version 3.10.1 or later. + /// Answers true only if the expiration is set to never expire. + /// See also `Never()`. + pub fn will_never_expire(&self) -> bool { + self._as == _Expiration::Never + } + + /// Do not change the record's expiry time when updating the record; + /// requires Aerospike server version 3.10.1 or later. + /// See also `willUpdateExpiration()`. pub fn Dont_Update() -> Self { Expiration { _as: _Expiration::DontUpdate, } } - /// Answers with the expiration's configured value in units of seconds. - #[getter] - pub fn in_seconds(&self) -> u32 { - self.into() - } + /// Answers *true* if the expiration is configured to somehow change during + /// a record update. This can be as simple as an explicit time-to-live, or + /// an instruction to use the namespace's default expiration, etc. Answers + /// *false* if the expiration will *not* be changed during a record update + /// (e.g., the expiration was constructed with DontUpdate().) + #[getter] + pub fn will_update_expiration(&self) -> bool { + self._as != _Expiration::DontUpdate + } } impl From<&Expiration> for u32 { @@ -4217,8 +4247,9 @@ impl Record { Some(self._as.generation) } - /// Expiration is TTL (Time-To-Live). - /// Number of seconds until record expires. + /// Expiration indicates when a record will expire (Time-To-Live). + /// To determine a record's time to live, use the `getTtl()` method on the + /// Expiration or, equivalently, on the record. #[getter] pub fn get_expiration(&self) -> Expiration { match self._as.expiration { @@ -4227,28 +4258,12 @@ impl Record { } } - /// Expiration is TTL (Time-To-Live). - /// Number of seconds until record expires. + /// Answer with the record's TTL (Time-To-Live), or null if not + /// possible. Expressed in number of seconds until record expires. + /// Equivalent to `$this->getExpiration()->getTtl()`. #[getter] pub fn get_ttl(&self) -> Option { - match self._as.expiration { - 0 => NEVER_EXPIRE.into(), - secs => { - let expiration = CITRUSLEAF_EPOCH + (secs as u64); - let now = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs(); - - // Record may not have expired on server, but delay or clock differences may - // cause it to look expired on client. Floor at 1, not 0, to avoid old - // "never expires" interpretation. - if expiration > now { - return (((expiration as u64) - now) as u32).into(); - } - return (1 as u32).into(); - } - } + self.get_expiration().get_ttl() } /// Key is the record's key. @@ -9750,7 +9765,6 @@ impl Client { /// Write record bin(s). The policy specifies the transaction timeout, record expiration and /// how the transaction is handled when the record already exists. pub fn put(&self, policy: &WritePolicy, key: &Key, bins: Vec<&Bin>) -> PhpResult<()> { - eprintln!("LBPUT001 put() entered"); let bins: Vec = bins.into_iter().map(|b| b.into()).collect(); let request = tonic::Request::new(proto::AerospikePutRequest { @@ -9768,7 +9782,6 @@ impl Client { } => Ok(()), pe => { let error: AerospikeException = pe.into(); - eprintln!("LBPUT002 Error detected: {:?}", error); throw_object(error.into_zval(true)?)?; Ok(()) } diff --git a/tests/ClientTest.php b/tests/ClientTest.php index 115d172..be940ec 100644 --- a/tests/ClientTest.php +++ b/tests/ClientTest.php @@ -24,7 +24,6 @@ public static function setUpBeforeClass(): void } } - public function testPutGetValues() { $values = [ @@ -319,4 +318,55 @@ public function testPutGetBinary() $this->assertEquals($binary, $binGet["binaryBin"]); } + + public function testReadTtlExpires() + { + $stringKey = new Key(self::$namespace, self::$set, "new_key"); + $wp = new WritePolicy(); + $wp->setExpiration(Expiration::Seconds(3)); + self::$client->put($wp, $stringKey, [new Bin("record", "expires_in_3")]); + sleep(5); + $rp = new ReadPolicy(); + $record = self::$client->get($rp, $stringKey); + $this->assertEquals($record, null); + } + + public function testReadTtlNoExpires() + { + $stringKey = new Key(self::$namespace, self::$set, "new_key"); + $wp = new WritePolicy(); + $wp->setExpiration(Expiration::Seconds(3)); + self::$client->put($wp, $stringKey, [new Bin("record", "expires_in_3")]); + sleep(1); + $rp = new ReadPolicy(); + $record = self::$client->get($rp, $stringKey); + $this->assertEquals($record->getTtl(), 2); + } + + public function testReadTtlNotUpdated() + { + $stringKey = new Key(self::$namespace, self::$set, "new_key"); + $wp = new WritePolicy(); + $wp->setExpiration(Expiration::Seconds(3)); + self::$client->put($wp, $stringKey, [new Bin("record", "expires_in_3")]); + sleep(1); + $wp->setExpiration(Expiration::DontUpdate()); + $this->assertFalse($wp->getExpiration()->willUpdateExpiration()); + self::$client->put($wp, $stringKey, [new Bin("record", "expires_in_2_hopefully")]); + $rp = new ReadPolicy(); + $record = self::$client->get($rp, $stringKey); + $this->assertEquals($record->getTtl(), 2); + } + + public function testReadTtlNeverExpires() + { + $stringKey = new Key(self::$namespace, self::$set, "new_key"); + $wp = new WritePolicy(); + $wp->setExpiration(Expiration::Never()); + self::$client->put($wp, $stringKey, [new Bin("record", "records_are_forever")]); + $rp = new ReadPolicy(); + $record = self::$client->get($rp, $stringKey); + $this->assertEquals($record->getTtl(), null); + $this->assertTrue($record->getExpiration()->willNeverExpire()); + } } From dece2d8b2b8919784bd010ac6433bca08e03640d Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Mon, 29 Sep 2025 17:07:38 -0700 Subject: [PATCH 3/7] Fix CI/CD pipeline to be PHP version-aware. --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e4b3dc..6c4c060 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -93,9 +93,9 @@ jobs: # with apt run: | sudo apt -y install \ - php-mbstring \ - php-xml \ - php-dev \ + php${{ matrix.php-version }}-mbstring \ + php${{ matrix.php-version }}-xml \ + php${{ matrix.php-version }}-dev \ phpunit \ build-essential \ protobuf-compiler \ From 53d03298d5abed019c3d03949c81736230e48d48 Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Tue, 30 Sep 2025 13:10:50 -0700 Subject: [PATCH 4/7] CLIENT-3777 Update README files per feedback --- README.md | 7 ++++--- aerospike-connection-manager/README.md | 10 ++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 97decf2..f3d9d65 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ In case the installation script fails to build the `PHP-Client`, or if you just $writePolicy->setRecordExistsAction(RecordExistsAction::Update); $writePolicy->setGenerationPolicy(GenerationPolicy::ExpectGenEqual); - $writePolicy->setExpiration(Expiration::seconds(3600)); // Expiring in 1 hour + $writePolicy->setExpiration(Expiration::Seconds(3600)); // Expiring in 1 hour $writePolicy->setMaxRetries(3); $writePolicy->setSocketTimeout(5000); ``` @@ -145,11 +145,12 @@ If there are any bugs, feature requests or feedback -> please create an issue on socket); -}catch(AerospikeException $e){ +} +catch(AerospikeException $e) { var_dump($e); } diff --git a/aerospike-connection-manager/README.md b/aerospike-connection-manager/README.md index 2dc1b56..4b91579 100644 --- a/aerospike-connection-manager/README.md +++ b/aerospike-connection-manager/README.md @@ -37,12 +37,14 @@ Aerospike's client policy allows for flexible control over read and write operat cd php-client/aerospike-connection-manager ``` -2. **Run Makefile**: Execute the default target of the Makefile to build & runthe aerospike-connection-manager: +2. **Configure the connection manager.** At a minimum, edit the `asld.toml` file to reflect your Aerospike server's current connection information. + +3. **Run Makefile**: Use the `run` target to run the aerospike-connection-manager: ```shell - make + make run ``` -3. **Verify Build**: Successful build output should resemble the following: +4. **Verify Build**: Successful build output should resemble the following: ```shell rm -f asld rm -f memprofile.out profile.out @@ -55,7 +57,7 @@ Aerospike's client policy allows for flexible control over read and write operat 2024/02/13 10:41:30 grpc ran on unix socket protocol /tmp/asld_grpc.sock ``` -4. **Install Service**: Once the build is verified, linux users who want to install the ACM as a service can execute this command: +5. **Install Service**: Once the build is verified, linux users who want to install the ACM as a service can execute this command: ```shell sudo make daemonize ``` From 7096e59a1aca6ae0760b4d6ef9a70bacd0dcc7f4 Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Wed, 1 Oct 2025 11:17:27 -0700 Subject: [PATCH 5/7] CLIENT-3777 Bump version to 1.4.0 --- CHANGELOG.md | 8 ++++++++ Cargo.toml | 2 +- README.md | 2 +- aerospike-connection-manager/version.txt | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b67fa23..a7ea60a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. +## [1.4.0] - 2025-10-01 + +- **Fixes** + - [CLIENT-3777] Fix anomalous getTtl() behavior. + +- **Improvements** + - [CLIENT-3777] Introduce getters on Expiration class objects. + ## [1.3.0] - 2025-02-23 - **New Features**: diff --git a/Cargo.toml b/Cargo.toml index 67e3c00..ebcb110 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aerospike_php" -version = "1.3.0" +version = "1.4.0" edition = "2021" authors = ["Khosrow Afroozeh ", "Sachin Venkatesha Murthy "] diff --git a/README.md b/README.md index f3d9d65..d61cb6f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![PHP version](https://img.shields.io/badge/php-%3E%3D%208.1-8892BF.svg)](https://github.com/aerospike/php-client) -# Aerospike PHP 8 Client (v1.3.0) +# Aerospike PHP 8 Client (v1.4.0) An [Aerospike](https://www.aerospike.com/) client library for PHP 8 diff --git a/aerospike-connection-manager/version.txt b/aerospike-connection-manager/version.txt index f0bb29e..88c5fb8 100644 --- a/aerospike-connection-manager/version.txt +++ b/aerospike-connection-manager/version.txt @@ -1 +1 @@ -1.3.0 +1.4.0 From 27ba22385a142b657a4c873592fc81003139859b Mon Sep 17 00:00:00 2001 From: "Samuel A. Falvo II" Date: Wed, 1 Oct 2025 12:12:21 -0700 Subject: [PATCH 6/7] CLIENT-3777 Update docs --- docs/classes/Aerospike-AdminPolicy.html | 52 +- .../classes/Aerospike-AerospikeException.html | 65 +- docs/classes/Aerospike-BatchDelete.html | 21 +- docs/classes/Aerospike-BatchDeletePolicy.html | 176 ++-- docs/classes/Aerospike-BatchPolicy.html | 486 ++++++---- docs/classes/Aerospike-BatchRead.html | 35 +- docs/classes/Aerospike-BatchReadPolicy.html | 114 ++- docs/classes/Aerospike-BatchRecord.html | 72 +- docs/classes/Aerospike-BatchUdf.html | 21 +- docs/classes/Aerospike-BatchUdfPolicy.html | 210 +++-- docs/classes/Aerospike-BatchWrite.html | 25 +- docs/classes/Aerospike-BatchWritePolicy.html | 284 ++++-- docs/classes/Aerospike-Bin.html | 21 +- docs/classes/Aerospike-BitwiseOp.html | 140 ++- .../Aerospike-BitwiseOverflowAction.html | 43 +- docs/classes/Aerospike-BitwisePolicy.html | 21 +- .../classes/Aerospike-BitwiseResizeFlags.html | 42 +- docs/classes/Aerospike-BitwiseWriteFlags.html | 61 +- docs/classes/Aerospike-Client.html | 275 ++++-- docs/classes/Aerospike-CommitLevel.html | 28 +- docs/classes/Aerospike-Concurrency.html | 35 +- docs/classes/Aerospike-ConsistencyLevel.html | 28 +- docs/classes/Aerospike-Context.html | 91 +- docs/classes/Aerospike-ExpType.html | 84 +- docs/classes/Aerospike-Expiration.html | 276 +++++- docs/classes/Aerospike-Expression.html | 532 +++++++---- docs/classes/Aerospike-Filter.html | 63 +- docs/classes/Aerospike-GenerationPolicy.html | 35 +- docs/classes/Aerospike-GeoJSON.html | 52 +- docs/classes/Aerospike-HLL.html | 52 +- docs/classes/Aerospike-HllOp.html | 91 +- docs/classes/Aerospike-HllPolicy.html | 21 +- docs/classes/Aerospike-HllWriteFlags.html | 61 +- .../Aerospike-IndexCollectionType.html | 42 +- docs/classes/Aerospike-IndexType.html | 42 +- docs/classes/Aerospike-Infinity.html | 16 +- docs/classes/Aerospike-InfoPolicy.html | 25 +- docs/classes/Aerospike-Json.html | 52 +- docs/classes/Aerospike-Key.html | 155 ++-- docs/classes/Aerospike-ListOp.html | 259 ++++-- docs/classes/Aerospike-ListOrderType.html | 35 +- docs/classes/Aerospike-ListPolicy.html | 21 +- docs/classes/Aerospike-ListReturnType.html | 77 +- docs/classes/Aerospike-ListSortFlags.html | 43 +- docs/classes/Aerospike-ListWriteFlags.html | 61 +- docs/classes/Aerospike-MapOp.html | 331 ++++--- docs/classes/Aerospike-MapOrderType.html | 61 +- docs/classes/Aerospike-MapPolicy.html | 21 +- docs/classes/Aerospike-MapReturnType.html | 105 ++- docs/classes/Aerospike-MapWriteFlags.html | 49 +- docs/classes/Aerospike-MapWriteMode.html | 43 +- docs/classes/Aerospike-Operation.html | 70 +- docs/classes/Aerospike-ParticleType.html | 91 +- docs/classes/Aerospike-PartitionFilter.html | 73 +- docs/classes/Aerospike-PartitionStatus.html | 117 ++- docs/classes/Aerospike-Privilege.html | 190 ++-- docs/classes/Aerospike-QueryDuration.html | 35 +- docs/classes/Aerospike-QueryPolicy.html | 424 ++++++--- docs/classes/Aerospike-ReadModeAP.html | 28 +- docs/classes/Aerospike-ReadModeSC.html | 42 +- docs/classes/Aerospike-ReadPolicy.html | 331 ++++--- docs/classes/Aerospike-Record.html | 165 ++-- .../classes/Aerospike-RecordExistsAction.html | 49 +- docs/classes/Aerospike-Recordset.html | 62 +- docs/classes/Aerospike-ResultCode.html | 862 ++++++++++++------ docs/classes/Aerospike-Role.html | 156 ++-- docs/classes/Aerospike-ScanPolicy.html | 424 ++++++--- docs/classes/Aerospike-Statement.html | 210 +++-- docs/classes/Aerospike-UdfLanguage.html | 25 +- docs/classes/Aerospike-UdfMeta.html | 86 +- docs/classes/Aerospike-UserRole.html | 156 ++-- docs/classes/Aerospike-Value.html | 142 ++- docs/classes/Aerospike-Wildcard.html | 16 +- docs/classes/Aerospike-WritePolicy.html | 548 +++++++---- docs/css/base.css | 7 +- docs/css/template.css | 8 + ...hp-stubs-libaerospike-php-stubsv1-0-0.html | 18 +- docs/graphs/classes.html | 8 +- docs/index.html | 10 +- docs/indices/files.html | 8 +- docs/js/searchIndex.js | 26 +- docs/js/template.js | 17 + docs/namespaces/aerospike.html | 10 +- docs/namespaces/default.html | 10 +- docs/packages/Application.html | 10 +- docs/packages/default.html | 10 +- docs/reports/deprecated.html | 8 +- docs/reports/errors.html | 8 +- docs/reports/markers.html | 8 +- 89 files changed, 6487 insertions(+), 3032 deletions(-) diff --git a/docs/classes/Aerospike-AdminPolicy.html b/docs/classes/Aerospike-AdminPolicy.html index fd7f977..7c4bd05 100644 --- a/docs/classes/Aerospike-AdminPolicy.html +++ b/docs/classes/Aerospike-AdminPolicy.html @@ -54,14 +54,14 @@

Doc Menu