Dejo un ejemplo funciona, adjunto la base de datos y el programa.
la idea es que para estos menesteres es necesario dos tablas al menos, la tabla que contiene la lista de los archivos, y la tabla que contiene los binarios de los archivos,
esto es para evitar que en un query se recupere mas de un solo archivo a la vez,
el hacer un SELECT * FROM TABLA_PDF es muy ineficiente, ya que se traeria a memoria todo los archivos de la tabla, la cual dependido de sus tamaños es probable que te lleves la ram de la pc, en este ejemplo, son necesaria dos tablas con un campo en común "archivo_numero", así que cuando necesito un archivo en particular los traigo en un segundo query usado ese numero.
espero me comprendan.
en el ejemplo, estan dos funciones PDF2MYSQL y MYSQL2PDF, en la primera ejecucion del programa debera esta comentada MYSQL2PDF, en la segunda ejecucion debera estar comentada PDF2MYSQL.
la base de datos
-- --------------------------------------------------------
-- Host:
-- Versión del servidor: 5.1.69-0ubuntu0.10.04.1 - (Ubuntu)
-- SO del servidor: debian-linux-gnu
-- HeidiSQL Versión: 8.3.0.4726
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Volcando estructura de base de datos para test
CREATE DATABASE IF NOT EXISTS `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `test`;
-- Volcando estructura para tabla test.tabla_archivo
CREATE TABLE IF NOT EXISTS `tabla_archivo` (
`archivo_numero` int(6) unsigned NOT NULL,
`archivo_nombre` char(150) NOT NULL,
KEY `archivo_numero` (`archivo_numero`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- La exportación de datos fue deseleccionada.
-- Volcando estructura para tabla test.tabla_pdf
CREATE TABLE IF NOT EXISTS `tabla_pdf` (
`archivo_numero` int(6) unsigned NOT NULL,
`archivo_contenido` mediumtext,
KEY `archivo_numero` (`archivo_numero`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- La exportación de datos fue deseleccionada.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
el programa
Code: Select all
#include "Directry.ch"
#ifndef __XAHRBOUR__
#include "hbcompat.ch"
#endif
#include "tdolphin.ch"
#include "fivewin.ch"
#define TRUE .t.
#define FALSE .f.
#define D_CLIENT_COMPRESS 32
REQUEST DBFCDX, DBFFPT
REQUEST HB_LANG_ESWIN, HB_CODEPAGE_ESWIN
procedure Main()
private oErr
private oServer
private oQry
IF !Configuracion()
RETURN
ENDIF
PDF2MYSQL()
//MYSQL2PDF()
oServer:end()
return
/*------------------------------------------------------------------*/
function Configuracion()
RddSetDefault( "DBFCDX" )
HB_LangSelect( "ESWIN" )
HB_SetCodePage( "ESWIN" )
SET DEFAULTCLPVALUE ON
SET LOGICALVALUE ON
SET CASESENSITIVE ON
SET PADRIGHT ON
return Conectar()
/*------------------------------------------------------------------*/
function Conectar()
local lOk := FALSE
LOCAL cSrv_Host := "192.168.10.10"
LOCAL cSrv_User := "carlos"
LOCAL cSrv_Pass := "diana1"
LOCAL cSrv_Port := "3306"
LOCAL cSrv_Data := "test"
TRY
oServer := TDolphinSrv():New( cSrv_Host, cSrv_User, cSrv_Pass, Val( cSrv_Port ), D_CLIENT_COMPRESS, cSrv_Data )
oServer:Execute( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" )
oServer:Execute( "SET SESSION LOW_PRIORITY_UPDATES=0" )
oServer:Execute( "SET SESSION SQL_BIG_SELECTS=1" )
oServer:Execute( "SET SESSION sql_mode='STRICT_ALL_TABLES'" )
oServer:Execute( "SET SESSION big_tables=0" )
oServer:Execute( "SET SESSION query_cache_type=ON" )
oServer:Execute( "SET SESSION collation_database='latin1_spanish_ci'" )
oServer:Execute( "SET @DTRIGGERS=NULL" )
oServer:Execute( "SET SESSION storage_engine=InnoDB" )
lOk := TRUE
CATCH oErr
MsgAlert( oErr:Description, "No se conecto al servidor" )
END
D_SetCaseSensitive( TRUE )
Set_MyLang( "es_ES" )
return lOk
/*------------------------------------------------------------------*/
function PDF2MYSQL()
local lOk := FALSE
local cDir := "d:\xhb\doc\sqlrdd"
local aFilesPdf := Directory( cDir + "\" + "*.pdf" )
local aFile, cFile, xCont, nFile
if len( aFilesPdf ) > 0
nFile := 0
try
for each aFile in aFilesPdf
nFile := nFile + 1
cFile := cDir + "\" + aFile[ F_NAME ]
xCont := FileStr( cFile )
?nFile, cFile, len(xCont)
if !empty( xCont )
oServer:Insert( "tabla_archivo", ;
{ "archivo_numero" , "archivo_nombre" }, ;
{ nFile, cFileName( cFile ) } )
oServer:Insert( "tabla_pdf", ;
{ "archivo_numero" , "archivo_contenido" }, ;
{ nFile , HB_Base64Encode( xCont, len( xCont ) ) } )
SysRefresh()
endif
next
lOk := TRUE
catch oErr
lOk := FALSE
MsgStop( oErr:description )
end
if lOk
MsgInfo( "Archivos respaldados en el servidor." )
endif
else
MsgAlert( "No hay archivos pdf en el directorio indicado" )
endif
return lOk
/*------------------------------------------------------------------*/
function MYSQL2PDF()
local lOk := FALSE
local nFile, cFile, xCont
local oQry2, cQry2
local cPath := "d:\misapp"
oQry := oServer:Query( "select archivo_numero, archivo_nombre from tabla_archivo" )
oQry:GoTop()
do while !oQry:eof()
nFile := oQry:archivo_numero
cFile := alltrim( oQry:archivo_nombre )
cQry2 := "select archivo_contenido from tabla_pdf where archivo_numero=%1 limit 1"
cQry2 := StrFormat( cQry2, alltrim( str( nFile ) ) )
try
oQry2 := oServer:Query( cQry2 )
if oQry2:RecCount() > 0
if !empty( oQry2:archivo_contenido )
xCont := HB_Base64Decode( oQry2:archivo_contenido )
if !empty( xCont )
if StrFile( xCont, cPath + "\" + cFile ) > 0
?"Archivo creado:", cFile
endif
endif
endif
endif
oQry2:end()
lOk := TRUE
catch oErr
lOk := FALSE
MsgStop( oErr:description )
end
oQry:Skip()
enddo
oQry:end()
return lOk
/*------------------------------------------------------------------*/
//EOF
/*------------------------------------------------------------------*/