class Azure::Table::TableService

Public Class Methods

new(*args) click to toggle source
Calls superclass method Azure::Service::StorageService::new
# File lib/azure/table/table_service.rb, line 26
def initialize(*args)
  super(*args)
  # @host = Azure.config.storage_table_host
  @host = "http://#{args.second}.table.core.windows.net"
end

Public Instance Methods

create_table(table_name, options={}) click to toggle source

Public: Creates new table in the storage account

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd135729

Returns nil on success

# File lib/azure/table/table_service.rb, line 48
def create_table(table_name, options={})
  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  body = Azure::Table::Serialization.hash_to_entry_xml({"TableName" => table_name}).to_xml
  call(:post, collection_uri(query), body)
  nil
end
delete_entity(table_name, partition_key, row_key, options={}) click to toggle source

Public: Deletes an existing entity in the table.

Attributes

  • table_name - String. The table name

  • partition_key - String. The partition key

  • row_key - String. The row key

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :if_match - String. A matching condition which is required for update (optional, Default=“*”)

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd135727

Returns nil on success

# File lib/azure/table/table_service.rb, line 414
def delete_entity(table_name, partition_key, row_key, options={})
  if_match = "*"
  if_match = options[:if_match] if options[:if_match]

  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  call(:delete, entities_uri(table_name, partition_key, row_key, query), nil, { "If-Match"=> if_match })
  nil
end
delete_table(table_name, options={}) click to toggle source

Public: Deletes the specified table and any data it contains.

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179387

Returns nil on success

# File lib/azure/table/table_service.rb, line 72
def delete_table(table_name, options={})
  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  call(:delete, table_uri(table_name, query))
  nil
end
entities_uri(table_name, partition_key=nil, row_key=nil, query={}) click to toggle source

Public: Generate the URI for an entity or group of entities in a table. If both the 'partition_key' and 'row_key' are specified, then the URI will match the entity under those specific keys.

Attributes

  • table_name - The table name

  • partition_key - The desired partition key (optional)

  • row_key - The desired row key (optional)

Returns a URI

# File lib/azure/table/table_service.rb, line 510
def entities_uri(table_name, partition_key=nil, row_key=nil, query={})
  return table_name if table_name.kind_of? ::URI

  path = if partition_key && row_key
    "%s(PartitionKey='%s',RowKey='%s')" % [
      table_name.encode("UTF-8"), encodeODataUriValue(partition_key.encode("UTF-8")), encodeODataUriValue(row_key.encode("UTF-8"))
    ]
  else
    "%s()" % table_name.encode("UTF-8")
  end

  uri = generate_uri(path)
  qs = []
  if query
    query.each do | key, val |
      key = key.encode("UTF-8")
      val = val.encode("UTF-8")

      if key[0] == "$"
        qs.push "#{key}#{::URI.encode_www_form(""=>val)}"
      else
        qs.push ::URI.encode_www_form(key=>val)
      end
    end
  end
  uri.query = qs.join '&' if qs.length > 0
  uri
end
execute_batch(batch, options={}) click to toggle source

Public: Executes a batch of operations.

Attributes

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd894038

Returns an array of results, one for each operation in the batch

# File lib/azure/table/table_service.rb, line 440
def execute_batch(batch, options={})
  headers = {
    "Content-Type"=> "multipart/mixed; boundary=#{batch.batch_id}",
    "Accept"=> 'application/atom+xml,application/xml',
    'Accept-Charset'=> 'UTF-8'
  }

  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  body = batch.to_body
  response = call(:post, generate_uri("/$batch", query), body, headers)
  batch.parse_response(response)
end
get_entity(table_name, partition_key, row_key, options={}) click to toggle source

Public: Gets an existing entity in the table.

Attributes

  • table_name - String. The table name

  • partition_key - String. The partition key

  • row_key - String. The row key

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

Returns an Azure::Table::Entity instance on success

# File lib/azure/table/table_service.rb, line 470
def get_entity(table_name, partition_key, row_key, options={})
  options[:partition_key] = partition_key
  options[:row_key] = row_key
  results = query_entities(table_name, options)
  results.length > 0 ? results[0] : nil
end
get_table(table_name, options={}) click to toggle source

Public: Gets the table.

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

Returns the last updated time for the table

# File lib/azure/table/table_service.rb, line 93
def get_table(table_name, options={})
  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  response = call(:get, table_uri(table_name, query))
  results = Azure::Table::Serialization.hash_from_entry_xml(response.body)
  results[:updated]
end
get_table_acl(table_name, options={}) click to toggle source

Public: Gets the access control list (ACL) for the table.

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/jj159100

Returns a list of Azure::Entity::SignedIdentifier instances

# File lib/azure/table/table_service.rb, line 148
def get_table_acl(table_name, options={})
  query = { "comp" => "acl" }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  response = call(:get, generate_uri(table_name, query))

  signed_identifiers = []
  signed_identifiers = Azure::Table::Serialization.signed_identifiers_from_xml response.body unless response.body == nil or response.body.length < 1
  signed_identifiers
end
insert_entity(table_name, entity_values, options={}) click to toggle source

Public: Inserts new entity to the table.

Attributes

  • table_name - String. The table name

  • entity_values - Hash. A hash of the name/value pairs for the entity.

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179433

Returns a Azure::Entity::Table::Entity

# File lib/azure/table/table_service.rb, line 204
def insert_entity(table_name, entity_values, options={})
  body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml

  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  response = call(:post, entities_uri(table_name, nil, nil, query), body)
  
  result = Azure::Table::Serialization.hash_from_entry_xml(response.body)

  Entity.new do |entity|
    entity.table = table_name
    entity.updated = result[:updated]
    entity.etag = response.headers["etag"] || result[:etag]
    entity.properties = result[:properties]
  end
end
insert_or_merge_entity(table_name, entity_values, options={}) click to toggle source

Public: Inserts or updates an existing entity within a table by merging new property values into the entity.

Attributes

  • table_name - String. The table name

  • entity_values - Hash. A hash of the name/value pairs for the entity.

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/hh452241

Returns the ETag for the entity on success

# File lib/azure/table/table_service.rb, line 370
def insert_or_merge_entity(table_name, entity_values, options={})
  options[:create_if_not_exists] = true
  merge_entity(table_name, entity_values, options)
end
insert_or_replace_entity(table_name, entity_values, options={}) click to toggle source

Public: Inserts or updates a new entity into a table.

Attributes

  • table_name - String. The table name

  • entity_values - Hash. A hash of the name/value pairs for the entity.

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/hh452242

Returns the ETag for the entity on success

# File lib/azure/table/table_service.rb, line 391
def insert_or_replace_entity(table_name, entity_values, options={})
  options[:create_if_not_exists] = true
  update_entity(table_name, entity_values, options)
end
merge_entity(table_name, entity_values, options={}) click to toggle source

Public: Updates an existing entity by updating the entity's properties. This operation does not replace the existing entity, as the update_entity operation does.

Attributes

  • table_name - String. The table name

  • entity_values - Hash. A hash of the name/value pairs for the entity.

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :if_match - String. A matching condition which is required for update (optional, Default=“*”)

  • :create_if_not_exists - Boolean. If true, and partition_key and row_key do not reference and existing entity, that entity will be inserted. If false, the operation will fail. (optional, Default=false)

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179392

Returns the ETag for the entity on success

# File lib/azure/table/table_service.rb, line 336
def merge_entity(table_name, entity_values, options={})
  if_match = "*"
  if_match = options[:if_match] if options[:if_match]

  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  uri = entities_uri(table_name, entity_values["PartitionKey"], entity_values["RowKey"], query)

  headers = { "X-HTTP-Method"=> "MERGE" }
  headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]

  body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml

  response = call(:post, uri, body, headers)
  response.headers["etag"]
end
query_entities(table_name, options={}) click to toggle source

Public: Queries entities for the given table name

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :partition_key - String. The partition key (optional)

  • :row_key - String. The row key (optional)

  • :select - Array. An array of property names to return (optional)

  • :filter - String. A filter expression (optional)

  • :top - Integer. A limit for the number of results returned (optional)

  • :continuation_token - Hash. The continuation token.

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179421

Returns an array with an extra continuation_token property on success

# File lib/azure/table/table_service.rb, line 243
def query_entities(table_name, options={})
  query ={}
  query["$select"] = options[:select].join ',' if options[:select]
  query["$filter"] = options[:filter] if options[:filter]
  query["$top"] = options[:top].to_s if options[:top] unless options[:partition_key] and options[:row_key]
  query["NextPartitionKey"] = options[:continuation_token][:next_partition_key] if options[:continuation_token] and options[:continuation_token][:next_partition_key]
  query["NextRowKey"] = options[:continuation_token][:next_row_key] if options[:continuation_token] and options[:continuation_token][:next_row_key]
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  uri = entities_uri(table_name, options[:partition_key], options[:row_key], query)
  response = call(:get, uri, nil, { "DataServiceVersion" => "2.0;NetFx"})

  entities = Azure::Service::EnumerationResults.new

  results = (options[:partition_key] and options[:row_key]) ? [Azure::Table::Serialization.hash_from_entry_xml(response.body)] : Azure::Table::Serialization.entries_from_feed_xml(response.body)
  
  results.each do |result|
    entity = Entity.new do |e|
      e.table = table_name
      e.updated = result[:updated]
      e.etag = response.headers["etag"] || result[:etag]
      e.properties = result[:properties]
    end
    entities.push entity
  end if results

  entities.continuation_token = nil
  entities.continuation_token = { 
    :next_partition_key=> response.headers["x-ms-continuation-NextPartitionKey"], 
    :next_row_key => response.headers["x-ms-continuation-NextRowKey"]
    } if response.headers["x-ms-continuation-NextPartitionKey"]

  entities
end
query_tables(options={}) click to toggle source

Public: Gets a list of all tables on the account.

Attributes

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :next_table_token - String. A token used to enumerate the next page of results, when the list of tables is larger than a single operation can return at once. (optional)

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179405

Returns an array with an extra continuation_token property on success

# File lib/azure/table/table_service.rb, line 118
def query_tables(options={})
  query = { }
  query["NextTable"] = options[:next_table_token] if options[:next_table_token]
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  uri = collection_uri(query)

  response = call(:get, uri)
  entries = Azure::Table::Serialization.entries_from_feed_xml(response.body) || []

  values = Azure::Service::EnumerationResults.new(entries)
  values.continuation_token = response.headers["x-ms-continuation-NextTableName"]
  values
end
set_table_acl(table_name, options={}) click to toggle source

Public: Sets the access control list (ACL) for the table.

Attributes

  • table_name - String. The table name

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :signed_identifiers - Array. A list of Azure::Entity::SignedIdentifier instances

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/jj159102

Returns nil on success

# File lib/azure/table/table_service.rb, line 175
def set_table_acl(table_name, options={})
  query = { "comp" => "acl" }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  uri = generate_uri(table_name, query)
  body = nil
  body = Azure::Table::Serialization.signed_identifiers_to_xml options[:signed_identifiers] if options[:signed_identifiers] && options[:signed_identifiers].length > 0

  call(:put, uri, body, {})
  nil
end
table_uri(name, query={}) click to toggle source

Public: Generate the URI for a specific table.

Attributes

  • name - The table name. If this is a URI, we just return this

Returns a URI

# File lib/azure/table/table_service.rb, line 493
def table_uri(name, query={})
  return name if name.kind_of? ::URI
  generate_uri("Tables('#{name}')", query)
end
update_entity(table_name, entity_values, options={}) click to toggle source

Public: Updates an existing entity in a table. The Update Entity operation replaces the entire entity and can be used to remove properties.

Attributes

  • table_name - String. The table name

  • entity_values - Hash. A hash of the name/value pairs for the entity.

  • options - Hash. Optional parameters.

Options

Accepted key/value pairs in options parameter are:

  • :if_match - String. A matching condition which is required for update (optional, Default=“*”)

  • :create_if_not_exists - Boolean. If true, and partition_key and row_key do not reference and existing entity, that entity will be inserted. If false, the operation will fail. (optional, Default=false)

  • :timeout - Integer. A timeout in seconds.

See msdn.microsoft.com/en-us/library/windowsazure/dd179427

Returns the ETag for the entity on success

# File lib/azure/table/table_service.rb, line 298
def update_entity(table_name, entity_values, options={})
  if_match = "*"
  if_match = options[:if_match] if options[:if_match]

  query = { }
  query["timeout"] = options[:timeout].to_s if options[:timeout]

  uri = entities_uri(table_name, entity_values["PartitionKey"], entity_values["RowKey"], query)

  headers = {}
  headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]

  body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml

  response = call(:put, uri, body, headers)
  response.headers["etag"]
end

Protected Instance Methods

collection_uri(query={}) click to toggle source

Protected: Generate the URI for the collection of tables.

Returns a URI

# File lib/azure/table/table_service.rb, line 481
def collection_uri(query={})
  generate_uri("Tables", query)
end
encodeODataUriValue(value) click to toggle source
# File lib/azure/table/table_service.rb, line 549
def encodeODataUriValue(value)
  # Replace each single quote (') with double single quotes ('') not double
  # quotes (")
  value = value.gsub("'", "''")

  # Encode the special URL characters
  value = URI.escape(value)

  value
end
encodeODataUriValues(values) click to toggle source
# File lib/azure/table/table_service.rb, line 540
def encodeODataUriValues(values)
  new_values = []
  values.each do |value|
    new_values.push encodeODataUriValue(value)
  end
  new_values
end