| 142 | } |
| 143 | |
| 144 | NODE_METHOD(Database::JS_new) { |
| 145 | assert(info.IsConstructCall()); |
| 146 | REQUIRE_ARGUMENT_STRING(first, v8::Local<v8::String> filename); |
| 147 | REQUIRE_ARGUMENT_STRING(second, v8::Local<v8::String> filenameGiven); |
| 148 | REQUIRE_ARGUMENT_BOOLEAN(third, bool in_memory); |
| 149 | REQUIRE_ARGUMENT_BOOLEAN(fourth, bool readonly); |
| 150 | REQUIRE_ARGUMENT_BOOLEAN(fifth, bool must_exist); |
| 151 | REQUIRE_ARGUMENT_INT32(sixth, int timeout); |
| 152 | REQUIRE_ARGUMENT_ANY(seventh, v8::Local<v8::Value> logger); |
| 153 | REQUIRE_ARGUMENT_ANY(eighth, v8::Local<v8::Value> buffer); |
| 154 | |
| 155 | UseAddon; |
| 156 | UseIsolate; |
| 157 | sqlite3* db_handle; |
| 158 | v8::String::Utf8Value utf8(isolate, filename); |
| 159 | int mask = readonly ? SQLITE_OPEN_READONLY |
| 160 | : must_exist ? SQLITE_OPEN_READWRITE |
| 161 | : (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); |
| 162 | |
| 163 | if (sqlite3_open_v2(*utf8, &db_handle, mask, NULL) != SQLITE_OK) { |
| 164 | ThrowSqliteError(addon, db_handle); |
| 165 | int status = sqlite3_close(db_handle); |
| 166 | assert(status == SQLITE_OK); ((void)status); |
| 167 | return; |
| 168 | } |
| 169 | |
| 170 | assert(sqlite3_db_mutex(db_handle) == NULL); |
| 171 | sqlite3_extended_result_codes(db_handle, 1); |
| 172 | sqlite3_busy_timeout(db_handle, timeout); |
| 173 | sqlite3_limit(db_handle, SQLITE_LIMIT_LENGTH, MAX_BUFFER_SIZE < MAX_STRING_SIZE ? MAX_BUFFER_SIZE : MAX_STRING_SIZE); |
| 174 | sqlite3_limit(db_handle, SQLITE_LIMIT_SQL_LENGTH, MAX_STRING_SIZE); |
| 175 | int status = sqlite3_db_config(db_handle, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, NULL); |
| 176 | assert(status == SQLITE_OK); ((void)status); |
| 177 | status = sqlite3_db_config(db_handle, SQLITE_DBCONFIG_DEFENSIVE, 1, NULL); |
| 178 | assert(status == SQLITE_OK); ((void)status); |
| 179 | |
| 180 | if (node::Buffer::HasInstance(buffer) && !Deserialize(buffer.As<v8::Object>(), addon, db_handle, readonly)) { |
| 181 | int status = sqlite3_close(db_handle); |
| 182 | assert(status == SQLITE_OK); ((void)status); |
| 183 | return; |
| 184 | } |
| 185 | |
| 186 | UseContext; |
| 187 | Database* db = new Database(isolate, addon, db_handle, logger); |
| 188 | db->Wrap(info.This()); |
| 189 | SetFrozen(isolate, ctx, info.This(), addon->cs.memory, v8::Boolean::New(isolate, in_memory)); |
| 190 | SetFrozen(isolate, ctx, info.This(), addon->cs.readonly, v8::Boolean::New(isolate, readonly)); |
| 191 | SetFrozen(isolate, ctx, info.This(), addon->cs.name, filenameGiven); |
| 192 | |
| 193 | info.GetReturnValue().Set(info.This()); |
| 194 | } |
| 195 | |
| 196 | NODE_METHOD(Database::JS_prepare) { |
| 197 | REQUIRE_ARGUMENT_STRING(first, v8::Local<v8::String> source); |
nothing calls this directly
no test coverage detected