/** * Write a specific session * * @param int $id Session Id * @param string $serializedData Serialized PHP object * @throws Exception */ public function write($id, $serializedData) { // Encode data $serializedData = base64_encode(serialize($serializedData)); if (strlen($serializedData) >= self::MAX_TS_PROPERTY_SIZE && $this->_storageType == self::STORAGE_TYPE_TABLE) { throw new Microsoft_WindowsAzure_Exception('Session data exceeds the maximum allowed size of ' . self::MAX_TS_PROPERTY_SIZE . ' bytes that can be stored using table storage. Consider switching to a blob storage back-end or try reducing session data size.'); } // Store data if ($this->_storageType == self::STORAGE_TYPE_TABLE) { // In table storage $sessionRecord = new Microsoft_WindowsAzure_Storage_DynamicTableEntity($this->_sessionContainerPartition, $id); $sessionRecord->sessionExpires = time(); $sessionRecord->serializedData = $serializedData; $sessionRecord->setAzurePropertyType('sessionExpires', 'Edm.Int32'); try { $this->_storage->updateEntity($this->_sessionContainer, $sessionRecord); } catch (Microsoft_WindowsAzure_Exception $unknownRecord) { $this->_storage->insertEntity($this->_sessionContainer, $sessionRecord); } } else { if ($this->_storageType == self::STORAGE_TYPE_BLOB) { // In blob storage $this->_storage->putBlobData($this->_sessionContainer, $this->_sessionContainerPartition . '/' . $id, $serializedData, array('sessionexpires' => time())); } } }
/** * Write a specific session * * @param int $id Session Id * @param string $serializedData Serialized PHP object */ public function write($id, $serializedData) { $sessionRecord = new Microsoft_WindowsAzure_Storage_DynamicTableEntity($this->_sessionTablePartition, $id); $sessionRecord->sessionExpires = time(); $sessionRecord->serializedData = base64_encode($serializedData); $sessionRecord->setAzurePropertyType('sessionExpires', 'Edm.Int32'); try { $this->_tableStorage->updateEntity($this->_sessionTable, $sessionRecord); } catch (Microsoft_WindowsAzure_Exception $unknownRecord) { $this->_tableStorage->insertEntity($this->_sessionTable, $sessionRecord); } }
/** * Update entity by adding or updating properties * * @param string $tableName Table name * @param Microsoft_WindowsAzure_Storage_TableEntity $entity Entity to update * @param boolean $verifyEtag Verify etag of the entity (used for concurrency) * @param array $properties Properties to merge. All properties will be used when omitted. * @throws Microsoft_WindowsAzure_Exception */ public function mergeEntity($tableName = '', Microsoft_WindowsAzure_Storage_TableEntity $entity = null, $verifyEtag = false, $properties = array()) { $mergeEntity = null; if (is_array($properties) && count($properties) > 0) { // Build a new object $mergeEntity = new Microsoft_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey()); // Keep only values mentioned in $properties $azureValues = $entity->getAzureValues(); foreach ($azureValues as $key => $value) { if (in_array($value->Name, $properties)) { $mergeEntity->setAzureProperty($value->Name, $value->Value, $value->Type); } } } else { $mergeEntity = $entity; } // Ensure entity timestamp matches updated timestamp $entity->setTimestamp(new DateTime()); return $this->_changeEntity(Microsoft_Http_Client::MERGE, $tableName, $mergeEntity, $verifyEtag); }
/** * Test set Azure values */ public function testSetAzureValues() { $dateTimeValue = new DateTime(); $values = array( 'PartitionKey' => 'partition1', 'RowKey' => '000001', 'Name' => 'Maarten', 'Age' => 25, 'Visible' => true, 'DateInService' => $dateTimeValue ); $target = new Microsoft_WindowsAzure_Storage_DynamicTableEntity(); $target->setAzureValues($values); $target->setAzurePropertyType('Age', 'Edm.Int32'); $this->assertEquals('partition1', $target->getPartitionKey()); $this->assertEquals('000001', $target->getRowKey()); $this->assertEquals('Maarten', $target->Name); $this->assertEquals(25, $target->Age); $this->assertEquals('Edm.Int32', $target->getAzurePropertyType('Age')); $this->assertEquals(true, $target->Visible); $this->assertEquals($dateTimeValue, $target->DateInService); $this->assertEquals('Edm.DateTime', $target->getAzurePropertyType('DateInService')); }