Página 3 de 4

MariaDB

Enviado: 26 Jan 2020 20:46
por JoséQuintas
Imagine o seguinte:

INSERT INTO CLIENTE ( NOME ) VALUE ( 'RUA DALVA' )

mas o usuário digita ' ) e mais comandos no nome

INSERT INTO CLIENTE ( NOME ) VALUE ( ' ' ); DELETE FROM.... ')

Só o fato de trocar aspas simples por \' , já evita problemas desse tipo, é uma das coisas a evitar.
O problema maior não é erro na gravação, mas o usuário se aproveitar pra outras coisas.

MariaDB

Enviado: 26 Jan 2020 20:51
por JoséQuintas
INSERT INTO CLIENTE ( NOME ) VALUE ( '\' ); DELETE FROM....\'')

Desse jeito vai gravar as aspas (') dentro do texto, sem erro, e sem a possibilidade do usuário injetar comandos, pelo menos com aspas...

MariaDB

Enviado: 26 Jan 2020 21:08
por asimoes
Quintas,

Fiz a função RemoveAcentosEspeciais(), com essa função funcionou.

Funcionou também para PTISO e PT850

CASE ValType( xValue ) == "C"
xValue := AllTrim( RemoveAcento( MySqlValidString( xValue ) ) )
RemoveAcentosEspeciais( @xValue )
cSql += StringSql( xValue )

Código: Selecionar todos

FUNCTION RemoveAcentosEspeciais( xValue )
LOCAL cLetra

   FOR EACH cLetra IN xValue
      DO CASE
         CASE cLetra $ "abcdefghijklmnopqrstuvwxyz"
         CASE cLetra $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
         CASE cLetra $ "0123456789"
         CASE cLetra $ " /·,+-()"
      OTHERWISE
         xValue := StrTran( xValue, cLetra )
      ENDCASE
   NEXT

RETURN Nil

MariaDB

Enviado: 26 Jan 2020 21:48
por asimoes
Tinha um campo com o nome Desc, deu ruim, kkk, modifiquei para DESCONTO, sistema legado tem disso.

MariaDB

Enviado: 26 Jan 2020 23:42
por asimoes
Fiz uma modificação aqui só pra ler o dbf que não foi lido por erro ou que entrou na pasta (novo), pra não ter que ler tudo novamente

Código: Selecionar todos

   hTable := {}

   FOR EACH oFile IN Directory( "*.DBF" )
      cFile := oFile[ F_NAME ]
      cFile := Substr( cFile, 1, At( ".", cFile ) - 1 )
      
      lRead := .T.
      
      IF Hb_FileExists( "ARQUIVO.json" )
         hArquivo := {}
         Hb_JSONDecode( Hb_MemoRead( "ARQUIVO.json" ), @hArquivo )
         lRead := Hb_aScan( hArquivo, { |a| a["DBF"] == cFile } ) = 0
      ENDIF
      
      IF lRead
         hRecord := Nil
         hRecord := {=>}
         hRecord["DBF"] := cFile
         aAdd( hTable, hRecord )
         CopyDbfToMySql( cFile, .T., .T., .T. )
         cJSON := Hb_JSONEncode( hTable, .T. )
         Hb_MemoWrit( "ARQUIVO.json", cJSON )
      ENDIF
        
   NEXT

MariaDB

Enviado: 26 Jan 2020 23:59
por JoséQuintas
Tive um problema estranho pra atualizar de 5.5 pra 10.x

Ao chamar a atualização, selecionar MySQL, deu erro.
Fazendo de novo, e clicando em "select all", aí marcou MySQL e funcionou.
Vai entender...

Atualizei da 5.5 pra 10.x

A única coisa que não gostei, é que os bancos continuaram na pasta 5.5, isso pode confundir.

Mas tudo certo.

Uso servidores diferentes agora, MySQL e MariaDB, minha base local é MariaDB, mas na internet é MySQL.
Como eu já disse, o mesmo conector funciona nos dois.
Agora minhas máquinas só tem MariaDB, mas conectam normalmente no MySQL da internet.

Acho que só faltou dizer uma coisa:

A instalação do MySQL tem 400MB
A instalação do MariaDB tem 50MB, e vém com HeidiSQL.

E pra quem estiver interessado, já pode trocar o ODBC pra MariaDB, mesmo que continue usando MySQL.

MariaDB

Enviado: 27 Jan 2020 00:41
por asimoes
Peguntas:

O nome EMAIL é palavra reservada do MariaDB ?

Porque deu erro na criação de primary aqui:

cKeyName é IDEMAIL

cSql += " PRIMARY KEY ( " + cKeyName + " )"

Modifiquei o nome da tabela de EMAIL para XEMAI, não deu erro

MariaDB

Enviado: 27 Jan 2020 01:24
por asimoes
Agora tem esse erro maluco:
2020-01-27 01_21_56-Utilitário de Carga MariaDB.png
Já tentei trocar o nome do dbf mais continua o erro.

MariaDB

Enviado: 27 Jan 2020 14:18
por JoséQuintas
Faz assim:

Faz a manutenção do HeidiSQL, e dá uma olhada no código CREATE dele.
Pode renomear o nome do campo, criar índice, etc.
Depois é só olhar como ele fez o CREATE.
Uma opção que aparece no HeidiSQL:

`CODIGO` INT(11)

MariaDB

Enviado: 27 Jan 2020 19:56
por asimoes
Quintas,

Descobri o problema, não tem tratamento para campo lógico.

Inclui esse código

CASE oStru[ nCont, DBS_TYPE ] == "L"
cSql += " VARCHAR( " + Ltrim( Str( oStru[ nCont, DBS_LEN ] ) ) + " ) DEFAULT 'F' "

Era esse o problema.
2020-01-27 19_55_05-Window.png
Foi criado também essa função para tratar o lógico

Código: Selecionar todos

FUNCTION LogicSql( lLogic )

   LOCAL cString

   Hb_Default(@lLogic, .F.)
   
   cString := IF( lLogic, "'T'", "'F'" )

   RETURN cString
CASE ValType( xValue ) == "L"
cSql += LogicSql( xValue )

MariaDB

Enviado: 27 Jan 2020 22:18
por JoséQuintas
asimoes escreveu:CASE oStru[ nCont, DBS_TYPE ] == "L"
cSql += " VARCHAR( " + Ltrim( Str( oStru[ nCont, DBS_LEN ] ) ) + " ) DEFAULT 'F' "
Mas aí tá criando caractere.
Não seria o binary?

Vou deixar pra quando for usar, assim tiro a dúvida.
Nunca usei campo lógico, não gosto deles, mas talvez um dia use no MariaDB.

MariaDB

Enviado: 27 Jan 2020 22:25
por JoséQuintas
Achei isto, e de geralmente usarem Tiny Int
mysql.png

MariaDB

Enviado: 28 Jan 2020 08:30
por asimoes
Quintas
Vou modificar como você sugeriu
No Oracle não tem isso, o artifício e dessa forma que eu fiz, o problema é compatibilidade com os outros bancos se for migrar
Varchar é igual nos SGBD

MariaDB

Enviado: 29 Jan 2020 11:34
por asimoes
Filtro e Sort com um resultset

Pode-se ordenar um resultset ou filtrar determinado campo dele.

Ex.:

Código: Selecionar todos

oRs:Sort   := "VENCIMENTO DESC"
            
oRs:Filter := "VENCIMENTO='20/02/2020'" 

oRs:Filter := "VENCIMENTO >= #20/01/20#"

MariaDB

Enviado: 29 Jan 2020 11:49
por JoséQuintas
asimoes escreveu:Filtro e Sort com um resultset
Só que isso é do ADO, e vale pra qualquer base de dados, até DBF.