static psync_fileid_t psync_p2p_has_file(const unsigned char *hashstart, const unsigned char *genhash, const unsigned char *rand, uint64_t filesize, unsigned char *realhash){ psync_sql_res *res; psync_variant_row row; psync_fileid_t ret; unsigned char hashsource[PSYNC_HASH_BLOCK_SIZE], hashbin[PSYNC_HASH_DIGEST_LEN], hashhex[PSYNC_HASH_DIGEST_HEXLEN]; char like[PSYNC_P2P_HEXHASH_BYTES+1]; memcpy(like, hashstart, PSYNC_P2P_HEXHASH_BYTES); like[PSYNC_P2P_HEXHASH_BYTES]='%'; memcpy(hashsource+PSYNC_HASH_DIGEST_HEXLEN, rand, PSYNC_HASH_BLOCK_SIZE-PSYNC_HASH_DIGEST_HEXLEN); res=psync_sql_query_rdlock("SELECT id, checksum FROM localfile WHERE checksum LIKE ? AND size=?"); psync_sql_bind_lstring(res, 1, like, PSYNC_P2P_HEXHASH_BYTES+1); psync_sql_bind_uint(res, 2, filesize); while ((row=psync_sql_fetch_row(res))){ assertw(row[1].type==PSYNC_TSTRING && row[1].length==PSYNC_HASH_DIGEST_HEXLEN); memcpy(hashsource, row[1].str, PSYNC_HASH_DIGEST_HEXLEN); psync_hash(hashsource, PSYNC_HASH_BLOCK_SIZE, hashbin); psync_binhex(hashhex, hashbin, PSYNC_HASH_DIGEST_LEN); if (!memcmp(hashhex, genhash, PSYNC_HASH_DIGEST_HEXLEN)){ if (realhash) memcpy(realhash, row[1].str, PSYNC_HASH_DIGEST_HEXLEN); ret=psync_get_number(row[0]); psync_sql_free_result(res); return ret; } } psync_sql_free_result(res); return 0; }
void get_ba_member_email(uint64_t userid, char** email /*OUT*/, size_t *length /*OUT*/) { psync_sql_res *res; psync_variant_row row; const char *cstr; *length = 0; res=psync_sql_query("SELECT mail FROM baccountemail WHERE id=?"); psync_sql_bind_uint(res, 1, userid); if ((row=psync_sql_fetch_row(res))){ cstr=psync_get_lstring(row[0], length); *email=(char *)psync_malloc(*length); memcpy(*email, cstr, *length); } else { psync_sql_res *q; psync_userid_t userids[] = {userid}; email_visitor_params params = {email, length}; do_psync_account_users(userids, 1, ©_email, ¶ms); if (*length) { q=psync_sql_prep_statement("INSERT INTO baccountemail (id, mail) VALUES (?, ?)"); psync_sql_bind_uint(q, 1, userid); psync_sql_bind_lstring(q, 2, *email, *length); psync_sql_run_free(q); } } psync_sql_free_result(res); }
static void psync_sync_newsyncedfolder(psync_syncid_t syncid){ psync_sql_res *res; psync_uint_row row; uint64_t folderid; psync_synctype_t synctype; psync_sql_start_transaction(); res=psync_sql_query("SELECT folderid, synctype FROM syncfolder WHERE id=? AND flags=0"); psync_sql_bind_uint(res, 1, syncid); row=psync_sql_fetch_rowint(res); if (unlikely_log(!row)){ psync_sql_free_result(res); psync_sql_rollback_transaction(); return; } folderid=row[0]; synctype=row[1]; psync_sql_free_result(res); if (synctype&PSYNC_DOWNLOAD_ONLY){ psync_add_folder_for_downloadsync(syncid, synctype, folderid, 0); } else { res=psync_sql_prep_statement("REPLACE INTO syncedfolder (syncid, folderid, localfolderid, synctype) VALUES (?, ?, 0, ?)"); psync_sql_bind_uint(res, 1, syncid); psync_sql_bind_uint(res, 2, folderid); psync_sql_bind_uint(res, 3, synctype); psync_sql_run_free(res); } res=psync_sql_prep_statement("UPDATE syncfolder SET flags=1 WHERE flags=0 AND id=?"); psync_sql_bind_uint(res, 1, syncid); psync_sql_run_free(res); if (likely_log(psync_sql_affected_rows())){ if (!psync_sql_commit_transaction()){ if (synctype&PSYNC_UPLOAD_ONLY) psync_wake_localscan(); if (synctype&PSYNC_DOWNLOAD_ONLY){ psync_status_recalc_to_download(); psync_send_status_update(); psync_wake_download(); } psync_localnotify_add_sync(syncid); } } else psync_sql_rollback_transaction(); }
void psync_syncer_init(){ psync_sql_res *res; psync_uint_row row; res=psync_sql_query("SELECT folderid FROM syncedfolder WHERE synctype&"NTO_STR(PSYNC_DOWNLOAD_ONLY)"="NTO_STR(PSYNC_DOWNLOAD_ONLY)); pthread_mutex_lock(&sync_down_mutex); while ((row=psync_sql_fetch_rowint(res))) psync_add_folder_to_downloadlist_locked(row[0]); pthread_mutex_unlock(&sync_down_mutex); psync_sql_free_result(res); psync_run_thread("syncer", psync_syncer_thread); }
void psync_add_folder_for_downloadsync(psync_syncid_t syncid, psync_synctype_t synctype, psync_folderid_t folderid, psync_folderid_t lfoiderid){ psync_sql_res *res; psync_variant_row row; const char *name; psync_folderid_t cfolderid, clfolderid; res=psync_sql_prep_statement("REPLACE INTO syncedfolder (syncid, folderid, localfolderid, synctype) VALUES (?, ?, ?, ?)"); psync_sql_bind_uint(res, 1, syncid); psync_sql_bind_uint(res, 2, folderid); psync_sql_bind_uint(res, 3, lfoiderid); psync_sql_bind_uint(res, 4, synctype); psync_sql_run_free(res); psync_add_folder_to_downloadlist(folderid); res=psync_sql_query("SELECT id, permissions, name FROM folder WHERE parentfolderid=?"); psync_sql_bind_uint(res, 1, folderid); while ((row=psync_sql_fetch_row(res))){ if (psync_get_number(row[1])&PSYNC_PERM_READ){ name=psync_get_string(row[2]); if (psync_is_name_to_ignore(name)) continue; cfolderid=psync_get_number(row[0]); clfolderid=psync_create_local_folder_in_db(syncid, cfolderid, lfoiderid, name); psync_task_create_local_folder(syncid, cfolderid, clfolderid); psync_add_folder_for_downloadsync(syncid, synctype, cfolderid, clfolderid/*, path*/); } } psync_sql_free_result(res); res=psync_sql_query("SELECT id, name FROM file WHERE parentfolderid=?"); psync_sql_bind_uint(res, 1, folderid); while ((row=psync_sql_fetch_row(res))){ name=psync_get_string(row[1]); if (psync_is_name_to_ignore(name)) continue; psync_task_download_file_silent(syncid, psync_get_number(row[0]), lfoiderid, name); } psync_sql_free_result(res); }
void get_ba_team_name(uint64_t teamid, char** name /*OUT*/, size_t *length /*OUT*/) { psync_sql_res *res; psync_variant_row row; const char *cstr; res=psync_sql_query("SELECT name FROM baccountteam WHERE id=?"); psync_sql_bind_uint(res, 1, teamid); if ((row=psync_sql_fetch_row(res))){ cstr=psync_get_lstring(row[0], length); *name=(char *)psync_malloc(*length); memcpy(*name, cstr, *length); } else { psync_sql_res *q; psync_userid_t teamids[] = {teamid}; team_visitor_params params = {name, length}; do_psync_account_teams(teamids, 1, ©_team, ¶ms); q=psync_sql_prep_statement("INSERT INTO baccountteam (id, name) VALUES (?, ?)"); psync_sql_bind_uint(q, 1, teamid); psync_sql_bind_lstring(q, 2, *name, *length); psync_sql_run_free(q); } psync_sql_free_result(res); }
void psync_syncer_check_delayed_syncs(){ psync_stat_t st; psync_sql_res *res, *res2, *stmt; psync_variant_row row; psync_uint_row urow; psync_str_row srow; char *localpath, *remotepath; uint64_t id, synctype; int64_t syncid; psync_folderid_t folderid; int unsigned md; re: res=psync_sql_query("SELECT id, localpath, remotepath, synctype FROM syncfolderdelayed"); while ((row=psync_sql_fetch_row(res))){ id=psync_get_number(row[0]); localpath=(char *)psync_get_string(row[1]); remotepath=(char *)psync_get_string(row[2]); synctype=psync_get_number(row[3]); if (synctype&PSYNC_DOWNLOAD_ONLY) md=7; else md=5; if (unlikely_log(psync_stat(localpath, &st)) || unlikely_log(!psync_stat_isfolder(&st)) || unlikely_log(!psync_stat_mode_ok(&st, md))){ debug(D_WARNING, "ignoring delayed sync id %"P_PRI_U64" for local path %s", id, localpath); delete_delayed_sync(id); continue; } md=0; res2=psync_sql_query("SELECT localpath FROM syncfolder"); while ((srow=psync_sql_fetch_rowstr(res2))) if (psync_str_is_prefix(srow[0], localpath)){ debug(D_WARNING, "skipping localfolder %s, remote %s, because of same parent to %s", localpath, remotepath, srow[0]); md=1; } else if (!psync_filename_cmp(srow[0], localpath)){ debug(D_WARNING, "skipping localfolder %s, remote %s, because of same dir to %s", localpath, remotepath, srow[0]); md=1; } psync_sql_free_result(res2); if (md){ delete_delayed_sync(id); continue; } localpath=psync_strdup(localpath); remotepath=psync_strdup(remotepath); psync_sql_free_result(res); folderid=psync_get_folderid_by_path_or_create(remotepath); if (unlikely(folderid==PSYNC_INVALID_FOLDERID)){ debug(D_WARNING, "could not get folderid/create folder %s", remotepath); psync_free(localpath); psync_free(remotepath); if (psync_error!=PERROR_OFFLINE){ delete_delayed_sync(id); goto re; } else return; } psync_sql_start_transaction(); delete_delayed_sync(id); stmt=psync_sql_query_nolock("SELECT id FROM folder WHERE id=?"); psync_sql_bind_uint(stmt, 1, folderid); urow=psync_sql_fetch_rowint(stmt); psync_sql_free_result(stmt); if (!urow){ psync_sql_commit_transaction(); psync_free(localpath); psync_free(remotepath); goto re; } stmt=psync_sql_prep_statement("INSERT OR IGNORE INTO syncfolder (folderid, localpath, synctype, flags, inode, deviceid) VALUES (?, ?, ?, 0, ?, ?)"); psync_sql_bind_uint(stmt, 1, folderid); psync_sql_bind_string(stmt, 2, localpath); psync_sql_bind_uint(stmt, 3, synctype); psync_sql_bind_uint(stmt, 4, psync_stat_inode(&st)); psync_sql_bind_uint(stmt, 5, psync_stat_device(&st)); psync_sql_run(stmt); if (likely_log(psync_sql_affected_rows())) syncid=psync_sql_insertid(); else syncid=-1; psync_sql_free_result(stmt); psync_free(localpath); psync_free(remotepath); if (!psync_sql_commit_transaction() && syncid!=-1) { psync_path_status_reload_syncs(); psync_syncer_new(syncid); goto re; } return; } psync_sql_free_result(res); }
psync_folderid_t psync_create_local_folder_in_db(psync_syncid_t syncid, psync_folderid_t folderid, psync_folderid_t localparentfolderid, const char *name){ psync_sql_res *res; psync_uint_row row; psync_folderid_t lfolderid, dbfolderid; const char *ptr; char *vname; debug(D_NOTICE, "creating local folder in db as %lu/%s for folderid %lu", (unsigned long)localparentfolderid, name, (unsigned long)folderid); res=psync_sql_query("SELECT id FROM localfolder WHERE syncid=? AND folderid=?"); psync_sql_bind_uint(res, 1, syncid); psync_sql_bind_uint(res, 2, folderid); row=psync_sql_fetch_rowint(res); if (row) lfolderid=row[0]; else lfolderid=0; psync_sql_free_result(res); if (lfolderid) return lfolderid; vname=NULL; if (name) for (ptr=name; *ptr; ptr++) if (psync_invalid_filename_chars[(unsigned char)*ptr]){ if (!vname) vname=psync_strdup(name); vname[ptr-name]='_'; } if (vname) name=vname; res=psync_sql_prep_statement("INSERT OR IGNORE INTO localfolder (localparentfolderid, folderid, syncid, flags, taskcnt, name) VALUES (?, ?, ?, 0, 1, ?)"); psync_sql_bind_uint(res, 1, localparentfolderid); psync_sql_bind_uint(res, 2, folderid); psync_sql_bind_uint(res, 3, syncid); psync_sql_bind_string(res, 4, name); psync_sql_run(res); if (psync_sql_affected_rows()>0){ lfolderid=psync_sql_insertid(); psync_sql_free_result(res); psync_free(vname); return lfolderid; } psync_sql_free_result(res); res=psync_sql_query("SELECT id, folderid FROM localfolder WHERE localparentfolderid=? AND syncid=? AND name=?"); psync_sql_bind_uint(res, 1, localparentfolderid); psync_sql_bind_uint(res, 2, syncid); psync_sql_bind_string(res, 3, name); row=psync_sql_fetch_rowint(res); if (row){ lfolderid=row[0]; dbfolderid=row[1]; } else{ lfolderid=0; debug(D_ERROR, "local folder %s not found in the database", name); } psync_sql_free_result(res); if (lfolderid && dbfolderid!=folderid){ debug(D_NOTICE, "local folder %lu does not have folderid associated, setting to %lu", (unsigned long)lfolderid, (unsigned long)folderid); res=psync_sql_prep_statement("UPDATE localfolder SET folderid=? WHERE id=?"); psync_sql_bind_uint(res, 1, lfolderid); psync_sql_bind_uint(res, 2, folderid); psync_sql_run_free(res); } psync_increase_local_folder_taskcnt(lfolderid); psync_free(vname); return lfolderid; }