azure-storage-blob 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ #-------------------------------------------------------------------------
4
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
5
+ #
6
+ # The MIT License(MIT)
7
+
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files(the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions :
14
+
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #--------------------------------------------------------------------------
26
+
27
+ require "rbconfig"
28
+
29
+ module Azure::Storage::Blob
30
+ module Default
31
+ # Default REST service (STG) version number
32
+ STG_VERSION = "2016-05-31"
33
+
34
+ # The number of default concurrent requests for parallel operation.
35
+ DEFAULT_PARALLEL_OPERATION_THREAD_COUNT = 1
36
+
37
+ # Constant representing a kilobyte (Non-SI version).
38
+ KB = 1024
39
+ # Constant representing a megabyte (Non-SI version).
40
+ MB = 1024 * 1024
41
+ # Constant representing a gigabyte (Non-SI version).
42
+ GB = 1024 * 1024 * 1024
43
+
44
+ # Specifies HTTP.
45
+ HTTP = "http"
46
+ # Specifies HTTPS.
47
+ HTTPS = "https"
48
+ # Default HTTP port.
49
+ DEFAULT_HTTP_PORT = 80
50
+ # Default HTTPS port.
51
+ DEFAULT_HTTPS_PORT = 443
52
+
53
+ # Marker for atom metadata.
54
+ XML_METADATA_MARKER = "$"
55
+ # Marker for atom value.
56
+ XML_VALUE_MARKER = "_"
57
+
58
+ # Default value for Content-Type if request has body.
59
+ CONTENT_TYPE_VALUE = "application/octet-stream"
60
+
61
+ # Default User Agent header string
62
+ USER_AGENT = "Azure-Storage/#{Azure::Storage::Blob::Version.to_uas}-#{Azure::Storage::Common::Version.to_uas} (Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; #{Azure::Storage::Common::Default.os})".freeze
63
+ end
64
+
65
+ # Defines constants for use with blob operations.
66
+ module BlobConstants
67
+ # XML element for the latest.
68
+ LATEST_ELEMENT = "Latest"
69
+
70
+ # XML element for uncommitted blocks.
71
+ UNCOMMITTED_ELEMENT = "Uncommitted"
72
+
73
+ # XML element for a block list.
74
+ BLOCK_LIST_ELEMENT = "BlockList"
75
+
76
+ # XML element for committed blocks.
77
+ COMMITTED_ELEMENT = "Committed"
78
+
79
+ # The default write page size, in bytes, used by blob streams.
80
+ DEFAULT_WRITE_PAGE_SIZE_IN_BYTES = 4 * 1024 * 1024
81
+
82
+ # The minimum write page size, in bytes, used by blob streams.
83
+ MIN_WRITE_PAGE_SIZE_IN_BYTES = 2 * 1024 * 1024
84
+
85
+ # The default maximum size, in bytes, of a blob before it must be separated into blocks.
86
+ DEFAULT_SINGLE_BLOB_PUT_THRESHOLD_IN_BYTES = 128 * 1024 * 1024
87
+
88
+ # The default write block size, in bytes, used by blob streams.
89
+ DEFAULT_WRITE_BLOCK_SIZE_IN_BYTES = 4 * 1024 * 1024
90
+
91
+ # The maximum size of a single block.
92
+ MAX_BLOCK_SIZE = 100 * 1024 * 1024
93
+
94
+ # The maximum count of blocks for a block blob
95
+ MAX_BLOCK_COUNT = 50000
96
+
97
+ # The maximum size of block blob
98
+ MAX_BLOCK_BLOB_SIZE = 50000 * 100 * 1024 * 1024
99
+
100
+ # The maximum size of block blob
101
+ MAX_APPEND_BLOB_SIZE = 1024 * 1024 * 1024 * 1024
102
+
103
+ # The maximum size, in bytes, of a blob before it must be separated into blocks.
104
+ MAX_SINGLE_UPLOAD_BLOB_SIZE_IN_BYTES = 256 * 1024 * 1024
105
+
106
+ # The maximum range get size when requesting for a contentMD5
107
+ MAX_RANGE_GET_SIZE_WITH_MD5 = 4 * 1024 * 1024
108
+
109
+ # The maximum page range size for a page update operation.
110
+ MAX_UPDATE_PAGE_SIZE = 4 * 1024 * 1024
111
+
112
+ # The maximum buffer size for writing a stream buffer.
113
+ MAX_QUEUED_WRITE_DISK_BUFFER_SIZE = 64 * 1024 * 1024
114
+
115
+ # Max size for single get page range. The max value should be 150MB
116
+ # http://blogs.msdn.com/b/windowsazurestorage/archive/2012/03/26/getting-the-page-ranges-of-a-large-page-blob-in-segments.aspx
117
+ MAX_SINGLE_GET_PAGE_RANGE_SIZE = 37 * 4 * 1024 * 1024
118
+
119
+ # The size of a page, in bytes, in a page blob.
120
+ PAGE_SIZE = 512
121
+
122
+ # Resource types.
123
+ module ResourceTypes
124
+ CONTAINER = "c"
125
+ BLOB = "b"
126
+ end
127
+
128
+ # List blob types.
129
+ module ListBlobTypes
130
+ Blob = "b"
131
+ Directory = "d"
132
+ end
133
+
134
+ # Put page write options
135
+ module PageWriteOptions
136
+ UPDATE = "update"
137
+ CLEAR = "clear"
138
+ end
139
+
140
+ # Blob types
141
+ module BlobTypes
142
+ BLOCK = "BlockBlob"
143
+ PAGE = "PageBlob"
144
+ APPEND = "AppendBlob"
145
+ end
146
+
147
+ # Blob lease constants
148
+ module LeaseOperation
149
+ ACQUIRE = "acquire"
150
+ RENEW = "renew"
151
+ CHANGE = "change"
152
+ RELEASE = "release"
153
+ BREAK = "break"
154
+ end
155
+ end
156
+
157
+ module BlobErrorCodeStrings
158
+ INVALID_BLOCK_ID = "InvalidBlockId"
159
+ BLOB_NOT_FOUND = "BlobNotFound"
160
+ BLOB_ALREADY_EXISTS = "BlobAlreadyExists"
161
+ CONTAINER_ALREADY_EXISTS = "ContainerAlreadyExists"
162
+ CONTAINER_NOT_FOUND = "ContainerNotFound"
163
+ INVALID_BLOB_OR_BLOCK = "InvalidBlobOrBlock"
164
+ INVALID_BLOCK_LIST = "InvalidBlockList"
165
+ MAX_BLOB_SIZE_CONDITION_NOT_MET = "MaxBlobSizeConditionNotMet"
166
+ APPEND_POSITION_CONDITION_NOT_MET = "AppendPositionConditionNotMet"
167
+ end
168
+ end
@@ -0,0 +1,566 @@
1
+ # frozen_string_literal: true
2
+
3
+ #-------------------------------------------------------------------------
4
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
5
+ #
6
+ # The MIT License(MIT)
7
+
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files(the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions :
14
+
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #--------------------------------------------------------------------------
26
+ module Azure::Storage
27
+ module Blob
28
+ # Public: Creates a new page blob. Note that calling create_page_blob to create a page
29
+ # blob only initializes the blob. To add content to a page blob, call put_blob_pages method.
30
+ #
31
+ # ==== Attributes
32
+ #
33
+ # * +container+ - String. The container name.
34
+ # * +blob+ - String. The blob name.
35
+ # * +length+ - Integer. Specifies the maximum size for the page blob, up to 1 TB.
36
+ # The page blob size must be aligned to a 512-byte boundary.
37
+ # * +options+ - Hash. Optional parameters.
38
+ #
39
+ # ==== Options
40
+ #
41
+ # Accepted key/value pairs in options parameter are:
42
+ # * +:transactional_md5+ - String. An MD5 hash of the blob content. This hash is used to verify the integrity of the blob during transport.
43
+ # When this header is specified, the storage service checks the hash that has arrived with the one that was sent.
44
+ # If the two hashes do not match, the operation will fail with error code 400 (Bad Request).
45
+ # * +:content_type+ - String. Content type for the blob. Will be saved with blob.
46
+ # * +:content_encoding+ - String. Content encoding for the blob. Will be saved with blob.
47
+ # * +:content_language+ - String. Content language for the blob. Will be saved with blob.
48
+ # * +:content_md5+ - String. Content MD5 for the blob. Will be saved with blob.
49
+ # * +:cache_control+ - String. Cache control for the blob. Will be saved with blob.
50
+ # * +:content_disposition+ - String. Conveys additional information about how to process the response payload,
51
+ # and also can be used to attach additional metadata
52
+ # * +:metadata+ - Hash. Custom metadata values to store with the blob.
53
+ # * +:sequence_number+ - Integer. The sequence number is a user-controlled value that you can use to track requests.
54
+ # The value of the sequence number must be between 0 and 2^63 - 1.The default value is 0.
55
+ # * +:timeout+ - Integer. A timeout in seconds.
56
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
57
+ # in the analytics logs when storage analytics logging is enabled.
58
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to create a new blob
59
+ # only if the blob has been modified since the specified date/time. If the blob has not been modified,
60
+ # the Blob service returns status code 412 (Precondition Failed).
61
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to create a new blob
62
+ # only if the blob has not been modified since the specified date/time. If the blob has been modified,
63
+ # the Blob service returns status code 412 (Precondition Failed).
64
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to create a new blob
65
+ # only if the blob's ETag value matches the value specified. If the values do not match,
66
+ # the Blob service returns status code 412 (Precondition Failed).
67
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to create a new blob
68
+ # only if the blob's ETag value does not match the value specified. If the values are identical,
69
+ # the Blob service returns status code 412 (Precondition Failed).
70
+ # * +:lease_id+ - String. Required if the blob has an active lease. To perform this operation on a blob with an active lease,
71
+ # specify the valid lease ID for this header.
72
+ #
73
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179451.aspx
74
+ #
75
+ # Returns a Blob
76
+ def create_page_blob(container, blob, length, options = {})
77
+ query = {}
78
+ StorageService.with_query query, "timeout", options[:timeout].to_s if options[:timeout]
79
+
80
+ uri = blob_uri(container, blob, query)
81
+
82
+ headers = {}
83
+
84
+ # set x-ms-blob-type to PageBlob
85
+ StorageService.with_header headers, "x-ms-blob-type", "PageBlob"
86
+
87
+ # ensure content-length is 0 and x-ms-blob-content-length is the blob length
88
+ StorageService.with_header headers, "Content-Length", 0.to_s
89
+ StorageService.with_header headers, "x-ms-blob-content-length", length.to_s
90
+
91
+ # set x-ms-sequence-number from options (or default to 0)
92
+ StorageService.with_header headers, "x-ms-sequence-number", (options[:sequence_number] || 0).to_s
93
+
94
+ # set the rest of the optional headers
95
+ StorageService.with_header headers, "Content-MD5", options[:transactional_md5]
96
+ StorageService.with_header headers, "x-ms-blob-content-type", options[:content_type]
97
+ StorageService.with_header headers, "x-ms-blob-content-encoding", options[:content_encoding]
98
+ StorageService.with_header headers, "x-ms-blob-content-language", options[:content_language]
99
+ StorageService.with_header headers, "x-ms-blob-content-md5", options[:content_md5]
100
+ StorageService.with_header headers, "x-ms-blob-cache-control", options[:cache_control]
101
+ StorageService.with_header headers, "x-ms-blob-content-disposition", options[:content_disposition]
102
+
103
+ StorageService.add_metadata_to_headers options[:metadata], headers
104
+ add_blob_conditional_headers options, headers
105
+ headers["x-ms-lease-id"] = options[:lease_id] if options[:lease_id]
106
+ headers["x-ms-blob-content-type"] = Default::CONTENT_TYPE_VALUE unless headers["x-ms-blob-content-type"]
107
+
108
+ # call PutBlob with empty body
109
+ response = call(:put, uri, nil, headers, options)
110
+
111
+ result = Serialization.blob_from_headers(response.headers)
112
+ result.name = blob
113
+ result.metadata = options[:metadata] if options[:metadata]
114
+
115
+ result
116
+ end
117
+
118
+ # Public: Creates a range of pages in a page blob.
119
+ #
120
+ # ==== Attributes
121
+ #
122
+ # * +container+ - String. Name of container
123
+ # * +blob+ - String. Name of blob
124
+ # * +start_range+ - Integer. Position of first byte of first page
125
+ # * +end_range+ - Integer. Position of last byte of of last page
126
+ # * +content+ - IO or String. Content to write. Length in bytes should equal end_range - start_range + 1
127
+ # * +options+ - Hash. A collection of options.
128
+ #
129
+ # ==== Options
130
+ #
131
+ # Accepted key/value pairs in options parameter are:
132
+ # * +:transactional_md5+ - String. An MD5 hash of the page content. This hash is used to verify the integrity of the page during transport.
133
+ # When this header is specified, the storage service checks the hash that has arrived with the one that was sent.
134
+ # * +:if_sequence_number_le+ - Integer. If the blob's sequence number is less than or equal to the specified value, the request proceeds;
135
+ # otherwise it fails with the SequenceNumberConditionNotMet error (HTTP status code 412 - Precondition Failed).
136
+ # * +:if_sequence_number_lt+ - Integer. If the blob's sequence number is less than the specified value, the request proceeds;
137
+ # otherwise it fails with SequenceNumberConditionNotMet error (HTTP status code 412 - Precondition Failed).
138
+ # * +:if_sequence_number_eq+ - Integer. If the blob's sequence number is equal to the specified value, the request proceeds;
139
+ # otherwise it fails with SequenceNumberConditionNotMet error (HTTP status code 412 - Precondition Failed).
140
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to write the page only if
141
+ # the blob has been modified since the specified date/time. If the blob has not been modified,
142
+ # the Blob service returns status code 412 (Precondition Failed).
143
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to write the page only if
144
+ # the blob has not been modified since the specified date/time. If the blob has been modified,
145
+ # the Blob service returns status code 412 (Precondition Failed).
146
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to write the page only if
147
+ # the blob's ETag value matches the value specified. If the values do not match,
148
+ # the Blob service returns status code 412 (Precondition Failed).
149
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to write the page only if
150
+ # the blob's ETag value does not match the value specified. If the values are identical,
151
+ # the Blob service returns status code 412 (Precondition Failed).
152
+ # * +:timeout+ - Integer. A timeout in seconds.
153
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
154
+ # in the analytics logs when storage analytics logging is enabled.
155
+ # * +:lease_id+ - String. Required if the blob has an active lease. To perform this operation on a blob with an active lease,
156
+ # specify the valid lease ID for this header.
157
+ #
158
+ # See http://msdn.microsoft.com/en-us/library/azure/ee691975.aspx
159
+ #
160
+ # Returns Blob
161
+ def put_blob_pages(container, blob, start_range, end_range, content, options = {})
162
+ query = { "comp" => "page" }
163
+ StorageService.with_query query, "timeout", options[:timeout].to_s if options[:timeout]
164
+
165
+ uri = blob_uri(container, blob, query)
166
+ headers = {}
167
+ StorageService.with_header headers, "Content-MD5", options[:transactional_md5]
168
+ StorageService.with_header headers, "x-ms-range", "bytes=#{start_range}-#{end_range}"
169
+ StorageService.with_header headers, "x-ms-page-write", "update"
170
+
171
+ # clear default content type
172
+ StorageService.with_header headers, "Content-Type", ""
173
+ headers["x-ms-lease-id"] = options[:lease_id] if options[:lease_id]
174
+
175
+ # set optional headers
176
+ unless options.empty?
177
+ add_blob_conditional_headers options, headers
178
+ end
179
+
180
+ response = call(:put, uri, content, headers, options)
181
+
182
+ result = Serialization.blob_from_headers(response.headers)
183
+ result.name = blob
184
+
185
+ result
186
+ end
187
+
188
+ # Public: Clears a range of pages from the blob.
189
+ #
190
+ # ==== Attributes
191
+ #
192
+ # * +container+ - String. Name of container.
193
+ # * +blob+ - String. Name of blob.
194
+ # * +start_range+ - Integer. Position of first byte of first page.
195
+ # * +end_range+ - Integer. Position of last byte of of last page.
196
+ # * +options+ - Hash. Optional parameters.
197
+ #
198
+ # ==== Options
199
+ #
200
+ # Accepted key/value pairs in options parameter are:
201
+ # * +:timeout+ - Integer. A timeout in seconds.
202
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
203
+ # in the analytics logs when storage analytics logging is enabled.
204
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to clear the page only if
205
+ # the blob has been modified since the specified date/time. If the blob has not been modified,
206
+ # the Blob service returns status code 412 (Precondition Failed).
207
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to clear the page only if
208
+ # the blob has not been modified since the specified date/time. If the blob has been modified,
209
+ # the Blob service returns status code 412 (Precondition Failed).
210
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to clear the page only if
211
+ # the blob's ETag value matches the value specified. If the values do not match,
212
+ # the Blob service returns status code 412 (Precondition Failed).
213
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to clear the page only if
214
+ # the blob's ETag value does not match the value specified. If the values are identical,
215
+ # the Blob service returns status code 412 (Precondition Failed).
216
+ #
217
+ # See http://msdn.microsoft.com/en-us/library/azure/ee691975.aspx
218
+ #
219
+ # Returns Blob
220
+ def clear_blob_pages(container, blob, start_range, end_range, options = {})
221
+ query = { "comp" => "page" }
222
+ StorageService.with_query query, "timeout", options[:timeout].to_s if options[:timeout]
223
+
224
+ uri = blob_uri(container, blob, query)
225
+
226
+ headers = {}
227
+ StorageService.with_header headers, "x-ms-range", "bytes=#{start_range}-#{end_range}"
228
+ StorageService.with_header headers, "x-ms-page-write", "clear"
229
+
230
+ # clear default content type
231
+ StorageService.with_header headers, "Content-Type", ""
232
+
233
+ # set optional headers
234
+ unless options.empty?
235
+ add_blob_conditional_headers options, headers
236
+ end
237
+
238
+ response = call(:put, uri, nil, headers, options)
239
+
240
+ result = Serialization.blob_from_headers(response.headers)
241
+ result.name = blob
242
+
243
+ result
244
+ end
245
+
246
+ # Public: Returns a list of active page ranges for a page blob. Active page ranges are
247
+ # those that have been populated with data.
248
+ #
249
+ # ==== Attributes
250
+ #
251
+ # * +container+ - String. The container name.
252
+ # * +blob+ - String. The blob name.
253
+ # * +options+ - Hash. Optional parameters.
254
+ #
255
+ # ==== Options
256
+ #
257
+ # Accepted key/value pairs in options parameter are:
258
+ # * +:start_range+ - Integer. Position of first byte of first page. (optional)
259
+ # * +:end_range+ - Integer. Position of last byte of of last page. (optional)
260
+ # * +:snapshot+ - String. An opaque DateTime value that specifies the blob snapshot to
261
+ # retrieve information from. (optional)
262
+ # * +:timeout+ - Integer. A timeout in seconds.
263
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
264
+ # in the analytics logs when storage analytics logging is enabled.
265
+ # * +:location_mode+ - LocationMode. Specifies the location mode used to decide
266
+ # which location the request should be sent to.
267
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to list the pages only if
268
+ # the blob has been modified since the specified date/time. If the blob has not been modified,
269
+ # the Blob service returns status code 412 (Precondition Failed).
270
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to list the pages only if
271
+ # the blob has not been modified since the specified date/time. If the blob has been modified,
272
+ # the Blob service returns status code 412 (Precondition Failed).
273
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to list the pages only if
274
+ # the blob's ETag value matches the value specified. If the values do not match,
275
+ # the Blob service returns status code 412 (Precondition Failed).
276
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to list the pages only if
277
+ # the blob's ETag value does not match the value specified. If the values are identical,
278
+ # the Blob service returns status code 412 (Precondition Failed).
279
+ # * +:previous_snapshot+ - String. An opaque DateTime value that specifies that the response will contain only pages that
280
+ # were changed between target blob and previous snapshot. Changed pages include both updated and
281
+ # cleared pages. The target blob may be a snapshot, as long as the snapshot specified by this
282
+ # is the older of the two.
283
+ # * +:lease_id+ - String. If this header is specified, the operation will be performed only if both of the
284
+ # following conditions are met:
285
+ # - The blob's lease is currently active.
286
+ # - The lease ID specified in the request matches that of the blob.
287
+ # If this header is specified and both of these conditions are not met, the request will fail
288
+ # and the Get Blob operation will fail with status code 412 (Precondition Failed).
289
+ #
290
+ # See http://msdn.microsoft.com/en-us/library/azure/ee691973.aspx
291
+ #
292
+ # Returns a list of page ranges in the format [ [start, end], [start, end], ... ]
293
+ #
294
+ # e.g. [ [0, 511], [512, 1024], ... ]
295
+ #
296
+ def list_page_blob_ranges(container, blob, options = {})
297
+ query = { "comp" => "pagelist" }
298
+ query.update("snapshot" => options[:snapshot]) if options[:snapshot]
299
+ query.update("prevsnapshot" => options[:previous_snapshot]) if options[:previous_snapshot]
300
+ StorageService.with_query query, "timeout", options[:timeout].to_s if options[:timeout]
301
+
302
+ options[:request_location_mode] = Azure::Storage::Common::RequestLocationMode::PRIMARY_OR_SECONDARY
303
+ uri = blob_uri(container, blob, query, options)
304
+
305
+ options[:start_range] = 0 if options[:end_range] && (not options[:start_range])
306
+
307
+ headers = {}
308
+ StorageService.with_header headers, "x-ms-range", "bytes=#{options[:start_range]}-#{options[:end_range]}" if options[:start_range]
309
+ add_blob_conditional_headers options, headers
310
+ headers["x-ms-lease-id"] = options[:lease_id] if options[:lease_id]
311
+
312
+ response = call(:get, uri, nil, headers, options)
313
+
314
+ pagelist = Serialization.page_list_from_xml(response.body)
315
+ pagelist
316
+ end
317
+
318
+ # Public: Resizes a page blob to the specified size.
319
+ #
320
+ # ==== Attributes
321
+ #
322
+ # * +container+ - String. The container name.
323
+ # * +blob+ - String. The blob name.
324
+ # * +size+ - String. The blob size. Resizes a page blob to the specified size.
325
+ # If the specified value is less than the current size of the blob,
326
+ # then all pages above the specified value are cleared.
327
+ # * +options+ - Hash. Optional parameters.
328
+ #
329
+ # ==== Options
330
+ #
331
+ # Accepted key/value pairs in options parameter are:
332
+ # * +:timeout+ - Integer. A timeout in seconds.
333
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
334
+ # in the analytics logs when storage analytics logging is enabled.
335
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to set the blob properties
336
+ # only if the blob has been modified since the specified date/time. If the blob has not been modified,
337
+ # the Blob service returns status code 412 (Precondition Failed).
338
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to set the blob properties
339
+ # only if the blob has not been modified since the specified date/time. If the blob has been modified,
340
+ # the Blob service returns status code 412 (Precondition Failed).
341
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to set the blob properties
342
+ # only if the blob's ETag value matches the value specified. If the values do not match,
343
+ # the Blob service returns status code 412 (Precondition Failed).
344
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to set the blob properties
345
+ # only if the blob's ETag value does not match the value specified. If the values are identical,
346
+ # the Blob service returns status code 412 (Precondition Failed).
347
+ #
348
+ # See http://msdn.microsoft.com/en-us/library/azure/ee691966.aspx
349
+ #
350
+ # Returns nil on success.
351
+ def resize_page_blob(container, blob, size, options = {})
352
+ options = { content_length: size }.merge(options)
353
+ set_blob_properties container, blob, options
354
+ end
355
+
356
+ # Public: Copies a snapshot of the source page blob to a destination page blob. The snapshot is copied such that only
357
+ # the differential changes between the previously copied snapshot are transferred to the destination. The copied snapshots
358
+ # are complete copies of the original snapshot and can be read or copied from as usual.The destination of an incremental copy
359
+ # must either not exist, or must have been created with a previous incremental copy from the same source blob. Once created,
360
+ # the destination blob is permanently associated with the source and may only be used for incremental copies. The Get Blob
361
+ # Properties and List Blobs APIs indicate whether the blob is an incremental copy blob created in this way. Incremental
362
+ # copy blobs may not be downloaded directly. The only supported operations are Get Blob Properties, Incremental Copy Blob,
363
+ # and Delete Blob. The copied snapshots may be read and deleted as usual.
364
+ #
365
+ # ==== Attributes
366
+ #
367
+ # * +destination_container+ - String. The destination container name to copy to.
368
+ # * +destination_blob+ - String. The destination blob name to copy to.
369
+ # * +source_uri+ - String. Specifies the URI of the source page blob snapshot.
370
+ # This value is a URL of up to 2 KB in length that specifies a page blob snapshot. The
371
+ # value should be URL-encoded as it would appear in a request URI. The source blob must
372
+ # either be public or must be authenticated via a shared access signature. Here is an
373
+ # example of a source blob URL:
374
+ # https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>
375
+ # * +options+ - Hash. Optional parameters.
376
+ #
377
+ # ==== Options
378
+ #
379
+ # Accepted key/value pairs in options parameter are:
380
+ # * +:metadata+ - Hash. Custom metadata values to store with the copy. If this parameter is not
381
+ # specified, the operation will copy the source blob metadata to the destination
382
+ # blob. If this parameter is specified, the destination blob is created with the
383
+ # specified metadata, and metadata is not copied from the source blob.
384
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to copy the blob only if the
385
+ # destination blob has been modified since the specified date/time. If the destination blob
386
+ # has not been modified, the Blob service returns status code 412 (Precondition Failed).
387
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to copy the blob only if the
388
+ # destination blob has not been modified since the specified date/time. If the destination
389
+ # blob has been modified, the Blob service returns status code 412 (Precondition Failed).
390
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to copy the blob
391
+ # only if the specified ETag value matches the ETag value for an existing destination blob.
392
+ # If the ETag for the destination blob does not match the ETag specified for If-Match,
393
+ # the Blob service returns status code 412 (Precondition Failed).
394
+ # * +:if_none_match+ - String. An ETag value, or the wildcard character (*). Specify an ETag value for this
395
+ # conditional header to copy the blob only if the specified ETag value does not match the
396
+ # ETag value for the destination blob. Specify the wildcard character (*) to perform the
397
+ # operation only if the destination blob does not exist. If the specified condition isn't met,
398
+ # the Blob service returns status code 412 (Precondition Failed).
399
+ # * +:timeout+ - Integer. A timeout in seconds.
400
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
401
+ # in the analytics logs when storage analytics logging is enabled.
402
+ # * +:lease_id+ - String. If this header is specified, the operation will be performed only if both of the
403
+ # following conditions are met:
404
+ # - The blob's lease is currently active.
405
+ # - The lease ID specified in the request matches that of the blob.
406
+ # If this header is specified and both of these conditions are not met, the request will fail
407
+ # and the Snapshot Blob operation will fail with status code 412 (Precondition Failed).
408
+ #
409
+ # See https://docs.microsoft.com/en-us/rest/api/storageservices/incremental-copy-blob
410
+ #
411
+ # Returns a tuple of (copy_id, copy_status).
412
+ #
413
+ # * +copy_id+ - String. String identifier for this copy operation. Use with Get Blob Properties to check
414
+ # the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy.
415
+ # * +copy_status+ - String. State of the copy operation. This is always pending to indicate that the copy has
416
+ # started and is in progress.
417
+ #
418
+ def incremental_copy_blob(destination_container, destination_blob, source_uri, options = {})
419
+ # query parameters
420
+ query = { Azure::Storage::Common::QueryStringConstants::COMP => Azure::Storage::Common::QueryStringConstants::INCREMENTAL_COPY }
421
+ StorageService.with_query query, "timeout", options[:timeout].to_s if options[:timeout]
422
+
423
+ # URI
424
+ uri = blob_uri(destination_container, destination_blob, query)
425
+
426
+ # headers
427
+ headers = {}
428
+ StorageService.with_header headers, "x-ms-copy-source", source_uri
429
+ unless options.empty?
430
+ add_blob_conditional_headers options, headers
431
+ StorageService.add_metadata_to_headers options[:metadata], headers
432
+ headers["x-ms-lease-id"] = options[:lease_id] if options[:lease_id]
433
+ end
434
+
435
+ response = call(:put, uri, nil, headers, options)
436
+ return response.headers["x-ms-copy-id"], response.headers["x-ms-copy-status"]
437
+ end
438
+
439
+ # Public: Sets a page blob's sequence number.
440
+ #
441
+ # ==== Attributes
442
+ #
443
+ # * +container+ - String. The container name.
444
+ # * +blob+ - String. The blob name.
445
+ # * +action+ - Symbol. Indicates how the service should modify the sequence
446
+ # number for the blob. Required if :sequence_number is used. This property
447
+ # applies to page blobs only.
448
+ #
449
+ # Specify one of the following options for this property:
450
+ #
451
+ # * +:max+ - Sets the sequence number to be the higher of the value included with
452
+ # the request and the value currently stored for the blob.
453
+ # * +:update+ - Sets the sequence number to the value included with the request.
454
+ # * +:increment+ - Increments the value of the sequence number by 1. If specifying this
455
+ # option, do not include the sequence_number option; doing so will return
456
+ # status code 400 (Bad Request).
457
+ #
458
+ # * +number+ - Integer. Sets the blob's sequence number. The sequence number is a
459
+ # user-controlled property that you can use to track requests and manage concurrency
460
+ # issues. Required if the 'action' parameter is set to :max or :update.
461
+ # This property applies to page blobs only.
462
+ #
463
+ # Use this together with the 'action' parameter to update the blob's sequence
464
+ # number, either to the specified value or to the higher of the values specified with
465
+ # the request or currently stored with the blob.
466
+ #
467
+ # This header should not be specified if the 'action' parameter is set to :increment;
468
+ # in this case the service automatically increments the sequence number by one.
469
+ #
470
+ # To set the sequence number to a value of your choosing, this property must be specified
471
+ # together with the 'action' parameter
472
+ # * +options+ - Hash. Optional parameters.
473
+ #
474
+ # ==== Options
475
+ #
476
+ # Accepted key/value pairs in options parameter are:
477
+ # * +:timeout+ - Integer. A timeout in seconds.
478
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
479
+ # in the analytics logs when storage analytics logging is enabled.
480
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to set the blob properties
481
+ # only if the blob has been modified since the specified date/time. If the blob has not been modified,
482
+ # the Blob service returns status code 412 (Precondition Failed).
483
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to set the blob properties
484
+ # only if the blob has not been modified since the specified date/time. If the blob has been modified,
485
+ # the Blob service returns status code 412 (Precondition Failed).
486
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to set the blob properties
487
+ # only if the blob's ETag value matches the value specified. If the values do not match,
488
+ # the Blob service returns status code 412 (Precondition Failed).
489
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to set the blob properties
490
+ # only if the blob's ETag value does not match the value specified. If the values are identical,
491
+ # the Blob service returns status code 412 (Precondition Failed).
492
+ #
493
+ # See http://msdn.microsoft.com/en-us/library/azure/ee691966.aspx
494
+ #
495
+ # Returns nil on success.
496
+ def set_sequence_number(container, blob, action, number, options = {})
497
+ options = { sequence_number_action: action, sequence_number: number }.merge(options)
498
+ set_blob_properties container, blob, options
499
+ end
500
+
501
+ # Public: Creates a new page blob filled with given content.
502
+ #
503
+ # ==== Attributes
504
+ #
505
+ # * +container+ - String. The container name.
506
+ # * +blob+ - String. The blob name.
507
+ # * +length+ - Integer. Specifies the maximum size for the page blob, up to 1 TB.
508
+ # The page blob size must be aligned to a 512-byte boundary.
509
+ # * +content+ - String or IO. The content to put in the page blob.
510
+ # * +options+ - Hash. Optional parameters.
511
+ #
512
+ # ==== Options
513
+ #
514
+ # Accepted key/value pairs in options parameter are:
515
+ # * +:content_type+ - String. Content type for the blob. Will be saved with blob.
516
+ # * +:content_encoding+ - String. Content encoding for the blob. Will be saved with blob.
517
+ # * +:content_language+ - String. Content language for the blob. Will be saved with blob.
518
+ # * +:content_md5+ - String. Content MD5 for the blob. Will be saved with blob.
519
+ # * +:cache_control+ - String. Cache control for the blob. Will be saved with blob.
520
+ # * +:content_disposition+ - String. Conveys additional information about how to process the response payload,
521
+ # and also can be used to attach additional metadata
522
+ # * +:metadata+ - Hash. Custom metadata values to store with the blob.
523
+ # * +:sequence_number+ - Integer. The sequence number is a user-controlled value that you can use to track requests.
524
+ # The value of the sequence number must be between 0 and 2^63 - 1.The default value is 0.
525
+ # * +:timeout+ - Integer. A timeout in seconds.
526
+ # * +:request_id+ - String. Provides a client-generated, opaque value with a 1 KB character limit that is recorded
527
+ # in the analytics logs when storage analytics logging is enabled.
528
+ # * +:if_modified_since+ - String. A DateTime value. Specify this conditional header to create a new blob
529
+ # only if the blob has been modified since the specified date/time. If the blob has not been modified,
530
+ # the Blob service returns status code 412 (Precondition Failed).
531
+ # * +:if_unmodified_since+ - String. A DateTime value. Specify this conditional header to create a new blob
532
+ # only if the blob has not been modified since the specified date/time. If the blob has been modified,
533
+ # the Blob service returns status code 412 (Precondition Failed).
534
+ # * +:if_match+ - String. An ETag value. Specify an ETag value for this conditional header to create a new blob
535
+ # only if the blob's ETag value matches the value specified. If the values do not match,
536
+ # the Blob service returns status code 412 (Precondition Failed).
537
+ # * +:if_none_match+ - String. An ETag value. Specify an ETag value for this conditional header to create a new blob
538
+ # only if the blob's ETag value does not match the value specified. If the values are identical,
539
+ # the Blob service returns status code 412 (Precondition Failed).
540
+ # * +:lease_id+ - String. Required if the blob has an active lease. To perform this operation on a blob with an active lease,
541
+ # specify the valid lease ID for this header.
542
+ #
543
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179451.aspx
544
+ #
545
+ # Returns a Blob
546
+ def create_page_blob_from_content(container, blob, length, content, options = {})
547
+ options[:content_type] = get_or_apply_content_type(content, options[:content_type])
548
+ create_page_blob(container, blob, length, options)
549
+
550
+ content = StringIO.new(content) if content.is_a? String
551
+ upload_count = (Float(length) / Float(BlobConstants::DEFAULT_WRITE_PAGE_SIZE_IN_BYTES)).ceil
552
+
553
+ for idx in 0...upload_count
554
+ start_range = idx * BlobConstants::DEFAULT_WRITE_PAGE_SIZE_IN_BYTES
555
+ end_range = start_range + BlobConstants::DEFAULT_WRITE_PAGE_SIZE_IN_BYTES - 1
556
+ end_range = (length - 1) if end_range > (length - 1)
557
+ put_blob_pages(container, blob, start_range, end_range, content.read(BlobConstants::DEFAULT_WRITE_PAGE_SIZE_IN_BYTES), lease_id: options[:lease_id])
558
+ end
559
+
560
+ get_properties_options = {}
561
+ get_properties_options[:lease_id] = options[:lease_id] if options[:lease_id]
562
+ # Get the blob properties
563
+ get_blob_properties(container, blob, get_properties_options)
564
+ end
565
+ end
566
+ end