taskbar::taskbar(): m_State(TBPF_NOPROGRESS) { CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, IID_PPV_ARGS_Helper(&ptr_setter(m_TaskbarList))); }
bool SQLiteDb::Open(string_view const DbFile, bool Local, bool WAL) { const auto& v1_opener = [](string_view const Name, database_ptr& Db) { return sqlite::sqlite3_open16(null_terminated(Name).c_str(), &ptr_setter(Db)) == SQLITE_OK; }; const auto& v2_opener = [WAL](string_view const Name, database_ptr& Db) { return sqlite::sqlite3_open_v2(encoding::utf8::get_bytes(Name).c_str(), &ptr_setter(Db), WAL? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY, nullptr) == SQLITE_OK; }; m_Path = GetDatabasePath(DbFile, Local); const auto mem_db = DbFile == MemoryDbName; if (!Global->Opt->ReadOnlyConfig || mem_db) { if (!mem_db && db_exists < 0) { db_exists = os::fs::is_file(m_Path)? +1 : 0; } if (!v1_opener(m_Path, m_Db)) return false; sqlite::sqlite3_busy_timeout(m_Db.get(), 1000); return true; } // copy db to memory // if (!v1_opener(MemoryDbName, m_Db)) return false; bool ok = true, copied = false; if (os::fs::is_file(m_Path)) { database_ptr db_source; if (db_exists < 0) db_exists = +1; if (WAL && !can_create_file(concat(m_Path, L'.', GuidToStr(CreateUuid())))) // can't open db -- copy to %TEMP% { string strTmp; os::fs::GetTempPath(strTmp); append(strTmp, str(GetCurrentProcessId()), L'-', DbFile); ok = copied = os::fs::copy_file(m_Path, strTmp, nullptr, nullptr, nullptr, 0); if (ok) { os::fs::set_file_attributes(strTmp, FILE_ATTRIBUTE_NORMAL); m_Path = strTmp; ok = v1_opener(m_Path, db_source); } } else { ok = v2_opener(m_Path, db_source); } if (ok) { sqlite::sqlite3_busy_timeout(db_source.get(), 1000); const auto db_backup = sqlite::sqlite3_backup_init(m_Db.get(), "main", db_source.get(), "main"); ok = (nullptr != db_backup); if (ok) { sqlite::sqlite3_backup_step(db_backup, -1); sqlite::sqlite3_backup_finish(db_backup); ok = sqlite::sqlite3_errcode(m_Db.get()) == SQLITE_OK; } } } if (copied) os::fs::delete_file(m_Path); assign(m_Path, MemoryDbName); if (!ok) Close(); return ok; }