1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::sync::Arc;
use google_cloud_rust_raw::spanner::v1::{
spanner::{CreateSessionRequest, Session},
spanner_grpc::SpannerClient,
};
use grpcio::{CallOption, ChannelBuilder, ChannelCredentials, EnvBuilder, MetadataBuilder};
#[allow(dead_code)]
pub struct Client {
database: String,
client: SpannerClient,
session: Session,
}
impl Client {
pub fn new(database: &str) -> crate::Result<Client> {
let database = database.to_string();
let endpoint = "spanner.googleapis.com:443";
let env = Arc::new(EnvBuilder::new().build());
let creds = ChannelCredentials::google_default_credentials()?;
let chan = ChannelBuilder::new(Arc::clone(&env))
.max_send_message_len(100 << 20)
.max_receive_message_len(100 << 20)
.set_credentials(creds)
.connect(&endpoint);
let client = SpannerClient::new(chan);
let mut req = CreateSessionRequest::new();
req.set_database(database.to_string());
let mut meta = MetadataBuilder::new();
meta.add_str("google-cloud-resource-prefix", &database)?;
meta.add_str("x-goog-api-client", "googleapis-rs")?;
let opt = CallOption::default().headers(meta.build());
let session = client.create_session_opt(&req, opt)?;
Ok(Client {
database,
client,
session,
})
}
}