azure 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|