int RsIni::writePrivateProfileString()

in src/odbc/rsodbc/rsini.cpp [249:383]


int RsIni::writePrivateProfileString(char *pSectionName, char *pKey, char *pData, char *pFile)
{
   FILE *fp;
   char buffer[INI_BUFFER_SIZE];
   char search[INI_KEY_SIZE];
   char original[INI_BUFFER_SIZE];
   char *pChar = NULL;
   int iStrCode = -1;
   size_t iFileLength;
   size_t iBufferLength;
   char * pFileBuffer;
   char pFullFilePath[MAX_PATH + 1];
   int iTempLen;

   if(pFile == NULL || pSectionName == NULL || pKey == NULL)
   {
	   return 0;
   }

   getFullOdbcIniPath(pFullFilePath, MAX_PATH, pFile);

   fp = fopen(pFullFilePath, "r");
   if(fp == NULL)
   {
		fp = fopen(pFullFilePath, "w");
		if (fp == NULL)
			return 0;
		fclose(fp);
        iFileLength = 0;
   }
   else
   {
      fseek(fp, 0, SEEK_END );
      iFileLength = ftell(fp);
      fclose(fp);
   }

   iTempLen = iBufferLength = iFileLength +  strlen(pKey) + 1 + ((pData) ? strlen(pData) : 0) + 2 + strlen(pSectionName) + 4;
   pFileBuffer = (char *) malloc(iBufferLength);
   pFileBuffer[0] = '\0';

   fp = fopen(pFullFilePath, "r");
   snprintf(search, INI_KEY_SIZE, "[%s]", pSectionName);

   while(fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
   {
	  strncat(pFileBuffer, buffer, iTempLen);

	  iTempLen -= strlen(buffer);

	  if(buffer[strlen(buffer)-1] == '\n')
          buffer[strlen(buffer)-1]= '\0';

      if(isCommentLine(buffer))
    	  continue;

	  if ((iStrCode = _stricmp(search, buffer)) == 0)
		  break;
   } // Loop

   if (iStrCode == 0)
   {
      iStrCode = -1;
      strncpy(search, pKey, INI_KEY_SIZE);
      while(fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
      {
		 original[0] = '\0';

         if(isCommentLine(buffer))
         {
			  strncat( pFileBuffer, buffer, INI_BUFFER_SIZE);
			  continue;
		 }

		 strncpy(original, buffer, INI_BUFFER_SIZE);

         if (isSection(buffer))
        	 break;

         if (buffer[strlen(buffer)-1] == '\n')
            buffer[strlen(buffer)-1]=0;

         if ((pChar = strchr(buffer, '=')) != NULL)
			 *pChar=0;

         if ((iStrCode = _stricmp(search, buffer)) == 0)
         {
			 original[0] = '\0';
			 break;
		 }

		 strncat(pFileBuffer, original, INI_BUFFER_SIZE);
		 original[0] = '\0';
      } // Loop

      if(pData)
      {
		  snprintf(buffer, INI_BUFFER_SIZE, "%s=%s\n", pKey, pData );
		  strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
      }

	  if(original[0] != '\0')
		  strncat( pFileBuffer, original, INI_BUFFER_SIZE);
   }
   else
   {
		snprintf(buffer, INI_BUFFER_SIZE, "[%s]\n", pSectionName);
		strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);

		if(pData)
		{
			snprintf(buffer, INI_BUFFER_SIZE, "%s=%s\n", pKey, pData);
			strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);
		}
   }

   while (fgets(buffer, INI_BUFFER_SIZE, fp) != 0)
		strncat(pFileBuffer, buffer, INI_BUFFER_SIZE);

   fclose(fp);

   fp = fopen(pFullFilePath, "w");
   if(fp == NULL)
   {
	   free(pFileBuffer);
	   return 0;
   }

   iFileLength = strlen(pFileBuffer);
   fputs(pFileBuffer, fp);
   fclose(fp);
   free(pFileBuffer);

   return 1;
}