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