Changeset 4517

Show
Ignore:
Timestamp:
04/11/12 16:14:07 (2 years ago)
Author:
pcanadilla
Message:

Se suben los cambios de pgloader.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • tolp/OfficialTolArchiveNetwork/EtlUtils/funBulkLoadPostgres.tol

    r4508 r4517  
    22// FILE:    funBulkLoadPostgres.tol 
    33// PURPOSE: Generic functions to load data in PostgreSQL databases 
     4////////////////////////////////////////////////////////////////////////////// 
     5 
     6////////////////////////////////////////////////////////////////////////////// 
     7Struct ColumnPositionSt 
     8{ 
     9  Text Name,   // Name of the column 
     10  Real PosIni, // Initial position of the fixed field 
     11  Real Length  // length of the field 
     12} ; 
    413////////////////////////////////////////////////////////////////////////////// 
    514 
     
    3847////////////////////////////////////////////////////////////////////////////// 
    3948{ 
    40   Text TraceETL("A remote command is going to be run in the host " + host + 
    41     " logged on with the credential of user " + userSO, "Des"); 
    4249  // We get the environment variable 
    4350  Text progFiles = GetEnv("PROGRAMFILES") + "\\" ; 
     
    4552    host + " -ssh -l " + userSO + " -pw " + passwdSO + " " + 
    4653    "\"" + cmd + "\"" ; 
     54 
     55  Text TraceETL("A remote command is going to be run in the host " + host + 
     56    " logged on with the credential of user " + userSO, "Des") ; 
     57 
    4758  Text TraceETL(cmdExec, "Cue") ; 
    4859  Real res = WinSystem(cmdExec, 4, TRUE) ; 
     
    7990PutDescription("It prepares a PostgreSQL connection. it copies the .pgpass " + 
    8091" file correspondig to the bbdd in teh host machine using the credentials " + 
    81 " given by userSO and passwdSO", 
    82 PrepPostgreSQLCon) ; 
     92" given by userSO and passwdSO" 
     93, PrepPostgreSQLCon) ; 
    8394////////////////////////////////////////////////////////////////////////////// 
    8495 
     
    95106 
    96107  cmd 
    97 }; 
    98 ///////////////////////////////////////////////////////////////////////////// 
    99 PutDescription("It returns the iconv command to execute from a ssh session", 
    100 IConv); 
     108} ; 
     109///////////////////////////////////////////////////////////////////////////// 
     110PutDescription("It returns the iconv command to execute from a ssh session" 
     111, IConv) ; 
    101112///////////////////////////////////////////////////////////////////////////// 
    102113 
     
    106117  Text host, Text userSO, Text passwdSO, 
    107118  Text fileOri, Text fileDes, 
    108   Text charOri, Text charDes) 
     119  Text charOri, Text charDes 
     120) 
    109121////////////////////////////////////////////////////////////////////////////// 
    110122{ 
     
    112124  Real res = ExecPlink(host, userSO, passwdSO, cmdiConv) ;   
    113125  res 
    114 }; 
     126} ; 
    115127///////////////////////////////////////////////////////////////////////////// 
    116128PutDescription("It launchs the iconv command in the host, using the " + 
    117129"credentials given by userSO/passwdSO. It transforms a fileOri coded with " + 
    118 "charcode charOri to fileDes coded with charcode charDes",  
    119 LaunchIConv) ; 
    120 ///////////////////////////////////////////////////////////////////////////// 
    121  
    122  
    123 ////////////////////////////////////////////////////////////////////////////// 
    124 Real BulkLoadPostgreSQL( 
     130"charcode charOri to fileDes coded with charcode charDes" 
     131, LaunchIConv) ; 
     132///////////////////////////////////////////////////////////////////////////// 
     133 
     134 
     135///////////////////////////////////////////////////////////////////////////// 
     136Text GetPgloaderConfigFileFixed( 
     137  Text host,  
     138  Text userSO, 
     139  Text passwdSO, 
     140  Text userBBDD, 
     141  Text passBBDD, 
     142  Text bbdd, 
     143  Text table,   
     144  Text fileName, 
     145  Text remotePath, 
     146  Set columnPosition 
     147) 
     148///////////////////////////////////////////////////////////////////////////// 
     149{ 
     150  // Se obtienen los campos y sus posiciones para generar los ficheros 
     151  Set colPos = EvalSet(columnPosition, Text(Set st){ 
     152    Text  
     153      st -> Name + ":" + IntText(st -> PosIni) + ":" + IntText(st -> Length)      
     154  }) ; 
     155 
     156  Text columsPositionText = TxtListItem(colPos, ",") ; 
     157 
     158  Text confFile =  
     159    "[pgsql]" +NL+ 
     160    "base = pgloader" +NL+ 
     161    "host = " + host +NL+ 
     162    "port = 5432" +NL+ //beware of this!! the port can change, although it is not normal 
     163    "base = " + bbdd +NL+ 
     164    "user = " + userBBDD +NL+ 
     165    "pass = " + passBBDD +NL+ 
     166    "log_file            = pgloader.log" +NL+ 
     167    "log_min_messages    = DEBUG" +NL+ 
     168    "client_min_messages = WARNING" +NL+ 
     169    "client_encoding = 'latin1'" +NL+ 
     170    "pg_option_standard_conforming_strings = on" +NL+ 
     171    "pg_option_work_mem = 12MB" +NL+ 
     172    "copy_every      = 5" +NL+ 
     173    "commit_every    = 5" +NL+ 
     174    "null         = \"\"" +NL+ 
     175    "empty_string = \"\\ \"" +NL+ 
     176    "max_parallel_sections = 4" +NL+ 
     177    "# those reject settings are defaults one" +NL+ 
     178    "reject_log   = " + remotePath + "simple.rej.log" +NL+ 
     179    "reject_data  = " + remotePath + "simple.rej" +NL+ 
     180    "[fixed]" +NL+ 
     181    "table           = " + table +NL+ 
     182    "format          = fixed" +NL+ 
     183    "filename        = " + fileName +NL+ 
     184    "columns         = *" +NL+ 
     185    "fixed_specs     = " + columsPositionText ; 
     186 
     187  confFile 
     188} ; 
     189///////////////////////////////////////////////////////////////////////////// 
     190PutDescription("It generates the config file for the pgloader tool" 
     191, GetPgloaderConfigFileFixed) ; 
     192///////////////////////////////////////////////////////////////////////////// 
     193 
     194 
     195///////////////////////////////////////////////////////////////////////////// 
     196Real PgloaderMoveConfigFile( 
     197  Text host, 
     198  Text userSO, 
     199  Text passwdSO, 
     200  Text configFile, 
     201  Text remotePath   
     202) 
     203///////////////////////////////////////////////////////////////////////////// 
     204{ 
     205  Text localConfigFile = GetEnv("TEMP") + "\\" + configFile ; 
     206  Text remoteConfigFile = remotePath + configFile ; 
     207 
     208  // Se copia el fichero a remoto 
     209  Real PutFile( 
     210    host, userSO, passwdSO, localConfigFile, remoteConfigFile 
     211  ) 
     212} ; 
     213///////////////////////////////////////////////////////////////////////////// 
     214PutDescription("It moves the the config file from local to remote" 
     215, PgloaderMoveConfigFile) ; 
     216///////////////////////////////////////////////////////////////////////////// 
     217 
     218 
     219///////////////////////////////////////////////////////////////////////////// 
     220Text PgloaderCmd(Text opts) 
     221///////////////////////////////////////////////////////////////////////////// 
     222{ 
     223  Text cmd = "pgloader" + " " + opts ; 
     224  cmd 
     225} ; 
     226///////////////////////////////////////////////////////////////////////////// 
     227PutDescription("It generates the cmd comand line for Pgloader" 
     228, PgloaderCmd) ; 
     229///////////////////////////////////////////////////////////////////////////// 
     230 
     231 
     232////////////////////////////////////////////////////////////////////////////// 
     233Real PgloaderBulkLoad( 
     234  Text host,  
     235  Text userSO, 
     236  Text passwdSO, 
     237  Text remotePath, // the folder used to load the files from the database 
     238  Text userBBDD, 
     239  Text passBBDD, 
     240  Text bbdd, 
     241  Text table, 
     242  Text configFile,  // if the file is not the default, you should has passed -C flag 
     243  Text fileName,    // data file to load 
     244  Set  columnPosition, 
     245  Text opts         // More options 
     246) 
     247////////////////////////////////////////////////////////////////////////////// 
     248{  
     249  // Check if the config file has been given 
     250  Text cfgFileName = 
     251    If (configFile == "", 
     252    { 
     253      Text defaultName = "pgloader.conf" ; 
     254      Text cfg = GetPgloaderConfigFileFixed(host,  
     255        userSO, passwdSO, userBBDD, passBBDD, bbdd, table, 
     256        fileName, remotePath, columnPosition) ; 
     257      Text WriteFile(GetEnv("TEMP") + "\\" + defaultName, cfg) ; 
     258      defaultName 
     259    }, 
     260    configFile 
     261  ) ; 
     262 
     263  Real PgloaderMoveConfigFile(host, userSO, passwdSO, cfgFileName, remotePath) ;   
     264 
     265  // Other check should be to test if the -C option has been given 
     266  // and pgloader.conf has been renamed to other name. To do sometime ... 
     267   
     268   
     269  // Añadir el parametro -C si se ha generado el fichero de configuración, 
     270  // sino, se deja como está 
     271  Text defaultOptions = 
     272    If (configFile != "", opts, 
     273      "-c " + remotePath + cfgFileName + " " + opts     
     274  ) ; 
     275 
     276  // Generated the cmd to invoque the pgloader 
     277  Text cmd = PgloaderCmd(defaultOptions) ; 
     278  Real res = ExecPlink(host, userSO, passwdSO, cmd) ; 
     279  Real res 
     280} ; 
     281///////////////////////////////////////////////////////////////////////////// 
     282PutDescription("It launchs the command pgloader in a PostgreSQL host."+ 
     283"It needs the credentials userSO and passwdSO in the host to run the " + 
     284"program with the opts given. The rest of the options are given to " + 
     285"configure the config file", 
     286PgloaderBulkLoad) ; 
     287///////////////////////////////////////////////////////////////////////////// 
     288 
     289 
     290 
     291////////////////////////////////////////////////////////////////////////////// 
     292Real PsqlBulkLoad( 
    125293  Text table, 
    126294  Text host,  
     
    131299  Text fileName, 
    132300  Text delimit, 
    133   Real header,  // detalla si el fichero tiene cabecera 1 = Si tiene, 0 = No 
     301  Real header,  // Flag to indicate if the file contains header: 1 = it has header, 0 = it doesn't have header 
    134302  Text txtOpts, // More options for text mode 
    135   Text csvOpts)  // More options for cvs mode 
     303  Text csvOpts  // More options for cvs mode 
     304  ) 
    136305////////////////////////////////////////////////////////////////////////////// 
    137306 
    138   Text cmd = PSQLBulkLoadingCmd( 
     307  Text cmd = PsqlCmd( 
    139308    userBBDD, bbdd, table, fileName, delimit, header, txtOpts, csvOpts 
    140309  ); 
     
    144313}; 
    145314///////////////////////////////////////////////////////////////////////////// 
    146 PutDescription("It launchs the command Copy in a PostgreSQL host. It needs "+ 
    147 "the credentials userSO and passwdSO in the host to put the fileName " + 
     315PutDescription("It launchs the command psql cmd Copy in a PostgreSQL host."+ 
     316"It needs the credentials userSO and passwdSO in the host to put the fileName" + 
    148317" to load. Then it uses the bbdd, table, userBBDD to specify the need " + 
    149 " parameters to connect with pgsql to the database. Finally, the options " + 
     318" parameters to connect with psql to the database. Finally, the options " + 
    150319"delimit, header, txtOpts and csvOpts are passed to the copy invocation " + 
    151 "to load correctly info into the table", 
    152 BulkLoadPostgreSQL) ; 
    153 ///////////////////////////////////////////////////////////////////////////// 
    154  
    155  
    156 ///////////////////////////////////////////////////////////////////////////// 
    157 Text PSQLBulkLoadingCmd( 
     320"to load the info into the table", 
     321PsqlBulkLoad) ; 
     322///////////////////////////////////////////////////////////////////////////// 
     323 
     324 
     325///////////////////////////////////////////////////////////////////////////// 
     326Text PsqlCmd( 
    158327  Text userBBDD,  
    159328  Text bbdd,  
    160329  Text table,  
    161330  Text fileName, 
    162   Text delimit, 
    163   Real header,  // detalla si el fichero tiene cabecera 1 = Si tiene, 0 = No 
    164   Text txtOpts, // Más opciones para el modo texto 
    165   Text csvOpts) // Más opciones para el modo csv 
     331  Text opts  // More options 
     332) 
    166333///////////////////////////////////////////////////////////////////////////// 
    167334{ 
    168335  Text "psql -U " + userBBDD + " -d " + bbdd + " -c " +  
    169     "\\\"" + BulkCmdPostgreSQL(table, fileName, delimit, 
     336    "\\\"" + PsqlCopyCmd(table, fileName, delimit, 
    170337    header, txtOpts, csvOpts) + "\\\"" 
    171 }; 
    172 ///////////////////////////////////////////////////////////////////////////// 
    173 PutDescription("It returns the pgsql bulk command used by PostgreSQL" 
    174 , PSQLBulkLoadingCmd) ; 
    175 ///////////////////////////////////////////////////////////////////////////// 
    176  
    177  
    178 ///////////////////////////////////////////////////////////////////////////// 
    179 Text BulkCmdPostgreSQL( 
     338} ; 
     339///////////////////////////////////////////////////////////////////////////// 
     340PutDescription("It returns the pgsql copy command used by PostgreSQL" 
     341, PsqlCmd) ; 
     342///////////////////////////////////////////////////////////////////////////// 
     343 
     344 
     345///////////////////////////////////////////////////////////////////////////// 
     346Text PsqlCopyCmd( 
    180347  Text table, 
    181348  Text fileName, 
     
    183350  Real header,  // detalla si el fichero tiene cabecera 1 = Si tiene, 0 = No 
    184351  Text txtOpts, // Más opciones para el modo texto 
    185   Text csvOpts) // Más opciones para el modo csv 
     352  Text csvOpts  // Más opciones para el modo csv 
     353  ) 
    186354///////////////////////////////////////////////////////////////////////////// 
    187355{  
    188   Text hea = If(header==1, " csv header", ""); 
     356  Text hea =  
     357    Case( 
     358      header==1, " csv header", 
     359      1, "") ; 
    189360   
    190   Text copy_cmd = "\copy " + table + " from" + " '" + fileName + "'" + 
     361  Text copy_cmd = "\copy " + table + " from" +  
     362    " '" + fileName + "'" + 
    191363    " with delimiter as '" + delimit + "'" + 
    192364    " " + txtOpts + hea + " " + csvOpts ; 
    193365 
    194366  copy_cmd 
    195 };  
    196 ///////////////////////////////////////////////////////////////////////////// 
    197 PutDescription("It returns the bulk cmd used by PostgreSQL", 
    198 BulkCmdPostgreSQL) ; 
     367} ;  
     368///////////////////////////////////////////////////////////////////////////// 
     369PutDescription("It returns the copy cmd used by PostgreSQL psql tool", 
     370PsqlCopyCmd) ; 
    199371///////////////////////////////////////////////////////////////////////////// 
    200372 
     
    204376///////////////////////////////////////////////////////////////////////////// 
    205377{ 
    206   Text com = If (OSUNIX == 1, 
    207     "mv " + oldName + " " +newName, 
     378  Text cmd = If (OSUNIX == 1, 
     379    "mv "  + oldName + " " +newName, 
    208380    "ren " + oldName + " " +newName 
    209   ); 
    210  
    211   com 
    212 }; 
     381  ) ; 
     382 
     383  cmd 
     384} ; 
    213385///////////////////////////////////////////////////////////////////////////// 
    214386PutDescription("It returns the rename command to use", RemoteFileRenameCmd) ; 
     
    218390///////////////////////////////////////////////////////////////////////////// 
    219391Real RemoteFileRename( 
    220   Text host,  
    221   Text userSO,  
    222   Text passwdSO, 
    223   Text fileNameOri,  
    224   Text fileNameDest, 
    225   Real remoteOSUNIX) 
    226 ///////////////////////////////////////////////////////////////////////////// 
    227 { 
    228   Text cmdRen = RemoteFileRenameCmd(fileNameOri, fileNameDest, remoteOSUNIX); 
    229   Real res = ExecPlink(host, userSO, passwdSO, cmdRen);   
     392  Text host, Text userSO, Text passwdSO, 
     393  Text fileNameOri, Text fileNameDest, 
     394  Real remoteOSUNIX 
     395) 
     396///////////////////////////////////////////////////////////////////////////// 
     397{ 
     398  Text cmd = RemoteFileRenameCmd(fileNameOri, fileNameDest, remoteOSUNIX) ; 
     399  Real res = ExecPlink(host, userSO, passwdSO, cmd) ;   
    230400  res 
    231 }; 
     401} ; 
    232402///////////////////////////////////////////////////////////////////////////// 
    233403PutDescription("It launchs a filename rename from fileNameOri to " + 
     
    237407///////////////////////////////////////////////////////////////////////////// 
    238408 
     409 
     410///////////////////////////////////////////////////////////////////////////// 
     411Text RemoteFileDeleteCmd(Text fileName, Real OSUNIX) 
     412///////////////////////////////////////////////////////////////////////////// 
     413{ 
     414  Text cmd = If (OSUNIX == 1, 
     415    "rm "  + fileName, 
     416    "del " + fileName 
     417  ) ; 
     418 
     419  cmd 
     420} ; 
     421///////////////////////////////////////////////////////////////////////////// 
     422PutDescription("It returns the delete command to use", RemoteFileDeleteCmd) ; 
     423///////////////////////////////////////////////////////////////////////////// 
     424 
     425 
     426///////////////////////////////////////////////////////////////////////////// 
     427Real RemoteFileDelete( 
     428  Text host, Text userSO, Text passwdSO, 
     429  Text fileName, Real remoteOSUNIX 
     430) 
     431///////////////////////////////////////////////////////////////////////////// 
     432{ 
     433  Text cmd = RemoteFileDeleteCmd(fileNameOri, remoteOSUNIX) ; 
     434  Real res = ExecPlink(host, userSO, passwdSO, cmd) ;   
     435  res 
     436} ; 
     437///////////////////////////////////////////////////////////////////////////// 
     438PutDescription("It launchs a file deletion from fileName in a ssh session." + 
     439"It uses the credentials userSO and " + 
     440"passwdSO in the host. Also, it requires a flag, remoteOSUNIX, " + 
     441"that indicates if the remote server is unix", RemoteFileDelete) ; 
     442///////////////////////////////////////////////////////////////////////////// 
     443 
     444