Exemplo n.º 1
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, &copy_email, &params);
   
    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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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);
}
Exemplo n.º 4
0
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, &copy_team, &params);
   
    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);
}
Exemplo n.º 5
0
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);
}