A platform for high-performance distributed tool and library development written in C++. It can be deployed in two different cluster modes: standalone or distributed. API for v0.5.0, released on June 13, 2018.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
StorageClientTemplate.cc
Go to the documentation of this file.
1 /*****************************************************************************
2  * *
3  * Copyright 2018 Rice University *
4  * *
5  * Licensed under the Apache License, Version 2.0 (the "License"); *
6  * you may not use this file except in compliance with the License. *
7  * You may obtain a copy of the License at *
8  * *
9  * http://www.apache.org/licenses/LICENSE-2.0 *
10  * *
11  * Unless required by applicable law or agreed to in writing, software *
12  * distributed under the License is distributed on an "AS IS" BASIS, *
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14  * See the License for the specific language governing permissions and *
15  * limitations under the License. *
16  * *
17  *****************************************************************************/
18 
19 #ifndef STORAGE_CLIENT_TEMPLATE_CC
20 #define STORAGE_CLIENT_TEMPLATE_CC
21 
22 #include "StorageClient.h"
23 #include "StorageAddData.h"
24 #include "StorageAddSet.h"
25 #include "StorageRemoveUserSet.h"
26 #include "StorageGetData.h"
27 #include "StorageGetDataResponse.h"
28 #include "StorageTestSetScan.h"
29 #include "StorageTestSetCopy.h"
30 #include "SimpleRequestResult.h"
31 #include "SimpleSendDataRequest.h"
32 #include "CompositeRequest.h"
33 #include "DataTypes.h"
34 #include <cstddef>
35 #include <fcntl.h>
36 #include <fstream>
37 #include <iostream>
38 
39 namespace pdb {
40 
41 template <class DataType>
43  std::string databaseName,
44  std::string setName,
45  std::string& errMsg,
46  bool typeCheck) {
47  return simpleSendDataRequest<StorageAddData, Handle<DataType>, SimpleRequestResult, bool>(
48  myLogger,
49  port,
50  address,
51  false,
52  1024,
53  [&](Handle<SimpleRequestResult> result) {
54  if (result != nullptr)
55  if (!result->getRes().first) {
56  myLogger->error("Error sending data: " + result->getRes().second);
57  errMsg = "Error sending data: " + result->getRes().second;
58  }
59  return true;
60  },
61  data,
62  databaseName,
63  setName,
64  getTypeName<DataType>(),
65  typeCheck);
66 }
67 
68 template <class DataType>
69 bool StorageClient::createSet(std::string databaseName, std::string setName, std::string& errMsg) {
70  if (usePangea == false) {
71  return myHelper.createSet<DataType>(databaseName, setName, errMsg);
72  } else {
73  std::string typeName = getTypeName<DataType>();
74  std::cout << "typeName for set to create =" << typeName << std::endl;
75  return simpleRequest<StorageAddSet, SimpleRequestResult, bool>(
76  myLogger,
77  port,
78  address,
79  false,
80  1024,
81  [&](Handle<SimpleRequestResult> result) {
82  if (result != nullptr) {
83  if (!result->getRes().first) {
84  errMsg = "Error creating set: " + result->getRes().second;
85  myLogger->error("Error creating set: " + result->getRes().second);
86  return false;
87  }
88  return true;
89  }
90  errMsg = "Error getting type name: got nothing back from catalog";
91  return false;
92  },
93  databaseName,
94  setName,
95  typeName);
96  }
97 }
98 
99 
100 template <class DataType>
101 bool StorageClient::removeSet(std::string databaseName, std::string setName, std::string& errMsg) {
102  if (this->usePangea == true) {
103 
104  std::string typeName = getTypeName<DataType>();
105  std::cout << "typeName for set to remove =" << typeName << std::endl;
106  return simpleRequest<StorageRemoveUserSet, SimpleRequestResult, bool>(
107  myLogger,
108  port,
109  address,
110  false,
111  1024,
112  [&](Handle<SimpleRequestResult> result) {
113  if (result != nullptr) {
114  if (!result->getRes().first) {
115  errMsg = "Error removing set: " + result->getRes().second;
116  myLogger->error("Error removing set: " + result->getRes().second);
117  return false;
118  }
119  return true;
120  }
121  errMsg = "Error getting type name: got nothing back from catalog";
122  return false;
123 
124  },
125  databaseName,
126  setName,
127  typeName);
128 
129  } else {
130 
131  return false;
132  }
133 }
134 
135 
136 template <class DataType>
137 bool StorageClient::retrieveData(std::string databaseName,
138  std::string setName,
139  std::string& errMsg) {
140  if (this->usePangea == false) {
141  std::cout << "retrieveData can only work for PangeaStorageServer\n";
142  return false;
143  }
144  std::string typeName = getTypeName<DataType>();
145  return compositeRequest<StorageGetData, StorageGetDataResponse, bool>(
146  myLogger,
147  port,
148  address,
149  false,
150  1024,
151  [&](Handle<StorageGetDataResponse> response, PDBCommunicator communicator) {
152  if (response == nullptr) {
153  errMsg = "Error getting type name : got nothing back from storage";
154  return false;
155  }
156  int numPages = response->getNumPages();
157  std::string fileName = response->getSetName();
158  std::cout << "fileName =" << fileName << std::endl;
159  int filedesc = open(fileName.c_str(), O_CREAT | O_WRONLY | O_APPEND);
160  bool success;
161  std::cout << "total page number =" << numPages << std::endl;
162  if (numPages > 0) {
163  for (int i = 0; i < numPages; i++) {
164  // the protocol is that each page is corresponding to a Vector
165  // let's get next Vector
166  char* recvBuffer = (char*)malloc(response->getRawPageSize());
167  success = communicator.receiveBytes(recvBuffer, errMsg);
168  if (success == false) {
169  close(filedesc);
170  return false;
171  }
173  (Record<Vector<Handle<Object>>>*)(recvBuffer + sizeof(NodeID) +
174  sizeof(DatabaseID) + sizeof(UserTypeID) +
175  sizeof(SetID) + sizeof(PageID) +
176  sizeof(int) + sizeof(size_t));
177  Handle<Vector<Handle<Object>>> objects = temp->getRootObject();
178  for (int j = 0; j < objects->size(); j++) {
179  if (j % 10000 == 0) {
180  std::cout << "the " << j << "-th object:" << std::endl;
181  unsafeCast<DataType, Object>((*objects)[j])->print();
182  std::cout << std::endl;
183  }
184  }
185  write(filedesc, recvBuffer, response->getRawPageSize());
186  }
187  }
188  close(filedesc);
189  return true;
190 
191  },
192 
193  databaseName,
194  setName,
195  typeName);
196 }
197 
198 template <class DataType>
199 bool StorageClient::scanData(std::string databaseName, std::string setName, std::string& errMsg) {
200  if (this->usePangea == false) {
201  std::cout << "scanData can only work for PangeaStorageServer\n";
202  return false;
203  }
204  std::string typeName = getTypeName<DataType>();
205  std::cout << "typeName for set to create =" << typeName << std::endl;
206  return simpleRequest<StorageTestSetScan, SimpleRequestResult, bool>(
207  myLogger,
208  port,
209  address,
210  false,
211  1024,
212  [&](Handle<SimpleRequestResult> result) {
213  if (result != nullptr) {
214  if (!result->getRes().first) {
215  errMsg = "Error creating set: " + result->getRes().second;
216  myLogger->error("Error scanning data: " + result->getRes().second);
217  return false;
218  }
219  return true;
220  }
221  errMsg = "Error getting type name: got nothing back from server";
222  return false;
223  },
224  databaseName,
225  setName);
226 }
227 
228 template <class DataType>
229 bool StorageClient::copyData(std::string srcDatabaseName,
230  std::string srcSetName,
231  std::string destDatabaseName,
232  std::string destSetName,
233  std::string& errMsg) {
234  if (this->usePangea == false) {
235  std::cout << "scanData can only work for PangeaStorageServer\n";
236  return false;
237  }
238  std::string typeName = getTypeName<DataType>();
239  std::cout << "typeName for set to create =" << typeName << std::endl;
240  return simpleRequest<StorageTestSetCopy, SimpleRequestResult, bool>(
241  myLogger,
242  port,
243  address,
244  false,
245  1024,
246  [&](Handle<SimpleRequestResult> result) {
247  if (result != nullptr) {
248  if (!result->getRes().first) {
249  errMsg = "Error creating set: " + result->getRes().second;
250  myLogger->error("Error copying data: " + result->getRes().second);
251  return false;
252  }
253  return true;
254  }
255  errMsg = "Error getting type name: got nothing back from server";
256  return false;
257  },
258  srcDatabaseName,
259  srcSetName,
260  destDatabaseName,
261  destSetName);
262 }
263 }
264 #endif
unsigned int SetID
Definition: DataTypes.h:31
PDBLoggerPtr myLogger
std::string address
Handle< ObjType > getRootObject()
Definition: Record.cc:46
bool retrieveData(std::string databaseName, std::string setName, std::string &errMsg)
unsigned int NodeID
Definition: DataTypes.h:27
CatalogClient myHelper
unsigned int DatabaseID
Definition: DataTypes.h:29
unsigned int PageID
Definition: DataTypes.h:26
bool createSet(std::string databaseName, std::string setName, std::string &errMsg)
bool scanData(std::string databaseName, std::string setName, std::string &errMsg)
bool removeSet(std::string databaseName, std::string setName, std::string &errMsg)
bool createSet(std::string databaseName, std::string setName, std::string &errMsg)
bool copyData(std::string srcDatabaseName, std::string srcSetName, std::string destDatabaseName, std::string destSetName, std::string &errMsg)
bool storeData(Handle< Vector< Handle< DataType >>> data, std::string databaseName, std::string setName, std::string &errMsg, bool typeCheck=true)
unsigned int UserTypeID
Definition: DataTypes.h:25