X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fadmin.c;h=54167f60f4da46efb9f9797a0f5c1205d3325ab7;hp=0ac0faa2c39199d1b7c63a329f97c7be3a1831e0;hb=1a219938c1325105582cdbc2c9a34b6fc3cdf191;hpb=4c176312acdc3444c9afc820f76a393e64668e52 diff --git a/client/admin.c b/client/admin.c index 0ac0faa..54167f6 100644 --- a/client/admin.c +++ b/client/admin.c @@ -1,18 +1,23 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: admin.c,v 1.18 2005-01-15 19:47:08 adam Exp $ */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include #include -#if HAVE_FNMATCH_H +#if HAVE_DIRENT_H #include +#endif +#if HAVE_FNMATCH_H #include +#endif +#if HAVE_SYS_STAT_H #include #endif @@ -23,40 +28,35 @@ #include #include #include - +#include #include #include "admin.h" /* Helper functions to get to various statics in the client */ -ODR getODROutputStream(); +ODR getODROutputStream(void); extern char *databaseNames[]; extern int num_databaseNames; -int sendAdminES(int type, char* param1) +static int sendAdminES(int type, char* param1) { ODR out = getODROutputStream(); char *dbname = odr_strdup (out, databaseNames[0]); - + /* Type: 1=reindex, 2=truncate, 3=delete, 4=create, 5=import, 6=refresh, 7=commit */ Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest ); Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; Z_External *r; - int oid[OID_SIZE]; + Odr_oid *oid; Z_ESAdminOriginPartToKeep *toKeep; Z_ESAdminOriginPartNotToKeep *notToKeep; - oident update_oid; printf ("Admin request\n"); fflush(stdout); - /* Set up the OID for the external */ - update_oid.proto = PROTO_Z3950; - update_oid.oclass = CLASS_EXTSERV; - update_oid.value = VAL_ADMINSERVICE; + oid = odr_oiddup(out, yaz_oid_extserv_admin); - oid_ent_to_oid (&update_oid, oid); - req->packageType = odr_oiddup(out,oid); + req->packageType = oid; req->packageName = "1.Extendedserveq"; /* Allocate the external */ @@ -71,59 +71,59 @@ int sendAdminES(int type, char* param1) r->u.adminService->which = Z_Admin_esRequest; r->u.adminService->u.esRequest = (Z_AdminEsRequest *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest)); - + toKeep = r->u.adminService->u.esRequest->toKeep = - (Z_ESAdminOriginPartToKeep *) + (Z_ESAdminOriginPartToKeep *) odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->toKeep)); - + toKeep->which=type; toKeep->databaseName = dbname; switch ( type ) { case Z_ESAdminOriginPartToKeep_reIndex: - toKeep->u.reIndex=odr_nullval(); - break; - + toKeep->u.reIndex=odr_nullval(); + break; + case Z_ESAdminOriginPartToKeep_truncate: - toKeep->u.truncate=odr_nullval(); - break; + toKeep->u.truncate=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_drop: - toKeep->u.drop=odr_nullval(); - break; + toKeep->u.drop=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_create: - toKeep->u.create=odr_nullval(); - break; + toKeep->u.create=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_import: - toKeep->u.import = (Z_ImportParameters*) + toKeep->u.import = (Z_ImportParameters*) odr_malloc(out, sizeof(*toKeep->u.import)); - toKeep->u.import->recordType=param1; - /* Need to add additional setup of records here */ - break; + toKeep->u.import->recordType=param1; + /* Need to add additional setup of records here */ + break; case Z_ESAdminOriginPartToKeep_refresh: - toKeep->u.refresh=odr_nullval(); - break; + toKeep->u.refresh=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_commit: - toKeep->u.commit=odr_nullval(); - break; + toKeep->u.commit=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_shutdown: - toKeep->u.commit=odr_nullval(); - break; + toKeep->u.commit=odr_nullval(); + break; case Z_ESAdminOriginPartToKeep_start: - toKeep->u.commit=odr_nullval(); - break; + toKeep->u.commit=odr_nullval(); + break; default: - /* Unknown admin service */ - break; + /* Unknown admin service */ + break; } - + notToKeep = r->u.adminService->u.esRequest->notToKeep = - (Z_ESAdminOriginPartNotToKeep *) - odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->notToKeep)); + (Z_ESAdminOriginPartNotToKeep *) + odr_malloc(out, sizeof(*r->u.adminService->u.esRequest->notToKeep)); notToKeep->which=Z_ESAdminOriginPartNotToKeep_recordsWillFollow; notToKeep->u.recordsWillFollow=odr_nullval(); - + send_apdu(apdu); - + return 0; } @@ -136,14 +136,14 @@ int cmd_adm_reindex(const char *arg) } /* cmd_adm_truncate - Truncate the specified database, removing all records and index entries, but leaving + Truncate the specified database, removing all records and index entries, but leaving the database & it's explain information intact ready for new records */ int cmd_adm_truncate(const char *arg) { if ( arg ) { sendAdminES(Z_ESAdminOriginPartToKeep_truncate, NULL); - return 2; + return 2; } return 0; } @@ -155,7 +155,7 @@ int cmd_adm_create(const char *arg) if ( arg ) { sendAdminES(Z_ESAdminOriginPartToKeep_create, NULL); - return 2; + return 2; } return 0; } @@ -167,7 +167,7 @@ int cmd_adm_drop(const char *arg) if ( arg ) { sendAdminES(Z_ESAdminOriginPartToKeep_drop, NULL); - return 2; + return 2; } return 0; } @@ -191,69 +191,75 @@ int cmd_adm_import(const char *arg) ODR out = getODROutputStream(); if (arg && sscanf (arg, "%19s %1023s %1023s", type_str, - dir_str, pattern_str) != 3) - return 0; + dir_str, pattern_str) != 3) + return 0; if (num_databaseNames != 1) - return 0; + return 0; dir = opendir(dir_str); if (!dir) - return 0; - + return 0; + sendAdminES(Z_ESAdminOriginPartToKeep_import, type_str); - + printf ("sent es request\n"); if ((cp=strrchr(dir_str, '/')) && cp[1] == 0) - sep=""; - + sep=""; + while ((ent = readdir(dir))) { - if (fnmatch (pattern_str, ent->d_name, 0) == 0) - { - char fname[1024]; - struct stat status; - FILE *inf; - - sprintf (fname, "%s%s%s", dir_str, sep, ent->d_name); - stat (fname, &status); - - if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) - { - Z_NamePlusRecord *rec; - Odr_oct *oct = (Odr_oct *) odr_malloc (out, sizeof(*oct)); - - if (!apdu) - { - apdu = zget_APDU(out, Z_APDU_segmentRequest); - segment = apdu->u.segmentRequest; - segment->segmentRecords = (Z_NamePlusRecord **) - odr_malloc (out, chunk * sizeof(*segment->segmentRecords)); - } - rec = (Z_NamePlusRecord *) odr_malloc (out, sizeof(*rec)); - rec->databaseName = 0; - rec->which = Z_NamePlusRecord_intermediateFragment; - rec->u.intermediateFragment = (Z_FragmentSyntax *) - odr_malloc (out, sizeof(*rec->u.intermediateFragment)); - rec->u.intermediateFragment->which = - Z_FragmentSyntax_notExternallyTagged; - rec->u.intermediateFragment->u.notExternallyTagged = oct; - - oct->len = oct->size = status.st_size; - oct->buf = (unsigned char *) odr_malloc (out, oct->size); - fread (oct->buf, 1, oct->size, inf); - fclose (inf); - - segment->segmentRecords[segment->num_segmentRecords++] = rec; - - if (segment->num_segmentRecords == chunk) - { - send_apdu (apdu); - apdu = 0; - } - } - } + if (fnmatch (pattern_str, ent->d_name, 0) == 0) + { + char fname[1024]; + struct stat status; + FILE *inf; + + sprintf (fname, "%s%s%s", dir_str, sep, ent->d_name); + stat (fname, &status); + + if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) + { + Z_NamePlusRecord *rec; + Odr_oct *oct = (Odr_oct *) odr_malloc (out, sizeof(*oct)); + + if (!apdu) + { + apdu = zget_APDU(out, Z_APDU_segmentRequest); + segment = apdu->u.segmentRequest; + segment->segmentRecords = (Z_NamePlusRecord **) + odr_malloc (out, chunk * sizeof(*segment->segmentRecords)); + } + rec = (Z_NamePlusRecord *) odr_malloc (out, sizeof(*rec)); + rec->databaseName = 0; + rec->which = Z_NamePlusRecord_intermediateFragment; + rec->u.intermediateFragment = (Z_FragmentSyntax *) + odr_malloc (out, sizeof(*rec->u.intermediateFragment)); + rec->u.intermediateFragment->which = + Z_FragmentSyntax_notExternallyTagged; + rec->u.intermediateFragment->u.notExternallyTagged = oct; + + oct->len = status.st_size; + oct->buf = (char *) odr_malloc (out, oct->len); + if (fread(oct->buf, 1, oct->len, inf) != (size_t) oct->len) + { + printf("Incomplete read of file %s\n", fname); + } + if (fclose(inf)) + { + printf("Close failed for file %s\n", fname); + } + + segment->segmentRecords[segment->num_segmentRecords++] = rec; + + if (segment->num_segmentRecords == chunk) + { + send_apdu (apdu); + apdu = 0; + } + } + } } if (apdu) - send_apdu(apdu); + send_apdu(apdu); apdu = zget_APDU(out, Z_APDU_segmentRequest); send_apdu (apdu); closedir(dir); @@ -268,19 +274,19 @@ int cmd_adm_import(const char *arg) #endif -/* "Freshen" the specified database, by checking metadata records against the sources from which they were +/* "Freshen" the specified database, by checking metadata records against the sources from which they were generated, and creating a new record if the source has been touched since the last extraction */ int cmd_adm_refresh(const char *arg) { if ( arg ) { sendAdminES(Z_ESAdminOriginPartToKeep_refresh, NULL); - return 2; + return 2; } return 0; } -/* cmd_adm_commit +/* cmd_adm_commit Make imported records a permenant & visible to the live system */ int cmd_adm_commit(const char *arg) { @@ -299,12 +305,12 @@ int cmd_adm_startup(const char *arg) sendAdminES(Z_ESAdminOriginPartToKeep_start, NULL); return 2; } - /* * Local variables: - * tab-width: 8 * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil * End: - * vim600: sw=4 ts=8 fdm=marker - * vim<600: sw=4 ts=8 + * vim: shiftwidth=4 tabstop=8 expandtab */ +