The Microsoft Azure Storage Client Library for C++ is a library built on top of the C++ REST SDK that lets you access Azure Storage from your C++ apps. You need to install it via NuGet. While installing it, I could not locate it using the NuGet packages UI in Visual Studio 2013. Instead I had to install it via the Package Manager Console. I assume it’s because the library is pre-release. The latest version is 0.3.0 (preview) dated May 16 2014. So when you install it, you need to add the -pre parameter.
install-package wastorage -pre
This will add the REST SDK and other dependencies like the wastorage.redist to your project. To test if it works, I created a table using a quickly put together C# project and then accessed it from a C++ console app. I just used the Azure storage emulator. Here are the includes you need to have in your project.
#include "../packages/wastorage.0.3.0-preview/build/native/include/was/storage_account.h" #include "../packages/wastorage.0.3.0-preview/build/native/include/was/table.h"
You can also add this using namespace declaration to save some keystrokes.
using namespace azure::storage;
Here’s the code snippet, and I’ve added comments to make it easier to understand.
// This returns the storage account object
auto storage_account = cloud_storage_account::parse(U("UseDevelopmentStorage=true"));
// This returns the table client service object
auto table_client = storage_account.create_cloud_table_client();
// Now, we get a reference to a named table
auto table = table_client.get_table_reference(U("Clients"));
// This will create the table if it does not exist
bool created = table.create_if_not_exists();
// We get everything without a filter
table_query query;
auto results = table.execute_query(query);
// Each item represents a table entity
for (auto item : results)
{
auto properties = item.properties();
// Each property from the table entity is returned as a key-value pair
for (auto property : properties)
{
ucout << property.first << U(" = ") << property.second.str() << U("\t");
}
ucout << endl;
}
Example output:
Id = 100 Name = John Brown Phone = 777-1234 Id = 101 Name = Mary Jane Phone = 777-5678
Now this was basically as easy as using C#. The one difference, and it’s a non-trivial one, is that with C# you can map the returned table_entity to a .NET type. So I can write something like this:
TableQuery<Client> query = new TableQuery<Client>();
foreach (var item in table.ExecuteQuery(query))
{
Console.WriteLine("{0} - {1}", item.Name, item.Phone);
}
Here, Client is an entity object.
class Client : TableEntity
{
public Client(int id)
{
this.Id = id;
this.PartitionKey = id.ToString();
this.RowKey = id.ToString();
}
public Client()
{
}
public string Name { get; set; }
public string Phone { get; set; }
public int Id { get; set; }
}
I am guessing here, but it’s most likely done via reflection. With C++, you’d need to write plumbing code to map the returned data to your C++ objects. Not a big deal really, and more a matter of coding convenience. Probably more performant to do it the C++ way (that’s an unverified personal thought).