I made the small changes you ask.

Except

SQLExecutor::SQLExecutor(const string &user, const string &schema)
 : _in_error_state(false)
{
 /* setup a Session object */
 _session= Session::make_shared(plugin::Listen::getNullClient(),
catalog::local());
 identifier::user::mptr user_id= identifier::User::make_shared();
 user_id->setUser(user);
 _session->setUser(user_id);
 _session->set_schema(schema);
 _result_set= new sql::ResultSet(1);
 _sql="";
}

Can put it in other function , will easy to track error .

And

This should be handled like this:
if req->type == POST
 ...
 executor->executeSQL()
 if error and error == table doesn't exist
    create table
    retry executeSQL()
 endif
endif

This one I will do later.



On Fri, Jun 15, 2012 at 4:31 PM, Mohit Srivastava <
srivastavamohi...@gmail.com> wrote:

> DBAccess.h
>
>      DBAccess(Json::Value &json_in,Json::Value &json_out);
>      void execute(const char* type,const char* schema,const char* table);
> I think json_in, schema and table belong together. I would change the
> above like this:
>
> DBAccess(enum evhttp_cmd_type type,const char* schema,const char*
> table,Json::Value &json_in,Json::Value &json_out);
> void execute();
>
> I think , If we put schema , table as constructor argument , then we have
> to specify them as member of class. And that is not needed , they are used
> only as temporary purpose.
>
> --
> Mohit
>
>
>
> On Fri, Jun 15, 2012 at 3:14 PM, Henrik Ingo <henrik.i...@avoinelama.fi>wrote:
>
>> Hi Mohit
>>
>> Great progress, I think we are getting close to finalizing the
>> DBAccess part. (Then of course need to also work on the HTTP part and
>> multi-threading.)
>>
>> Regarding ENUM, I realize now you should just use the one that already
>> exists in event2/http.h:
>>
>> enum evhttp_cmd_type {
>>        EVHTTP_REQ_GET     = 1 << 0,
>>        EVHTTP_REQ_POST    = 1 << 1,
>>        EVHTTP_REQ_HEAD    = 1 << 2,
>>        EVHTTP_REQ_PUT     = 1 << 3,
>>        EVHTTP_REQ_DELETE  = 1 << 4,
>>        EVHTTP_REQ_OPTIONS = 1 << 5,
>>        EVHTTP_REQ_TRACE   = 1 << 6,
>>        EVHTTP_REQ_CONNECT = 1 << 7,
>>        EVHTTP_REQ_PATCH   = 1 << 8
>> };
>>
>> It is already used in json_server.cc, just use it the same way. I'm
>> also giving some examples below.
>>
>>
>>
>> Now, to the actual review:
>>
>>
>> $ ls
>> DBAccess.cc  docs             http_handler.h  json_server.cc
>> plugin.ini       sql_executor.h    sql_generator.h
>> SQLToJsonGenerator.h
>> DBAccess.h   http_handler.cc  json            plugin.ac
>> sql_executor.cc  sql_generator.cc  SQLToJsonGenerator.cc
>>
>> Be consistent in file names:
>> mv SQLToJsonGenerator.* sql_to_json_generator.*
>> mv DBAccess.* db_access.*
>>
>>
>> Remember to use "bzr mv"!
>>
>>
>> DBAccess.h
>>
>>      DBAccess(Json::Value &json_in,Json::Value &json_out);
>>      void execute(const char* type,const char* schema,const char* table);
>>
>> I think json_in, schema and table belong together. I would change the
>> above like this:
>>
>>      DBAccess(enum evhttp_cmd_type type,
>>                       const char* schema,
>>                       const char* table,
>>                       Json::Value &json_in,
>>                       Json::Value &json_out);
>>      void execute();
>>
>>
>> DBAccess.cc
>>
>> I think the code flow here is simple and elegant! The refactoring is
>> paying off :-)
>>
>>
>> sql_generator.cc
>>
>>
>> You can remove this comment on line 102 (it is now done):
>>
>>      // TODO: Need to do json_in[].type() first and juggle it from
>> there to be safe. See json/value.h
>>
>>
>> I think you are now not covering the case where client makes a POST
>> into a table that doesn't exist and it needs to be created?
>>
>> This should be handled like this:
>> if req->type == POST
>>  ...
>>  executor->executeSQL()
>>  if error and error == table doesn't exist
>>     create table
>>     retry executeSQL()
>>  endif
>> endif
>>
>> (For any other errors, return them to client as usual.)
>>
>>
>> sql_executor.h
>>
>>  SQLExecutor(const string &user, const string &schema);
>>
>> I would omit user for now, we can put back user and password into the
>> API once we actually support authentication.
>>
>>
>> sql_executor.cc
>>
>> SQLExecutor::SQLExecutor(const string &user, const string &schema)
>>  : _in_error_state(false)
>> {
>>  /* setup a Session object */
>>  _session= Session::make_shared(plugin::Listen::getNullClient(),
>> catalog::local());
>>  identifier::user::mptr user_id= identifier::User::make_shared();
>>  user_id->setUser(user);
>>  _session->setUser(user_id);
>>  _session->set_schema(schema);
>>  _result_set= new sql::ResultSet(1);
>>  _sql="";
>> }
>>
>> I think the creation of a session needs to be outside of constructor.
>> The reason is that there could be errors, such as authentication, so
>> it is easier to handle in the code if it is a separate method and not
>> the constructor.
>>
>> Since in this case we really just execute one string of SQL, I propose
>> you just move the session stuff into executeSQL.
>>
>> The constructor would then be simply:
>>
>> SQLExecutor::SQLExecutor(const string &schema)
>>  : _in_error_state(false), _schema(schema), _sql("")
>> {
>> }
>>
>>
>> SQLToJsonGenerator.h
>>
>>    void generateJson(const char* s);
>>
>> Should be
>>
>>    void generateJson(enum evhttp_cmd_type type);
>>
>>
>>
>> SQLToJsonGenerator.cc
>>
>>
>>  void SQLToJsonGenerator::generateSQLErrorJson()
>>  {
>>    _json_out["error_type"]= _sql_executor->getErrorType();
>>    _json_out["error_message"]= _sql_executor->getErrorMessage();
>>    _json_out["error_code"]= _sql_executor->getErrorCode();
>>    _json_out["internal_sql_query"]= _sql_executor->getSql();
>>    _json_out["schema"]= _schema;
>>    _json_out["sqlstate"]= _sql_executor->getSqlState();
>>  }
>>
>>
>> Add also:
>>    _json_out["table"]= _table;
>>
>> ...even if it is redundant now, it will be useful later.
>>
>> I didn't look at HTTPHandler yet. Will do that separately. Looks
>> really good now!
>>
>> henrik
>>
>>
>>
>>
>> On Thu, Jun 14, 2012 at 12:55 PM, Mohit Srivastava
>> <srivastavamohi...@gmail.com> wrote:
>> > Hi Henrik,
>> >
>> > I have completed the DBAccess part too, but need to use enum. You might
>> help
>> > me in that too :)
>> > These are the new commits , you can find latest code here. Again please
>> > ignore json_server.cc right now.
>> >
>> > Updated plugin.ini , sql_generator & sql_executor:
>> >
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server/revision/2461
>> >
>> > Few changes in sql_generator:
>> >
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server/revision/2462
>> >
>> > New files added:
>> >
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server/revision/2463
>> >
>> > Remove a unwanted file ":w" :
>> >
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server/revision/2464
>> >
>> > Thanks
>> > --
>> > Mohit
>> >
>> >
>> > On Thu, Jun 14, 2012 at 12:53 AM, Mohit Srivastava
>> > <srivastavamohi...@gmail.com> wrote:
>> >>
>> >> Hi,
>> >> You can fond new code here.
>> >> Please ignore json_server.cc right now , I just use it for manual
>> testing.
>> >> Now I am on my way to write code for DBAccess.
>> >>
>> >>
>> >>
>> http://bazaar.launchpad.net/~srivastavamohit91/drizzle/drizzle-json_server/revision/2461
>> >>
>> >> Suggestions and comments are welcome :)
>> >>
>> >> Thanks
>> >> --
>> >> Mohit
>> >
>> >
>>
>>
>>
>> --
>> henrik.i...@avoinelama.fi
>> +358-40-8211286 skype: henrik.ingo irc: hingo
>> www.openlife.cc
>>
>> My LinkedIn profile: http://www.linkedin.com/profile/view?id=9522559
>>
>
>
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : drizzle-discuss@lists.launchpad.net
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to