Class: Azure::Table::TableService

Inherits:
Service::StorageService show all
Defined in:
lib/azure/table/table_service.rb

Instance Attribute Summary

Attributes inherited from Core::SignedService

#account_name, #signer

Attributes inherited from Core::FilteredService

#filters

Attributes inherited from Core::Service

#host

Instance Method Summary collapse

Methods inherited from Service::StorageService

#add_metadata_to_headers, #get_service_properties, #service_properties_headers, #service_properties_uri, #set_service_properties

Methods inherited from Core::SignedService

#call

Methods inherited from Core::FilteredService

#call, #with_filter

Methods inherited from Core::Service

#call, #generate_uri

Constructor Details

#initializeTableService

Returns a new instance of TableService.



26
27
28
29
# File 'lib/azure/table/table_service.rb', line 26

def initialize
  super(Azure::Table::Auth::SharedKey.new)
  @host = Azure.config.storage_table_host
end

Instance Method Details

#create_table(table_name, options = {}) ⇒ Object

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/azure/dd135729

Returns nil on success



47
48
49
50
51
52
53
54
# File 'lib/azure/table/table_service.rb', line 47

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 = {}) ⇒ Object

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/azure/dd135727

Returns nil on success



413
414
415
416
417
418
419
420
421
422
# File 'lib/azure/table/table_service.rb', line 413

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 = {}) ⇒ Object

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/azure/dd179387

Returns nil on success



71
72
73
74
75
76
77
# File 'lib/azure/table/table_service.rb', line 71

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 = {}) ⇒ Object



509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
# File 'lib/azure/table/table_service.rb', line 509

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 = {}) ⇒ Object

Public: Executes a batch of operations.

Attributes

  • batch - The Azure::Table::Batch instance to execute.

  • 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/azure/dd894038

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



439
440
441
442
443
444
445
446
447
448
449
450
451
452
# File 'lib/azure/table/table_service.rb', line 439

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 = {}) ⇒ Object

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



469
470
471
472
473
474
# File 'lib/azure/table/table_service.rb', line 469

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 = {}) ⇒ Object

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



92
93
94
95
96
97
98
99
# File 'lib/azure/table/table_service.rb', line 92

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 = {}) ⇒ Object

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/azure/jj159100

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



147
148
149
150
151
152
153
154
155
156
# File 'lib/azure/table/table_service.rb', line 147

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 = {}) ⇒ Object

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/azure/dd179433

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



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/azure/table/table_service.rb', line 203

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 = {}) ⇒ Object

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/azure/hh452241

Returns the ETag for the entity on success



369
370
371
372
# File 'lib/azure/table/table_service.rb', line 369

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 = {}) ⇒ Object

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/azure/hh452242

Returns the ETag for the entity on success



390
391
392
393
# File 'lib/azure/table/table_service.rb', line 390

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 = {}) ⇒ Object

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/azure/dd179392

Returns the ETag for the entity on success



335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'lib/azure/table/table_service.rb', line 335

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 = {}) ⇒ Object

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/azure/dd179421

Returns an array with an extra continuation_token property on success



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/azure/table/table_service.rb', line 242

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 = {}) ⇒ Object

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/azure/dd179405

Returns an array with an extra continuation_token property on success



117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/azure/table/table_service.rb', line 117

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 = {}) ⇒ Object

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/azure/jj159102

Returns nil on success



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/azure/table/table_service.rb', line 174

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 = {}) ⇒ Object



492
493
494
495
# File 'lib/azure/table/table_service.rb', line 492

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 = {}) ⇒ Object

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/azure/dd179427

Returns the ETag for the entity on success



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'lib/azure/table/table_service.rb', line 297

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