Name

index —

ATTRIBUTES

Attribute Pos. Req. Default Description
extension
basefile
type
export_only
spec
fn
fields
col
columns
show_status
interpolate     0 interpolate input?
reparse     1 interpolate output?

DESCRIPTION

BEHAVIOR

This tag does not appear to be affected by, or affect, the rest of Interchange.

EXAMPLES

No examples are available at this time. We do consider this a problem and will try to supply some.

NOTES

AVAILABILITY

index is available in Interchange versions:

4.6.0-5.9.0 (git-head)

SOURCE

Interchange 5.9.0:

Source: code/SystemTag/index.coretag
Lines: 16


# Copyright 2002-2007 Interchange Development Group and others
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.  See the LICENSE file for details.
# 
# $Id: index.coretag,v 1.5 2007-03-30 23:40:49 pajamian Exp $

UserTag index               Order        table
UserTag index               addAttr
UserTag index               attrAlias    base table
UserTag index               attrAlias    database table
UserTag index               PosNumber    1
UserTag index               Version      $Revision: 1.5 $
UserTag index               MapRoutine   Vend::Data::index_database

Source: lib/Vend/Data.pm
Lines: 1137

sub index_database {
my($dbname, $opt) = @_;

return undef unless defined $dbname;

my $db;
$db = database_exists_ref($dbname)
  or do {
    logError("Vend::Data export: non-existent database %s", $dbname);
    return undef;
  };

$db = $db->ref();

my $ext = $opt->{extension} || 'idx';

my $db_fn = $db->config('db_file');
my $bx_fn = $opt->{basefile} || $db->config('db_text');
my $ix_fn = "$bx_fn.$ext";
my $type  = $opt->{type} || $db->config('type');

#::logDebug(
#  "dbname=$dbname db_fn=$db_fn bx_fn=$bx_fn ix_fn=$ix_fn\n" .
#  "options: " . uneval($opt) . "\n"
#  );

if(    ! -f $bx_fn
      or 
    file_modification_time($db_fn)
      >
          file_modification_time($bx_fn)    )
{
  export_database($dbname, $bx_fn, $type);
}

return if $opt->{export_only};

if(    -f $ix_fn
      and 
    file_modification_time($ix_fn)
      >=
          file_modification_time($bx_fn)    )
{
  # We didn't need to index if got here
  return;
}

if(! $opt->{spec}) {
  $opt->{fn} = $opt->{fn} || $opt->{fields} || $opt->{col} || $opt->{columns};
  my $key = $db->config('KEY');
  my @fields = grep $_ ne $key, split /[\0,\s]+/, $opt->{fn};
  my $sort = join ",", @fields;
  if(! $opt->{fn}) {
    logError(errmsg("index attempted on table '%s' with no fields, no search spec", $dbname));
    return undef;
  }
  $opt->{spec} = <<EOF;
ra=1
rf=$opt->{fn}
tf=$sort
EOF
}

my $scan = Vend::Interpolate::escape_scan($opt->{spec});
$scan =~ s:^scan/::;

my $c = {
      mv_list_only        => 1,
      mv_search_file    => $bx_fn,
    };

Vend::Scan::find_search_params($c, $scan);

$c->{mv_matchlimit} = 100000
  unless defined $c->{mv_matchlimit};
my $f_delim = $c->{mv_return_delim} || "\t";
my $r_delim = $c->{mv_record_delim} || "\n";

my @fn;
if($c->{mv_return_fields}) {
  @fn = split /\s*[\0,]+\s*/, $c->{mv_return_fields};
}

#::logDebug( "search options: " . uneval($c) . "\n");

open(Vend::Data::INDEX, "+<$ix_fn") or
  open(Vend::Data::INDEX, "+>$ix_fn") or
       die "Couldn't open $ix_fn: $!\n";
lockfile(\*Vend::Data::INDEX, 1, 1)
  or die "Couldn't exclusive lock $ix_fn: $!\n";
open(Vend::Data::INDEX, "+>$ix_fn") or
     die "Couldn't write $ix_fn: $!\n";

if(@fn) {
  print INDEX " ";
  print INDEX join $f_delim, @fn;
  print INDEX $r_delim;
}

my $ref = Vend::Scan::perform_search($c);
for(@$ref) {
  print INDEX join $f_delim, @$_; 
  print INDEX $r_delim;
}

unlockfile(\*Vend::Data::INDEX)
  or die "Couldn't unlock $ix_fn: $!\n";
close(Vend::Data::INDEX)
  or die "Couldn't close $ix_fn: $!\n";
return 1 if $opt->{show_status};
return;
}

AUTHORS

Interchange Development Group

SEE ALSO

DocBook! Interchange!