VALUE executeRestore(VALUE self, VALUE manager) { ManagerHandle *handle = NULL; char *buffer = NULL; short length = 0; ISC_STATUS status[20]; /* Check that the service manager is connected. */ Data_Get_Struct(manager, ManagerHandle, handle); if(handle->handle == 0) { rb_ibruby_raise(NULL, "Database restore error. Service manager not connected."); } createRestoreBuffer(rb_iv_get(self, "@backup_file"), rb_iv_get(self, "@database"), rb_iv_get(self, "@options"), &buffer, &length); /* Start the service request. */ if(isc_service_start(status, &handle->handle, NULL, length, buffer)) { free(buffer); rb_ibruby_raise(status, "Error performing database restore."); } free(buffer); /* Query the service until it is complete. */ rb_iv_set(self, "@log", queryService(&handle->handle)); return(self); }
VALUE executeAddUser(VALUE self, VALUE manager) { ManagerHandle *handle = NULL; char *buffer = NULL; short length = 0; ISC_STATUS status[20]; /* Check that the service manager is connected. */ Data_Get_Struct(manager, ManagerHandle, handle); if(handle->handle == 0) { rb_ibruby_raise(NULL, "Add user error. Service manager not connected."); } createAddUserBuffer(self, &buffer, &length); /* Start the service request. */ if(isc_service_start(status, &handle->handle, NULL, length, buffer)) { free(buffer); rb_ibruby_raise(status, "Error adding user."); } free(buffer); return(self); }
void TraceSvcUtil::runService(size_t spbSize, const UCHAR* spb) { os_utils::CtrlCHandler ctrlCHandler; ISC_STATUS_ARRAY status; if (isc_service_start(status, &m_svcHandle, 0, static_cast<USHORT>(spbSize), reinterpret_cast<const char*>(spb))) { status_exception::raise(status); } const char query[] = {isc_info_svc_to_eof, isc_info_end}; // use one second timeout to poll service char send[16]; char* p = send; *p++ = isc_info_svc_timeout; ADD_SPB_LENGTH(p, 4); ADD_SPB_NUMERIC(p, 1); *p++ = isc_info_end; const USHORT sendSize = (p - send); char results[MAXBUF]; bool noData; do { if (isc_service_query(status, &m_svcHandle, 0, sendSize, send, sizeof(query), query, sizeof(results) - 1, results)) { status_exception::raise(status); } p = results; bool ignoreTruncation = false; bool dirty = false; noData = true; while (*p != isc_info_end) { const UCHAR item = *p++; switch (item) { case isc_info_svc_to_eof: ignoreTruncation = true; case isc_info_svc_line: { const unsigned short l = isc_vax_integer(p, sizeof(l)); p += sizeof(l); if (l) { const char ch = p[l]; p[l] = 0; fprintf(stdout, "%s", p); p[l] = ch; p += l; dirty = true; } noData = (l == 0); } break; case isc_info_truncated: if (!ignoreTruncation) return; break; case isc_info_svc_timeout: case isc_info_data_not_ready: noData = false; if (dirty) { fflush(stdout); dirty = false; } break; default: status_exception::raise(Arg::Gds(isc_fbsvcmgr_query_err) << Arg::Num(static_cast<unsigned char>(p[-1]))); } } } while (!(ctrlCHandler.getTerminated() || noData)); }