Skip to content

Commit 459480e

Browse files
committed
Simple (very!) datastore example.
1 parent 0b67d3d commit 459480e

File tree

6 files changed

+5468
-0
lines changed

6 files changed

+5468
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
LDFLAGS = -Xlinker -lz
3+
4+
all:
5+
swift build -v $(LDFLAGS)
6+
cp .build/debug/Datastore .
7+
8+
clean :
9+
rm -rf Packages googleapis .build
10+
rm -f Package.pins Datastore Sources/*.pb.swift Sources/swiftgrpc.log
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
*
3+
* Copyright 2017, Google Inc.
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are
8+
* met:
9+
*
10+
* * Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
* * Redistributions in binary form must reproduce the above
13+
* copyright notice, this list of conditions and the following disclaimer
14+
* in the documentation and/or other materials provided with the
15+
* distribution.
16+
* * Neither the name of Google Inc. nor the names of its
17+
* contributors may be used to endorse or promote products derived from
18+
* this software without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*
32+
*/
33+
import PackageDescription
34+
let package = Package (
35+
name: "Datastore",
36+
dependencies: [
37+
.Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,1,10)),
38+
.Package(url: "https://github.com/apple/swift-protobuf.git", Version(0,9,901)),
39+
]
40+
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Calling the Google Cloud Datastore API
2+
3+
This directory contains a very simple sample that calls the
4+
[Google Cloud Datastore API](https://cloud.google.com/datastore/docs/reference/rpc/google.datastore.v1).
5+
Calls are made directly to the Datastore RPC interface.
6+
In practice, these would be wrapped in idiomatic code.
7+
8+
Use [RUNME](RUNME) to generate the necessary Protocol Buffer
9+
and gRPC support code.
10+
11+
Calls require a Google project ID and an OAuth token.
12+
Both should be specified in [Sources/main.swift](Sources/main.swift).
13+
14+
To create a project ID, visit the
15+
[Google Cloud Console](https://cloud.google.com/console).
16+
17+
One easy way to get an OAuth token is to use the
18+
[Instance Metadata Service](https://cloud.google.com/compute/docs/storing-retrieving-metadata)
19+
that is available in Google cloud instances, such as
20+
[Google Compute Engine](https://cloud.google.com/compute/)
21+
or
22+
[Google Cloud Shell](https://cloud.google.com/shell/docs/).
23+
This allows you to get a short-lived service token with curl:
24+
25+
curl \
26+
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token \
27+
-H Metadata-Flavor:Google
28+
29+
That will return something like the following:
30+
31+
{"access_token":"OAUTH ACCESS TOKEN","expires_in":1799,"token_type":"Bearer"}
32+
33+
34+
Put the string matching OAUTH ACCESS TOKEN in the `authToken` variable in
35+
[Sources/main.swift](Sources/main.swift).
36+
Please note that you must run the `curl` command from within a Google cloud instance.
37+
Once you have the OAuth token, you can use it from anywhere until it expires.
38+
39+
CAUTION: Please take care to not share your OAuth token.
40+
It provides access to all of your Google services.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/bin/sh
2+
#
3+
# Use this script to regenerate the Protocol Buffer and gRPC files
4+
# needed to build the example.
5+
#
6+
# Note that it requires updated protoc, protoc-gen-swift, and
7+
# protoc-gen-swiftgrpc binaries and assumes that protoc-gen-swift
8+
# is installed in $HOME/local/bin.
9+
10+
git clone http://github.com/googleapis/googleapis
11+
12+
protoc \
13+
googleapis/google/datastore/v1/datastore.proto \
14+
googleapis/google/datastore/v1/entity.proto \
15+
googleapis/google/datastore/v1/query.proto \
16+
googleapis/google/type/latlng.proto \
17+
-Igoogleapis \
18+
--swift_out=googleapis \
19+
--swift_opt=Visibility=Public \
20+
--plugin=$HOME/local/bin/protoc-gen-swift \
21+
--swiftgrpc_out=Sources
22+
23+
# move swift files to this directory
24+
find googleapis -name "*.swift" -exec mv {} Sources \;
25+
26+
# remove the grpc service file; we don't need it
27+
rm Sources/google.datastore.v1.server.pb.swift
28+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
*
3+
* Copyright 2017, Google Inc.
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are
8+
* met:
9+
*
10+
* * Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
* * Redistributions in binary form must reproduce the above
13+
* copyright notice, this list of conditions and the following disclaimer
14+
* in the documentation and/or other materials provided with the
15+
* distribution.
16+
* * Neither the name of Google Inc. nor the names of its
17+
* contributors may be used to endorse or promote products derived from
18+
* this software without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*
32+
*/
33+
import Foundation
34+
import gRPC
35+
36+
gRPC.initialize()
37+
38+
let authToken = "<YOUR AUTH TOKEN>"
39+
40+
let projectID = "<YOUR PROJECT ID>"
41+
42+
let certificateURL = URL(fileURLWithPath:"roots.pem")
43+
let certificates = try! String(contentsOf: certificateURL)
44+
let service = Google_Datastore_V1_DatastoreService(address:"datastore.googleapis.com",
45+
certificates:certificates,
46+
host:nil)
47+
48+
service.metadata = Metadata(["authorization":"Bearer " + authToken])
49+
50+
var request = Google_Datastore_V1_RunQueryRequest()
51+
request.projectId = projectID
52+
53+
var query = Google_Datastore_V1_GqlQuery()
54+
query.queryString = "select *"
55+
56+
request.gqlQuery = query
57+
58+
print("\(request)")
59+
60+
let result = try service.runquery(request)
61+
62+
print("\(result)")

0 commit comments

Comments
 (0)