// better_sqlite3.hpp // #ifndef LZZ_BETTER_SQLITE3_better_sqlite3_hpp #define LZZ_BETTER_SQLITE3_better_sqlite3_hpp #line 2 "./src/better_sqlite3.lzz" #include #include #include #include #include #include #include #include #include #include #include #include #line 31 "./src/util/macros.lzz" template using CopyablePersistent = v8::Persistent>; #line 36 "./src/util/binder.lzz" static bool IsPlainObject(v8::Isolate* isolate, v8::Local obj); #define LZZ_INLINE inline #line 16 "./src/util/macros.lzz" v8::Local StringFromUtf8 (v8::Isolate * isolate, char const * data, int length); #line 19 "./src/util/macros.lzz" v8::Local InternalizedFromUtf8 (v8::Isolate * isolate, char const * data, int length); #line 22 "./src/util/macros.lzz" v8::Local InternalizedFromUtf8OrNull (v8::Isolate * isolate, char const * data, int length); #line 26 "./src/util/macros.lzz" v8::Local InternalizedFromLatin1 (v8::Isolate * isolate, char const * str); #line 33 "./src/util/macros.lzz" void SetFrozen (v8::Isolate * isolate, v8::Local ctx, v8::Local obj, CopyablePersistent & key, v8::Local value); #line 37 "./src/util/macros.lzz" void ThrowError (char const * message); #line 38 "./src/util/macros.lzz" void ThrowTypeError (char const * message); #line 39 "./src/util/macros.lzz" void ThrowRangeError (char const * message); #line 91 "./src/util/macros.lzz" bool IS_SKIPPED (char c); #line 96 "./src/util/macros.lzz" template #line 96 "./src/util/macros.lzz" T * ALLOC_ARRAY (size_t count); #line 101 "./src/util/macros.lzz" template #line 101 "./src/util/macros.lzz" void FREE_ARRAY (T * array_pointer); #line 105 "./src/util/macros.lzz" v8::Local NewConstructorTemplate (v8::Isolate * isolate, v8::Local data, v8::FunctionCallback func, char const * name); #line 116 "./src/util/macros.lzz" void SetPrototypeMethod (v8::Isolate * isolate, v8::Local data, v8::Local recv, char const * name, v8::FunctionCallback func); #line 129 "./src/util/macros.lzz" void SetPrototypeSymbolMethod (v8::Isolate * isolate, v8::Local data, v8::Local recv, v8::Local symbol, v8::FunctionCallback func); #line 142 "./src/util/macros.lzz" void SetPrototypeGetter (v8::Isolate * isolate, v8::Local data, v8::Local recv, char const * name, v8::AccessorGetterCallback func); #line 1 "./src/util/constants.lzz" class CS { #line 2 "./src/util/constants.lzz" public: #line 4 "./src/util/constants.lzz" v8::Local Code (v8::Isolate * isolate, int code); #line 10 "./src/util/constants.lzz" explicit CS (v8::Isolate * isolate); #line 119 "./src/util/constants.lzz" CopyablePersistent database; #line 120 "./src/util/constants.lzz" CopyablePersistent reader; #line 121 "./src/util/constants.lzz" CopyablePersistent source; #line 122 "./src/util/constants.lzz" CopyablePersistent memory; #line 123 "./src/util/constants.lzz" CopyablePersistent readonly; #line 124 "./src/util/constants.lzz" CopyablePersistent name; #line 125 "./src/util/constants.lzz" CopyablePersistent next; #line 126 "./src/util/constants.lzz" CopyablePersistent length; #line 127 "./src/util/constants.lzz" CopyablePersistent done; #line 128 "./src/util/constants.lzz" CopyablePersistent value; #line 129 "./src/util/constants.lzz" CopyablePersistent changes; #line 130 "./src/util/constants.lzz" CopyablePersistent lastInsertRowid; #line 131 "./src/util/constants.lzz" CopyablePersistent statement; #line 132 "./src/util/constants.lzz" CopyablePersistent column; #line 133 "./src/util/constants.lzz" CopyablePersistent table; #line 134 "./src/util/constants.lzz" CopyablePersistent type; #line 135 "./src/util/constants.lzz" CopyablePersistent totalPages; #line 136 "./src/util/constants.lzz" CopyablePersistent remainingPages; #line 138 "./src/util/constants.lzz" private: #line 140 "./src/util/constants.lzz" static void SetString (v8::Isolate * isolate, CopyablePersistent & constant, char const * str); #line 144 "./src/util/constants.lzz" void SetCode (v8::Isolate * isolate, int code, char const * str); #line 150 "./src/util/constants.lzz" std::unordered_map > codes; }; #line 1 "./src/util/bind-map.lzz" class BindMap { #line 2 "./src/util/bind-map.lzz" public: #line 6 "./src/util/bind-map.lzz" class Pair { #line 6 "./src/util/bind-map.lzz" friend class BindMap; #line 7 "./src/util/bind-map.lzz" public: #line 9 "./src/util/bind-map.lzz" int GetIndex (); #line 13 "./src/util/bind-map.lzz" v8::Local GetName (v8::Isolate * isolate); #line 17 "./src/util/bind-map.lzz" private: #line 19 "./src/util/bind-map.lzz" explicit Pair (v8::Isolate * isolate, char const * name, int index); #line 22 "./src/util/bind-map.lzz" explicit Pair (v8::Isolate * isolate, Pair * pair); #line 25 "./src/util/bind-map.lzz" CopyablePersistent const name; #line 26 "./src/util/bind-map.lzz" int const index; }; #line 29 "./src/util/bind-map.lzz" explicit BindMap (char _); #line 36 "./src/util/bind-map.lzz" ~ BindMap (); #line 41 "./src/util/bind-map.lzz" Pair * GetPairs (); #line 45 "./src/util/bind-map.lzz" int GetSize (); #line 50 "./src/util/bind-map.lzz" void Add (v8::Isolate * isolate, char const * name, int index); #line 56 "./src/util/bind-map.lzz" private: #line 58 "./src/util/bind-map.lzz" void Grow (v8::Isolate * isolate); #line 70 "./src/util/bind-map.lzz" Pair * pairs; #line 71 "./src/util/bind-map.lzz" int capacity; #line 72 "./src/util/bind-map.lzz" int length; }; #line 20 "./src/better_sqlite3.lzz" struct Addon; #line 21 "./src/better_sqlite3.lzz" class Statement; #line 22 "./src/better_sqlite3.lzz" class Backup; #line 1 "./src/objects/database.lzz" class Database : public node::ObjectWrap { #line 2 "./src/objects/database.lzz" public: #line 4 "./src/objects/database.lzz" static v8::Local Init (v8::Isolate * isolate, v8::Local data); #line 23 "./src/objects/database.lzz" class CompareDatabase { #line 23 "./src/objects/database.lzz" public: #line 24 "./src/objects/database.lzz" bool operator () (Database const * const a, Database const * const b) const; }; #line 28 "./src/objects/database.lzz" class CompareStatement { #line 28 "./src/objects/database.lzz" public: #line 29 "./src/objects/database.lzz" bool operator () (Statement const * const a, Statement const * const b) const; }; #line 33 "./src/objects/database.lzz" class CompareBackup { #line 33 "./src/objects/database.lzz" public: #line 34 "./src/objects/database.lzz" bool operator () (Backup const * const a, Backup const * const b) const; }; #line 40 "./src/objects/database.lzz" void ThrowDatabaseError (); #line 44 "./src/objects/database.lzz" static void ThrowSqliteError (Addon * addon, sqlite3 * db_handle); #line 48 "./src/objects/database.lzz" static void ThrowSqliteError (Addon * addon, char const * message, int code); #line 64 "./src/objects/database.lzz" bool Log (v8::Isolate * isolate, sqlite3_stmt * handle); #line 77 "./src/objects/database.lzz" void AddStatement (Statement * stmt); #line 78 "./src/objects/database.lzz" void RemoveStatement (Statement * stmt); #line 81 "./src/objects/database.lzz" void AddBackup (Backup * backup); #line 82 "./src/objects/database.lzz" void RemoveBackup (Backup * backup); #line 86 "./src/objects/database.lzz" struct State { #line 87 "./src/objects/database.lzz" bool const open; #line 88 "./src/objects/database.lzz" bool busy; #line 89 "./src/objects/database.lzz" bool const safe_ints; #line 90 "./src/objects/database.lzz" bool const unsafe_mode; #line 91 "./src/objects/database.lzz" bool was_js_error; #line 92 "./src/objects/database.lzz" bool const has_logger; #line 93 "./src/objects/database.lzz" unsigned short int iterators; #line 94 "./src/objects/database.lzz" Addon * const addon; }; #line 96 "./src/objects/database.lzz" State * GetState (); #line 99 "./src/objects/database.lzz" sqlite3 * GetHandle (); #line 102 "./src/objects/database.lzz" Addon * GetAddon (); #line 107 "./src/objects/database.lzz" void CloseHandles (); #line 119 "./src/objects/database.lzz" ~ Database (); #line 124 "./src/objects/database.lzz" private: #line 126 "./src/objects/database.lzz" explicit Database (v8::Isolate * isolate, Addon * addon, sqlite3 * db_handle, v8::Local logger); #line 149 "./src/objects/database.lzz" static void JS_new (v8::FunctionCallbackInfo const & info); #line 201 "./src/objects/database.lzz" static void JS_prepare (v8::FunctionCallbackInfo const & info); #line 217 "./src/objects/database.lzz" static void JS_exec (v8::FunctionCallbackInfo const & info); #line 257 "./src/objects/database.lzz" static void JS_backup (v8::FunctionCallbackInfo const & info); #line 275 "./src/objects/database.lzz" static void JS_serialize (v8::FunctionCallbackInfo const & info); #line 297 "./src/objects/database.lzz" static void JS_function (v8::FunctionCallbackInfo const & info); #line 321 "./src/objects/database.lzz" static void JS_aggregate (v8::FunctionCallbackInfo const & info); #line 350 "./src/objects/database.lzz" static void JS_table (v8::FunctionCallbackInfo const & info); #line 370 "./src/objects/database.lzz" static void JS_loadExtension (v8::FunctionCallbackInfo const & info); #line 392 "./src/objects/database.lzz" static void JS_close (v8::FunctionCallbackInfo const & info); #line 402 "./src/objects/database.lzz" static void JS_defaultSafeIntegers (v8::FunctionCallbackInfo const & info); #line 408 "./src/objects/database.lzz" static void JS_unsafeMode (v8::FunctionCallbackInfo const & info); #line 415 "./src/objects/database.lzz" static void JS_open (v8::Local _, v8::PropertyCallbackInfo const & info); #line 419 "./src/objects/database.lzz" static void JS_inTransaction (v8::Local _, v8::PropertyCallbackInfo const & info); #line 424 "./src/objects/database.lzz" static bool Deserialize (v8::Local buffer, Addon * addon, sqlite3 * db_handle, bool readonly); #line 449 "./src/objects/database.lzz" static void FreeSerialization (char * data, void * _); #line 453 "./src/objects/database.lzz" static int const MAX_BUFFER_SIZE = node::Buffer::kMaxLength > INT_MAX ? INT_MAX : static_cast(node::Buffer::kMaxLength); #line 454 "./src/objects/database.lzz" static int const MAX_STRING_SIZE = v8::String::kMaxLength > INT_MAX ? INT_MAX : static_cast(v8::String::kMaxLength); #line 456 "./src/objects/database.lzz" sqlite3 * const db_handle; #line 457 "./src/objects/database.lzz" bool open; #line 458 "./src/objects/database.lzz" bool busy; #line 459 "./src/objects/database.lzz" bool safe_ints; #line 460 "./src/objects/database.lzz" bool unsafe_mode; #line 461 "./src/objects/database.lzz" bool was_js_error; #line 462 "./src/objects/database.lzz" bool const has_logger; #line 463 "./src/objects/database.lzz" unsigned short int iterators; #line 464 "./src/objects/database.lzz" Addon * const addon; #line 465 "./src/objects/database.lzz" CopyablePersistent const logger; #line 466 "./src/objects/database.lzz" std::set stmts; #line 467 "./src/objects/database.lzz" std::set backups; }; #line 1 "./src/objects/statement.lzz" class Statement : public node::ObjectWrap { #line 1 "./src/objects/statement.lzz" friend class StatementIterator; #line 2 "./src/objects/statement.lzz" public: #line 4 "./src/objects/statement.lzz" static v8::Local Init (v8::Isolate * isolate, v8::Local data); #line 21 "./src/objects/statement.lzz" static bool Compare (Statement const * const a, Statement const * const b); #line 26 "./src/objects/statement.lzz" BindMap * GetBindMap (v8::Isolate * isolate); #line 39 "./src/objects/statement.lzz" void CloseHandles (); #line 46 "./src/objects/statement.lzz" ~ Statement (); #line 52 "./src/objects/statement.lzz" private: #line 55 "./src/objects/statement.lzz" class Extras { #line 55 "./src/objects/statement.lzz" friend class Statement; #line 56 "./src/objects/statement.lzz" explicit Extras (sqlite3_uint64 id); #line 57 "./src/objects/statement.lzz" BindMap bind_map; #line 58 "./src/objects/statement.lzz" sqlite3_uint64 const id; }; #line 61 "./src/objects/statement.lzz" explicit Statement (Database * db, sqlite3_stmt * handle, sqlite3_uint64 id, bool returns_data); #line 85 "./src/objects/statement.lzz" static void JS_new (v8::FunctionCallbackInfo const & info); #line 156 "./src/objects/statement.lzz" static void JS_run (v8::FunctionCallbackInfo const & info); #line 179 "./src/objects/statement.lzz" static void JS_get (v8::FunctionCallbackInfo const & info); #line 194 "./src/objects/statement.lzz" static void JS_all (v8::FunctionCallbackInfo const & info); #line 215 "./src/objects/statement.lzz" static void JS_iterate (v8::FunctionCallbackInfo const & info); #line 225 "./src/objects/statement.lzz" static void JS_bind (v8::FunctionCallbackInfo const & info); #line 236 "./src/objects/statement.lzz" static void JS_pluck (v8::FunctionCallbackInfo const & info); #line 247 "./src/objects/statement.lzz" static void JS_expand (v8::FunctionCallbackInfo const & info); #line 258 "./src/objects/statement.lzz" static void JS_raw (v8::FunctionCallbackInfo const & info); #line 269 "./src/objects/statement.lzz" static void JS_safeIntegers (v8::FunctionCallbackInfo const & info); #line 278 "./src/objects/statement.lzz" static void JS_columns (v8::FunctionCallbackInfo const & info); #line 321 "./src/objects/statement.lzz" static void JS_busy (v8::Local _, v8::PropertyCallbackInfo const & info); #line 326 "./src/objects/statement.lzz" Database * const db; #line 327 "./src/objects/statement.lzz" sqlite3_stmt * const handle; #line 328 "./src/objects/statement.lzz" Extras * const extras; #line 329 "./src/objects/statement.lzz" bool alive; #line 330 "./src/objects/statement.lzz" bool locked; #line 331 "./src/objects/statement.lzz" bool bound; #line 332 "./src/objects/statement.lzz" bool has_bind_map; #line 333 "./src/objects/statement.lzz" bool safe_ints; #line 334 "./src/objects/statement.lzz" char mode; #line 335 "./src/objects/statement.lzz" bool const returns_data; }; #line 1 "./src/objects/statement-iterator.lzz" class StatementIterator : public node::ObjectWrap { #line 2 "./src/objects/statement-iterator.lzz" public: #line 4 "./src/objects/statement-iterator.lzz" static v8::Local Init (v8::Isolate * isolate, v8::Local data); #line 15 "./src/objects/statement-iterator.lzz" ~ StatementIterator (); #line 17 "./src/objects/statement-iterator.lzz" private: #line 19 "./src/objects/statement-iterator.lzz" explicit StatementIterator (Statement * stmt, bool bound); #line 38 "./src/objects/statement-iterator.lzz" static void JS_new (v8::FunctionCallbackInfo const & info); #line 57 "./src/objects/statement-iterator.lzz" static void JS_next (v8::FunctionCallbackInfo const & info); #line 64 "./src/objects/statement-iterator.lzz" static void JS_return (v8::FunctionCallbackInfo const & info); #line 71 "./src/objects/statement-iterator.lzz" static void JS_symbolIterator (v8::FunctionCallbackInfo const & info); #line 75 "./src/objects/statement-iterator.lzz" void Next (v8::FunctionCallbackInfo const & info); #line 100 "./src/objects/statement-iterator.lzz" void Return (v8::FunctionCallbackInfo const & info); #line 105 "./src/objects/statement-iterator.lzz" void Throw (); #line 111 "./src/objects/statement-iterator.lzz" void Cleanup (); #line 119 "./src/objects/statement-iterator.lzz" static v8::Local NewRecord (v8::Isolate * isolate, v8::Local ctx, v8::Local value, Addon * addon, bool done); #line 126 "./src/objects/statement-iterator.lzz" static v8::Local DoneRecord (v8::Isolate * isolate, Addon * addon); #line 130 "./src/objects/statement-iterator.lzz" Statement * const stmt; #line 131 "./src/objects/statement-iterator.lzz" sqlite3_stmt * const handle; #line 132 "./src/objects/statement-iterator.lzz" Database::State * const db_state; #line 133 "./src/objects/statement-iterator.lzz" bool const bound; #line 134 "./src/objects/statement-iterator.lzz" bool const safe_ints; #line 135 "./src/objects/statement-iterator.lzz" char const mode; #line 136 "./src/objects/statement-iterator.lzz" bool alive; #line 137 "./src/objects/statement-iterator.lzz" bool logged; }; #line 1 "./src/objects/backup.lzz" class Backup : public node::ObjectWrap { #line 2 "./src/objects/backup.lzz" public: #line 4 "./src/objects/backup.lzz" static v8::Local Init (v8::Isolate * isolate, v8::Local data); #line 12 "./src/objects/backup.lzz" static bool Compare (Backup const * const a, Backup const * const b); #line 17 "./src/objects/backup.lzz" void CloseHandles (); #line 28 "./src/objects/backup.lzz" ~ Backup (); #line 33 "./src/objects/backup.lzz" private: #line 35 "./src/objects/backup.lzz" explicit Backup (Database * db, sqlite3 * dest_handle, sqlite3_backup * backup_handle, sqlite3_uint64 id, bool unlink); #line 55 "./src/objects/backup.lzz" static void JS_new (v8::FunctionCallbackInfo const & info); #line 98 "./src/objects/backup.lzz" static void JS_transfer (v8::FunctionCallbackInfo const & info); #line 124 "./src/objects/backup.lzz" static void JS_close (v8::FunctionCallbackInfo const & info); #line 132 "./src/objects/backup.lzz" Database * const db; #line 133 "./src/objects/backup.lzz" sqlite3 * const dest_handle; #line 134 "./src/objects/backup.lzz" sqlite3_backup * const backup_handle; #line 135 "./src/objects/backup.lzz" sqlite3_uint64 const id; #line 136 "./src/objects/backup.lzz" bool alive; #line 137 "./src/objects/backup.lzz" bool unlink; }; #line 1 "./src/util/data-converter.lzz" class DataConverter { #line 2 "./src/util/data-converter.lzz" public: #line 4 "./src/util/data-converter.lzz" void ThrowDataConversionError (sqlite3_context * invocation, bool isBigInt); #line 13 "./src/util/data-converter.lzz" protected: #line 15 "./src/util/data-converter.lzz" virtual void PropagateJSError (sqlite3_context * invocation) = 0; #line 16 "./src/util/data-converter.lzz" virtual std::string GetDataErrorPrefix () = 0; }; #line 1 "./src/util/custom-function.lzz" class CustomFunction : protected DataConverter { #line 2 "./src/util/custom-function.lzz" public: #line 4 "./src/util/custom-function.lzz" explicit CustomFunction (v8::Isolate * isolate, Database * db, char const * name, v8::Local fn, bool safe_ints); #line 17 "./src/util/custom-function.lzz" virtual ~ CustomFunction (); #line 19 "./src/util/custom-function.lzz" static void xDestroy (void * self); #line 23 "./src/util/custom-function.lzz" static void xFunc (sqlite3_context * invocation, int argc, sqlite3_value * * argv); #line 40 "./src/util/custom-function.lzz" protected: #line 42 "./src/util/custom-function.lzz" void PropagateJSError (sqlite3_context * invocation); #line 48 "./src/util/custom-function.lzz" std::string GetDataErrorPrefix (); #line 52 "./src/util/custom-function.lzz" private: #line 53 "./src/util/custom-function.lzz" std::string const name; #line 54 "./src/util/custom-function.lzz" Database * const db; #line 55 "./src/util/custom-function.lzz" protected: #line 56 "./src/util/custom-function.lzz" v8::Isolate * const isolate; #line 57 "./src/util/custom-function.lzz" CopyablePersistent const fn; #line 58 "./src/util/custom-function.lzz" bool const safe_ints; }; #line 1 "./src/util/custom-aggregate.lzz" class CustomAggregate : public CustomFunction { #line 2 "./src/util/custom-aggregate.lzz" public: #line 4 "./src/util/custom-aggregate.lzz" explicit CustomAggregate (v8::Isolate * isolate, Database * db, char const * name, v8::Local start, v8::Local step, v8::Local inverse, v8::Local result, bool safe_ints); #line 21 "./src/util/custom-aggregate.lzz" static void xStep (sqlite3_context * invocation, int argc, sqlite3_value * * argv); #line 25 "./src/util/custom-aggregate.lzz" static void xInverse (sqlite3_context * invocation, int argc, sqlite3_value * * argv); #line 29 "./src/util/custom-aggregate.lzz" static void xValue (sqlite3_context * invocation); #line 33 "./src/util/custom-aggregate.lzz" static void xFinal (sqlite3_context * invocation); #line 37 "./src/util/custom-aggregate.lzz" private: #line 39 "./src/util/custom-aggregate.lzz" static void xStepBase (sqlite3_context * invocation, int argc, sqlite3_value * * argv, CopyablePersistent const CustomAggregate::* ptrtm); #line 58 "./src/util/custom-aggregate.lzz" static void xValueBase (sqlite3_context * invocation, bool is_final); #line 82 "./src/util/custom-aggregate.lzz" struct Accumulator { #line 82 "./src/util/custom-aggregate.lzz" public: #line 83 "./src/util/custom-aggregate.lzz" CopyablePersistent value; #line 84 "./src/util/custom-aggregate.lzz" bool initialized; #line 85 "./src/util/custom-aggregate.lzz" bool is_window; }; #line 88 "./src/util/custom-aggregate.lzz" Accumulator * GetAccumulator (sqlite3_context * invocation); #line 105 "./src/util/custom-aggregate.lzz" static void DestroyAccumulator (sqlite3_context * invocation); #line 111 "./src/util/custom-aggregate.lzz" void PropagateJSError (sqlite3_context * invocation); #line 116 "./src/util/custom-aggregate.lzz" bool const invoke_result; #line 117 "./src/util/custom-aggregate.lzz" bool const invoke_start; #line 118 "./src/util/custom-aggregate.lzz" CopyablePersistent const inverse; #line 119 "./src/util/custom-aggregate.lzz" CopyablePersistent const result; #line 120 "./src/util/custom-aggregate.lzz" CopyablePersistent const start; }; #line 1 "./src/util/custom-table.lzz" class CustomTable { #line 2 "./src/util/custom-table.lzz" public: #line 4 "./src/util/custom-table.lzz" explicit CustomTable (v8::Isolate * isolate, Database * db, char const * name, v8::Local factory); #line 16 "./src/util/custom-table.lzz" static void Destructor (void * self); #line 20 "./src/util/custom-table.lzz" static sqlite3_module MODULE; #line 47 "./src/util/custom-table.lzz" static sqlite3_module EPONYMOUS_MODULE; #line 74 "./src/util/custom-table.lzz" private: #line 77 "./src/util/custom-table.lzz" class VTab { #line 77 "./src/util/custom-table.lzz" friend class CustomTable; #line 78 "./src/util/custom-table.lzz" explicit VTab (CustomTable * parent, v8::Local generator, std::vector parameter_names, bool safe_ints); #line 92 "./src/util/custom-table.lzz" static CustomTable::VTab * Upcast (sqlite3_vtab * vtab); #line 96 "./src/util/custom-table.lzz" sqlite3_vtab * Downcast (); #line 100 "./src/util/custom-table.lzz" sqlite3_vtab base; #line 101 "./src/util/custom-table.lzz" CustomTable * const parent; #line 102 "./src/util/custom-table.lzz" int const parameter_count; #line 103 "./src/util/custom-table.lzz" bool const safe_ints; #line 104 "./src/util/custom-table.lzz" CopyablePersistent const generator; #line 105 "./src/util/custom-table.lzz" std::vector const parameter_names; }; #line 109 "./src/util/custom-table.lzz" class Cursor { #line 109 "./src/util/custom-table.lzz" friend class CustomTable; #line 110 "./src/util/custom-table.lzz" static CustomTable::Cursor * Upcast (sqlite3_vtab_cursor * cursor); #line 114 "./src/util/custom-table.lzz" sqlite3_vtab_cursor * Downcast (); #line 118 "./src/util/custom-table.lzz" CustomTable::VTab * GetVTab (); #line 122 "./src/util/custom-table.lzz" sqlite3_vtab_cursor base; #line 123 "./src/util/custom-table.lzz" CopyablePersistent iterator; #line 124 "./src/util/custom-table.lzz" CopyablePersistent next; #line 125 "./src/util/custom-table.lzz" CopyablePersistent row; #line 126 "./src/util/custom-table.lzz" bool done; #line 127 "./src/util/custom-table.lzz" sqlite_int64 rowid; }; #line 131 "./src/util/custom-table.lzz" class TempDataConverter : DataConverter { #line 131 "./src/util/custom-table.lzz" friend class CustomTable; #line 132 "./src/util/custom-table.lzz" explicit TempDataConverter (CustomTable * parent); #line 136 "./src/util/custom-table.lzz" void PropagateJSError (sqlite3_context * invocation); #line 141 "./src/util/custom-table.lzz" std::string GetDataErrorPrefix (); #line 145 "./src/util/custom-table.lzz" CustomTable * const parent; #line 146 "./src/util/custom-table.lzz" int status; }; #line 151 "./src/util/custom-table.lzz" static int xCreate (sqlite3 * db_handle, void * _self, int argc, char const * const * argv, sqlite3_vtab * * output, char * * errOutput); #line 156 "./src/util/custom-table.lzz" static int xConnect (sqlite3 * db_handle, void * _self, int argc, char const * const * argv, sqlite3_vtab * * output, char * * errOutput); #line 210 "./src/util/custom-table.lzz" static int xDisconnect (sqlite3_vtab * vtab); #line 215 "./src/util/custom-table.lzz" static int xOpen (sqlite3_vtab * vtab, sqlite3_vtab_cursor * * output); #line 220 "./src/util/custom-table.lzz" static int xClose (sqlite3_vtab_cursor * cursor); #line 228 "./src/util/custom-table.lzz" static int xFilter (sqlite3_vtab_cursor * _cursor, int idxNum, char const * idxStr, int argc, sqlite3_value * * argv); #line 284 "./src/util/custom-table.lzz" static int xNext (sqlite3_vtab_cursor * _cursor); #line 313 "./src/util/custom-table.lzz" static int xEof (sqlite3_vtab_cursor * cursor); #line 318 "./src/util/custom-table.lzz" static int xColumn (sqlite3_vtab_cursor * _cursor, sqlite3_context * invocation, int column); #line 336 "./src/util/custom-table.lzz" static int xRowid (sqlite3_vtab_cursor * cursor, sqlite_int64 * output); #line 343 "./src/util/custom-table.lzz" static int xBestIndex (sqlite3_vtab * vtab, sqlite3_index_info * output); #line 394 "./src/util/custom-table.lzz" void PropagateJSError (); #line 399 "./src/util/custom-table.lzz" Addon * const addon; #line 400 "./src/util/custom-table.lzz" v8::Isolate * const isolate; #line 401 "./src/util/custom-table.lzz" Database * const db; #line 402 "./src/util/custom-table.lzz" std::string const name; #line 403 "./src/util/custom-table.lzz" CopyablePersistent const factory; }; #line 65 "./src/util/data.lzz" namespace Data { #line 72 "./src/util/data.lzz" v8::Local GetValueJS (v8::Isolate * isolate, sqlite3_stmt * handle, int column, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 76 "./src/util/data.lzz" v8::Local GetValueJS (v8::Isolate * isolate, sqlite3_value * value, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 80 "./src/util/data.lzz" v8::Local GetFlatRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 91 "./src/util/data.lzz" v8::Local GetExpandedRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 110 "./src/util/data.lzz" v8::Local GetRawRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 119 "./src/util/data.lzz" v8::Local GetRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints, char mode); } #line 65 "./src/util/data.lzz" namespace Data { #line 128 "./src/util/data.lzz" void GetArgumentsJS (v8::Isolate * isolate, v8::Local * out, sqlite3_value * * values, int argument_count, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { #line 135 "./src/util/data.lzz" int BindValueFromJS (v8::Isolate * isolate, sqlite3_stmt * handle, int index, v8::Local value); } #line 65 "./src/util/data.lzz" namespace Data { #line 140 "./src/util/data.lzz" void ResultValueFromJS (v8::Isolate * isolate, sqlite3_context * invocation, v8::Local value, DataConverter * converter); } #line 1 "./src/util/binder.lzz" class Binder { #line 2 "./src/util/binder.lzz" public: #line 4 "./src/util/binder.lzz" explicit Binder (sqlite3_stmt * _handle); #line 11 "./src/util/binder.lzz" bool Bind (v8::FunctionCallbackInfo const & info, int argc, Statement * stmt); #line 28 "./src/util/binder.lzz" private: #line 30 "./src/util/binder.lzz" struct Result { #line 31 "./src/util/binder.lzz" int count; #line 32 "./src/util/binder.lzz" bool bound_object; }; #line 55 "./src/util/binder.lzz" void Fail (void (* Throw) (char const *), char const * message); #line 63 "./src/util/binder.lzz" int NextAnonIndex (); #line 69 "./src/util/binder.lzz" void BindValue (v8::Isolate * isolate, v8::Local value, int index); #line 90 "./src/util/binder.lzz" int BindArray (v8::Isolate * isolate, v8::Local arr); #line 116 "./src/util/binder.lzz" int BindObject (v8::Isolate * isolate, v8::Local obj, Statement * stmt); #line 160 "./src/util/binder.lzz" Result BindArgs (v8::FunctionCallbackInfo const & info, int argc, Statement * stmt); #line 200 "./src/util/binder.lzz" sqlite3_stmt * handle; #line 201 "./src/util/binder.lzz" int param_count; #line 202 "./src/util/binder.lzz" int anon_index; #line 203 "./src/util/binder.lzz" bool success; }; #line 34 "./src/better_sqlite3.lzz" struct Addon { #line 35 "./src/better_sqlite3.lzz" static void JS_setErrorConstructor (v8::FunctionCallbackInfo const & info); #line 40 "./src/better_sqlite3.lzz" static void Cleanup (void * ptr); #line 47 "./src/better_sqlite3.lzz" explicit Addon (v8::Isolate * isolate); #line 52 "./src/better_sqlite3.lzz" sqlite3_uint64 NextId (); #line 56 "./src/better_sqlite3.lzz" CopyablePersistent Statement; #line 57 "./src/better_sqlite3.lzz" CopyablePersistent StatementIterator; #line 58 "./src/better_sqlite3.lzz" CopyablePersistent Backup; #line 59 "./src/better_sqlite3.lzz" CopyablePersistent SqliteError; #line 60 "./src/better_sqlite3.lzz" v8::FunctionCallbackInfo const * privileged_info; #line 61 "./src/better_sqlite3.lzz" sqlite3_uint64 next_id; #line 62 "./src/better_sqlite3.lzz" CS cs; #line 63 "./src/better_sqlite3.lzz" std::set dbs; }; #line 16 "./src/util/macros.lzz" LZZ_INLINE v8::Local StringFromUtf8 (v8::Isolate * isolate, char const * data, int length) #line 16 "./src/util/macros.lzz" { return v8::String::NewFromUtf8(isolate, data, v8::NewStringType::kNormal, length).ToLocalChecked(); } #line 19 "./src/util/macros.lzz" LZZ_INLINE v8::Local InternalizedFromUtf8 (v8::Isolate * isolate, char const * data, int length) #line 19 "./src/util/macros.lzz" { return v8::String::NewFromUtf8(isolate, data, v8::NewStringType::kInternalized, length).ToLocalChecked(); } #line 22 "./src/util/macros.lzz" LZZ_INLINE v8::Local InternalizedFromUtf8OrNull (v8::Isolate * isolate, char const * data, int length) #line 22 "./src/util/macros.lzz" { if (data == NULL) return v8::Null(isolate); return InternalizedFromUtf8(isolate, data, length); } #line 26 "./src/util/macros.lzz" LZZ_INLINE v8::Local InternalizedFromLatin1 (v8::Isolate * isolate, char const * str) #line 26 "./src/util/macros.lzz" { return v8::String::NewFromOneByte(isolate, reinterpret_cast(str), v8::NewStringType::kInternalized).ToLocalChecked(); } #line 33 "./src/util/macros.lzz" LZZ_INLINE void SetFrozen (v8::Isolate * isolate, v8::Local ctx, v8::Local obj, CopyablePersistent & key, v8::Local value) #line 33 "./src/util/macros.lzz" { obj->DefineOwnProperty(ctx, key.Get(isolate), value, static_cast(v8::DontDelete | v8::ReadOnly)).FromJust(); } #line 91 "./src/util/macros.lzz" LZZ_INLINE bool IS_SKIPPED (char c) #line 91 "./src/util/macros.lzz" { return c == ' ' || c == ';' || (c >= '\t' && c <= '\r'); } #line 96 "./src/util/macros.lzz" template #line 96 "./src/util/macros.lzz" LZZ_INLINE T * ALLOC_ARRAY (size_t count) #line 96 "./src/util/macros.lzz" { return static_cast(::operator new[](count * sizeof(T))); } #line 101 "./src/util/macros.lzz" template #line 101 "./src/util/macros.lzz" LZZ_INLINE void FREE_ARRAY (T * array_pointer) #line 101 "./src/util/macros.lzz" { ::operator delete[](array_pointer); } #line 9 "./src/util/bind-map.lzz" LZZ_INLINE int BindMap::Pair::GetIndex () #line 9 "./src/util/bind-map.lzz" { return index; } #line 13 "./src/util/bind-map.lzz" LZZ_INLINE v8::Local BindMap::Pair::GetName (v8::Isolate * isolate) #line 13 "./src/util/bind-map.lzz" { return name.Get(isolate); } #line 41 "./src/util/bind-map.lzz" LZZ_INLINE BindMap::Pair * BindMap::GetPairs () #line 41 "./src/util/bind-map.lzz" { return pairs; } #line 45 "./src/util/bind-map.lzz" LZZ_INLINE int BindMap::GetSize () #line 45 "./src/util/bind-map.lzz" { return length; } #line 77 "./src/objects/database.lzz" LZZ_INLINE void Database::AddStatement (Statement * stmt) #line 77 "./src/objects/database.lzz" { stmts.insert(stmts.end(), stmt); } #line 78 "./src/objects/database.lzz" LZZ_INLINE void Database::RemoveStatement (Statement * stmt) #line 78 "./src/objects/database.lzz" { stmts.erase(stmt); } #line 81 "./src/objects/database.lzz" LZZ_INLINE void Database::AddBackup (Backup * backup) #line 81 "./src/objects/database.lzz" { backups.insert(backups.end(), backup); } #line 82 "./src/objects/database.lzz" LZZ_INLINE void Database::RemoveBackup (Backup * backup) #line 82 "./src/objects/database.lzz" { backups.erase(backup); } #line 96 "./src/objects/database.lzz" LZZ_INLINE Database::State * Database::GetState () #line 96 "./src/objects/database.lzz" { return reinterpret_cast(&open); } #line 99 "./src/objects/database.lzz" LZZ_INLINE sqlite3 * Database::GetHandle () #line 99 "./src/objects/database.lzz" { return db_handle; } #line 102 "./src/objects/database.lzz" LZZ_INLINE Addon * Database::GetAddon () #line 102 "./src/objects/database.lzz" { return addon; } #line 21 "./src/objects/statement.lzz" LZZ_INLINE bool Statement::Compare (Statement const * const a, Statement const * const b) #line 21 "./src/objects/statement.lzz" { return a->extras->id < b->extras->id; } #line 119 "./src/objects/statement-iterator.lzz" LZZ_INLINE v8::Local StatementIterator::NewRecord (v8::Isolate * isolate, v8::Local ctx, v8::Local value, Addon * addon, bool done) #line 119 "./src/objects/statement-iterator.lzz" { v8::Local record = v8::Object::New(isolate); record->Set(ctx, addon->cs.value.Get(isolate), value).FromJust(); record->Set(ctx, addon->cs.done.Get(isolate), v8::Boolean::New(isolate, done)).FromJust(); return record; } #line 126 "./src/objects/statement-iterator.lzz" LZZ_INLINE v8::Local StatementIterator::DoneRecord (v8::Isolate * isolate, Addon * addon) #line 126 "./src/objects/statement-iterator.lzz" { return NewRecord(isolate, isolate -> GetCurrentContext ( ) , v8::Undefined(isolate), addon, true); } #line 12 "./src/objects/backup.lzz" LZZ_INLINE bool Backup::Compare (Backup const * const a, Backup const * const b) #line 12 "./src/objects/backup.lzz" { return a->id < b->id; } #line 39 "./src/util/custom-aggregate.lzz" LZZ_INLINE void CustomAggregate::xStepBase (sqlite3_context * invocation, int argc, sqlite3_value * * argv, CopyablePersistent const CustomAggregate::* ptrtm) #line 39 "./src/util/custom-aggregate.lzz" { CustomAggregate * self = static_cast < CustomAggregate * > ( sqlite3_user_data ( invocation ) ) ; v8 :: Isolate * isolate = self -> isolate ; v8 :: HandleScope scope ( isolate ) ; Accumulator * acc = self -> GetAccumulator ( invocation ) ; if ( acc -> value . IsEmpty ( ) ) return ; v8::Local args_fast[5]; v8::Local* args = argc <= 4 ? args_fast : ALLOC_ARRAY>(argc + 1); args[0] = acc->value.Get(isolate); if (argc != 0) Data::GetArgumentsJS(isolate, args + 1, argv, argc, self->safe_ints); v8::MaybeLocal maybeReturnValue = (self->*ptrtm).Get(isolate)->Call( isolate -> GetCurrentContext ( ) , v8::Undefined(isolate), argc + 1, args); if (args != args_fast) delete[] args; if (maybeReturnValue.IsEmpty()) { self->PropagateJSError(invocation); } else { v8::Local returnValue = maybeReturnValue.ToLocalChecked(); if (!returnValue->IsUndefined()) acc->value.Reset(isolate, returnValue); } } #line 58 "./src/util/custom-aggregate.lzz" LZZ_INLINE void CustomAggregate::xValueBase (sqlite3_context * invocation, bool is_final) #line 58 "./src/util/custom-aggregate.lzz" { CustomAggregate * self = static_cast < CustomAggregate * > ( sqlite3_user_data ( invocation ) ) ; v8 :: Isolate * isolate = self -> isolate ; v8 :: HandleScope scope ( isolate ) ; Accumulator * acc = self -> GetAccumulator ( invocation ) ; if ( acc -> value . IsEmpty ( ) ) return ; if (!is_final) { acc->is_window = true; } else if (acc->is_window) { DestroyAccumulator(invocation); return; } v8::Local result = acc->value.Get(isolate); if (self->invoke_result) { v8::MaybeLocal maybeResult = self->result.Get(isolate)->Call( isolate -> GetCurrentContext ( ) , v8::Undefined(isolate), 1, &result); if (maybeResult.IsEmpty()) { self->PropagateJSError(invocation); return; } result = maybeResult.ToLocalChecked(); } Data::ResultValueFromJS(isolate, invocation, result, self); if (is_final) DestroyAccumulator(invocation); } #line 92 "./src/util/custom-table.lzz" LZZ_INLINE CustomTable::VTab * CustomTable::VTab::Upcast (sqlite3_vtab * vtab) #line 92 "./src/util/custom-table.lzz" { return reinterpret_cast(vtab); } #line 96 "./src/util/custom-table.lzz" LZZ_INLINE sqlite3_vtab * CustomTable::VTab::Downcast () #line 96 "./src/util/custom-table.lzz" { return reinterpret_cast(this); } #line 110 "./src/util/custom-table.lzz" LZZ_INLINE CustomTable::Cursor * CustomTable::Cursor::Upcast (sqlite3_vtab_cursor * cursor) #line 110 "./src/util/custom-table.lzz" { return reinterpret_cast(cursor); } #line 114 "./src/util/custom-table.lzz" LZZ_INLINE sqlite3_vtab_cursor * CustomTable::Cursor::Downcast () #line 114 "./src/util/custom-table.lzz" { return reinterpret_cast(this); } #line 118 "./src/util/custom-table.lzz" LZZ_INLINE CustomTable::VTab * CustomTable::Cursor::GetVTab () #line 118 "./src/util/custom-table.lzz" { return VTab::Upcast(base.pVtab); } #line 52 "./src/better_sqlite3.lzz" LZZ_INLINE sqlite3_uint64 Addon::NextId () #line 52 "./src/better_sqlite3.lzz" { return next_id++; } #undef LZZ_INLINE #endif