示例#1
0
int indexDocuments(Configuration c, Extension extension) {


	/*Cette fonction permet pour une extension définie de :
	- Recuperer la liste des fichiers de cette extension
	- Recuperer la liste des fichiers deja indexes
	- Comparer ces deux listes afin de supprimer les descripteurs ou indexer les nouveaux fichiers si necessaire
	*/

	//Dans l'integralité des fonctions gerant les "listes de fichiers", celles-ci étant des listes de chaines de caractères
	//on utilisera non pas un tableau à deux dimension mais un tableau à une dimension de cette forme :
	// |---PATH1---|---PATH2---|---PATH3---|--- avec chaque path de taille maximale PATH_SIZE (macro)
	//(ce choix a ete notamment fait pour simplifier la gestion dynamique de la memoire)

	//Recuperation de la liste des fichiers textes présent dans le répertoire indexé
	char* dir_file_list;
	int nbFiles_Dir = getDirectoryFileList(&dir_file_list, c.rootPath, extension);

	//Récuperation de la liste des fichiers textes déjà indexés (infos présentes dans ./data/liste_base_texte)
	char* indexed_file_list;
	int nbFiles_Indexed = getIndexedFileList(&indexed_file_list, extension);
	
	//Comparaison des deux listes pour générer la liste des fichiers à indexés et la liste des descripteurs devant être supprimés

	if(nbFiles_Dir==0 && nbFiles_Indexed==0) {
		free(dir_file_list);
		free(indexed_file_list);
		return 1; //Cas OK () mais rien à faire
	}

	char* toIndex;
	char* toDelete;
	int* nbComp;
	nbComp = compareDirAndIndexedFiles(dir_file_list, nbFiles_Dir, indexed_file_list, nbFiles_Indexed, &toIndex, &toDelete);
	int nbFilesToIndex = nbComp[0];
	int nbDescToDelete = nbComp[1];
	free(nbComp);

	//Supression des descripteurs
	//Parcours de liste_base : récuperation de l'id descripteur et suppression de la ligne pour chaque fichier à "desindexer"
	//Parcours de base : suppression des descripteur dont les ids ont été récupéré lors du parcours de liste_base
	removeDescriptors(toDelete, nbDescToDelete, extension);
	free(toDelete);

	//Indexation des fichiers et ajout à la base de données

	switch(extension) {
		case TEXTE:
		indexTextFiles(toIndex, nbFilesToIndex, c);
		break;
		case IMAGE:
		indexImageFiles(toIndex, nbFilesToIndex, c);
		break;
		case AUDIO:
		indexAudioFiles(toIndex, nbFilesToIndex, c);
		break;
	}
	free(toIndex);

	free(dir_file_list);
	free(indexed_file_list);
	return 1;
}
bool getDirectoryFileList(const std::string& Directory, std::vector<FileEntry>& result, const std::string& Prefix, const bool recursive)
{
  FileEntry one;
  #if defined(_WIN32)
  //Windows part
  intptr_t handle;
  struct _finddata_t sr;
  sr.attrib = _A_NORMAL | _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_VOLID |
              _A_SUBDIR | _A_ARCH;
  handle = _findfirst(std::string(Directory+"*").c_str(),&sr);
  if (handle == -1)
  {
    std::cout << "getDirectoryFileList: ERROR: unable to open directory \""
              << Directory <<"\". Returning incomplete list.\n";
    return false;
  }
  //search it
  while(_findnext(handle, &sr)==0)
  {
    one.FileName = Prefix + std::string(sr.name);
    one.IsDirectory = ((sr.attrib & _A_SUBDIR)==_A_SUBDIR);
    result.push_back(one);
    if (recursive and one.IsDirectory
        and (std::string(sr.name)!=".") and (std::string(sr.name)!=".."))
    {
      //call function recursively
      if (!getDirectoryFileList(Directory+std::string(sr.name)+DirectorySeparator,
          result, Prefix+std::string(sr.name)+DirectorySeparator, recursive))
      {
        //error occurred, close handle and return
        _findclose(handle);
        return false;
      }
    }//if recursive
  }//while
  _findclose(handle);
  #else
  //Linux part
  DIR * direc = opendir(Directory.c_str());
  if (direc == NULL)
  {
    std::cout << "getDirectoryFileList: ERROR: unable to open directory \""
              << Directory <<"\". Returning incomplete list.\n";
    return false;
  }//if

  struct dirent* entry = readdir(direc);
  while (entry != NULL)
  {
    one.FileName = Prefix + std::string(entry->d_name);
    one.IsDirectory = entry->d_type==DT_DIR;
    //check for socket, pipes, block device and char device, which we don't want
    if (entry->d_type != DT_SOCK && entry->d_type != DT_FIFO && entry->d_type != DT_BLK
        && entry->d_type != DT_CHR)
    {
      result.push_back(one);
      if (recursive and one.IsDirectory
          and (std::string(entry->d_name)!=".") and (std::string(entry->d_name)!=".."))
      {
        //call function recursively
        if (!getDirectoryFileList(Directory+std::string(entry->d_name)+DirectorySeparator,
            result, Prefix+std::string(entry->d_name)+DirectorySeparator, recursive))
        {
          //error occurred, close handle and return
          closedir(direc);
          return false;
        }
      }//if recursive
    }//if wanted file type
    entry = readdir(direc);
  }//while
  closedir(direc);
  #endif
  return true;
}//function