Exemplo n.º 1
0
/*! @brief Loads all members of a group
 * 
 * Loads all members of a group
 * 
 * @param group The group
 * @param path The path from which to load the members
 * @param error Pointer to an error struct
 * @returns True if the members were loaded successfully, FALSE otherwise
 * 
 */
static osync_bool _osync_group_load_members(OSyncGroup *group, const char *path, OSyncError **error)
{	
  GDir *dir = NULL;
  GError *gerror = NULL;
  char *member_path = NULL;
  char *filename = NULL;
  OSyncMember *member = NULL;
  const gchar *de = NULL;
	
  osync_trace(TRACE_ENTRY, "%s(%p, %s, %p)", __func__, group, path, error);

  dir = g_dir_open(path, 0, &gerror);
  if (!dir) {
    osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Unable to open group configdir %s", gerror->message);
    g_error_free (gerror);
    goto error;
  }

  while ((de = g_dir_read_name(dir))) {
    filename = g_strdup_printf ("%s%c%s%csyncmember.conf", osync_group_get_configdir(group), G_DIR_SEPARATOR, de, G_DIR_SEPARATOR);
    if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) {
      g_free(filename);
      continue;
    }
    g_free(filename);
		
    member = osync_member_new(error);
    if (!member)
      goto error_close;

#ifdef OPENSYNC_UNITTESTS
    if (group->schemadir)
      osync_member_set_schemadir(member, group->schemadir);
#endif /* OPENSYNC_UNITTESTS */
		
    member_path = g_strdup_printf ("%s%c%s", osync_group_get_configdir(group), G_DIR_SEPARATOR, de);
    if (!osync_member_load(member, member_path, error)) {
      g_free(member_path);
      goto error_free_member;
    }
    g_free(member_path);
		
    osync_group_add_member(group, member);
    osync_member_unref(member);
  }
  g_dir_close(dir);
	
  osync_trace(TRACE_EXIT, "%s", __func__);
  return TRUE;

 error_free_member:
  osync_member_unref(member);
 error_close:
  g_dir_close(dir);
 error:
  osync_trace(TRACE_EXIT_ERROR, "%s: %p", __func__, osync_error_print(error));
  return FALSE;
}
Exemplo n.º 2
0
/*! @brief Reset all databases of a group (anchor, hashtable and archive) 
 * 
 * @param group The group
 * @param error Pointer to an error struct
 * @returns TRUE on success, FALSE otherwise
 * 
 */
osync_bool osync_group_reset(OSyncGroup *group, OSyncError **error)
{
  OSyncDB *db = NULL;
  GList *m = NULL;
  char *path = NULL;
  osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, group, error);

  osync_assert(group);

  /* Loop over all members... */
  for (m = group->members; m; m = m->next) {
    OSyncMember *member = m->data;

    /* flush hashtable */
    path = g_strdup_printf("%s%chashtable.db", osync_member_get_configdir(member), G_DIR_SEPARATOR);
    if (!(db = osync_db_new(error)))
      goto error_and_free;

    if (!osync_db_open(db, path, error))
      goto error_and_free;

    osync_db_reset_full(db, error);

    g_free(path);

    /* flush anchor db */ 
    path = g_strdup_printf("%s%canchor.db", osync_member_get_configdir(member), G_DIR_SEPARATOR);
    if (!(db = osync_db_new(error)))
      goto error_and_free;

    if (!osync_db_open(db, path, error))
      goto error_and_free;

    osync_db_reset_full(db, error);

    g_free(path);

  }

  path = g_strdup_printf("%s%carchive.db", osync_group_get_configdir(group), G_DIR_SEPARATOR);
  if (!(db = osync_db_new(error)))
    goto error_and_free;

  if (!osync_db_open(db, path, error))
    goto error_and_free;

  osync_db_reset_full(db, error);

  g_free(path);

  osync_trace(TRACE_EXIT, "%s", __func__);
  return TRUE;

 error_and_free:
  g_free(path);	
  //error:
  osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error));
  return FALSE;
}
Exemplo n.º 3
0
/*! @brief Check if group configuration is up to date. 
 * 
 * @param group The group
 * @returns TRUE if the group configuration is up to date, FALSE otherwise. 
 */
osync_bool osync_group_is_uptodate(OSyncGroup *group)
{
  xmlDocPtr doc = NULL;
  xmlNodePtr cur = NULL;
  OSyncError *error = NULL;
  unsigned int version_major;
  unsigned int version_minor;
  xmlChar *version_str = NULL;
  osync_bool uptodate = FALSE;
  char *config = NULL; 
  const char *configdir = NULL;

  osync_assert(group);
  osync_trace(TRACE_ENTRY, "%s(%p)", __func__, group);
        
  configdir = osync_group_get_configdir(group);
  if (!configdir){
    osync_trace(TRACE_EXIT, "%s(%p) - No configdir set", __func__, group);
    return FALSE;
  }

  config = g_strdup_printf("%s%c%s",
                           configdir,
                           G_DIR_SEPARATOR, "syncgroup.conf");
	
  /* If syncgroup isn't present, we assume that update is required. */
  if (!osync_xml_open_file(&doc, &cur, config, "syncgroup", &error)) {
    osync_trace(TRACE_ERROR, "%s: %s", __func__, osync_error_print(&error));
    osync_error_unref(&error);
    goto end;
  }

  version_str = xmlGetProp(cur->parent, (const xmlChar *)"version");

  /* No version node, means very outdated version. */
  if (!version_str)
    goto end;

  sscanf((const char *) version_str, "%u.%u", &version_major, &version_minor);

  osync_trace(TRACE_INTERNAL, "Version: %s (current %u.%u required %u.%u)",
              version_str, version_major, version_minor, 
              OSYNC_GROUP_MAJOR_VERSION, OSYNC_GROUP_MINOR_VERSION ); 

  if (OSYNC_GROUP_MAJOR_VERSION == version_major 
      && OSYNC_GROUP_MINOR_VERSION == version_minor)
    uptodate = TRUE;

  osync_xml_free(version_str);
 end:
  g_free(config);

  if (doc)
    osync_xml_free_doc(doc);

  osync_trace(TRACE_EXIT, "%s(%p)", __func__, group);
  return uptodate;
}
Exemplo n.º 4
0
static void dump_map_objtype(OSyncGroupEnv *env, const char *objtype, const char *groupname)
{
	printf("Dumping of mappings got temporarliy disabled\n");

/* FIXME: Temporarily disabled - OSyncArchive got removed from 0.40 API draft */
#if 0	

	OSyncError *error = NULL;
	OSyncGroup *group = osync_group_env_find_group(env, groupname);

	char *path = g_strdup_printf("%s/archive.db", osync_group_get_configdir(group));
	OSyncArchive *archive = osync_archive_new(path, &error);
	OSyncList *ids = NULL;
	OSyncList *uids = NULL;
	OSyncList *mappingids = NULL;
	OSyncList *memberids = NULL;
	OSyncList *d , *u, *m, *i;

	if (!archive)
		goto error;
	g_free(path);
	
	if (!osync_archive_load_changes(archive, objtype, &ids, &uids, &mappingids, &memberids, &error))
		goto error;
	
	d = ids;
	u = uids;
	m = mappingids;
	i = memberids;
	
	for (; u; u = u->next) {
		long long int id = (long long int)GPOINTER_TO_INT(d->data);
		char *uid = u->data;
		long long int memberid = (long long int)GPOINTER_TO_INT(i->data);
		long long int mappingid = (long long int)GPOINTER_TO_INT(m->data);
		
		printf("ID: %lli UID: %s MEMBER: %lli MAPPINGID: %lli\n", id, uid, memberid, mappingid);
		
		m = m->next;
		d = d->next;
		i = i->next;
	}
	
	osync_list_free(ids);
	osync_list_free(uids);
	osync_list_free(mappingids);
	osync_list_free(memberids);
	
	osync_archive_unref(archive);
	return;

 error:
	printf("ERROR: %s", osync_error_print(&error));
	osync_error_unref(&error);
#endif	
}