Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Further work on the schema command "event" method. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | schema |
Files: | files | file ages | folders |
SHA3-256: |
644a84f1b96b860a41a43b1c723983aa |
User & Date: | rolf 2019-10-24 11:13:17 |
Context
2019-10-24
| ||
14:12 | Added xsd as new format (and default) to the text constraint command "number". check-in: c2b6dd2267 user: rolf tags: schema | |
11:13 | Further work on the schema command "event" method. check-in: 644a84f1b9 user: rolf tags: schema | |
2019-10-23
| ||
00:27 | Sanitized namespoace handling for 'event start'. Startet attribute input to the 'event start' method. Therefor internal reorganisation, which also makes adding hash tables for larger sets of attribute a bit simpler. check-in: 5f6af15f8d user: rolf tags: schema | |
Changes
Changes to generic/schema.c.
1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 .... 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 .... 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 .... 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 |
char *name, *ns; SchemaCP *cp; Tcl_HashEntry *h; Tcl_Obj *attname, *attns, *attvalue; cp = sdata->stack->pattern; for (i = 0; i < len; i += 2) { Tcl_ListObjIndex (interp, attr, i, &attname); Tcl_ListObjIndex (interp, attr, i+1, &attvalue); if (Tcl_ListObjLength (interp, attname, &len) == TCL_OK) { if (len == 2) { Tcl_ListObjIndex (interp, attname, 1, &attns); Tcl_ListObjIndex (interp, attname, 1, &attname); } } h = Tcl_FindHashEntry (&sdata->attrNames, Tcl_GetString (attname)); if (!h) goto unknown; name = Tcl_GetHashKey (&sdata->attrNames, h); if (attns) { h = Tcl_FindHashEntry (&sdata->namespace, Tcl_GetString (attns)); ................................................................................ Tcl_GetString (attvalue), &req); reqAttr += req; unknown: if (!found) { if (!recover (interp, sdata, S("UNKNOWN_ATTRIBUTE"), 0, 0)) { if (ns) { SetResult ("Unknown attribute \""); Tcl_AppendResult (interp, ns, ":", ns, "\""); } else { SetResult3 ("Unknown attribute \"", name, "\""); } sdata->validationState = VALIDATION_ERROR; return TCL_ERROR; } ................................................................................ Tcl_Interp *interp, int objc, Tcl_Obj *const objv[] ) { int methodIndex, keywordIndex, hnew, patternIndex; int result = TCL_OK, forwardDef = 0, i = 0, j; int savedDefineToplevel, type, len, checkAttr; unsigned int savedNumPatternList; SchemaData *savedsdata = NULL, *sdata = (SchemaData *) clientData; Tcl_HashTable *hashTable; Tcl_HashEntry *h, *h1; SchemaCP *pattern, *current = NULL; void *namespacePtr, *savedNamespacePtr; char *xmlstr, *errMsg; domDocument *doc; domNode *node; static const char *schemaInstanceMethods[] = { "defelement", "defpattern", "start", "event", "delete", "nrForwardDefinitions", "reset", "define", "validate", "domvalidate", "deftext", "info", "reportcmd", "prefixns", NULL }; ................................................................................ case k_elementstart: if (objc < 4 && objc > 6) { Tcl_WrongNumArgs (interp, 3, objv, "<elementname>" "?<attInfo>? ?<namespace>?"); return TCL_ERROR; } namespacePtr = NULL; checkAttr = 0; if (objc == 6) { namespacePtr = getNamespacePtr (sdata, Tcl_GetString (objv[5])); } if (objc >= 5) { if (Tcl_ListObjLength (interp, objv[4], &len) != TCL_OK) { namespacePtr = getNamespacePtr (sdata, Tcl_GetString (objv[4])); } else { if (len == 1) { namespacePtr = getNamespacePtr ( sdata, Tcl_GetString (objv[4]) ); } else if (len % 2 != 0) { SetResult ("Invalid attribute information"); return TCL_ERROR; } else { checkAttr = 1; } } } result = probeElement (interp, sdata, Tcl_GetString (objv[3]), namespacePtr); if (result == TCL_OK && checkAttr) { if (!probeEventAttribute (interp, sdata, objv[4], len)) { return TCL_ERROR; } } break; case k_elementend: if (objc != 3) { Tcl_WrongNumArgs (interp, 3, objv, "No arguments expected."); return TCL_ERROR; |
> > > > | | | > | > > > > > | | > > | | < > | | | < < |
1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 .... 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 .... 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 .... 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 |
char *name, *ns; SchemaCP *cp; Tcl_HashEntry *h; Tcl_Obj *attname, *attns, *attvalue; cp = sdata->stack->pattern; for (i = 0; i < len; i += 2) { found = 0; ns = NULL; name = NULL; attns = NULL; Tcl_ListObjIndex (interp, attr, i, &attname); Tcl_ListObjIndex (interp, attr, i+1, &attvalue); if (Tcl_ListObjLength (interp, attname, &len) == TCL_OK) { if (len == 2) { Tcl_ListObjIndex (interp, attname, 1, &attns); Tcl_ListObjIndex (interp, attname, 0, &attname); } } h = Tcl_FindHashEntry (&sdata->attrNames, Tcl_GetString (attname)); if (!h) goto unknown; name = Tcl_GetHashKey (&sdata->attrNames, h); if (attns) { h = Tcl_FindHashEntry (&sdata->namespace, Tcl_GetString (attns)); ................................................................................ Tcl_GetString (attvalue), &req); reqAttr += req; unknown: if (!found) { if (!recover (interp, sdata, S("UNKNOWN_ATTRIBUTE"), 0, 0)) { if (ns) { SetResult ("Unknown attribute \""); Tcl_AppendResult (interp, ns, ":", name, "\""); } else { SetResult3 ("Unknown attribute \"", name, "\""); } sdata->validationState = VALIDATION_ERROR; return TCL_ERROR; } ................................................................................ Tcl_Interp *interp, int objc, Tcl_Obj *const objv[] ) { int methodIndex, keywordIndex, hnew, patternIndex; int result = TCL_OK, forwardDef = 0, i = 0, j; int savedDefineToplevel, type, len; unsigned int savedNumPatternList; SchemaData *savedsdata = NULL, *sdata = (SchemaData *) clientData; Tcl_HashTable *hashTable; Tcl_HashEntry *h, *h1; SchemaCP *pattern, *current = NULL; void *namespacePtr, *savedNamespacePtr; char *xmlstr, *errMsg; domDocument *doc; domNode *node; Tcl_Obj *attData; static const char *schemaInstanceMethods[] = { "defelement", "defpattern", "start", "event", "delete", "nrForwardDefinitions", "reset", "define", "validate", "domvalidate", "deftext", "info", "reportcmd", "prefixns", NULL }; ................................................................................ case k_elementstart: if (objc < 4 && objc > 6) { Tcl_WrongNumArgs (interp, 3, objv, "<elementname>" "?<attInfo>? ?<namespace>?"); return TCL_ERROR; } namespacePtr = NULL; len = 0; attData = NULL; if (objc == 6) { namespacePtr = getNamespacePtr (sdata, Tcl_GetString (objv[5])); } if (objc >= 5) { if (Tcl_ListObjLength (interp, objv[4], &len) != TCL_OK) { if (objc == 6) { SetResult ("Invalid attribute information"); return TCL_ERROR; } else { namespacePtr = getNamespacePtr (sdata, Tcl_GetString (objv[4])); len = 0; } } else { if (len == 1) { namespacePtr = getNamespacePtr (sdata, Tcl_GetString (objv[4])); len = 0; } else if (len % 2 != 0) { SetResult ("Invalid attribute information"); return TCL_ERROR; } else { attData = objv[4]; } } } result = probeElement (interp, sdata, Tcl_GetString (objv[3]), namespacePtr); if (result == TCL_OK) { result = probeEventAttribute (interp, sdata, attData, len); } break; case k_elementend: if (objc != 3) { Tcl_WrongNumArgs (interp, 3, objv, "No arguments expected."); return TCL_ERROR; |
Changes to tests/schema.test.
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 |
} s delete set result } {0 {error "This method is not allowed in nested evaluation" at line 1 character 6} 0 {error "This method is not allowed in nested evaluation" at line 1 character 15} 0 {error "This method is not allowed in nested evaluation" at line 1 character 13}} test schema-4.6 {event start with namespace} { tdom::schema s s defelement doc http://tdom.org/test { element a 1 { attribute att1 } } s event start doc http://tdom.org/test s event start a http://tdom.org/test s event end s event end s delete } {} test schema-5.1 {dom parse -validateCmd} { set result [catch { [dom parse -validateCmd tdom::schema <doc/>] }] } 1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > |
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 |
} s delete set result } {0 {error "This method is not allowed in nested evaluation" at line 1 character 6} 0 {error "This method is not allowed in nested evaluation" at line 1 character 15} 0 {error "This method is not allowed in nested evaluation" at line 1 character 13}} test schema-4.6 {event start with namespace} { tdom::schema s s defelement doc http://tdom.org/test { element a ! text } s event start doc http://tdom.org/test s event start a http://tdom.org/test s event text "some text" s event end s event end s delete } {} test schema-4.7 {event start with namespace} { tdom::schema s s defelement doc http://tdom.org/test { element a 1 { attribute att1 } } s event start doc http://tdom.org/test set result [catch {s event start a http://tdom.org/test} errMsg] lappend result $errMsg s delete set result } {1 {Missing mandatory attribute(s)}} test schema-4.8 {event start with namespace} { tdom::schema s s defelement doc http://tdom.org/test { element a 1 { attribute att1 } } s event start doc http://tdom.org/test s event start a {att1 "some data"} http://tdom.org/test s event end s event end s delete } {} test schema-4.9 {event start with namespace w/ namespaced attribute} { tdom::schema s s defelement doc http://tdom.org/test { element a 1 { nsattribute att1 http://tdom.org/test } } s event start doc http://tdom.org/test s event start a {{att1 http://tdom.org/test} "some data"} http://tdom.org/test s event end s event end } {} test schema-5.1 {dom parse -validateCmd} { set result [catch { [dom parse -validateCmd tdom::schema <doc/>] }] } 1 |