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);
}
Example #2
0
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);
}
Example #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);
}
Example #4
0
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 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);
}
Example #6
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);
}
Example #7
0
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;
}