+ if (copyAssemblyCreateSymlink(binPath, tac_dir, np, true)) {
+ _ERR("Failed to create symlink");
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+
+ int count = -1;
+ sql = sqlite3_mprintf(
+ "SELECT COUNT(NUGET) FROM TAC WHERE PKGID = %Q AND NAME = %Q;", pkgId.c_str(), tac_name.c_str());
+ int ret = sqlite3_exec(tac_db, sql, sqliteCb, &count, NULL);
+ if (ret != SQLITE_OK) {
+ _ERR("Sqlite select error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ if (count == 1) {
+ sql = sqlite3_mprintf(
+ "UPDATE TAC SET NAME = %Q, VERSION = %Q, NUGET = %Q WHERE PKGID = %Q AND NAME = %Q;",
+ tac_name.c_str(), tac_version.c_str(), np.c_str(), pkgId.c_str(), tac_name.c_str());
+ if (!updateDB(tac_db, sql)) {
+ _ERR("Sqlite update error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ } else if (count == 0) {
+ sql = sqlite3_mprintf(
+ "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \
+ "VALUES (%Q, %Q, %Q, %Q);", pkgId.c_str(), np.c_str(), tac_name.c_str(), tac_version.c_str());
+ if (!insertDB(tac_db, sql)) {
+ _ERR("Sqlite insert error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ }
+ } else {
+ _INFO("Exists tac_version_dir [%s]", tac_version_dir.c_str());
+ if (!isSymlinkFile(sha256_info)) {
+ if (compareSHA256Info(sha256_info, np)) {
+ if (copyAssemblyCreateSymlink(binPath, tac_dir, np, false)) {
+ _ERR("Failed to create symlink");
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+
+ int count = -1;
+ char *sql = sqlite3_mprintf(
+ "SELECT COUNT(NUGET) FROM TAC WHERE PKGID = %Q AND NAME = %Q;", pkgId.c_str(), tac_name.c_str());
+ int ret = sqlite3_exec(tac_db, sql, sqliteCb, &count, NULL);
+ if (ret != SQLITE_OK) {
+ _ERR("Sqlite select error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ if (count == 1) {
+ sql = sqlite3_mprintf(
+ "UPDATE TAC SET NAME = %Q, VERSION = %Q, NUGET = %Q WHERE PKGID = %Q AND NAME = %Q;",
+ tac_name.c_str(), tac_version.c_str(), np.c_str(), pkgId.c_str(), tac_name.c_str());
+ if (!updateDB(tac_db, sql)) {
+ _ERR("Sqlite update error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ } else if (count == 0) {
+ sql = sqlite3_mprintf(
+ "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \
+ "VALUES (%Q, %Q, %Q, %Q);", pkgId.c_str(), np.c_str(), tac_name.c_str(), tac_version.c_str());
+ if (!insertDB(tac_db, sql)) {
+ _ERR("Sqlite insert error");
+ sqlite3_free(sql);
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ sqlite3_free(sql);
+ }
+ } else {
+ _INFO("Different nuget : %s", np.c_str());
+ continue;
+ }
+ } else {
+ _ERR("Failed to create sha256_info. Symbolic link is detected");
+ tacState = TAC_STATE_RESTORE;
+ return -1;
+ }
+ }
+ }