ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/XML-DB/DB.pm
Revision: 1.3
Committed: Sun Apr 21 20:07:57 2002 UTC (22 years, 1 month ago) by root
Branch: MAIN
Changes since 1.2: +94 -9 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 XML::DB - emulate a native xml database using DBI
4
5 =head1 SYNOPSIS
6
7 =head1 DESCRIPTION
8
9 Ehrm... ;)
10
11 =head1 FUNCTIONS
12
13 =head1 SEE ALSO
14
15 =head1 AUTHOR
16
17 This perl extension was written by Marc Lehmann <pcg@goof.com>
18
19 =head1 BUGS
20
21 =cut
22
23 package XML::DB;
24
25 use XML::Parser;
26 use PApp::SQL;
27
28 #require Exporter;
29 BEGIN {
30 $VERSION = 0.01;
31
32 use base DynaLoader;
33
34 bootstrap XML::DB $VERSION;
35 }
36
37 sub new {
38 my $class = shift;
39 bless { @_ }, $class;
40 }
41
42 sub seq {
43 sql_insertid sql_exec "update $_[0]_seq set n = last_insert_id(n + 1)";
44 }
45
46 sub 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
53 sub new_value {
54 sql_insertid sql_exec $_[0]{dbh}, "insert into value values (NULL, ?)", $_[1];
55 }
56
57 sub new_xml_insert_parser {
58 my $self = shift;
59 my $dbh = $self->{dbh};
60
61 my $did = 55;
62 my $n = 1;
63
64 my @l;
65 my @attr;
66
67 new XML::Parser
68 Namespaces => 1,
69 NoExpand => 1,
70 Handlers => {
71 Char => sub {
72 sql_exec $dbh, "insert into node values (?, ?, ?, 'pcdata', ?)",
73 $did, $n+1, $n+2, $self->new_value($_[1]);
74 $n += 2;
75 },
76 Start => sub {
77 my ($parser, $element, @attrs) = @_;
78 push @l, ++$n;
79 push @attr, \@attrs;
80 },
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;
97 },
98 },
99 @_,
100 ;
101 }
102
103 sub 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;
153 }
154
155 1;
156
157
158
159
160