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 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 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); }