1039 lines
43 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
// better_sqlite3.hpp
//
#ifndef LZZ_BETTER_SQLITE3_better_sqlite3_hpp
#define LZZ_BETTER_SQLITE3_better_sqlite3_hpp
#line 2 "./src/better_sqlite3.lzz"
#include <climits>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
#include <algorithm>
#include <sqlite3.h>
#include <node.h>
#include <node_object_wrap.h>
#include <node_buffer.h>
#line 31 "./src/util/macros.lzz"
template <class T> using CopyablePersistent = v8::Persistent<T, v8::CopyablePersistentTraits<T>>;
#line 144 "./src/util/macros.lzz"
void SetPrototypeGetter(
v8::Isolate* isolate,
v8::Local<v8::External> data,
v8::Local<v8::FunctionTemplate> recv,
const char* name,
v8::AccessorGetterCallback func
);
#line 36 "./src/util/binder.lzz"
static bool IsPlainObject(v8::Isolate* isolate, v8::Local<v8::Object> obj);
#define LZZ_INLINE inline
#line 16 "./src/util/macros.lzz"
v8::Local <v8::String> StringFromUtf8 (v8::Isolate * isolate, char const * data, int length);
#line 19 "./src/util/macros.lzz"
v8::Local <v8::String> InternalizedFromUtf8 (v8::Isolate * isolate, char const * data, int length);
#line 22 "./src/util/macros.lzz"
v8::Local <v8::Value> InternalizedFromUtf8OrNull (v8::Isolate * isolate, char const * data, int length);
#line 26 "./src/util/macros.lzz"
v8::Local <v8::String> InternalizedFromLatin1 (v8::Isolate * isolate, char const * str);
#line 33 "./src/util/macros.lzz"
void SetFrozen (v8::Isolate * isolate, v8::Local <v8::Context> ctx, v8::Local <v8::Object> obj, CopyablePersistent <v8::String> & key, v8::Local <v8::Value> 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 <typename T>
#line 96 "./src/util/macros.lzz"
T * ALLOC_ARRAY (size_t count);
#line 101 "./src/util/macros.lzz"
template <typename T>
#line 101 "./src/util/macros.lzz"
void FREE_ARRAY (T * array_pointer);
#line 105 "./src/util/macros.lzz"
v8::Local <v8::FunctionTemplate> NewConstructorTemplate (v8::Isolate * isolate, v8::Local <v8::External> data, v8::FunctionCallback func, char const * name);
#line 116 "./src/util/macros.lzz"
void SetPrototypeMethod (v8::Isolate * isolate, v8::Local <v8::External> data, v8::Local <v8::FunctionTemplate> recv, char const * name, v8::FunctionCallback func);
#line 129 "./src/util/macros.lzz"
void SetPrototypeSymbolMethod (v8::Isolate * isolate, v8::Local <v8::External> data, v8::Local <v8::FunctionTemplate> recv, v8::Local <v8::Symbol> symbol, v8::FunctionCallback func);
#line 1 "./src/util/constants.lzz"
class CS
{
#line 2 "./src/util/constants.lzz"
public:
#line 4 "./src/util/constants.lzz"
v8::Local <v8::String> Code (v8::Isolate * isolate, int code);
#line 10 "./src/util/constants.lzz"
explicit CS (v8::Isolate * isolate);
#line 119 "./src/util/constants.lzz"
CopyablePersistent <v8::String> database;
#line 120 "./src/util/constants.lzz"
CopyablePersistent <v8::String> reader;
#line 121 "./src/util/constants.lzz"
CopyablePersistent <v8::String> source;
#line 122 "./src/util/constants.lzz"
CopyablePersistent <v8::String> memory;
#line 123 "./src/util/constants.lzz"
CopyablePersistent <v8::String> readonly;
#line 124 "./src/util/constants.lzz"
CopyablePersistent <v8::String> name;
#line 125 "./src/util/constants.lzz"
CopyablePersistent <v8::String> next;
#line 126 "./src/util/constants.lzz"
CopyablePersistent <v8::String> length;
#line 127 "./src/util/constants.lzz"
CopyablePersistent <v8::String> done;
#line 128 "./src/util/constants.lzz"
CopyablePersistent <v8::String> value;
#line 129 "./src/util/constants.lzz"
CopyablePersistent <v8::String> changes;
#line 130 "./src/util/constants.lzz"
CopyablePersistent <v8::String> lastInsertRowid;
#line 131 "./src/util/constants.lzz"
CopyablePersistent <v8::String> statement;
#line 132 "./src/util/constants.lzz"
CopyablePersistent <v8::String> column;
#line 133 "./src/util/constants.lzz"
CopyablePersistent <v8::String> table;
#line 134 "./src/util/constants.lzz"
CopyablePersistent <v8::String> type;
#line 135 "./src/util/constants.lzz"
CopyablePersistent <v8::String> totalPages;
#line 136 "./src/util/constants.lzz"
CopyablePersistent <v8::String> remainingPages;
#line 138 "./src/util/constants.lzz"
private:
#line 140 "./src/util/constants.lzz"
static void SetString (v8::Isolate * isolate, CopyablePersistent <v8::String> & 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 <int, CopyablePersistent<v8::String> > 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 <v8::String> 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 <v8::String> 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 <v8 :: Function> Init (v8::Isolate * isolate, v8::Local <v8 :: External> 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 <v8::Value> logger);
#line 149 "./src/objects/database.lzz"
static void JS_new (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 201 "./src/objects/database.lzz"
static void JS_prepare (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 217 "./src/objects/database.lzz"
static void JS_exec (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 257 "./src/objects/database.lzz"
static void JS_backup (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 275 "./src/objects/database.lzz"
static void JS_serialize (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 297 "./src/objects/database.lzz"
static void JS_function (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 321 "./src/objects/database.lzz"
static void JS_aggregate (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 350 "./src/objects/database.lzz"
static void JS_table (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 370 "./src/objects/database.lzz"
static void JS_loadExtension (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 392 "./src/objects/database.lzz"
static void JS_close (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 402 "./src/objects/database.lzz"
static void JS_defaultSafeIntegers (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 408 "./src/objects/database.lzz"
static void JS_unsafeMode (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 415 "./src/objects/database.lzz"
static void JS_open (v8::Local <v8 :: String> _, v8::PropertyCallbackInfo <v8 :: Value> const & info);
#line 419 "./src/objects/database.lzz"
static void JS_inTransaction (v8::Local <v8 :: String> _, v8::PropertyCallbackInfo <v8 :: Value> const & info);
#line 424 "./src/objects/database.lzz"
static bool Deserialize (v8::Local <v8::Object> 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<int>(node::Buffer::kMaxLength);
#line 454 "./src/objects/database.lzz"
static int const MAX_STRING_SIZE = v8::String::kMaxLength > INT_MAX ? INT_MAX : static_cast<int>(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 <v8::Value> const logger;
#line 466 "./src/objects/database.lzz"
std::set <Statement*, CompareStatement> stmts;
#line 467 "./src/objects/database.lzz"
std::set <Backup*, CompareBackup> 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 <v8 :: Function> Init (v8::Isolate * isolate, v8::Local <v8 :: External> 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 <v8 :: Value> const & info);
#line 156 "./src/objects/statement.lzz"
static void JS_run (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 179 "./src/objects/statement.lzz"
static void JS_get (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 194 "./src/objects/statement.lzz"
static void JS_all (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 215 "./src/objects/statement.lzz"
static void JS_iterate (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 225 "./src/objects/statement.lzz"
static void JS_bind (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 236 "./src/objects/statement.lzz"
static void JS_pluck (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 247 "./src/objects/statement.lzz"
static void JS_expand (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 258 "./src/objects/statement.lzz"
static void JS_raw (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 269 "./src/objects/statement.lzz"
static void JS_safeIntegers (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 278 "./src/objects/statement.lzz"
static void JS_columns (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 321 "./src/objects/statement.lzz"
static void JS_busy (v8::Local <v8 :: String> _, v8::PropertyCallbackInfo <v8 :: Value> 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 <v8 :: Function> Init (v8::Isolate * isolate, v8::Local <v8 :: External> 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 <v8 :: Value> const & info);
#line 57 "./src/objects/statement-iterator.lzz"
static void JS_next (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 64 "./src/objects/statement-iterator.lzz"
static void JS_return (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 71 "./src/objects/statement-iterator.lzz"
static void JS_symbolIterator (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 75 "./src/objects/statement-iterator.lzz"
void Next (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 100 "./src/objects/statement-iterator.lzz"
void Return (v8::FunctionCallbackInfo <v8 :: Value> 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 <v8::Object> NewRecord (v8::Isolate * isolate, v8::Local <v8::Context> ctx, v8::Local <v8::Value> value, Addon * addon, bool done);
#line 126 "./src/objects/statement-iterator.lzz"
static v8::Local <v8::Object> 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 <v8 :: Function> Init (v8::Isolate * isolate, v8::Local <v8 :: External> 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 <v8 :: Value> const & info);
#line 98 "./src/objects/backup.lzz"
static void JS_transfer (v8::FunctionCallbackInfo <v8 :: Value> const & info);
#line 124 "./src/objects/backup.lzz"
static void JS_close (v8::FunctionCallbackInfo <v8 :: Value> 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 <v8::Function> 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 <v8::Function> 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 <v8::Value> start, v8::Local <v8::Function> step, v8::Local <v8::Value> inverse, v8::Local <v8::Value> 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 <v8::Function> 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 <v8::Value> 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 <v8::Function> const inverse;
#line 119 "./src/util/custom-aggregate.lzz"
CopyablePersistent <v8::Function> const result;
#line 120 "./src/util/custom-aggregate.lzz"
CopyablePersistent <v8::Value> 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 <v8::Function> 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 <v8::Function> generator, std::vector <std::string> 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 <v8::Function> const generator;
#line 105 "./src/util/custom-table.lzz"
std::vector <std::string> 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 <v8::Object> iterator;
#line 124 "./src/util/custom-table.lzz"
CopyablePersistent <v8::Function> next;
#line 125 "./src/util/custom-table.lzz"
CopyablePersistent <v8::Array> 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 <v8::Function> const factory;
};
#line 65 "./src/util/data.lzz"
namespace Data
{
#line 72 "./src/util/data.lzz"
v8::Local <v8::Value> 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 <v8::Value> 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 <v8::Value> GetFlatRowJS (v8::Isolate * isolate, v8::Local <v8::Context> ctx, sqlite3_stmt * handle, bool safe_ints);
}
#line 65 "./src/util/data.lzz"
namespace Data
{
#line 91 "./src/util/data.lzz"
v8::Local <v8::Value> GetExpandedRowJS (v8::Isolate * isolate, v8::Local <v8::Context> ctx, sqlite3_stmt * handle, bool safe_ints);
}
#line 65 "./src/util/data.lzz"
namespace Data
{
#line 110 "./src/util/data.lzz"
v8::Local <v8::Value> GetRawRowJS (v8::Isolate * isolate, v8::Local <v8::Context> ctx, sqlite3_stmt * handle, bool safe_ints);
}
#line 65 "./src/util/data.lzz"
namespace Data
{
#line 119 "./src/util/data.lzz"
v8::Local <v8::Value> GetRowJS (v8::Isolate * isolate, v8::Local <v8::Context> 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 <v8::Value> * 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 <v8::Value> 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 <v8::Value> 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 <v8 :: Value> 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 <v8::Value> value, int index);
#line 90 "./src/util/binder.lzz"
int BindArray (v8::Isolate * isolate, v8::Local <v8::Array> arr);
#line 116 "./src/util/binder.lzz"
int BindObject (v8::Isolate * isolate, v8::Local <v8::Object> obj, Statement * stmt);
#line 160 "./src/util/binder.lzz"
Result BindArgs (v8::FunctionCallbackInfo <v8 :: Value> 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 <v8 :: Value> 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 <v8::Function> Statement;
#line 57 "./src/better_sqlite3.lzz"
CopyablePersistent <v8::Function> StatementIterator;
#line 58 "./src/better_sqlite3.lzz"
CopyablePersistent <v8::Function> Backup;
#line 59 "./src/better_sqlite3.lzz"
CopyablePersistent <v8::Function> SqliteError;
#line 60 "./src/better_sqlite3.lzz"
v8::FunctionCallbackInfo <v8 :: Value> 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 <Database*, Database::CompareDatabase> dbs;
};
#line 16 "./src/util/macros.lzz"
LZZ_INLINE v8::Local <v8::String> 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 <v8::String> 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 <v8::Value> 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 <v8::String> InternalizedFromLatin1 (v8::Isolate * isolate, char const * str)
#line 26 "./src/util/macros.lzz"
{
return v8::String::NewFromOneByte(isolate, reinterpret_cast<const uint8_t*>(str), v8::NewStringType::kInternalized).ToLocalChecked();
}
#line 33 "./src/util/macros.lzz"
LZZ_INLINE void SetFrozen (v8::Isolate * isolate, v8::Local <v8::Context> ctx, v8::Local <v8::Object> obj, CopyablePersistent <v8::String> & key, v8::Local <v8::Value> value)
#line 33 "./src/util/macros.lzz"
{
obj->DefineOwnProperty(ctx, key.Get(isolate), value, static_cast<v8::PropertyAttribute>(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 <typename T>
#line 96 "./src/util/macros.lzz"
LZZ_INLINE T * ALLOC_ARRAY (size_t count)
#line 96 "./src/util/macros.lzz"
{
return static_cast<T*>(::operator new[](count * sizeof(T)));
}
#line 101 "./src/util/macros.lzz"
template <typename T>
#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 <v8::String> 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<State*>(&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 <v8::Object> StatementIterator::NewRecord (v8::Isolate * isolate, v8::Local <v8::Context> ctx, v8::Local <v8::Value> value, Addon * addon, bool done)
#line 119 "./src/objects/statement-iterator.lzz"
{
v8::Local<v8::Object> 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 <v8::Object> 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 <v8::Function> 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<v8::Value> args_fast[5];
v8::Local<v8::Value>* args = argc <= 4 ? args_fast : ALLOC_ARRAY<v8::Local<v8::Value>>(argc + 1);
args[0] = acc->value.Get(isolate);
if (argc != 0) Data::GetArgumentsJS(isolate, args + 1, argv, argc, self->safe_ints);
v8::MaybeLocal<v8::Value> 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<v8::Value> 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<v8::Value> result = acc->value.Get(isolate);
if (self->invoke_result) {
v8::MaybeLocal<v8::Value> 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*>(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<sqlite3_vtab*>(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*>(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<sqlite3_vtab_cursor*>(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