rc_t VCursorListSeededWritableColumns ( VCursor *self, BSTree *columns, const KNamelist *seed ) { rc_t rc; KDlset *libs; struct resolve_phys_data pb; pb . pr . schema = self -> schema; pb . pr . ld = self -> tbl -> linker; pb . pr . stbl = self -> stbl; pb . pr . curs = self; pb . pr . cache = & self -> prod; pb . pr . owned = & self -> owned; pb . pr . chain = chainEncoding; pb . pr . blobbing = false; pb . pr . ignore_column_errors = true; pb . pr . discover_writable_columns = true; pb . seed = seed; if ( seed != NULL ) { rc = KNamelistCount ( seed, & pb . count ); if ( rc != 0 ) return rc; } /* open the dynamic linker libraries */ rc = VLinkerOpen ( pb . pr . ld, & libs ); if ( rc == 0 ) { pb . pr . libs = libs; VProdResolveWritableColumns ( & pb , self->suspend_triggers ); KDlsetRelease ( libs ); if ( rc == 0 ) { /* add columns to list */ uint32_t idx = VectorStart ( & self -> row ); uint32_t end = VectorLength ( & self -> row ); for ( end += idx; idx < end; ++idx ) { const VColumn* vcol = ( const VColumn* ) VectorGet ( & self -> row, idx ); if ( vcol != NULL ) { VColumnRef *cref; rc = VColumnRefMake ( & cref, self -> schema, vcol -> scol ); if ( rc != 0 ) break; rc = BSTreeInsert ( columns, & cref -> n, VColumnRefSort ); assert ( rc == 0 ); } } } } return rc; }
/* Open * open cursor, resolving schema * for the set of opened columns * * NB - there is no corresponding "Close" * use "Release" instead. */ rc_t VTableReadCursorOpen ( const VTableCursor *cself ) { rc_t rc; VTableCursor *self = ( VTableCursor* ) cself; if ( self == NULL ) rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull ); else { VLinker *ld = self -> tbl -> linker; KDlset *libs; rc = VLinkerOpen ( ld, & libs ); if ( rc == 0 ) { rc = VCursorOpenRead ( self, libs ); if ( rc == 0 ) { int64_t first; uint64_t count; rc = VCursorIdRange ( & self -> dad, 0, & first, & count ); if ( rc != 0 ) { /* permit empty open when run from sradb */ if ( GetRCState ( rc ) == rcEmpty && GetRCObject ( rc ) == rcRange && self -> permit_add_column && VectorLength ( & self -> dad . row ) == 0 ) { rc = 0; } } else if ( count != 0 ) { /* set initial row id to starting row */ self -> dad . start_id = self -> dad . end_id = self -> dad . row_id = first; } if ( rc != 0 ) self -> dad . state = vcFailed; } KDlsetRelease ( libs ); } } return rc; }
/* Open * opens libraries for search */ rc_t VLinkerOpen ( const VLinker *self, struct KDlset **libs ) { rc_t rc = KDyldMakeSet ( self -> dl, libs ); if ( rc == 0 ) { KDlset *set = * libs; rc = KDlsetAddAll ( set ); if ( rc == 0 ) return 0; KDlsetRelease ( set ); * libs = NULL; } return rc; }
static rc_t VTableFindType ( VTable *self ) { rc_t rc; VTableFindData pb; pb . linker = self -> linker; rc = VLinkerOpen ( pb . linker, & pb . libs ); if ( rc == 0 ) { pb . vtbl = self; pb . stbl = NULL; /* search schema */ VSchemaFindUntyped ( self -> schema, & pb ); /* record stbl */ self -> stbl = pb . stbl; KDlsetRelease ( pb . libs ); } return rc; }
/* MakeSet * load a dynamic library * * "set" [ OUT ] - return parameter for lib set */ LIB_EXPORT rc_t CC KDyldMakeSet ( const KDyld *self, KDlset **setp ) { rc_t rc = 0; if ( setp == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcSelf, rcNull ); else { KDlset *set = malloc ( sizeof * set ); if ( set == NULL ) rc = RC ( rcFS, rcDylib, rcConstructing, rcMemory, rcExhausted ); else { set -> dl = KDyldAttach ( self ); VectorInit ( & set -> name, 0, 16 ); VectorInit ( & set -> ord, 0, 16 ); KRefcountInit ( & set -> refcount, 1, "KDlset", "make", "dlset" ); #if ! ALWAYS_ADD_EXE { KDylib *jni; const char* libname = "vdb_jni.dll"; rc = KDyldLoadLib ( ( KDyld* ) self, & jni, libname ); if ( rc == 0 ) { rc = KDlsetAddLib ( set, jni ); KDylibRelease ( jni ); } /*if (rc == 0)*/ /* if JNI code is not there, C tools should not suffer */ { * setp = set; return 0; } } #else { KDylib *exe; rc = KDyldLoadLib ( ( KDyld* ) self, & exe, NULL ); if ( rc == 0 ) { rc = KDlsetAddLib ( set, exe ); KDylibRelease ( exe ); if ( rc == 0 ) { * setp = set; return 0; } } } KDlsetRelease ( set ); #endif } } * setp = NULL; } return rc; }
rc_t CC KMain ( int argc, char *argv [] ) { Args * args; rc_t rc; rc = ArgsMakeAndHandle (&args, argc, argv, 1, MyOptions, sizeof MyOptions / sizeof (OptDef)); if (rc) LOGERR (klogInt, rc, "failed to parse arguments"); else { do { KDyld *dl; uint32_t num_libs; rc = ArgsParamCount (args, &num_libs); if (rc) { LOGERR ( klogInt, rc, "Failure to count parameters" ); break; } if (num_libs == 0) { rc = MiniUsage(args); break; } /* create loader */ rc = KDyldMake (&dl); if (rc) { LOGERR ( klogInt, rc, "failed to create dynamic loader" ); break; } else { do { KDlset *libs; const char * path; uint32_t ix; uint32_t num_paths; rc = ArgsOptionCount (args, OPTION_LOAD, &num_paths); if (rc) { LOGERR (klogInt, rc, "failed to count paths"); break; } for (ix = 0; ix < num_paths; ix++) { rc = ArgsOptionValue (args, OPTION_LOAD, ix, (const void **)&path); if (rc) { LOGERR (klogInt, rc, "failed to access a path option"); break; } testld_update_libpath (dl, path); } if (rc) break; /* append contents of LD_LIBRARY_PATH */ path = getenv ( "LD_LIBRARY_PATH" ); if (path) testld_update_libpath (dl, path); /* create libset */ rc = KDyldMakeSet (dl, & libs); if (rc) { LOGERR (klogInt, rc, "failed to create dl library set"); break; } else { /* test it */ for (ix = 0; ix < num_libs; ++ ix ) { rc = ArgsParamValue (args, ix, (const void **)&path); if (rc) break; testld_load_library (dl, libs, path); } KDlsetRelease ( libs ); } } while (0); KDyldRelease ( dl ); } } while (0); ArgsWhack (args); } return rc; }
LIB_EXPORT rc_t CC VCursorOpen ( const VCursor *cself ) { rc_t rc; VCursor *self = ( VCursor* ) cself; if ( self == NULL ) rc = RC ( rcVDB, rcCursor, rcOpening, rcSelf, rcNull ); else { VLinker *ld = self -> tbl -> linker; KDlset *libs; rc = VLinkerOpen ( ld, & libs ); if ( rc == 0 ) { rc = VCursorOpenRead ( self, libs ); if ( rc == 0 ) { if ( ! self -> read_only ) { VProdResolve pr; pr . schema = self -> schema; pr . ld = ld; pr . libs = libs; pr . stbl = self -> stbl; pr . curs = self; pr . cache = & self -> prod; pr . owned = & self -> owned; pr . chain = chainEncoding; pr . blobbing = false; pr . ignore_column_errors = false; pr . discover_writable_columns = false; if ( !self -> suspend_triggers ) rc = VProdResolveAddTriggers ( & pr, self -> stbl ); } if ( rc == 0 ) { /* TBD - warn if any input columns are unreferenced by schema */ int64_t first; uint64_t count; rc = VCursorIdRange ( self, 0, & first, & count ); if ( rc != 0 ) { if ( GetRCState ( rc ) == rcEmpty ) { /* writable cursors are expected to be empty */ if ( ! self -> read_only || /* permit empty open when run from sradb */ ( GetRCObject ( rc ) == rcRange && self -> permit_add_column && VectorLength ( & self -> row ) == 0 ) ) { rc = 0; } } } else if ( count != 0 ) { if ( self -> read_only ) { /* set initial row id to starting row */ self -> start_id = self -> end_id = self -> row_id = first; } else { /* set initial row id to append */ self -> start_id = self -> end_id = self -> row_id = first + count; } } } if ( rc != 0 ) self -> state = vcFailed; } KDlsetRelease ( libs ); } } return rc; }