46 import yaml |
46 import yaml |
47 |
47 |
48 from google.appengine.api import api_base_pb |
48 from google.appengine.api import api_base_pb |
49 from google.appengine.api import apiproxy_stub |
49 from google.appengine.api import apiproxy_stub |
50 from google.appengine.api import apiproxy_stub_map |
50 from google.appengine.api import apiproxy_stub_map |
|
51 from google.appengine.api import datastore_errors |
|
52 from google.appengine.api import mail_service_pb |
|
53 from google.appengine.api import urlfetch_service_pb |
51 from google.appengine.api import users |
54 from google.appengine.api import users |
|
55 from google.appengine.api.capabilities import capability_service_pb |
|
56 from google.appengine.api.images import images_service_pb |
|
57 from google.appengine.api.memcache import memcache_service_pb |
52 from google.appengine.datastore import datastore_pb |
58 from google.appengine.datastore import datastore_pb |
53 from google.appengine.ext import webapp |
59 from google.appengine.ext import webapp |
54 from google.appengine.ext.remote_api import remote_api_pb |
60 from google.appengine.ext.remote_api import remote_api_pb |
55 from google.appengine.runtime import apiproxy_errors |
61 from google.appengine.runtime import apiproxy_errors |
56 |
62 |
74 of the Next request. |
80 of the Next request. |
75 """ |
81 """ |
76 runquery_response = datastore_pb.QueryResult() |
82 runquery_response = datastore_pb.QueryResult() |
77 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'RunQuery', |
83 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'RunQuery', |
78 request, runquery_response) |
84 request, runquery_response) |
|
85 if runquery_response.result_size() > 0: |
|
86 response.CopyFrom(runquery_response) |
|
87 return |
|
88 |
79 next_request = datastore_pb.NextRequest() |
89 next_request = datastore_pb.NextRequest() |
80 next_request.mutable_cursor().CopyFrom(runquery_response.cursor()) |
90 next_request.mutable_cursor().CopyFrom(runquery_response.cursor()) |
81 next_request.set_count(request.limit()) |
91 next_request.set_count(request.limit()) |
82 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Next', |
92 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Next', |
83 next_request, response) |
93 next_request, response) |
152 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Rollback', tx, |
162 apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Rollback', tx, |
153 api_base_pb.VoidProto()) |
163 api_base_pb.VoidProto()) |
154 |
164 |
155 |
165 |
156 SERVICE_PB_MAP = { |
166 SERVICE_PB_MAP = { |
|
167 'capability_service': { |
|
168 'IsEnabled': (capability_service_pb.IsEnabledRequest, |
|
169 capability_service_pb.IsEnabledResponse), |
|
170 }, |
157 'datastore_v3': { |
171 'datastore_v3': { |
158 'Get': (datastore_pb.GetRequest, datastore_pb.GetResponse), |
172 'Get': (datastore_pb.GetRequest, datastore_pb.GetResponse), |
159 'Put': (datastore_pb.PutRequest, datastore_pb.PutResponse), |
173 'Put': (datastore_pb.PutRequest, datastore_pb.PutResponse), |
160 'Delete': (datastore_pb.DeleteRequest, datastore_pb.DeleteResponse), |
174 'Delete': (datastore_pb.DeleteRequest, datastore_pb.DeleteResponse), |
161 'Count': (datastore_pb.Query, api_base_pb.Integer64Proto), |
175 'Count': (datastore_pb.Query, api_base_pb.Integer64Proto), |
162 'GetIndices': (api_base_pb.StringProto, datastore_pb.CompositeIndices), |
176 'GetIndices': (api_base_pb.StringProto, datastore_pb.CompositeIndices), |
163 }, |
177 }, |
|
178 'images': { |
|
179 'Transform': (images_service_pb.ImagesTransformRequest, |
|
180 images_service_pb.ImagesTransformResponse), |
|
181 'Composite': (images_service_pb.ImagesCompositeRequest, |
|
182 images_service_pb.ImagesCompositeResponse), |
|
183 'Histogram': (images_service_pb.ImagesHistogramRequest, |
|
184 images_service_pb.ImagesHistogramResponse), |
|
185 }, |
|
186 'mail': { |
|
187 'Send': (mail_service_pb.MailMessage, api_base_pb.VoidProto), |
|
188 'SendToAdmins': (mail_service_pb.MailMessage, api_base_pb.VoidProto), |
|
189 }, |
|
190 'memcache': { |
|
191 'Get': (memcache_service_pb.MemcacheGetRequest, |
|
192 memcache_service_pb.MemcacheGetResponse), |
|
193 'Set': (memcache_service_pb.MemcacheSetRequest, |
|
194 memcache_service_pb.MemcacheSetResponse), |
|
195 'Delete': (memcache_service_pb.MemcacheDeleteRequest, |
|
196 memcache_service_pb.MemcacheDeleteResponse), |
|
197 'Increment': (memcache_service_pb.MemcacheIncrementRequest, |
|
198 memcache_service_pb.MemcacheIncrementResponse), |
|
199 'FlushAll': (memcache_service_pb.MemcacheFlushRequest, |
|
200 memcache_service_pb.MemcacheFlushResponse), |
|
201 'Stats': (memcache_service_pb.MemcacheStatsRequest, |
|
202 memcache_service_pb.MemcacheStatsResponse), |
|
203 }, |
164 'remote_datastore': { |
204 'remote_datastore': { |
165 'RunQuery': (datastore_pb.Query, datastore_pb.QueryResult), |
205 'RunQuery': (datastore_pb.Query, datastore_pb.QueryResult), |
166 'Transaction': (remote_api_pb.TransactionRequest, |
206 'Transaction': (remote_api_pb.TransactionRequest, |
167 datastore_pb.PutResponse), |
207 datastore_pb.PutResponse), |
168 'GetIDs': (remote_api_pb.PutRequest, datastore_pb.PutResponse), |
208 'GetIDs': (remote_api_pb.PutRequest, datastore_pb.PutResponse), |
|
209 }, |
|
210 'urlfetch': { |
|
211 'Fetch': (urlfetch_service_pb.URLFetchRequest, |
|
212 urlfetch_service_pb.URLFetchResponse), |
169 }, |
213 }, |
170 } |
214 } |
171 |
215 |
172 |
216 |
173 class ApiCallHandler(webapp.RequestHandler): |
217 class ApiCallHandler(webapp.RequestHandler): |
219 self.response.set_status(200) |
265 self.response.set_status(200) |
220 except Exception, e: |
266 except Exception, e: |
221 logging.exception('Exception while handling %s', request) |
267 logging.exception('Exception while handling %s', request) |
222 self.response.set_status(200) |
268 self.response.set_status(200) |
223 response.mutable_exception().set_contents(pickle.dumps(e)) |
269 response.mutable_exception().set_contents(pickle.dumps(e)) |
|
270 if isinstance(e, datastore_errors.Error): |
|
271 application_error = response.mutable_application_error() |
|
272 application_error.setCode(e.application_error) |
|
273 application_error.setDetail(e.error_detail) |
224 self.response.out.write(response.Encode()) |
274 self.response.out.write(response.Encode()) |
225 |
275 |
226 def ExecuteRequest(self, request): |
276 def ExecuteRequest(self, request): |
227 """Executes an API invocation and returns the response object.""" |
277 """Executes an API invocation and returns the response object.""" |
228 service = request.service_name() |
278 service = request.service_name() |