| 69 | } |
| 70 | |
| 71 | NODE_METHOD(Statement::JS_new) { |
| 72 | UseAddon; |
| 73 | if (!addon->privileged_info) { |
| 74 | return ThrowTypeError("Statements can only be constructed by the db.prepare() method"); |
| 75 | } |
| 76 | assert(info.IsConstructCall()); |
| 77 | Database* db = Unwrap<Database>(addon->privileged_info->This()); |
| 78 | REQUIRE_DATABASE_OPEN(db->GetState()); |
| 79 | REQUIRE_DATABASE_NOT_BUSY(db->GetState()); |
| 80 | |
| 81 | v8::Local<v8::String> source = (*addon->privileged_info)[0].As<v8::String>(); |
| 82 | v8::Local<v8::Object> database = (*addon->privileged_info)[1].As<v8::Object>(); |
| 83 | bool pragmaMode = (*addon->privileged_info)[2].As<v8::Boolean>()->Value(); |
| 84 | int flags = SQLITE_PREPARE_PERSISTENT; |
| 85 | |
| 86 | if (pragmaMode) { |
| 87 | REQUIRE_DATABASE_NO_ITERATORS_UNLESS_UNSAFE(db->GetState()); |
| 88 | flags = 0; |
| 89 | } |
| 90 | |
| 91 | UseIsolate; |
| 92 | v8::String::Utf8Value utf8(isolate, source); |
| 93 | sqlite3_stmt* handle; |
| 94 | const char* tail; |
| 95 | |
| 96 | if (sqlite3_prepare_v3(db->GetHandle(), *utf8, utf8.length() + 1, flags, &handle, &tail) != SQLITE_OK) { |
| 97 | return db->ThrowDatabaseError(); |
| 98 | } |
| 99 | if (handle == NULL) { |
| 100 | return ThrowRangeError("The supplied SQL string contains no statements"); |
| 101 | } |
| 102 | // https://github.com/WiseLibs/better-sqlite3/issues/975#issuecomment-1520934678 |
| 103 | for (char c; (c = *tail); ) { |
| 104 | if (IS_SKIPPED(c)) { |
| 105 | ++tail; |
| 106 | continue; |
| 107 | } |
| 108 | if (c == '/' && tail[1] == '*') { |
| 109 | tail += 2; |
| 110 | for (char c; (c = *tail); ++tail) { |
| 111 | if (c == '*' && tail[1] == '/') { |
| 112 | tail += 2; |
| 113 | break; |
| 114 | } |
| 115 | } |
| 116 | } else if (c == '-' && tail[1] == '-') { |
| 117 | tail += 2; |
| 118 | for (char c; (c = *tail); ++tail) { |
| 119 | if (c == '\n') { |
| 120 | ++tail; |
| 121 | break; |
| 122 | } |
| 123 | } |
| 124 | } else { |
| 125 | sqlite3_finalize(handle); |
| 126 | return ThrowRangeError("The supplied SQL string contains more than one statement"); |
| 127 | } |
| 128 | } |
nothing calls this directly
no test coverage detected