#!/usr/bin/perl use DBI(); $filetypes{"pdf"}='pdf'; $filetypes{"ps"}='pdf'; $filetypes{"html"}='html'; $filetypes{"htm"}='html'; $filetypes{"doc"}='doc'; $filetypes{"xls"}='xls'; $filetypes{"txt"}='txt'; %monthlist = (Jan => "0", Feb => "1", Mar => "2", Apr => "3", May => "4", Jun => "5", Jul => "6", Aug => "7", Sep => "8", Oct => "9", Nov => "10", Dec => "11", 0 => "Jan", 1 => "Feb", 2 => "Mar", 3 => "Apr", 4 => "May", 5 => "Jun", 6 => "Jul", 7 => "Aug", 8 => "Sep", 9 => "Oct", 10 => "Nov", 11 => "Dec"); $tempfile="/tmp/temp.txt"; $localfile="local"; $list = ''; $list .= quotemeta chr for(32..126); #________________________________________________________________________________________________________# $ENV{ORACLE_HOME} = "/usr/local/oracle_home"; &log_print('Index Started...'); &open_A("select dm.filename as A,dm.id as B from doc_master dm, doc_contents dc where dm.id=dc.file_id and dc.inserted='0' order by dm.id desc"); &log_print("Search Completed, Processing Started"); while(my $ref = $sth->fetchrow_hashref()) { $filename=$ref->{"A"}; $id=$ref->{"B"}; &log_print("$filename, $id"); &get_text("$filename","$id"); if ($contents[0]) { &execute_B("update doc_contents set contents='$contents[0]',inserted='1' where file_id='$id'"); for ($k=1;$k<@contents;$k++) { &execute_B("insert into doc_contents (file_id,contents,inserted) values ('$id','$contents[$k]','1')"); print "read ".$id.", got: "."$contents[$k]"."\n"; } my $templength = scalar(@contents); my $templength2 = 2000*$templength; &log_print("\n$id($filename)($type) - $templength2+ chars ($templength rows added)"); } else { if ($type eq 'pdf') { &execute_B("update doc_contents set contents=' ',inserted='4' where file_id='$id'"); &log_print("\n$id($filename)($type) - PDF ignored"); } else { &execute_B("update doc_contents set contents=' ',inserted='2' where file_id='$id'"); &log_print("\n$id($filename)($type) - no text to write to file"); } } } #next line removes all of the non-matching files so that they don't build up &execute_B("update doc_contents set contents=' ',inserted='3' where inserted='0'"); &log_print("Index Completed"); &close_A(); #________________________________________________________________________________________________________# sub open_A { $ENV{ORACLE_HOME} = "/usr/local/oracle_home"; $dbh = DBI->connect('DBI:Oracle:ifx2db','ifx1','ifx1'); $statement = "$_[0]"; $sth = $dbh->prepare($statement); $rv = $sth->execute; } #________________________________________________________________________________________________________# sub close_A { $rc = $sth->finish; $rc = $dbh->disconnect; } #________________________________________________________________________________________________________# sub execute_B { $rv2 = $dbh->do($_[$INDEX]); } #________________________________________________________________________________________________________# sub log_print { $stamp = &stamp_to_date(time); $logstring = "[$stamp]: $_[0]"; print "\n$logstring\n"; } #________________________________________________________________________________________________________# sub get_text { my @a = split /\./,"$_[0]"; $type = $filetypes{"$a[1]"}; unless ($type) { $type = 'null'; } #my $target = "$_[1].$type"; #scp from remote $_[0] to $target my $target=$_[0]; my $return = ''; if ($type eq 'pdf') { #system("pstotext $target $tempfile"); exec("/usr/local/bin/pdftotext $target $tempfile"); open(INFILE, "$tempfile"); @text=; close(INFILE); $return=join("",@text); $return=''; } elsif ($type eq 'html') { $return=`html2text $target`; } elsif ($type eq 'xls') { $return=`xls2csv $target`; } elsif ($type eq 'doc') { $return=`catdoc $target`; } elsif ($type eq 'txt') { open(INFILE, "$target`"); @text=; close(INFILE); $return=join("",@text); } else { $return = ''; } #$content=~s/[^!-~]/ /g; $return=~s/[^$list]/ /g; #replace all control characters with a space. $return=~s/\'/\'\'/g; #escape all single quotes since they'll mess up the SQL. $return=~s/\s+/ /g; #replace all instance of multiple spaces with single spaces. @contents=(); $flag=0; $m=0; $nextstring=$return; $lastspace=0; while (!$flag) { $lastspace = rindex($nextstring,' ',2000); #this returns the last instance of a space before 2000 chars $contents[$m]=substr($nextstring,0,$lastspace); #grabs the string until the last instance of a space before 2000 chars $nextstring=substr($nextstring,$lastspace+1); #grabs the string from the last space to the end. if (length($nextstring)<2000) { $contents[$m+1]=$nextstring; $flag=1; } $m++; } log_print("~~".$return."\n"); } #________________________________________________________________________________________________________# sub stamp_to_date { my @temp_time = localtime($_[0]); $hours = $temp_time[2]; $m="AM"; if ($hours>12) { $m="PM"; $hours=$hours-12; } elsif ($hours==0) { $hours=12; } $minutes = $temp_time[1]; if ($minutes<10) { $minutes="0$minutes"; } $tempmonth = $monthlist{$temp_time[4]}; $tempday = $temp_time[3]; $tempyear = $temp_time[5]+1900; $export="$hours:$minutes $m, $tempmonth $tempday, $tempyear PST"; return $export; } #________________________________________________________________________________________________________# 0;