binding/v8/jsi/dataaccess/DataSourceManager.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file DataSourceManager.cpp
22 
23  \brief Utility functions to register the DataSourceManager class into Google JavaScript V8 engine.
24  */
25 
26 // TerraLib
27 #include "../../../../common/Exception.h"
28 #include "../../../../core/translator/Translator.h"
29 #include "../../../../dataaccess/datasource/DataSourceManager.h"
30 #include "../../common/Utils.h"
31 #include "DataAccess.h"
32 
33 // Boost
34 #include <boost/cstdint.hpp>
35 
36 ::v8::Handle<::v8::Value> DataSourceManager_Make(const ::v8::Arguments& args)
37 {
38  ::v8::HandleScope hs;
39 
40  if((args.Length() != 2) || args[0].IsEmpty() || !args[0]->IsString() || args[1].IsEmpty() || !args[1]->IsString())
41  return ::v8::ThrowException(::v8::String::New("In order to use the DataSourceManager make method you must use object notation: \"ds = TeDataSourceManager.make(\"id1\", \"POSTGIS\");\""));
42 
43  v8::String::Utf8Value jid(args[0]->ToString());
44  v8::String::Utf8Value jdstype(args[1]->ToString());
45 
46  try
47  {
49  ::v8::Local<::v8::Object> jds = te::v8::common::Make(ds, te::v8::jsi::GetDataSourceTemplate, false);
50  return hs.Close(jds);
51  }
52  catch(const std::exception& e)
53  {
54  return ::v8::ThrowException(::v8::String::New(e.what()));
55  }
56  catch(...)
57  {
58  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Unexpected exception in make method!")));
59  }
60 }
61 
62 ::v8::Handle<::v8::Value> DataSourceManager_Open(const ::v8::Arguments& args)
63 {
64  ::v8::HandleScope hs;
65 
66  if(args.Length() != 3)
67  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Wrong number of parameters for open method!")));
68 
69  if(args[0].IsEmpty() || !args[0]->IsString() || args[1].IsEmpty() || !args[1]->IsString() || args[2].IsEmpty())
70  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Wrong parameters type for open method!")));
71 
72  v8::String::Utf8Value jid(args[0]->ToString());
73  v8::String::Utf8Value jdstype(args[1]->ToString());
74 
75  try
76  {
77  if(args[2]->IsString())
78  {
79  v8::String::Utf8Value jconninfo(args[2]->ToString());
80  te::da::DataSource* ds = te::da::DataSourceManager::getInstance().open(*jid, *jdstype, *jconninfo);
81  ::v8::Local<::v8::Object> jds = te::v8::common::Make(ds, te::v8::jsi::GetDataSourceTemplate, false);
82  return hs.Close(jds);
83  }
84  else if(args[2]->IsArray())
85  {
86  ::v8::Local<::v8::Object> aconninfo = args[2]->ToObject();
87  std::map<std::string, std::string> conninfo;
88  te::v8::common::Convert2Cpp(aconninfo, conninfo);
89  te::da::DataSource* ds = te::da::DataSourceManager::getInstance().open(*jid, *jdstype, conninfo);
90  ::v8::Local<::v8::Object> jds = te::v8::common::Make(ds, te::v8::jsi::GetDataSourceTemplate, false);
91  return hs.Close(jds);
92  }
93 
94  throw te::common::Exception(TR_V8JSI("Wrong parameters in open method!"));
95  }
96  catch(const std::exception& e)
97  {
98  return ::v8::ThrowException(::v8::String::New(e.what()));
99  }
100  catch(...)
101  {
102  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Unexpected exception in open method!")));
103  }
104 }
105 
106 ::v8::Handle<::v8::Value> DataSourceManager_Size(const ::v8::Arguments& args)
107 {
108  ::v8::HandleScope hs;
109  std::size_t size = te::da::DataSourceManager::getInstance().size();
110  ::v8::Local<::v8::Integer> jsize = ::v8::Integer::New(static_cast<boost::int32_t>(size));
111  return hs.Close(jsize);
112 }
113 
114 ::v8::Handle<::v8::Value> DataSourceManager_Find(const ::v8::Arguments& args)
115 {
116  ::v8::HandleScope hs;
117 
118  if(args.Length() != 1 || args[0].IsEmpty())
119  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("In order to use the find method, you must use the object notation: \"ds = obj.find(\"ds1_id1\");\"")));
120 
121  if(args[0]->IsString())
122  {
123  v8::String::Utf8Value jid(args[0]->ToString());
125  ::v8::Local<::v8::Object> jds = te::v8::common::Make(ds, te::v8::jsi::GetDataSourceTemplate, false);
126  return hs.Close(jds);
127  }
128  else if(args[0]->IsObject())
129  {
130  te::da::DataSource* ds = te::v8::common::Unwrap<te::da::DataSource>(args[0]->ToObject());
131  std::string id = te::da::DataSourceManager::getInstance().find(ds);
132  ::v8::Local<::v8::String> jid = ::v8::String::New(id.c_str());
133  return hs.Close(jid);
134  }
135 
136  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Invalid parameter type in find method!")));
137 }
138 
139 ::v8::Handle<::v8::Value> DataSourceManager_Insert(const ::v8::Arguments& /*args*/)
140 {
141  ::v8::HandleScope hs;
142  return ::v8::Undefined();
143 }
144 
145 ::v8::Handle<::v8::Value> DataSourceManager_Detach(const ::v8::Arguments& /*args*/)
146 {
147  ::v8::HandleScope hs;
148 
149  /*if(args.Length() != 1 || args[0].IsEmpty())
150  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("In order to use the detach method, you must use the object notation: \"obj.detach(\"ds1_id1\");\"")));
151 
152  if(args[0]->IsString())
153  {
154  v8::String::Utf8Value jid(args[0]->ToString());
155  te::da::DataSource* ds = te::da::DataSourceManager::getInstance().find(*jid);
156  ::v8::Local<::v8::Object> jds = te::v8::common::Make(ds, te::v8::jsi::GetDataSourceTemplate, true);
157  return hs.Close(jds);
158  }
159  else if(args[0]->IsObject())
160  {
161  te::da::DataSource* ds = te::v8::common::Unwrap<te::da::DataSource>(args[0]->ToObject());
162  te::da::DataSourceManager::getInstance().detach(ds);
163  return ::v8::Undefined();
164  }*/
165 
166  return ::v8::ThrowException(::v8::String::New(TR_V8JSI("Invalid parameter type in the detach method!")));
167 }
168 
169 ::v8::Handle<::v8::Value> DataSourceManager_DetachAll(const ::v8::Arguments& /*args*/)
170 {
171  ::v8::HandleScope hs;
172  /*te::da::DataSourceManager::getInstance().detachAll();*/
173  return ::v8::Undefined();
174 }
175 
176 ::v8::Handle<::v8::Value> DataSourceManager_Remove(const ::v8::Arguments& /*args*/)
177 {
178  ::v8::HandleScope hs;
179 
180  //if(args.Length() != 1 || args[0].IsEmpty())
181  // return ::v8::ThrowException(::v8::String::New("In order to use the detach method, you must use the object notation: \"obj.remove(\"ds1_id1\");\""));
182 
183  //if(args[0]->IsString())
184  //{
185  // v8::String::Utf8Value jid(args[0]->ToString());
186  // te::da::DataSourceManager::getInstance().remove(*jid);
187 
188  // return ::v8::Undefined();
189  //}
190  //else if(args[0]->IsObject())
191  //{
192  // te::da::DataSource* ds = te::v8::common::Unwrap<te::da::DataSource>(args[0]->ToObject());
193 
194  // te::da::DataSourceManager::getInstance().remove(ds);
195 
196  // return ::v8::Undefined();
197  //}
198 
199  return ::v8::ThrowException(::v8::String::New("Invalid parameter type in the remove method!"));
200 }
201 
202 ::v8::Handle<::v8::Value> DataSourceManager_RemoveAll(const ::v8::Arguments& /*args*/)
203 {
204  ::v8::HandleScope hs;
205 
206  /*if(args.Length() != 0)
207  return ::v8::ThrowException(::v8::String::New("In order to use the removeAll method, you must use the object notation: \"obj.removeAll();\""));
208 
209  te::da::DataSourceManager::getInstance().removeAll();*/
210 
211  return ::v8::Undefined();
212 }
213 
214 ::v8::Handle<::v8::Value> DataSourceManager_Begin(const ::v8::Arguments& /*args*/)
215 {
216  ::v8::HandleScope hs;
217  return ::v8::Undefined();
218 }
219 
220 ::v8::Handle<::v8::Value> DataSourceManager_End(const ::v8::Arguments& /*args*/)
221 {
222  ::v8::HandleScope hs;
223  return ::v8::Undefined();
224 }
225 
226 ::v8::Handle<::v8::Value> DataSourceManager_GetOpenedList(const ::v8::Arguments& /*args*/)
227 {
228  ::v8::HandleScope hs;
229  return ::v8::Undefined();
230 }
231 
232 void te::v8::jsi::RegisterDataSourceManager(::v8::Local<::v8::Object>& global)
233 {
234  ::v8::HandleScope hs;
235 
236  ::v8::Handle<::v8::ObjectTemplate> objTpl = ::v8::ObjectTemplate::New();
237 
238  objTpl->Set(::v8::String::NewSymbol("make"), ::v8::FunctionTemplate::New(DataSourceManager_Make));
239  objTpl->Set(::v8::String::NewSymbol("open"), ::v8::FunctionTemplate::New(DataSourceManager_Open));
240  objTpl->Set(::v8::String::NewSymbol("size"), ::v8::FunctionTemplate::New(DataSourceManager_Size));
241  objTpl->Set(::v8::String::NewSymbol("find"), ::v8::FunctionTemplate::New(DataSourceManager_Find));
242  objTpl->Set(::v8::String::NewSymbol("insert"), ::v8::FunctionTemplate::New(DataSourceManager_Insert));
243  objTpl->Set(::v8::String::NewSymbol("detach"), ::v8::FunctionTemplate::New(DataSourceManager_Detach));
244  objTpl->Set(::v8::String::NewSymbol("detachAll"), ::v8::FunctionTemplate::New(DataSourceManager_DetachAll));
245  objTpl->Set(::v8::String::NewSymbol("remove"), ::v8::FunctionTemplate::New(DataSourceManager_Remove));
246  objTpl->Set(::v8::String::NewSymbol("removeAll"), ::v8::FunctionTemplate::New(DataSourceManager_RemoveAll));
247  objTpl->Set(::v8::String::NewSymbol("begin"), ::v8::FunctionTemplate::New(DataSourceManager_Begin));
248  objTpl->Set(::v8::String::NewSymbol("end"), ::v8::FunctionTemplate::New(DataSourceManager_End));
249  objTpl->Set(::v8::String::NewSymbol("getOpenedList"), ::v8::FunctionTemplate::New(DataSourceManager_GetOpenedList));
250 
251  global->Set(::v8::String::New("TeDataSourceManager"), objTpl->NewInstance());
252 }
253 
::v8::Local<::v8::Object > Make(T *obj, TF tfunc, const bool isOwner)
It creates a new JavaScript object from a C++ object (obj).
::v8::Handle<::v8::Value > DataSourceManager_DetachAll(const ::v8::Arguments &)
::v8::Handle<::v8::Value > DataSourceManager_Insert(const ::v8::Arguments &)
JavaScript exporting routine for the TerraLib Data Access module.
::v8::Handle<::v8::Value > DataSourceManager_Remove(const ::v8::Arguments &)
static te::dt::Date ds(2010, 01, 01)
An abstract class for data providers like a DBMS, Web Services or a regular file. ...
::v8::Persistent<::v8::FunctionTemplate > & GetDataSourceTemplate()
It returns a reference to the persistent template of a DataSource object.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
::v8::Handle<::v8::Value > DataSourceManager_Open(const ::v8::Arguments &args)
void Convert2Cpp(const ::v8::Local<::v8::Object > &jsmap, std::map< std::string, std::string > &cppmap)
It converts the input map to an object representing the associative conteiner.
::v8::Handle<::v8::Value > DataSourceManager_RemoveAll(const ::v8::Arguments &)
::v8::Handle<::v8::Value > DataSourceManager_Size(const ::v8::Arguments &args)
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
::v8::Handle<::v8::Value > DataSourceManager_Find(const ::v8::Arguments &args)
::v8::Handle<::v8::Value > DataSourceManager_Make(const ::v8::Arguments &args)
::v8::Handle<::v8::Value > DataSourceManager_Detach(const ::v8::Arguments &)
::v8::Handle<::v8::Value > DataSourceManager_GetOpenedList(const ::v8::Arguments &)
void RegisterDataSourceManager(::v8::Local<::v8::Object > &global)
It registers the GeometryFactory class.
::v8::Handle<::v8::Value > DataSourceManager_End(const ::v8::Arguments &)
#define TR_V8JSI(message)
It marks a string in order to get translated. This is a special mark used in the Vector Geometry modu...
std::string ToString(const XMLCh *const value)
It converts the XML string to a standard C++ string.
::v8::Handle<::v8::Value > DataSourceManager_Begin(const ::v8::Arguments &)