use std::collections::HashMap;
use std::sync::Arc;
use std::time::{SystemTime, UNIX_EPOCH};
use futures::executor::block_on;
use google_cloud_rust_raw::bigtable::admin::v2::{
bigtable_instance_admin::GetClusterRequest,
bigtable_instance_admin_grpc::BigtableInstanceAdminClient,
bigtable_table_admin::CreateTableRequest, bigtable_table_admin::DeleteTableRequest,
bigtable_table_admin::ListTablesRequest, bigtable_table_admin_grpc::BigtableTableAdminClient,
instance::Cluster, table::ColumnFamily, table::GcRule, table::Table,
};
use google_cloud_rust_raw::bigtable::v2::{
bigtable::MutateRowsRequest, bigtable::MutateRowsRequest_Entry, bigtable_grpc::BigtableClient,
data::Mutation, data::Mutation_SetCell,
};
use google_cloud_rust_raw::empty::Empty;
use grpcio::{Channel, ChannelBuilder, ChannelCredentials, ClientUnaryReceiver, EnvBuilder};
use protobuf::well_known_types::Duration;
use protobuf::RepeatedField;
#[allow(dead_code)]
fn timestamp() -> u128 {
let start = SystemTime::now();
let time = start
.duration_since(UNIX_EPOCH)
.expect("Failed to fetch timestamp");
time.as_micros()
}
fn connect(endpoint: &str) -> Channel {
let env = Arc::new(EnvBuilder::new().build());
let creds =
ChannelCredentials::google_default_credentials().expect("No Google credentials found");
ChannelBuilder::new(env)
.max_send_message_len(1 << 28)
.max_receive_message_len(1 << 28)
.set_credentials(creds)
.connect(&endpoint)
}
fn get_cluster(
client: &BigtableInstanceAdminClient,
cluster_id: &str,
) -> ::grpcio::Result<Cluster> {
println!("Get cluster information");
let mut request = GetClusterRequest::new();
request.set_name(cluster_id.to_string());
client.get_cluster(&request)
}
fn list_tables(client: &BigtableTableAdminClient, instance_id: &str) {
println!("List all existing tables");
let mut request = ListTablesRequest::new();
request.set_parent(instance_id.to_string());
match client.list_tables(&request) {
Ok(response) => {
response
.get_tables()
.iter()
.for_each(|table| println!(" table: {:?}", table));
}
Err(error) => println!("Failed to list tables: {}", error),
}
}
fn create_table(
client: &BigtableTableAdminClient,
instance_id: &str,
table_name: &str,
table: Table,
) -> ::grpcio::Result<Table> {
println!("Creating table {}", table_name);
let mut request = CreateTableRequest::new();
request.set_parent(instance_id.to_string());
request.set_table(table);
request.set_table_id("hello-world".to_string());
client.create_table(&request)
}
fn delete_table_async(
client: &BigtableTableAdminClient,
table_name: &str,
) -> grpcio::Result<ClientUnaryReceiver<Empty>> {
println!("Deleting the {} table", table_name);
let mut request = DeleteTableRequest::new();
request.set_name(table_name.to_string());
client.delete_table_async(&request)
}
async fn async_main() {
let _project_id = String::from("mozilla-rust-sdk-dev");
let instance_id = String::from("projects/mozilla-rust-sdk-dev/instances/mozilla-rust-sdk");
let cluster_id = String::from(
"projects/mozilla-rust-sdk-dev/instances/mozilla-rust-sdk/clusters/mozilla-rust-sdk-c1",
);
let endpoint = "bigtable.googleapis.com";
let admin_endpoint = "bigtableadmin.googleapis.com";
let table_name =
String::from("projects/mozilla-rust-sdk-dev/instances/mozilla-rust-sdk/tables/hello-world");
let column_family_id = "cf1";
let channel = connect(admin_endpoint);
let client = BigtableInstanceAdminClient::new(channel.clone());
let cluster = get_cluster(&client, &cluster_id).unwrap();
dbg!(cluster);
let admin_client = BigtableTableAdminClient::new(channel.clone());
list_tables(&admin_client, &instance_id);
let mut duration = Duration::new();
duration.set_seconds(60 * 60 * 24 * 5);
let mut gc_rule = GcRule::new();
gc_rule.set_max_num_versions(2);
gc_rule.set_max_age(duration);
let mut column_family = ColumnFamily::new();
column_family.set_gc_rule(gc_rule);
let mut hash_map = HashMap::new();
hash_map.insert(column_family_id.to_string(), column_family);
let mut table = Table::new();
table.set_column_families(hash_map);
match create_table(&admin_client, &instance_id, &table_name, table) {
Ok(table) => println!(" table {:?} created", table),
Err(error) => println!(" failed to created table: {}", error),
}
println!("Insert entries into table");
let greetings = vec!["Hello World!", "Hello Cloud!", "Hello Rust!"];
let mut mutation_requests = Vec::new();
let column = "greeting";
for (i, greeting) in greetings.iter().enumerate() {
let row_key = format!("greeting{}", i);
let mut set_cell = Mutation_SetCell::new();
set_cell.set_column_qualifier(column.to_string().into_bytes());
set_cell.set_timestamp_micros(-1);
set_cell.set_value(greeting.to_string().into_bytes());
set_cell.set_family_name(column_family_id.to_string());
let mut mutation = Mutation::new();
mutation.set_set_cell(set_cell);
let mut request = MutateRowsRequest_Entry::new();
request.set_row_key(row_key.into_bytes());
request.set_mutations(RepeatedField::from_vec(vec![mutation]));
mutation_requests.push(request);
}
let channel = connect(endpoint);
let _client = BigtableClient::new(channel.clone());
let mut request = MutateRowsRequest::new();
request.set_table_name(table_name.to_string());
request.set_entries(RepeatedField::from_vec(mutation_requests));
list_tables(&admin_client, &instance_id);
delete_table_async(&admin_client, &table_name)
.unwrap()
.await
.map_err(|e| dbg!(e))
.expect("Failure");
list_tables(&admin_client, &instance_id);
}
fn main() {
block_on(async_main())
}