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