+ int r, i, fd;
+ char gprefix[128];
+ char ext[128];
+ char ext_res[128];
+ char subType[128];
+ RecType recType;
+ struct recordGroup rGroupM;
+ struct recordGroup *rGroup = &rGroupM;
+ struct file_read_info *fi;
+ void *clientData;
+
+ memcpy (rGroup, rGroupP, sizeof(*rGroupP));
+
+ if (!rGroup->groupName || !*rGroup->groupName)
+ *gprefix = '\0';
+ else
+ sprintf (gprefix, "%s.", rGroup->groupName);
+
+ logf (LOG_DEBUG, "fileExtract %s", fname);
+
+ /* determine file extension */
+ *ext = '\0';
+ for (i = strlen(fname); --i >= 0; )
+ if (fname[i] == '/')
+ break;
+ else if (fname[i] == '.')
+ {
+ strcpy (ext, fname+i+1);
+ break;
+ }
+ /* determine file type - depending on extension */
+ if (!rGroup->recordType)
+ {
+ sprintf (ext_res, "%srecordType.%s", gprefix, ext);
+ if (!(rGroup->recordType = res_get (zh->res, ext_res)))
+ {
+ sprintf (ext_res, "%srecordType", gprefix);
+ rGroup->recordType = res_get (zh->res, ext_res);
+ }
+ }
+ if (!rGroup->recordType)
+ {
+ if (zh->records_processed < rGroup->fileVerboseLimit)
+ logf (LOG_LOG, "? %s", fname);
+ return 0;
+ }
+ if (!*rGroup->recordType)
+ return 0;
+ if (!(recType =
+ recType_byName (zh->reg->recTypes, rGroup->recordType, subType,
+ &clientData)))
+ {
+ logf (LOG_WARN, "No such record type: %s", rGroup->recordType);
+ return 0;
+ }
+
+ /* determine match criteria */
+ if (!rGroup->recordId)
+ {
+ sprintf (ext_res, "%srecordId.%s", gprefix, ext);
+ rGroup->recordId = res_get (zh->res, ext_res);
+ }
+
+ /* determine database name */
+ if (!rGroup->databaseName)
+ {
+ sprintf (ext_res, "%sdatabase.%s", gprefix, ext);
+ if (!(rGroup->databaseName = res_get (zh->res, ext_res)))
+ {
+ sprintf (ext_res, "%sdatabase", gprefix);
+ rGroup->databaseName = res_get (zh->res, ext_res);
+ }
+ }
+ if (!rGroup->databaseName)
+ rGroup->databaseName = "Default";
+
+ /* determine if explain database */
+
+ sprintf (ext_res, "%sexplainDatabase", gprefix);
+ rGroup->explainDatabase =
+ atoi (res_get_def (zh->res, ext_res, "0"));
+
+ /* announce database */
+ if (zebraExplain_curDatabase (zh->reg->zei, rGroup->databaseName))
+ {
+ if (zebraExplain_newDatabase (zh->reg->zei, rGroup->databaseName,
+ rGroup->explainDatabase))
+ return 0;
+ }
+
+ if (rGroup->flagStoreData == -1)
+ {
+ const char *sval;
+ sprintf (ext_res, "%sstoreData.%s", gprefix, ext);
+ if (!(sval = res_get (zh->res, ext_res)))
+ {
+ sprintf (ext_res, "%sstoreData", gprefix);
+ sval = res_get (zh->res, ext_res);
+ }
+ if (sval)
+ rGroup->flagStoreData = atoi (sval);
+ }
+ if (rGroup->flagStoreData == -1)
+ rGroup->flagStoreData = 0;
+
+ if (rGroup->flagStoreKeys == -1)
+ {
+ const char *sval;
+
+ sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext);
+ sval = res_get (zh->res, ext_res);
+ if (!sval)
+ {
+ sprintf (ext_res, "%sstoreKeys", gprefix);
+ sval = res_get (zh->res, ext_res);
+ }
+ if (!sval)
+ sval = res_get (zh->res, "storeKeys");
+ if (sval)
+ rGroup->flagStoreKeys = atoi (sval);
+ }
+ if (rGroup->flagStoreKeys == -1)
+ rGroup->flagStoreKeys = 0;
+
+ if (sysno && deleteFlag)
+ fd = -1;
+ else
+ {
+ char full_rep[1024];
+
+ if (zh->path_reg && !yaz_is_abspath (fname))
+ {
+ strcpy (full_rep, zh->path_reg);
+ strcat (full_rep, "/");
+ strcat (full_rep, fname);
+ }
+ else
+ strcpy (full_rep, fname);
+