dbf travado qdo fecha com CTRL+ALT+DEL

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Mário Isa »

Então !
De vez em quando um usuário resolve "fechar" o sistema com CTRL+ALT+DEL.
Justamente durante a rotina de organização geral (coisa minha) que só acontece uma vez por mês.

Depois, ao voltar ao sistema, o mesmo não consegue mais abrir o dbf.
Ou, na hora de abrir, o windows informa que o banco já está aberto.
Daí é necessário reiniciar pois sem isso / os dbfs / não estão corretamente fechados /
Tem alguma maneira de se resolver isso ?

Tipo um comando que force o fechamento do banco ?
Mário
Cezar
Usuário Nível 3
Usuário Nível 3
Mensagens: 189
Registrado em: 27 Mai 2006 14:03

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Cezar »

ola,

Para evitar esse tipo de desatre eu fazia a reindexação geral na maquina que contem a base de dados em modo exclusivo e não sai de perto até acabar..


v_cez@yahoo.com.br
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Mário Isa »

Olá César!

Isso eu já faço / eu alterei o errorsys.prg para que ele / ao detectar algum problema com NTX / ele "fecha" todos os bancos / em todos os computadores da rede / e reconstrói só aquele NTX / e depois dá ordem para reabrir o banco em todos (enquanto isso eles ficaram aguardando a ordem para reabertura)

O problema é quando o banco travou e não abre. você dá o comando use / mas não acontece nada / ele não abre...

Eu também já até modifiquei o errorsys.prg / para que ele / ao perceber este problema / ele reinicia a máquina servidora automaticamente / mas eu gostaria de evitar isso / e ainda não sei como /

:%
Cezar
Usuário Nível 3
Usuário Nível 3
Mensagens: 189
Registrado em: 27 Mai 2006 14:03

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Cezar »

Ola,

Eu adoto esses critérios, talvez sirva como sugestão:
1. Todos os usuários tinham que estar fora do programa(s), sei que numa rede
com muitos usuários fica dificil/impossível.
Mantinha uma tabela dos usuarios que estaõ usando o programa.
Qdo entra seta a tabela, qdo sai re-seta, assim vc sabe quem esta usando.
2. Ligava um semaforo, assim que todo mundo estivessem for dos programas,
se alguem tentar-se entrar no programa e a indexação geral esta em curso,
o programa pede para "voltar depois".
3. Na indexação:
Um de cada vez: fechar o Dbf, deletar o indice(s), abrir exclusivo, indexar e fechar.


v_cez@yahoo.com.br
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Mário Isa »

O meu modelo funciona mais ou menos assim:

é um modo automático /

Aqui é na hora que vai tentar abrir o arquivo

Código: Selecionar todos

contaneterr := 1
DO WHILE (sempre .OR. m->tempox > 0)


// tentando abrir o arquivo



   IF exuse                    && exclusivo
      USE (arq) alias (ape) EXCLUSIVE New
   ELSE                        && compartilhado
      USE (arq) alias (ape) Shared New
   ENDIF



// se o arquivo não foi aberto e tentou-se mais de 5 vezes  / toma-se providencias


   if select(ape) = 0 .and. contaneterr <= 5 .and. !exuse
    inkey(1)
    contaneterr++
    loop
   end
   if select(ape) # 0
    return .t.
   end
   if contaneterr > 5
    
    // start_rep_autom ??




// se tentou mais de 5 vezes dá umas mensagens



    Tecle('Um ou mais arquivos nÆo puderam ser aberto(s). Verifique o computador-servidor.')



    ferase('erroabre.txt')

// nesta função vai tentar corrigir o erro


    ace_erro_dbf(arq)


    return .t.
   end
   INKEY(1)                    && espera 1 segundo
e a função ace_erro_dbf()

Código: Selecionar todos

//--------------->
function ace_erro_dbf(o_nome_dbf)




// grava o log de todos os q estão abertos agora

comanda := 'qprocess * /SYSTEM > qproc__e.txt'
execdos(comanda)

// pega o nome do indexado
__indexa := vaiab(o_nome_dbf)


// manda "parar" (fechar) aquele dbf na rede toda

para_file_ter(o_nome_dbf) // a função para_file_ter recebe o nome do arquivo q é prá "parar" (fechar) / e o fecha em todas as estações e elas aguardam ordens para reabrí-lo.
aguarda(5)


// fecha o dbf aqui (nesta estação) também

&o_nome_dbf->(dbclosearea())

// abre ele no modo exclusivo

use &o_nome_dbf exclusive new


// caso não tenha aberto é porque tá com pau mesmo / então reinicia mas só se for o servidor
porque isso ainda é um projeto / tenho q trabalhar mais nele.

if empty(alias())
 // Talvez, no futuro, tem q reiniciar computadores

 if (type('estacao')=N .and. estacao=val(subs(unitserver,5)) ) .or. (type('estacao')="C" .and. estacao == UNITSERVER)
  chutdown()
 end

 return .f.
end


// caso tenha conseguido abrir então dá o pack e o recall all
pack
recall all


// daí reconstrói todos os indexados.
ct__index := 1
while ct__index <= len(indexado(__indexa))
 ferase(indexado(__indexa)[ct__index])
 __aachave := achave(__indexa)[ct__index]

 indexon(__aachave,'1',indexado(__indexa)[ct__index],'.t.')
 // indexon é a minha função que reconstrói aquele .ntx
   //       indexado() é uma função q retorna o nome do .NTX daquele .dbf / daquela posição

 ct_index++
end

dbclearindex()

// fecha o arquivo
&o_nome_dbf->(dbclosearea())

// a função usei já abre o .DBF com todos os .ntx
usei(o_nome_dbf)


//renavarios renomeia vários arquivos para vários
renomeando para .ope é uma ordem para reabrir o arquivo / e todos reabrem.
renavarios('fh*.fil','fh*.ope')


return nil


//-------------------->
 Function chutdown()
 dbcloseall()
 execdos('ren ok*.* de*.*') // derruba todos os outros terminais
 clear
 cor(8)
 @ 08,5 say 'UM PROBLEMA FOI DETECTADO E O REINÖCIO DO COMPUTADOR  NECESSµRIO.'
 @ 10,5 say 'AGUARDANDO 3 SEGUNDOS PARA REINICIAR O COMPUTADOR....'
 ctsecs := 3
 whil ctsecs > 0
  @ 12,20 say ctsecs pict '99'
  aguarda(1)
  ctsecs--
 end
 cor(1)

//memoriza um e-mail para enviar a mim me avisando de q a máq teve q ser reiniciada.
 Transemail('Reiniciou maq-'+minha_fanta+'-'+dtoc(date()),{},{},NIL,NIL,"S")

 comanda := 'start shutdown -r -f'
 run (comanda)
 saiimed()
 return nil

Simples porque é automático
Complicado por causa do código / que é doido.
:)´
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Stanis Luksys »

Olá,

Me parece que eu vi algum lugar que existe uma rotina, ou um flag de compilação, não me lembro, que seta o xHarbour para fazer um despejo de memória quando o programa termina inesperadamente (mesmo que não passe pelo errorsys), mas não sei se funciona quando o processo é terminado na marra via ctrl+alt+del.

Ou seja, falei um monte de coisa e não disse nada né... Mas vou pesquisar e volto aqui pra falar sobre esta funcionalidade, que apesar dea princípio não poder resolver a questão do DBF travado em sí, pode dar boas pistas para no momento do próximo início do sistema, fazer umas verificações, talvez até recuperando dados perdidos antes do commit.

Na questão do DBF propriamente, acho que não tem solução, a única forma que conheço é o loop infinito tentanto abrir em modo exclusivo.

Minha sugestão prática seria a seguinte: você faz um backup geralzão sempre antes dessa rotina, faz tudo que ela tem que fazer direcionando para o backup, e não para os DBFs principais, e então quando reiniciar o sistema, se detectar que esta rotina rodou com sucesso nos arquivos novos, substitue os velhos pelos novos.. Se não rodou até o fim fica com os DBFs originais e tenta de novo. É gambi mas deve funcionar!

Olha, seria bem fácil isso, bastaria copiar os DBFs envolvidos para outro diretório, mudar pelo SET DEFAULT o path de trabalho, e rodar a rotina.

Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Mário Isa »

Está muito legal o papo.
Mas acho q a solução definitiva é abandonar o .DBF e migrar para um banco de dados como firebird, mysql, oracle e outros...
Mas vou pesquisar também sobre o LETODBF.
Depois posto aqui.
Mário
Cezar
Usuário Nível 3
Usuário Nível 3
Mensagens: 189
Registrado em: 27 Mai 2006 14:03

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Cezar »

Ola Mário,

Me ocorreu agora, será que que não tem um jeito de quando iniciar o programa bloquear/Inibir o CTRL+ALT+DEL ??

Uma outra coisa que ajudaria, antes de mudar para Sql que seria o ideal, seria trocar os indices de .Ntx para .Cdx, mais pratico e seguro.

v_cez@yahoo.com.br
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Mensagem por Stanis Luksys »

Opa,
Mário Isa escreveu:Mas acho q a solução definitiva é abandonar o .DBF e migrar para um banco de dados como firebird, mysql, oracle e outros...
Se você centralizou a abertura, indexação e gravaçao de arquivos em funções suas e não fica usando USE e INDEX ON pelo meio do código, converter para qualquer banco de dados se torna muitíssimo facil, bastando alterar as devidas funções. O ideal pra quem está no DBF seria criar um classe só pra manipular DBFs... Dá uma olhadinha neste tópico que pode servir de exemplo...

Agora se o código está confuso, com o Mediator dá pra fazer isso sem muita alteração. Dá uma pesquisadinha pelo fórum...

Quanto a bloquear o ctrl+alt+del, não adianta fazer isso, porque se o cara sair do modo tela cheia, e o programa perder o foco, tanto o ctrl alt del como o fechar pelo X da janela mesmo, são de responsabilidade do Windows, teria então que ter um outro programa residente na memória, tipo no reloginho, aí daria muito trabalho.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Responder