MCPcopy Create free account
hub / github.com/WiseLibs/better-sqlite3 / NODE_METHOD

Function NODE_METHOD

src/objects/statement.cpp:71–140  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

69}
70
71NODE_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 }

Callers

nothing calls this directly

Calls 12

ThrowTypeErrorFunction · 0.85
ThrowRangeErrorFunction · 0.85
IS_SKIPPEDFunction · 0.85
SetFrozenFunction · 0.85
GetRowJSFunction · 0.85
GetStateMethod · 0.80
GetHandleMethod · 0.80
ThrowDatabaseErrorMethod · 0.80
NextIdMethod · 0.80
GetAddonMethod · 0.80
GetRowJSMethod · 0.80

Tested by

no test coverage detected