// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.
#include "fileio.ch"
#ifdef __PLATFORM__Linux
#define  OS_FILE_MASK  "*"
#else
#define  OS_FILE_MASK  "*.*"
#endif


#define _BEST_ACTIVE_SEM "ACTIVE.SEM"
#define _OPEN_READ       ( nH := FOPEN( cFile, FO_READ+FO_SHARED ) ) == -1
#define _OPEN_EXCLUSIVE  ( nH := FOPEN( cFile, FO_WRITE+FO_EXCLUSIVE ) ) == -1
#define _CLOSE           IF nH <> -1 ;   FCLOSE( nH ) ; nH := -1 ;    ENDIF
#TRANSLATE _CONFIG_INI(  <cPath>  ) => NameConfigIni(  <cPath>  )

// Передаваемые параметры:
//						cRegim := '1' - Open BEST
//						cRegim := '2' - Open INDEX
//						cRegim := '3' - Close BEST
//						cRegim := '4' - Close INDEX
//
// Возвращаемое значение:
//						cStatus := '0' - OK!
//						cStatus := '1' - Best active
//						cStatus := '2' - INDEX active

FUNCTION BestActive( cRegim, cPath )
  LOCAL cFile := cPath+_BEST_ACTIVE_SEM, cStatus := '0',;
        nH := -1,i, cOldStatus := '0'
  Static aHandel := {}

#ifndef _DEBUG
  i := ASCAN( aHandel,{|x| x[1]==UPPER(cPath)} )
  IF i == 0
    nH := -1
    cOldStatus := '0'
  ELSE
    nH := aHandel[i][2]
    cOldStatus := aHandel[i][3]
  ENDIF
  // проверим наличее семафорного файла
  IF !FILE( cFile )
    MEMOWRIT( cFile, 'Если вы читаете - индексации нет!' )
  ENDIF

  IF     cRegim == '0'  // Текущее состояние
    cStatus := cOldStatus

  ELSEIF cRegim == '1' .AND. nH == -1 // Запуск БЭСТа
    IF _OPEN_READ
      cStatus := '2'  // Идет индексация
    ELSE
      cOldStatus := '1'
    ENDIF

  ELSEIF cRegim == '2'  // Монопольный режим работы с БЭСТом
    _CLOSE
    IF _OPEN_EXCLUSIVE
      IF _OPEN_READ ;      cStatus := '2'  // Идет индексация
      ELSE          ;      cStatus := '1'  // Кто-то работает
      ENDIF
    ELSE
      cOldStatus := '2'
    ENDIF
  ELSEIF cRegim == '3'   // Завершение работы с БЭСТом
     _CLOSE
     cOldStatus := '0'

  ELSEIF cRegim == '4'   // Завершение монопольной работы с БЭСТом
     _CLOSE
     IF _OPEN_READ
       cStatus := '2'
     ELSE
       cOldStatus := '1'
     ENDIF // Идет индексация
  ENDIF
  IF i == 0
    AADD( aHandel, {UPPER(cPath),nH,cOldStatus})
  ELSE
    aHandel[i][2] := nH
    aHandel[i][3] := cOldStatus
  ENDIF
#endif

RETURN ( cStatus )



FUNCTION SverkaVersion( cExeVersion, cPathExe, cPathDbf )
  LOCAL cVerConfig, cVerDbase, lRez
RETURN .T.

  cExeVersion := UPPER(ALLTRIM(cExeVersion))
  cVerConfig  := UPPER(ALLTRIM(MEMOLINE( MEMOREAD( _CONFIG_INI(cPathExe) ), 100, 2)))
  cVerDbase   := UPPER(ALLTRIM(MEMOLINE( MEMOREAD(cPathDbf+"VER.VER"), 100, 1)))
//  ? cexeversion, cverconfig, cverdbase
  //cExeVersion := SUBSTR( cExeVersion, ATNUM('/',cExeVersion,2)-6, 5 )
  //cVerConfig  := SUBSTR( cVerConfig,  ATNUM('/',cVerConfig, 2)-6, 5 )
  //cVerDbase   := SUBSTR( cVerDbase ,  ATNUM('/',cVerDbase , 2)-6, 5 )
  cExeVersion := SubStr(cExeVersion,at(".",cExeVersion)-2,5)
  cVerConfig  := SubStr(cVerConfig ,at(".",cVerConfig )-2,5)
  cVerDbase   := SubStr(cVerDbase  ,at(".",cVerDbase  )-2,5)

//  ? cexeversion, cverconfig, cverdbase
//inkey(0)

  lRez := cExeVersion == cVerConfig .AND. cVerConfig == cVerDbase

RETURN( lRez .OR. AT( 'REZERV.EXE', UPPER(EXENAME()) ) != 0.OR. AT( 'ANALIZ.EXE', UPPER(EXENAME()) ) != 0)


FUNCTION RetDbaseVer(cPathDbf)
LOCAL nRet  // Возвращает номер версии базы (менее 4.00 - грубо)(в виде числа)
IF (empty(fileseek(cPathDbf+"INI\"+OS_FILE_MASK, 16) ).or.LEN(DIRECTORY(cPathDbf+"INI\"+OS_FILE_MASK))<2)
   nRet:= "2.00"
ELSEIF !FILE(cPathDbf+"TOVAR\SH_FACT.DBF")
   nRet:= "3.00"
ELSEIF !FILE(cPathDbf+"VER.VER")
   nRet:= "3.99"
ELSE
   nRet:= UPPER(ALLTRIM(MEMOLINE( MEMOREAD(cPathDbf+"VER.VER"), 100, 1)))
   nRet:= SUBSTR( nRet ,  ATNUM('/',nRet , 2)-5, 5 )
ENDIF
RETURN VAL(nRet)

FUNCTION BS_BS( x, y )
 LOCAL nRez := 0
 If y >= 0
   nRez := VAL(STR(x, 30, y))
 ELSE
   nRez := VAL(STR(x/10** -y, 30, 0)) * 10** -y
 ENDIF
RETURN( nRez )

FUNCTION BS_ROUND( x, y )
RETURN( ROUND( ROUND( x, y+5 ), y ) )

#ifdef _TRIAL_DATE
  FUNCTION MY_TMP()
  RETURN( DATE() )
#endif
// DIM88
//--------------------------------------------------------------------------//
                    FUNCTION BS_FCOUNT()
//--------------------------------------------------------------------------//
// Выставляет возвращает скорректированный FCOUNT()
IF FieldPos("CRC") != 0
  RETURN FCOUNT()-IIF(FieldPos("CRYPT_CODE")=0,3,4)
ENDIF
RETURN FCOUNT()
//--------------------------------------------------------------------------//
                    FUNCTION Bs_Struct(lAll)
//--------------------------------------------------------------------------//
// Возвращает скорректированный массив описывающий структуру базы
IF lAll = NIL .AND. FieldPos("CRC") != 0
  RETURN ASIZE(dbStruct(),FCOUNT()-IIF(FieldPos("CRYPT_CODE")=0,3,4))
ENDIF
RETURN dbStruct()

