ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/XML-DB/DB.pm
(Generate patch)

Comparing XML-DB/DB.pm (file contents):
Revision 1.2 by root, Sun Apr 21 17:30:07 2002 UTC vs.
Revision 1.3 by root, Sun Apr 21 20:07:57 2002 UTC

20 20
21=cut 21=cut
22 22
23package XML::DB; 23package XML::DB;
24 24
25sub dk($) {
26 my $x = unpack "H*", $_[0];
27 $x =~ y/a-z/A-Z/;
28 $x;
29}
30
31use XML::Parser; 25use XML::Parser;
32use PApp::SQL; 26use PApp::SQL;
33 27
34#require Exporter; 28#require Exporter;
35BEGIN { 29BEGIN {
43sub new { 37sub new {
44 my $class = shift; 38 my $class = shift;
45 bless { @_ }, $class; 39 bless { @_ }, $class;
46} 40}
47 41
42sub seq {
43 sql_insertid sql_exec "update $_[0]_seq set n = last_insert_id(n + 1)";
44}
45
46sub name_id {
47 # not threadsafe
48 sql_ufetch $_[0]{dbh}, "select i from name where n = ? and v = ?", "$_[1]", $_[2]
49 or sql_insertid sql_exec $_[0]{dbh}, "insert into name values (NULL, ?, ?)", "$_[1]", $_[2];
50
51}
52
53sub new_value {
54 sql_insertid sql_exec $_[0]{dbh}, "insert into value values (NULL, ?)", $_[1];
55}
56
48sub new_xml_insert_parser { 57sub new_xml_insert_parser {
58 my $self = shift;
59 my $dbh = $self->{dbh};
60
49 my $did = 55; 61 my $did = 55;
50 my $n = 1; 62 my $n = 1;
51 63
52 my @children = ([]); 64 my @l;
65 my @attr;
53 66
54 new XML::Parser 67 new XML::Parser
55 NameSpaces => 1, 68 Namespaces => 1,
56 NoExpand => 1, 69 NoExpand => 1,
57 Handlers => { 70 Handlers => {
58 Char => sub { 71 Char => sub {
59 push @{$children[-1]}, ['pcdata', $_[1]]; 72 sql_exec $dbh, "insert into node values (?, ?, ?, 'pcdata', ?)",
73 $did, $n+1, $n+2, $self->new_value($_[1]);
74 $n += 2;
60 }, 75 },
61 Start => sub { 76 Start => sub {
77 my ($parser, $element, @attrs) = @_;
78 push @l, ++$n;
79 push @attr, \@attrs;
62 }, 80 },
63 End => sub { 81 End => sub {
82 my ($parser, $element) = @_;
83 my $attr = pop @attr;
84 my $l = pop @l;
85 sql_exec $dbh, "insert into node values (?, ?, ?, 'element', ?)",
86 $did, $l, ++$n, $self->name_id($parser->namespace($element), $element);
87
88 for (my $i = 0; $i < @$attr; $i += 2) {
89 sql_exec $dbh, "insert into attr values (?, ?, ?, ?)",
90 $did, $l, $self->name_id($parser->namespace($attr->[$i]), $attr->[$i]),
91 $self->new_value($attr->[$i+1]);
92 }
93 },
94 Final => sub {
95 sql_exec $dbh, "insert into node values (?, ?, ?, 'root', 0)",
96 $did, 1, ++$n;
64 }, 97 },
65 }, 98 },
66 @_, 99 @_,
67 ; 100 ;
101}
102
103sub get_fragment {
104 my ($self, $did, $ol) = @_;
105
106 $ol ||= 1;
107
108 my $or = sql_fetch $self->{dbh}, "select r from node where did = ? and l = ?", $did, $ol;
109 my $st = sql_exec $self->{dbh}, \my($l, $r, $t, $c),
110 "select l, r, t, c from node where did = ? and l > ? and r < ? order by l",
111 $did, $ol, $or;
112
113 my $ot;
114 my @stack;
115 my $doc = "";
116 my %ns;
117 my $nso;
118 my $nsp = "a";
119
120 my $expand_name = sub {
121 $ns{$_[0]} ||= $nsp++;
122 };
123
124 while ($st->fetch) {
125 if ($l > $or) {
126 ($ol, $or, $oc) = @{pop @stack};
127
128 $doc .= "</$oc>";
129 }
130
131 if ($t eq "element") {
132 my ($ns, $name) = $expand_name->(sql_ufetch $self->{dbh}, "select ns, v from name where i = ?", $c);
133 push @stack, [$ol, $or, $ns];
134 ($ol, $or) = ($l, $r);
135
136 $doc .= "<$ns";
137
138 my $st = sql_exec $self->{dbh}, "select name.n, , v from
139 } elsif ($t eq "pcdata") {
140 $c = sql_ufetch $self->{dbh}, "select v from value where i = ?", $c;
141
142 $doc .= "$c";
143
144 } elsif ($t eq "entity") {
145 } elsif ($t eq "pi") {
146 } elsif ($t eq "doctype") {
147 } else {
148 die "FATAL: database corrupt, unexpected nodetype '$t'";
149 }
150 }
151
152 $doc;
68} 153}
69 154
701; 1551;
71 156
72 157

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines