azure 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +36 -0
- data/README.md +3 -0
- data/Rakefile +81 -0
- data/azure.gemspec +20 -9
- data/lib/azure.rb +4 -0
- data/lib/azure/atom.rb +170 -0
- data/lib/azure/auth.rb +29 -0
- data/lib/azure/blobs.rb +620 -0
- data/lib/azure/blobs/blob.rb +360 -0
- data/lib/azure/blobs/container.rb +209 -0
- data/lib/azure/blobs/service.rb +396 -0
- data/lib/azure/blobs/shared_access_signature.rb +84 -0
- data/lib/azure/blobs/uri.rb +60 -0
- data/lib/azure/configuration.rb +121 -0
- data/lib/azure/core/auth/shared_key.rb +95 -0
- data/lib/azure/core/auth/shared_key_lite.rb +34 -0
- data/lib/azure/core/collection.rb +118 -0
- data/lib/azure/core/service.rb +43 -0
- data/lib/azure/core/signer.rb +32 -0
- data/lib/azure/core/utils/interval.rb +97 -0
- data/lib/azure/core/utils/queryable.rb +74 -0
- data/lib/azure/core/utils/storage_service_properties.rb +83 -0
- data/lib/azure/core/utils/string.rb +59 -0
- data/lib/azure/error.rb +72 -0
- data/lib/azure/queues.rb +272 -0
- data/lib/azure/queues/message.rb +174 -0
- data/lib/azure/queues/queue.rb +187 -0
- data/lib/azure/queues/service.rb +263 -0
- data/lib/azure/queues/service_properties.rb +152 -0
- data/lib/azure/queues/uri.rb +78 -0
- data/lib/azure/request.rb +102 -0
- data/lib/azure/response.rb +93 -0
- data/lib/azure/service_bus.rb +4 -0
- data/lib/azure/service_bus/auth/authorizer.rb +22 -0
- data/lib/azure/service_bus/auth/uri.rb +52 -0
- data/lib/azure/service_bus/auth/wrap.rb +37 -0
- data/lib/azure/service_bus/auth/wrap_service.rb +76 -0
- data/lib/azure/service_bus/auth/wrap_token.rb +45 -0
- data/lib/azure/service_bus/auth/wrap_token_manager.rb +46 -0
- data/lib/azure/service_bus/brokered_message.rb +139 -0
- data/lib/azure/service_bus/brokered_message_serializer.rb +113 -0
- data/lib/azure/service_bus/queues.rb +194 -0
- data/lib/azure/service_bus/queues/queue.rb +100 -0
- data/lib/azure/service_bus/queues/queue_serializer.rb +51 -0
- data/lib/azure/service_bus/queues/service.rb +154 -0
- data/lib/azure/service_bus/queues/uri.rb +80 -0
- data/lib/azure/service_bus/rules.rb +110 -0
- data/lib/azure/service_bus/rules/rule.rb +97 -0
- data/lib/azure/service_bus/rules/service.rb +122 -0
- data/lib/azure/service_bus/rules/uri.rb +39 -0
- data/lib/azure/service_bus/service_bus_service.rb +22 -0
- data/lib/azure/service_bus/subscriptions.rb +170 -0
- data/lib/azure/service_bus/subscriptions/service.rb +133 -0
- data/lib/azure/service_bus/subscriptions/subscription.rb +164 -0
- data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +74 -0
- data/lib/azure/service_bus/subscriptions/uri.rb +71 -0
- data/lib/azure/service_bus/topics.rb +120 -0
- data/lib/azure/service_bus/topics/service.rb +98 -0
- data/lib/azure/service_bus/topics/topic.rb +122 -0
- data/lib/azure/service_bus/topics/topic_serializer.rb +44 -0
- data/lib/azure/service_bus/topics/uri.rb +58 -0
- data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +21 -0
- data/lib/azure/service_runtime/client/goal_state_protocol.rb +18 -0
- data/lib/azure/service_runtime/client/runtime_client.rb +135 -0
- data/lib/azure/service_runtime/deployment.rb +24 -0
- data/lib/azure/service_runtime/local_resource.rb +15 -0
- data/lib/azure/service_runtime/role.rb +17 -0
- data/lib/azure/service_runtime/role_environment.rb +206 -0
- data/lib/azure/service_runtime/role_environment_change.rb +32 -0
- data/lib/azure/service_runtime/role_instance.rb +35 -0
- data/lib/azure/service_runtime/role_instance_endpoint.rb +14 -0
- data/lib/azure/tables.rb +215 -0
- data/lib/azure/tables/auth/shared_key.rb +71 -0
- data/lib/azure/tables/auth/shared_key_lite.rb +30 -0
- data/lib/azure/tables/entities_collection.rb +66 -0
- data/lib/azure/tables/entity.rb +127 -0
- data/lib/azure/tables/service.rb +211 -0
- data/lib/azure/tables/table.rb +129 -0
- data/lib/azure/tables/tables_collection.rb +62 -0
- data/lib/azure/tables/types.rb +65 -0
- data/lib/azure/tables/uri.rb +62 -0
- data/test/fixtures/32px-fulls-black.jpg +0 -0
- data/test/fixtures/all_containers.xml +20 -0
- data/test/fixtures/all_tables.xml +22 -0
- data/test/fixtures/create_table_response_entry.xml +15 -0
- data/test/fixtures/error.xml +5 -0
- data/test/fixtures/insert_entity_response_entry.xml +25 -0
- data/test/fixtures/messages.xml +12 -0
- data/test/fixtures/query_entities_empty_response.xml +7 -0
- data/test/fixtures/query_entities_response.xml +45 -0
- data/test/fixtures/queue_service_properties.xml +22 -0
- data/test/fixtures/queue_service_properties_original.xml +19 -0
- data/test/fixtures/queues.xml +16 -0
- data/test/fixtures/sb_default_create_queue_response.xml +23 -0
- data/test/fixtures/sb_default_create_topic_response.xml +18 -0
- data/test/fixtures/sb_get_access_token_response.txt +1 -0
- data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
- data/test/integration/blobs/auth_test.rb +19 -0
- data/test/integration/blobs/blob_test.rb +61 -0
- data/test/integration/blobs/clear_page_range_test.rb +19 -0
- data/test/integration/blobs/copy_test.rb +33 -0
- data/test/integration/blobs/create_blobs_test.rb +51 -0
- data/test/integration/blobs/create_container_test.rb +13 -0
- data/test/integration/blobs/create_snapshot_test.rb +17 -0
- data/test/integration/blobs/delete_blob_snapshots_test.rb +19 -0
- data/test/integration/blobs/delete_blobs_test.rb +25 -0
- data/test/integration/blobs/delete_container_test.rb +24 -0
- data/test/integration/blobs/delete_snapshot_test.rb +17 -0
- data/test/integration/blobs/get_blob_snapshot_test.rb +18 -0
- data/test/integration/blobs/get_blobs_test.rb +31 -0
- data/test/integration/blobs/get_page_range_test.rb +19 -0
- data/test/integration/blobs/list_blobs_test.rb +39 -0
- data/test/integration/blobs/list_containers_test.rb +28 -0
- data/test/integration/blobs/manage_blob_leases_test.rb +45 -0
- data/test/integration/blobs/manage_blob_metadata_test.rb +51 -0
- data/test/integration/blobs/manage_blob_properties_test.rb +25 -0
- data/test/integration/blobs/manage_blob_service_properties_test.rb +38 -0
- data/test/integration/blobs/manage_container_metadata_test.rb +46 -0
- data/test/integration/blobs/manage_container_permissions_test.rb +17 -0
- data/test/integration/blobs/update_page_range_test.rb +20 -0
- data/test/integration/queues/clear_messages_test.rb +22 -0
- data/test/integration/queues/create_queue_test.rb +13 -0
- data/test/integration/queues/delete_message_test.rb +42 -0
- data/test/integration/queues/delete_queue_test.rb +24 -0
- data/test/integration/queues/get_messages_test.rb +39 -0
- data/test/integration/queues/list_queues_test.rb +43 -0
- data/test/integration/queues/manage_queue_metadata_test.rb +45 -0
- data/test/integration/queues/manage_queue_service_properties_test.rb +27 -0
- data/test/integration/queues/peek_messages_test.rb +55 -0
- data/test/integration/queues/put_message_test.rb +31 -0
- data/test/integration/queues/update_message_test.rb +46 -0
- data/test/integration/service_bus/auth_test.rb +18 -0
- data/test/integration/service_bus/queues/create_queue_test.rb +25 -0
- data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +29 -0
- data/test/integration/service_bus/queues/delete_queue_test.rb +25 -0
- data/test/integration/service_bus/queues/get_queue_test.rb +23 -0
- data/test/integration/service_bus/queues/list_queues_test.rb +39 -0
- data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +34 -0
- data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +31 -0
- data/test/integration/service_bus/queues/send_message_to_queue_test.rb +22 -0
- data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +36 -0
- data/test/integration/service_bus/rules/create_rule_test.rb +19 -0
- data/test/integration/service_bus/rules/delete_rule_test.rb +17 -0
- data/test/integration/service_bus/rules/get_rule_test.rb +21 -0
- data/test/integration/service_bus/rules/list_rules_test.rb +24 -0
- data/test/integration/service_bus/rules/rule_test.rb +16 -0
- data/test/integration/service_bus/subscriptions/create_subscription_test.rb +25 -0
- data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +31 -0
- data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +30 -0
- data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +28 -0
- data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +23 -0
- data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +42 -0
- data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +36 -0
- data/test/integration/service_bus/subscriptions/subscription_test.rb +31 -0
- data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +43 -0
- data/test/integration/service_bus/topics/create_topic_test.rb +25 -0
- data/test/integration/service_bus/topics/delete_topic_test.rb +25 -0
- data/test/integration/service_bus/topics/get_topic_test.rb +23 -0
- data/test/integration/service_bus/topics/list_topics_test.rb +39 -0
- data/test/integration/service_bus/topics/send_message_to_topic_test.rb +23 -0
- data/test/integration/tables/auth_test.rb +29 -0
- data/test/integration/tables/creating_tables_test.rb +16 -0
- data/test/integration/tables/delete_entity_test.rb +39 -0
- data/test/integration/tables/deleting_table_test.rb +22 -0
- data/test/integration/tables/insert_entity_test.rb +23 -0
- data/test/integration/tables/merge_entity_test.rb +28 -0
- data/test/integration/tables/query_entities_test.rb +131 -0
- data/test/integration/tables/query_tables_test.rb +63 -0
- data/test/integration/tables/update_entity_test.rb +54 -0
- data/test/integration/test_helper.rb +14 -0
- data/test/support/blobs.rb +12 -0
- data/test/support/env.rb +5 -0
- data/test/support/fixtures.rb +22 -0
- data/test/support/stubs.rb +28 -0
- data/test/support/table_names.rb +44 -0
- data/test/test_helper.rb +10 -0
- data/test/unit/atom_test.rb +58 -0
- data/test/unit/auth_test.rb +24 -0
- data/test/unit/blobs/blob_test.rb +5 -0
- data/test/unit/blobs/container_test.rb +67 -0
- data/test/unit/blobs/service_test.rb +17 -0
- data/test/unit/blobs/shared_access_signature_test.rb +66 -0
- data/test/unit/blobs_test.rb +156 -0
- data/test/unit/core/service_test.rb +57 -0
- data/test/unit/core/utils/interval_test.rb +70 -0
- data/test/unit/core/utils/queryable_test.rb +69 -0
- data/test/unit/core/utils/storage_service_properties_test.rb +66 -0
- data/test/unit/error_test.rb +39 -0
- data/test/unit/queues/message_test.rb +40 -0
- data/test/unit/queues/queue_test.rb +64 -0
- data/test/unit/queues/service_properties.rb +35 -0
- data/test/unit/request_test.rb +38 -0
- data/test/unit/response_test.rb +43 -0
- data/test/unit/service_bus/auth/authorizer_test.rb +27 -0
- data/test/unit/service_bus/auth/wrap_token_test.rb +28 -0
- data/test/unit/service_bus/queues/queue_test.rb +38 -0
- data/test/unit/service_bus/topics/topic_test.rb +33 -0
- data/test/unit/service_runtime/data/goalstate.xml +9 -0
- data/test/unit/service_runtime/data/roleenvironmentdata.xml +29 -0
- data/test/unit/service_runtime/data/runtime.xml +6 -0
- data/test/unit/service_runtime/role_environment_test.rb +144 -0
- data/test/unit/tables/auth/shared_key_lite_test.rb +39 -0
- data/test/unit/tables/auth/shared_key_test.rb +45 -0
- data/test/unit/tables/entities_collection_test.rb +39 -0
- data/test/unit/tables/entity_test.rb +72 -0
- data/test/unit/tables/table_test.rb +57 -0
- data/test/unit/tables_test.rb +302 -0
- data/test/unit/types_test.rb +67 -0
- metadata +310 -47
- data/LICENSE +0 -0
- data/README +0 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
require "azure/tables/types"
|
2
|
+
require "azure/tables"
|
3
|
+
require "azure/error"
|
4
|
+
|
5
|
+
module Azure
|
6
|
+
module Tables
|
7
|
+
# Public: Representation of a table Entity.
|
8
|
+
class Entity
|
9
|
+
# ETag to force updates/deletes.
|
10
|
+
FORCE_UPDATE = "*".freeze
|
11
|
+
|
12
|
+
include Azure::ErrorHandler
|
13
|
+
|
14
|
+
# Public: Returns an Entity from an Atom::Entry object.
|
15
|
+
#
|
16
|
+
# entry - Atom::Entry object representing the Entity.
|
17
|
+
#
|
18
|
+
# Returns Azure::Entity
|
19
|
+
def self.from_entry(entry)
|
20
|
+
entity = new
|
21
|
+
|
22
|
+
entity.url = URI(entry.id)
|
23
|
+
|
24
|
+
entry.content.m_properties.each do |property_node|
|
25
|
+
value = Types.cast(
|
26
|
+
property_node.content,
|
27
|
+
property_node.attributes["type"]
|
28
|
+
)
|
29
|
+
|
30
|
+
entity[property_node.name] = value
|
31
|
+
end
|
32
|
+
|
33
|
+
entity
|
34
|
+
end
|
35
|
+
|
36
|
+
# Public: Get/Set this entity's URL.
|
37
|
+
attr_accessor :url
|
38
|
+
|
39
|
+
# Public: Get/Set this entity's ETag for conditional updates.
|
40
|
+
attr_accessor :etag
|
41
|
+
|
42
|
+
# Public: Get the attributes.
|
43
|
+
attr :attributes
|
44
|
+
|
45
|
+
# Public: Initialize an Entity.
|
46
|
+
#
|
47
|
+
# attributes - A Hash of attributes.
|
48
|
+
#
|
49
|
+
# Yields self.
|
50
|
+
def initialize(attributes={}, service=Azure::Tables)
|
51
|
+
@attributes = attributes
|
52
|
+
@service = service
|
53
|
+
self.etag = FORCE_UPDATE
|
54
|
+
yield self if block_given?
|
55
|
+
end
|
56
|
+
|
57
|
+
# Public: Two entities are considered equal if they both have the same
|
58
|
+
# URI.
|
59
|
+
#
|
60
|
+
# other - An Entity.
|
61
|
+
#
|
62
|
+
# Returns true|false.
|
63
|
+
def ==(other)
|
64
|
+
url == other.url
|
65
|
+
end
|
66
|
+
|
67
|
+
# Public: Reset this entity to clone another's properties. This will copy
|
68
|
+
# everything from the other entity into this one.
|
69
|
+
#
|
70
|
+
# other - An entity.
|
71
|
+
#
|
72
|
+
# Returns self.
|
73
|
+
def reset(other)
|
74
|
+
self.url = other.url
|
75
|
+
self.attributes.replace(other.attributes)
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: Replace an entity with a new set of attributes. In case of an
|
80
|
+
# error, self.error will be set.
|
81
|
+
#
|
82
|
+
# attributes - A Hash of attributes.
|
83
|
+
#
|
84
|
+
# Returns true|false to indicate success.
|
85
|
+
def update(attributes)
|
86
|
+
@service.update_entity(self, attributes)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Public: Merge new attributes into our set of attributes. In case of an
|
90
|
+
# error, self.error will be set.
|
91
|
+
#
|
92
|
+
# attributes - A Hash of attributes.
|
93
|
+
#
|
94
|
+
# Returns true|false to indicate success.
|
95
|
+
def merge(attributes)
|
96
|
+
@service.merge_entity(self, attributes)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Public: Delete this entity from the service. In case of an error,
|
100
|
+
# self.error will be set.
|
101
|
+
#
|
102
|
+
# Returns true|false to indicate success.
|
103
|
+
def delete
|
104
|
+
@service.delete_entity(self)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Public: Access a property on this entity.
|
108
|
+
#
|
109
|
+
# name - The property name.
|
110
|
+
#
|
111
|
+
# Returns the property value.
|
112
|
+
def [](name)
|
113
|
+
@attributes[name]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Public: Set a property on this entity.
|
117
|
+
#
|
118
|
+
# name - The property name.
|
119
|
+
# value - The value for this property.
|
120
|
+
#
|
121
|
+
# Returns the property value.
|
122
|
+
def []=(name, value)
|
123
|
+
@attributes[name] = value
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require "azure/core/service"
|
2
|
+
require "azure/core/utils/queryable"
|
3
|
+
require "azure/tables/auth/shared_key"
|
4
|
+
require "azure/tables/auth/shared_key_lite"
|
5
|
+
require "azure/tables/uri"
|
6
|
+
require "azure/atom"
|
7
|
+
|
8
|
+
module Azure
|
9
|
+
module Tables
|
10
|
+
class Service < Core::Service
|
11
|
+
def initialize(signer=Azure::Tables::Auth::SharedKey.new)
|
12
|
+
super(signer)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Services
|
17
|
+
# Public: Get a list of tables from the server.
|
18
|
+
class QueryTables < Service
|
19
|
+
include Core::Utils::Queryable
|
20
|
+
|
21
|
+
# Public: Invoke the service.
|
22
|
+
#
|
23
|
+
# query - A hash of options.
|
24
|
+
# :filter - A string to filter results.
|
25
|
+
# :top - Returns only the top n tables from the set.
|
26
|
+
#
|
27
|
+
# To read more about supported query filters check this link.
|
28
|
+
# http://msdn.microsoft.com/en-us/library/windowsazure/dd894031
|
29
|
+
#
|
30
|
+
# Returns a Response.
|
31
|
+
def call(query)
|
32
|
+
uri = Tables::URI.collection
|
33
|
+
query.delete(:select)
|
34
|
+
uri.query = build_query(query)
|
35
|
+
super(:get, uri) do |request|
|
36
|
+
request.headers["DataServiceVersion"] = "2.0;NetFx"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Public: Find a single table by name.
|
42
|
+
class FetchTable < Service
|
43
|
+
# Public: Invoke the service.
|
44
|
+
#
|
45
|
+
# name - The name of the table.
|
46
|
+
#
|
47
|
+
# Returns a Response.
|
48
|
+
def call(name)
|
49
|
+
uri = Tables::URI.table(name)
|
50
|
+
super(:get, uri)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Public: Create a table.
|
55
|
+
class CreateTable < Service
|
56
|
+
# Public: Invoke the service.
|
57
|
+
#
|
58
|
+
# table_name - A String with the table name.
|
59
|
+
#
|
60
|
+
# Returns a Response.
|
61
|
+
def call(table_name)
|
62
|
+
body = Atom::Entry.new do |entry|
|
63
|
+
entry.properties["TableName"] = table_name
|
64
|
+
end
|
65
|
+
|
66
|
+
super(:post, Tables::URI.collection, body.to_xml)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Public: Delete a table.
|
71
|
+
class DeleteTable < Service
|
72
|
+
# Public: Invoke the service.
|
73
|
+
#
|
74
|
+
# table_name - A String with the table name.
|
75
|
+
#
|
76
|
+
# Returns a Response.
|
77
|
+
def call(table_name)
|
78
|
+
super(:delete, Tables::URI.table(table_name))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Public: Insert an entity into a table.
|
83
|
+
class InsertEntity < Service
|
84
|
+
# Public: Invoke the service.
|
85
|
+
#
|
86
|
+
# table_name - A String with the table name.
|
87
|
+
# attributes - A Hash of entity attributes. The hash *must* contain the
|
88
|
+
# keys: "PartitionKey" and "RowKey".
|
89
|
+
#
|
90
|
+
# Returns a Response.
|
91
|
+
def call(table_name, attributes)
|
92
|
+
body = Atom::Entry.new do |entry|
|
93
|
+
entry.updated = Time.now.utc
|
94
|
+
entry.properties.merge(attributes)
|
95
|
+
end
|
96
|
+
|
97
|
+
super(:post, Tables::URI.entities(table_name), body.to_xml)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Public: Replace the attributes of an existing entity.
|
102
|
+
class ReplaceEntity < Service
|
103
|
+
# Public: Invoke the service.
|
104
|
+
#
|
105
|
+
# table_name - A String with the table name.
|
106
|
+
# attributes - A Hash of entity attributes. The hash *must* contain the
|
107
|
+
# keys: "PartitionKey" and "RowKey".
|
108
|
+
# etag - The condition to perform the update. "*" will force an
|
109
|
+
# unconditional update.
|
110
|
+
#
|
111
|
+
# Returns a Response.
|
112
|
+
def call(table_name, attributes, etag)
|
113
|
+
uri = Tables::URI.entities(
|
114
|
+
table_name,
|
115
|
+
attributes.fetch("PartitionKey"),
|
116
|
+
attributes.fetch("RowKey")
|
117
|
+
)
|
118
|
+
|
119
|
+
body = Atom::Entry.new do |entry|
|
120
|
+
entry.id = uri
|
121
|
+
entry.updated = Time.now.utc
|
122
|
+
entry.properties.merge(attributes)
|
123
|
+
end
|
124
|
+
|
125
|
+
super(:put, uri, body.to_xml) do |request|
|
126
|
+
request.headers["If-Match"] = etag
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Public: Update only certain properties of an entity.
|
132
|
+
class MergeEntity < Service
|
133
|
+
# Public: Invoke the service.
|
134
|
+
#
|
135
|
+
# uri - The URI of the Entity we're updating.
|
136
|
+
# attributes - A Hash of new entity attributes.
|
137
|
+
# etag - The condition to perform the update. "*" will force an
|
138
|
+
# unconditional update.
|
139
|
+
#
|
140
|
+
# Returns a Response.
|
141
|
+
def call(uri, attributes, etag)
|
142
|
+
body = Atom::Entry.new do |entry|
|
143
|
+
entry.id = uri
|
144
|
+
entry.updated = Time.now.utc
|
145
|
+
entry.properties.merge(attributes)
|
146
|
+
end
|
147
|
+
|
148
|
+
super(:post, uri, body.to_xml) do |request|
|
149
|
+
request.headers["If-Match"] = etag
|
150
|
+
request.headers["X-HTTP-Method"] = "MERGE"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Public: Delete an Entity
|
156
|
+
class DeleteEntity < Service
|
157
|
+
# Public: Invoke the service.
|
158
|
+
#
|
159
|
+
# uri - The URI of the Entity we're deleting.
|
160
|
+
# etag - The condition to perform the update. "*" will force an
|
161
|
+
# unconditional update.
|
162
|
+
#
|
163
|
+
# Returns a Response.
|
164
|
+
def call(uri, etag)
|
165
|
+
super(:delete, uri) do |request|
|
166
|
+
request.headers["If-Match"] = etag
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Public: Get entities from a given table.
|
172
|
+
class QueryEntities < Service
|
173
|
+
include Core::Utils::Queryable
|
174
|
+
|
175
|
+
# Public: Invoke the service.
|
176
|
+
#
|
177
|
+
# table_name - A String with the table name.
|
178
|
+
# query - A hash of options.
|
179
|
+
# :partition_key - Only get entities with this PartitionKey
|
180
|
+
# (optional, but :row_key must also be
|
181
|
+
# included).
|
182
|
+
# :row_key - Only get entities with this RowKey
|
183
|
+
# (optional, but :partition_key must also
|
184
|
+
# be included).
|
185
|
+
# :select - An array with property names. Only these
|
186
|
+
# properties are provided from the
|
187
|
+
# returned returned set of entities.
|
188
|
+
# :filter - A string to filter results.
|
189
|
+
# :top - Returns only the top n tables or entities from the set.
|
190
|
+
#
|
191
|
+
# To read more about supported query filters check this link.
|
192
|
+
# http://msdn.microsoft.com/en-us/library/windowsazure/dd894031
|
193
|
+
#
|
194
|
+
# Returns a Response.
|
195
|
+
def call(table_name, query)
|
196
|
+
uri = Tables::URI.entities(
|
197
|
+
table_name,
|
198
|
+
query.fetch(:partition_key, nil),
|
199
|
+
query.fetch(:row_key, nil)
|
200
|
+
)
|
201
|
+
|
202
|
+
uri.query = build_query(query)
|
203
|
+
|
204
|
+
super(:get, uri) do |request|
|
205
|
+
request.headers["DataServiceVersion"] = "2.0;NetFx"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require "azure/tables"
|
2
|
+
require "azure/tables/uri"
|
3
|
+
require "azure/error"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
module Azure
|
7
|
+
module Tables
|
8
|
+
# Public: Representation of a Table in the storage system.
|
9
|
+
class Table
|
10
|
+
include Azure::ErrorHandler
|
11
|
+
|
12
|
+
# Get the Table's URI.
|
13
|
+
#
|
14
|
+
# Returns a URI.
|
15
|
+
attr :url
|
16
|
+
|
17
|
+
# Get the Table's name.
|
18
|
+
#
|
19
|
+
# Returns a String.
|
20
|
+
attr :name
|
21
|
+
|
22
|
+
# Public: Instantiate a table from an Atom entry.
|
23
|
+
#
|
24
|
+
# entry - An Atom::Entry element.
|
25
|
+
#
|
26
|
+
# Returns a Table.
|
27
|
+
def self.from_entry(entry)
|
28
|
+
name = entry.content.m_properties.children.first.content
|
29
|
+
new(name, ::URI.parse(entry.id))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Public: Instantiate a table from an error object.
|
33
|
+
#
|
34
|
+
# error - An Azure::Error.
|
35
|
+
#
|
36
|
+
# Returns a Table.
|
37
|
+
def self.from_error(error)
|
38
|
+
table = new(nil, nil)
|
39
|
+
table.error = error
|
40
|
+
table
|
41
|
+
end
|
42
|
+
|
43
|
+
# Public: Create a Table. The resulting table will be invalid if the
|
44
|
+
# create operation fails.
|
45
|
+
#
|
46
|
+
# name - The name of the table.
|
47
|
+
# service - The Table service to perform external calls.
|
48
|
+
#
|
49
|
+
# Returns a Table.
|
50
|
+
def self.create(name, service=Azure::Tables)
|
51
|
+
service.create(name)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Public: Find a Table by name. If no table matches the provided name, nil
|
55
|
+
# is returned.
|
56
|
+
#
|
57
|
+
# name - The name of the table.
|
58
|
+
#
|
59
|
+
# Returns a Table or nil.
|
60
|
+
def self.[](name)
|
61
|
+
fetch(name) { nil }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Public: Find a Table by name. If no table matches the provided name,
|
65
|
+
# execute the given block, or raise ArgumentError.
|
66
|
+
#
|
67
|
+
# name - The name of the table.
|
68
|
+
# service - The Table service to perform external calls.
|
69
|
+
#
|
70
|
+
# Yields the error returned by the server in case the table wasn't found.
|
71
|
+
#
|
72
|
+
# Returns a Table.
|
73
|
+
# Raises ArgumentError if the table isn't found and no block is given.
|
74
|
+
def self.fetch(name, service=Azure::Tables, &block)
|
75
|
+
block ||= -> { raise ArgumentError, "Can't find Table named '#{name}'" }
|
76
|
+
table = service.fetch(name)
|
77
|
+
table.valid? ? table : block.call(table.error)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Public: Initialize the table.
|
81
|
+
#
|
82
|
+
# name - A String with the name of the table.
|
83
|
+
# url - The URI of the table in the service.
|
84
|
+
# service - The Table service to perform external calls.
|
85
|
+
def initialize(name, url=Azure::Tables::URI.table(name), service=Azure::Tables)
|
86
|
+
@name = name
|
87
|
+
@url = url
|
88
|
+
@service = service
|
89
|
+
end
|
90
|
+
|
91
|
+
# Public: Compare two tables to see if they are the same.
|
92
|
+
#
|
93
|
+
# other - A table.
|
94
|
+
#
|
95
|
+
# Returns true|false.
|
96
|
+
def ==(other)
|
97
|
+
name == other.name
|
98
|
+
end
|
99
|
+
|
100
|
+
# Public: Deletes this table from the storage service.
|
101
|
+
#
|
102
|
+
# Returns true|false to indicate whether the delete was successful or not.
|
103
|
+
def delete
|
104
|
+
@service.delete(self)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Public: Insert a new entity into this table. If the operation fails, an
|
108
|
+
# error will be added to the entity.
|
109
|
+
#
|
110
|
+
# entity - An Azure::Tables::Entity.
|
111
|
+
#
|
112
|
+
# Returns the entity.
|
113
|
+
def insert(entity)
|
114
|
+
@service.insert_entity(self, entity)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Public: Query for entities in this table.
|
118
|
+
#
|
119
|
+
# Returns a list of entities.
|
120
|
+
def entities(query={})
|
121
|
+
if query.key?(:partition_key) && query.key?(:row_key)
|
122
|
+
@service.query_entity(self, query.delete(:partition_key), query.delete(:row_key), query)
|
123
|
+
else
|
124
|
+
@service.query_entities(self, query)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|