| 86 | } |
| 87 | |
| 88 | bool Database::Deserialize( |
| 89 | Napi::Env env, |
| 90 | Napi::Object buffer, |
| 91 | Addon* addon, |
| 92 | sqlite3* db_handle, |
| 93 | bool readonly |
| 94 | ) { |
| 95 | Napi::Buffer<char> buf = buffer.As<Napi::Buffer<char>>(); |
| 96 | size_t length = buf.Length(); |
| 97 | unsigned char* data = (unsigned char*)sqlite3_malloc64(length); |
| 98 | unsigned int flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_RESIZEABLE; |
| 99 | |
| 100 | if (readonly) { |
| 101 | flags |= SQLITE_DESERIALIZE_READONLY; |
| 102 | } |
| 103 | if (length) { |
| 104 | if (!data) { |
| 105 | ThrowError(env, "Out of memory"); |
| 106 | return false; |
| 107 | } |
| 108 | memcpy(data, buf.Data(), length); |
| 109 | } |
| 110 | |
| 111 | int status = sqlite3_deserialize(db_handle, "main", data, length, length, flags); |
| 112 | if (status != SQLITE_OK) { |
| 113 | ThrowSqliteError(env, addon, status == SQLITE_ERROR ? "unable to deserialize database" : sqlite3_errstr(status), status); |
| 114 | return false; |
| 115 | } |
| 116 | |
| 117 | return true; |
| 118 | } |
| 119 | |
| 120 | void Database::FreeSerialization(Napi::Env env, char* data) { |
| 121 | sqlite3_free(data); |
nothing calls this directly
no test coverage detected