Archive for the ‘Programação’ Category

Enviando e-mails pelo Delphi

quarta-feira, agosto 18th, 2010

Dando uma vasculhada nos meus arquivos antigos, encontrei um projeto da época de faculdade… um Programa para enviar spam.  Como foi tudo “em nome ciência” e para incomodar alguns amigos…

Foi feito para fins acadêmicos… não me responsabilizo pelo seu uso.

Nos anexos estão disponibilizados os fontes e também uma classe para envio de e-mail diretamente por um servidor SMTP, a TSendMail esta classe (que utiliza os componentes da Indy) está pronta para ser adicionada ao projeto e ao instanciá-la basta preencher as propriedades que seu e-mail será enviado.

(mais…)

Definindo Role de Conexão ao Banco de Dados com JDBC

sexta-feira, abril 9th, 2010

Uma rapidinha, pois demorei a encontrar:

Para definir a role na conexão com o Banco de Dados utilize um Properties

Properties prop = new Properties();
prop.put("user", "login_bd");
prop.put("password", "senha_bd");
prop.put("roleName", "role_bd");

Connection conn = DriverManager.getConnection("jdbc:firebirdsql:127.0.01:banco", prop);

conn.setAutoCommit(false);            
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Simples assim! Note que roleName é case sensitive eu apanhei um monte até descobrir.

Monitores…

sexta-feira, agosto 21st, 2009

18082009660
Sim… as vezes eu me perco :|

Hibernate sem XML (ufa!)

quarta-feira, abril 22nd, 2009

Opa, eu nunca me dei bem com XML… não sei se é trauma da época que trabalhava com html(abre tag, fecha tag, abre tag…) ou se é algum outro tipo de bloqueio.

E no caso usando hibernate+Annotations achei muito chato ficar alterando este XML para mapear as classes. Além de engessar caso eu queira configurar um nova conexão em tempo de execução.

Isto é mais um exemplo… futuramente (eu ando prometendo muitas coisas :| ) posto aqui um projeto utilizando ele.

No caso aqui eu uso duas classes Banco e BancoProjeto, como são vários projetos herdo e personalizo de acordo com a necessidade de cada projeto.

Primeira classe: Banco

package br.com.theos.admin.database;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

public class Banco {

    protected static Banco instancia;

    private Session session;
    private Transaction transaction;
    private AnnotationConfiguration cfg;

    public synchronized static Banco getInstancia() {
        if (instancia == null) {
            instancia = new Banco();
        }
        return instancia;
    }

    public Banco() {
    	super();

    	cfg = new AnnotationConfiguration();
    }

    public void setProperty(String key, String value) {
        	cfg.setProperty(key, value);
    }

    @SuppressWarnings("unchecked")
    public void addMappedClass(Class persistenceClass) {
    	cfg.addAnnotatedClass(persistenceClass);
    }  

    public Session getSession() {
    	if (session == null) {
    		session = cfg.buildSessionFactory().openSession();
    	}

    	return session;
    }

    public void startTransaction() {
    	transaction = session.beginTransaction();
    }

    public void commitTransaction() {
    	transaction.commit();
    }

    public void rollbackTransaction() {
    	transaction.rollback();
    }
}

Ela apenas está preparada para receber as configurações e serviços básicos. É necessário herdá-la para que seja possível a conexão.

Segunda classe: BancoProjeto

package br.com.theos.server.database;

import br.com.theos.admin.database.Banco;
import br.com.theos.server.database.entities.Class1;
import br.com.theos.server.database.entities.Class2;
import br.com.theos.server.database.entities.Class3;

public class BancoProjeto extends Banco {

	public BancoProjeto(String database) {
		super();

		loadBuild(database);
		loadMappedClass();
	}

	public synchronized static Banco getInstancia(String database) {
        	if (instancia == null) {
            		instancia = new BancoProjeto(database);
        	}       

        	return instancia;
    	}

	private void loadBuild(String database) {
		setProperty("hibernate.dialect", "org.hibernate.dialect.FirebirdDialect");
		setProperty("hibernate.connection.driver_class", "org.firebirdsql.jdbc.FBDriver");
		setProperty("hibernate.connection.url", "jdbc:firebirdsql:localhost/3050:"+database);
		setProperty("hibernate.connection.username", "sysdba");
		setProperty("hibernate.connection.password", "masterkey");
		setProperty("hibernate.show_sql", "false");
                /*
                 * Para apagar e recriar: "create-drop"
                 * Para não fazer nada:  "validate"
                 * Para somente atualizar: "update"
                 */
		setProperty("hibernate.hbm2ddl.auto", "validate");
	}

	private void loadMappedClass() {
		addMappedClass(Class1.class);
		addMappedClass(Class2.class);
		addMappedClass(Class3.class);
	}
}

Pronto! Agora abandonamos o persistence.xml e o hibernate.cfg.xml.

Isto vai dar uma dinamicidade melhor ao seu projeto.

Criar base de dados do Firebird+Java

quarta-feira, abril 22nd, 2009

Opa, precisei em tempo de execução criar uma base firebird com java.

Pesquisei, e claro o Google nos trouxe grandes informações.

Mas vou disponibilizar uma classe prontinha para pesquisa, ou utilização:

package br.com.theos.server.database;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

import org.firebirdsql.management.FBManager;

public class CreateDatabase {

	private String path;
	private String sep;

	public CreateDatabase() {
		super();

		Execute("teste");
	}

	private String getPath() { //Caminho do aliases.conf do firebird
		if (path == "") {
                         //Separador padrão do sistema operacional
			sep = System.getProperty("file.separator");

			StringBuilder pBuilder = new StringBuilder();

                        //Caminho padrão do diretório de instalação dos programas
			pBuilder.append(System.getenv("programfiles"));
			pBuilder.append(sep);
			pBuilder.append("Firebird");
			pBuilder.append(sep);
			pBuilder.append("Firebird_1_5"); //No meu caso usamos ainda o Firebird 1.5
			pBuilder.append(sep);
			pBuilder.append("aliases.conf");
                        path = pBuilder.toString();
		}

		return path;
	}

	//Para quem usa Alias, adicionar ao arquivo o alias da nova base
	private void addAlias(String database) throws FileNotFoundException {		

		File f = new File(getPath());

		if (f.exists()) {
			try {
				FileWriter fw = new FileWriter(getPath(),true);
				BufferedWriter bout = new BufferedWriter(fw);

				bout.write("\n"+database + " = "
                                         +System.getProperty("user.dir")+sep+
                                         database+".fdb"+"\n");
				bout.close();
				fw.close();
			} catch (IOException e) {
				// TODO Gerar log
				e.printStackTrace();
			}
		}
		else {
			throw new FileNotFoundException(getPath());
		}
	}

	//Database é o nome da base, será criada no diretório da aplicação
	public void Execute(String database) {
		try {
			addAlias(database);

			FBManager fb = new FBManager();
			fb.setServer("127.0.0.1");
			fb.setPort(3050);		

			fb.start();
			fb.createDatabase(database, "sysdba", "masterkey");
			fb.stop();

		} catch (FileNotFoundException fe) {
			// TODO Auto-generated catch block
			fe.printStackTrace();
		}
		catch(Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Pronto! Simples assim! :D

Não se esquecer da JDBC do Firebrid adicionado ao projeto.

Continuando downloads de arquivos

segunda-feira, novembro 24th, 2008

Aqui na empresa estamos desenvolvendo um atualizador online, onde ele irá fazer o download e a execução da atualização para os clientes.

Como a nossa internet brasileira não é confiável, e ainda temos muitos clientes que utilizam internet discada, surgiu a necessidade de continuar os downloads de arquivos.

Após pesquisas, e a grande ajuda do Fábio Matsuda fui buscar no componente IdHTTP da Indy a solução.

procedure TForm1.Download(url, pathLocal : String;);
var
   eFile     : TFileStream;
   IdHTTP  : TIdHTTP;
begin
   idHTTP := TIdHTTP.Create(nil);

   if FileExists(pathLocal) then //Caso o arquivo já exista ele o abre, caso contrário cria um novo
      eFile := TFileStream.Create(pathLocal,fmOpenReadWrite)
   else
      eFile := TFileStream.Create(pathLocal,fmCreate);

   try
      try
         eFile.Seek(0,soFromEnd); //Colocando o ponteiro no final do arquivo

         IdHTTP.Head(url); //Buscando informações do arquivo

         if eFile.Position < IdHTTP.Response.ContentLength then //Somente se o arquivo já não foi totalmente baixado
         begin
            IdHTTP.Request.ContentRangeStart := eFile.Position; //Definindo onde deve inciar o download
            IdHTTP.Request.ContentRangeEnd := IdHTTP.Response.ContentLength; //Verificando o tamanho do arquivo

            if eFile.Position > 0 then
            begin //É importante que o range seja definido com o tamanho inicial e o final
               IdHTTP.Request.Range := Format('%d-%d',[eFile.Position,IdHTTP.Response.ContentLength]);
            end;

            IdHTTP.Get(url,eFile);
         end;
      except
         ShowMessage('Conexão interrompida.');
      end;
   finally
      eFile.Free;
      IdHTTP.Disconnect;
      IdHTTP.Free;
   end;
end;

Este é um pequeno exemplo para se continuar downloads já iniciados, aos menos atenciosos url e pathLocal são paramentos que indicam o endereço do arquivo na internet e onde ele será salvo respectivamente.

Lembrando que é importante verificar o arquivo, seja por md5, hash ou crc32, para não haver problema caso este não seja atualizado.

Com o componene TIdHTTP é fácil colocar uma barra de progresso para o download, você já possui o tamanho total do arquivo

IdHTTP.Response.ContentLength

e o evento

OnWork

vai lhe informando quantos bytes já foram baixados pela variável

AWorkCount
IdHTTP.OnWork(ASender: TObject; AWorkMode: TWorkMode;
   AWorkCount: Integer);
begin
   Progress.Position := Trunc((AWorkCount/IdHTTP.Response.ContentLength)*100);
end;

Pronto, só lembrando que desenvolvi utilizando Indy 10 e Delphi 2007, não testei em versões anteriores.