Commit 8fdc4c8c by Konstantin Käfer

fix memory leaks

parent 72b2667b
...@@ -156,5 +156,14 @@ const char* sqlite_code_string(int code); ...@@ -156,5 +156,14 @@ const char* sqlite_code_string(int code);
stmt->db->Process(); \ stmt->db->Process(); \
delete baton; delete baton;
#define DELETE_FIELD(field) \
switch ((field)->type) { \
case SQLITE_INTEGER: delete (Data::Integer*)(field); break; \
case SQLITE_FLOAT: delete (Data::Float*)(field); break; \
case SQLITE_TEXT: delete (Data::Text*)(field); break; \
case SQLITE_BLOB: delete (Data::Blob*)(field); break; \
case SQLITE_NULL: delete (Data::Null*)(field); break; \
}
#endif #endif
...@@ -552,6 +552,7 @@ int Statement::EIO_AfterAll(eio_req *req) { ...@@ -552,6 +552,7 @@ int Statement::EIO_AfterAll(eio_req *req) {
Data::Rows::const_iterator end = baton->rows.end(); Data::Rows::const_iterator end = baton->rows.end();
for (int i = 0; it < end; it++, i++) { for (int i = 0; it < end; it++, i++) {
result->Set(i, RowToJS(*it)); result->Set(i, RowToJS(*it));
delete *it;
} }
Local<Value> argv[] = { Local<Value>::New(Null()), result }; Local<Value> argv[] = { Local<Value>::New(Null()), result };
...@@ -758,6 +759,8 @@ Local<Array> Statement::RowToJS(Data::Row* row) { ...@@ -758,6 +759,8 @@ Local<Array> Statement::RowToJS(Data::Row* row) {
result->Set(i, value); result->Set(i, value);
result->Set(String::NewSymbol(field->name.c_str()), value); result->Set(String::NewSymbol(field->name.c_str()), value);
DELETE_FIELD(field);
} }
return result; return result;
......
...@@ -84,15 +84,16 @@ public: ...@@ -84,15 +84,16 @@ public:
Data::Parameters parameters; Data::Parameters parameters;
Baton(Statement* stmt_, Handle<Function> cb_) : stmt(stmt_) { Baton(Statement* stmt_, Handle<Function> cb_) : stmt(stmt_) {
Data::Parameters::const_iterator it = parameters.begin();
Data::Parameters::const_iterator end = parameters.end();
for (; it < end; it++) delete *it;
stmt->Ref(); stmt->Ref();
ev_ref(EV_DEFAULT_UC); ev_ref(EV_DEFAULT_UC);
callback = Persistent<Function>::New(cb_); callback = Persistent<Function>::New(cb_);
} }
~Baton() { ~Baton() {
Data::Parameters::const_iterator it = parameters.begin();
Data::Parameters::const_iterator end = parameters.end();
for (; it < end; it++) {
DELETE_FIELD(*it);
}
stmt->Unref(); stmt->Unref();
ev_unref(EV_DEFAULT_UC); ev_unref(EV_DEFAULT_UC);
callback.Dispose(); callback.Dispose();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment