Exemple #1
0
int TreeGetNciLw(TREE_INFO *info, int node_num, NCI *nci)
{
  int       status;

 /* status = TreeLockNci(info,0,node_num);
  if (!(status & 1)) return status;*/
  status = TreeNORMAL;

/******************************************
  If the tree is not open for edit then
  if the characteristic file is not open
  (or not open for write)
  open the characteristic file for writting
  if OK so far then
  fill in the rab and read the record
******************************************/
  if ((info->edit == 0) || (node_num < info->edit->first_in_mem))
  {
    int deleted = 1;
    while (status & 1 && deleted) {
      if ((info->nci_file == 0) || (info->nci_file->put == 0))
	status = TreeOpenNciW(info, 0);
      if (status & 1) {      
	char nci_bytes[42];
	status = TreeLockNci(info,0,node_num,&deleted);
	if (status & 1 && deleted) {
	  status = TreeReopenNci(info);
	}
	else {
	  if (!(status & 1)) return status;
	  MDS_IO_LSEEK(info->nci_file->put,node_num * sizeof(nci_bytes),SEEK_SET);
	  status = (MDS_IO_READ(info->nci_file->put,nci_bytes,sizeof(nci_bytes)) == sizeof(nci_bytes)) ? TreeNORMAL : TreeFAILURE;
	  if (status == TreeNORMAL)
	    TreeSerializeNciIn(nci_bytes,nci);
	  if (!(status & 1))
	    TreeUnLockNci(info,0,node_num);
	}
      }
    }
  }
  else
  {
  /********************************************
   Otherwise the tree is open for edit so
   the characteristics are just a memory reference
   away.
  *********************************************/
	status = TreeLockNci(info,0,node_num,0);
		if (!(status & 1)) return status;

    memcpy(nci, info->edit->nci + node_num - info->edit->first_in_mem, sizeof(struct nci));
  }

  return status;
}
STATIC_ROUTINE int CopyFile(char *src, char *dst, int dont_replace)
{
  /*
  int status=0;
  char *cmd = (char *)malloc(strlen(src)+strlen(dst) + 100);
  sprintf(cmd,"cp %s %s",src,dst);
  status = system(cmd);
  if (status != 0)
     printf("Error creating pulse with command: %s, status = %d\n",cmd,status);
  else {
    sprintf(cmd,"SetMdsplusFileProtection %s 2> /dev/null",dst);
    system(cmd);
  }
  free(cmd);
  return status == 0;
  */
  int status = TreeFAILURE;

  int src_fd = MDS_IO_OPEN(src,O_RDONLY | O_BINARY | O_RANDOM, 0);
  if (src_fd != -1)
  {
    off_t src_len = MDS_IO_LSEEK(src_fd, 0, SEEK_END);
    int dst_fd = MDS_IO_OPEN(dst,O_RDWR | O_CREAT | O_TRUNC, 0664);
    if (dst_fd != -1)
    {
      MDS_IO_LSEEK(src_fd, 0, SEEK_SET);
      MDS_IO_LOCK(src_fd,0,src_len,1);
      if (src_len > 0)
      {
        void *buff = malloc(src_len);
        size_t bytes_read = MDS_IO_READ(src_fd,buff,(size_t)src_len);
        if (bytes_read == src_len)
	{
          int bytes_written = MDS_IO_WRITE(dst_fd,buff,(size_t)src_len);
          if (bytes_written == src_len)
            status = TreeSUCCESS;
        }
        if (buff)
          free(buff);
      }
      else if (src_len == 0)
          status = TreeSUCCESS;
      MDS_IO_LOCK(src_fd,0,src_len,0);
      MDS_IO_CLOSE(dst_fd);
    }
    MDS_IO_CLOSE(src_fd);
  }
  return status;
}
STATIC_ROUTINE int _CopyFile(char *src, char *dst, int lock_it)
{
  int status = TreeFAILURE;

  int src_fd = MDS_IO_OPEN(src,O_RDONLY | O_BINARY | O_RANDOM, 0);
  if (src_fd != -1)
  {
    ssize_t src_len = MDS_IO_LSEEK(src_fd, 0, SEEK_END);
    int dst_fd = MDS_IO_OPEN(dst,O_RDWR | O_CREAT | O_TRUNC, 0664);
    if ((dst_fd != -1) && (src_len != -1))
    {
      MDS_IO_LSEEK(src_fd, 0, SEEK_SET);
      if (lock_it) MDS_IO_LOCK(src_fd,0,(int)src_len,MDS_IO_LOCK_RD,0);
      if (src_len > 0)
      {
        size_t chunk_size = (size_t)(MIN(MAX_CHUNK, src_len));
        void *buff = malloc(chunk_size);
        size_t bytes_to_go = (size_t)src_len;
        while(bytes_to_go > 0)
        {
          size_t io_size = MIN(bytes_to_go, chunk_size);
          ssize_t bytes_read = MDS_IO_READ(src_fd,buff,io_size);
          if (bytes_read == io_size)
	  {
            ssize_t bytes_written = MDS_IO_WRITE(dst_fd,buff,io_size);
            if (bytes_written != io_size)
              break;
          }
          bytes_to_go -= io_size;
        }
        if (buff)
          free(buff);
        if (bytes_to_go == 0)
          status = TreeSUCCESS;
      }
      else if (src_len == 0)
          status = TreeSUCCESS;
      if (lock_it) MDS_IO_LOCK(src_fd,0,(int)src_len,MDS_IO_LOCK_NONE,0);
      MDS_IO_CLOSE(dst_fd);
    }
    MDS_IO_CLOSE(src_fd);
  }
  return status;
}
int       TreeGetCurrentShotId(char *experiment)
{
  int shot = 0;
  int status = 0;
  char *path = 0;
  char *exp = strcpy(malloc(strlen(experiment)+6),experiment);
  int i;
  int slen;
  for (i=0;exp[i] != '\0';i++)
    exp[i] = _ToLower(exp[i]);
  strcat(exp,"_path");
  path = TranslateLogical(exp);
  exp[strlen(experiment)]='\0';
  if (path && ((slen = strlen(path)) > 2) && (path[slen-1] == ':') && (path[slen-2] == ':'))
  {
    path[slen-2] = 0;
    status = TreeGetCurrentShotIdRemote(exp, path, &shot);
  }
  else
  {
    int fd = OpenShotIdFile(exp,O_RDONLY);
    if (fd != -1)
    {
      status = MDS_IO_READ(fd,&shot,sizeof(shot)) == sizeof(shot);
      MDS_IO_CLOSE(fd);
#ifdef WORDS_BIGENDIAN
      if (status & 1)
      {
        int lshot = shot;
        int i;
        char *optr = (char *)&shot;
        char *iptr = (char *)&lshot;
        for (i=0;i<4;i++) optr[i] = iptr[3-i];
      }
#endif
    }
  }
  if (path)
    TranslateLogicalFree(path);
  free(exp);
  return (status & 1) ? shot : 0;
}