Skip to content
This repository was archived by the owner on Oct 6, 2020. It is now read-only.

Commit 7cac521

Browse files
author
Francesco Cogno
authored
Cosmos/stored procedure (#238)
Implemented stored procedure functions
1 parent 047b94d commit 7cac521

File tree

75 files changed

+3687
-454
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+3687
-454
lines changed

Cargo.toml.bak

Lines changed: 0 additions & 11 deletions
This file was deleted.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
[![Build Status](https://travis-ci.org/MindFlavor/AzureSDKForRust.svg?branch=master)](https://travis-ci.org/MindFlavor/AzureSDKForRust) [![Coverage Status](https://coveralls.io/repos/MindFlavor/AzureSDKForRust/badge.svg?branch=master&service=github)](https://coveralls.io/github/MindFlavor/AzureSDKForRust?branch=master) ![stability-unstable](https://img.shields.io/badge/stability-unstable-yellow.svg)
77

8-
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/0.40.0) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/0.40.0) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/0.40.0)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
8+
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/cosmos_0.41.0) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/cosmos_0.41.0) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/cosmos_0.41.0)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
99

1010
[![GitHub contributors](https://img.shields.io/github/contributors/MindFlavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/graphs/contributors)
1111

1212
Crate | Docs | Crates.io | Downloads | Downloads@Latest |
1313
-- | -- | -- | -- | -- |
1414
[azure_sdk_auth_aad](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_auth_aad) | [![docs](https://docs.rs/azure_sdk_auth_aad/badge.svg)](https://docs.rs/azure_sdk_auth_aad/0.40.0/azure_sdk_auth_aad) | [![Crate](https://img.shields.io/crates/v/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad)
1515
[azure_sdk_core](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_core) | [![docs](https://docs.rs/azure_sdk_core/badge.svg)](https://docs.rs/azure_sdk_core/0.40.0/azure_sdk_core) | [![Crate](https://img.shields.io/crates/v/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core)
16-
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.40.0/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
16+
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.41.0/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
1717
[azure_sdk_service_bus](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_service_bus) | [![docs](https://docs.rs/azure_sdk_service_bus/badge.svg)](https://docs.rs/azure_sdk_service_bus/0.40.0/azure_sdk_service_bus) | [![Crate](https://img.shields.io/crates/v/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus)
1818
[azure_sdk_storage_account](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_account) | [![docs](https://docs.rs/azure_sdk_storage_account/badge.svg)](https://docs.rs/azure_sdk_storage_account/0.40.0/azure_sdk_storage_account) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account)
1919
[azure_sdk_storage_blob](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_blob) | [![docs](https://docs.rs/azure_sdk_storage_blob/badge.svg)](https://docs.rs/azure_sdk_storage_blob/0.40.0/azure_sdk_storage_blob) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob)

azure_sdk_cosmos/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "azure_sdk_cosmos"
3-
version = "0.40.0"
3+
version = "0.41.0"
44
description = "Rust wrappers around Microsoft Azure REST APIs - Azure Cosmos DB crate"
55
readme = "README.md"
66
authors = ["Francesco Cogno <francesco.cogno@outlook.com>", "Max Gortman <mgortman@microsoft.com>"]

azure_sdk_cosmos/examples/create_delete_database.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use azure_sdk_cosmos::prelude::*;
2+
use futures::stream::StreamExt;
23
use std::error::Error;
34

45
#[tokio::main]
@@ -32,12 +33,15 @@ async fn main() -> Result<(), Box<dyn Error>> {
3233
// account. Database do not implement Display but deref to &str so you can pass it to methods
3334
// both as struct or id.
3435

36+
let list_databases_response = client.list_databases().execute().await?;
37+
println!("list_databases_response = {:#?}", list_databases_response);
38+
3539
let db = client
3640
.create_database()
3741
.with_database_name(&database_name)
3842
.execute()
3943
.await?;
40-
println!("created database = {:?}", db);
44+
println!("created database = {:#?}", db);
4145

4246
// create collection!
4347
{
@@ -71,21 +75,32 @@ async fn main() -> Result<(), Box<dyn Error>> {
7175
.await?;
7276

7377
println!(
74-
"create_collection_response == {:?}",
78+
"create_collection_response == {:#?}",
7579
create_collection_response
7680
);
7781

7882
let db_collection = db_client.with_collection(&"panzadoro");
83+
84+
let get_collection_response = db_collection.get_collection().execute().await?;
85+
println!("get_collection_response == {:#?}", get_collection_response);
86+
87+
let stream = db_client.list_collections();
88+
let mut stream = Box::pin(stream.stream());
89+
while let Some(res) = stream.next().await {
90+
let res = res?;
91+
println!("res == {:#?}", res);
92+
}
93+
7994
let delete_response = db_collection.delete_collection().execute().await?;
80-
println!("collection deleted: {:?}", delete_response);
95+
println!("collection deleted: {:#?}", delete_response);
8196
}
8297

8398
let resp = client
8499
.with_database(&database_name)
85100
.delete_database()
86101
.execute()
87102
.await?;
88-
println!("database deleted. resp == {:?}", resp);
103+
println!("database deleted. resp == {:#?}", resp);
89104

90105
Ok(())
91106
}

azure_sdk_cosmos/examples/document00.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern crate serde_derive;
44
// DB.
55
use azure_sdk_core::prelude::*;
66
use azure_sdk_cosmos::prelude::*;
7+
use azure_sdk_cosmos::responses::GetDocumentResponse;
78
use std::borrow::Cow;
89
use std::error::Error;
910

@@ -177,7 +178,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
177178

178179
// The document can be no longer there so the result is
179180
// an Option<Document<T>>
180-
if let Some(document) = get_document_response.document {
181+
if let GetDocumentResponse::Found(document) = get_document_response {
181182
// Now, for the sake of experimentation, we will update (replace) the
182183
// document created. We do this only if the original document has not been
183184
// modified in the meantime. This is called optimistic concurrency.
@@ -189,7 +190,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
189190
.replace_document()
190191
.with_document(&doc)
191192
.with_partition_keys(&(&doc.document_attributes.id).into())
192-
.with_if_match_condition(IfMatchCondition::Match(&document.document_attributes.etag))
193+
.with_if_match_condition(IfMatchCondition::Match(&document.etag))
193194
.execute()
194195
.await?;
195196
println!(

azure_sdk_cosmos/examples/document_entries00.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use azure_sdk_core::modify_conditions::IfMatchCondition;
22
use azure_sdk_core::prelude::*;
33
use azure_sdk_cosmos::prelude::*;
4+
use azure_sdk_cosmos::responses::GetDocumentResponse;
45
use futures::stream::StreamExt;
56
use std::borrow::Cow;
67
use std::error::Error;
@@ -74,12 +75,9 @@ async fn main() -> Result<(), Box<dyn Error>> {
7475

7576
// we inserted 5 documents and retrieved the first 3.
7677
// continuation_token must be present
77-
assert_eq!(
78-
response.additional_headers.continuation_token.is_some(),
79-
true
80-
);
78+
assert!(response.continuation_token.is_some());
8179

82-
let ct = response.additional_headers.continuation_token.unwrap();
80+
let ct = response.continuation_token.unwrap();
8381
println!("ct == {}", ct);
8482

8583
let response = client
@@ -93,10 +91,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
9391

9492
// we got the last 2 entries. Now continuation_token
9593
// must be absent
96-
assert_eq!(
97-
response.additional_headers.continuation_token.is_some(),
98-
false
99-
);
94+
assert!(response.continuation_token.is_none());
10095

10196
// we can have Rust pass the continuation_token for
10297
// us if we call the stream function. Here we
@@ -123,17 +118,24 @@ async fn main() -> Result<(), Box<dyn Error>> {
123118
.execute::<MySampleStruct>()
124119
.await?;
125120

126-
assert_eq!(response.document.is_some(), true);
121+
assert!(match response {
122+
GetDocumentResponse::Found(_) => true,
123+
_ => false,
124+
});
127125
println!("response == {:#?}", response);
128-
let mut doc = response.clone().document.unwrap();
129-
doc.document.a_string = "Something else here".into();
130126

131-
let etag = doc.document_attributes.etag().to_owned();
127+
let mut doc = match response {
128+
GetDocumentResponse::Found(ref resp) => resp.clone(),
129+
GetDocumentResponse::NotFound(_) => panic!(),
130+
};
131+
doc.document.document.a_string = "Something else here".into();
132+
133+
let etag = doc.etag.to_owned();
132134

133135
println!("\n\nReplacing document");
134136
let replace_document_response = client
135137
.replace_document()
136-
.with_document(&doc)
138+
.with_document(&doc.document)
137139
.with_partition_keys(PartitionKeys::new().push(&id)?)
138140
.with_consistency_level(ConsistencyLevel::from(&response))
139141
.with_if_match_condition(IfMatchCondition::Match(&etag)) // use optimistic concurrency check
@@ -157,8 +159,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
157159
.execute::<MySampleStruct>()
158160
.await?;
159161

160-
assert_eq!(response.document.is_some(), false);
161-
assert_eq!(response.has_been_found, false);
162+
assert!(match response {
163+
GetDocumentResponse::NotFound(_) => true,
164+
_ => false,
165+
});
162166
println!("response == {:#?}", response);
163167

164168
for i in 0u64..5 {
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
use azure_sdk_cosmos::prelude::*;
2+
use std::borrow::Cow;
3+
use std::error::Error;
4+
#[macro_use]
5+
extern crate serde_derive;
6+
7+
#[derive(Serialize, Deserialize, Clone, Debug)]
8+
struct MySampleStruct<'a> {
9+
a_string: Cow<'a, str>,
10+
a_number: u64,
11+
a_timestamp: i64,
12+
}
13+
14+
// This example expects you to have created a collection
15+
// with partitionKey on "id".
16+
#[tokio::main]
17+
async fn main() -> Result<(), Box<dyn Error>> {
18+
let database_name = std::env::args()
19+
.nth(1)
20+
.expect("please specify database name as first command line parameter");
21+
let collection_name = std::env::args()
22+
.nth(2)
23+
.expect("please specify collection name as second command line parameter");
24+
25+
let master_key =
26+
std::env::var("COSMOS_MASTER_KEY").expect("Set env variable COSMOS_MASTER_KEY first!");
27+
let account = std::env::var("COSMOS_ACCOUNT").expect("Set env variable COSMOS_ACCOUNT first!");
28+
29+
let authorization_token = AuthorizationToken::new_master(&master_key)?;
30+
31+
let client = ClientBuilder::new(account, authorization_token)?;
32+
let client = client.with_database(&database_name);
33+
let client = client.with_collection(&collection_name);
34+
35+
let mut doc = Document::new(
36+
format!("unique_id{}", 500),
37+
MySampleStruct {
38+
a_string: Cow::Borrowed("Something here"),
39+
a_number: 600,
40+
a_timestamp: chrono::Utc::now().timestamp(),
41+
},
42+
);
43+
44+
let mut partition_keys = PartitionKeys::new();
45+
partition_keys.push(doc.document_attributes.id())?;
46+
47+
// let's add an entity.
48+
let create_document_response = client
49+
.create_document()
50+
.with_document(&doc)
51+
.with_partition_keys(&partition_keys)
52+
.with_is_upsert(true)
53+
.execute()
54+
.await?;
55+
56+
println!(
57+
"create_document_response == {:#?}\n\n\n",
58+
create_document_response
59+
);
60+
61+
let document_client = client.with_document(&doc);
62+
63+
let get_document_response = document_client
64+
.get_document()
65+
.with_partition_keys(&partition_keys)
66+
.execute::<serde_json::Value>()
67+
.await?;
68+
println!("get_document_response == {:#?}", get_document_response);
69+
70+
let document_client = client.with_document(&"ciccia");
71+
72+
let get_document_response = document_client
73+
.get_document()
74+
.with_partition_keys(&partition_keys)
75+
.execute::<serde_json::Value>()
76+
.await?;
77+
println!(
78+
"get_document_response == {:#?}\n\n\n",
79+
get_document_response
80+
);
81+
82+
let list_documents_response = client
83+
.list_documents()
84+
.execute::<serde_json::Value>()
85+
.await?;
86+
println!("list_documents_response == {:#?}", list_documents_response);
87+
88+
let query_documents_response = client
89+
.query_documents()
90+
.with_query(&("SELECT * FROM c WHERE c.a_number = 600".into()))
91+
.with_query_cross_partition(true)
92+
.execute::<serde_json::Value>()
93+
.await?;
94+
println!(
95+
"query_documents_response == {:#?}",
96+
query_documents_response
97+
);
98+
99+
doc.document.a_number = 43;
100+
101+
let replace_document_response = client
102+
.replace_document()
103+
.with_document(&doc)
104+
.with_partition_keys(&partition_keys)
105+
.execute()
106+
.await?;
107+
println!(
108+
"replace_document_response == {:#?}",
109+
replace_document_response
110+
);
111+
112+
Ok(())
113+
}

0 commit comments

Comments
 (0)